From 2dcb4bb7561e5d3847b324a7fa19a966c3078a8f Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Sun, 24 Jul 2016 11:55:55 +0200 Subject: [PATCH 001/259] -t flag to control timeout --- bin/http-server | 3 +++ lib/http-server.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/bin/http-server b/bin/http-server index 51b060299..5befd8fbd 100755 --- a/bin/http-server +++ b/bin/http-server @@ -30,6 +30,8 @@ if (argv.h || argv.help) { ' -o [path] Open browser window after starting the server', ' -c Cache time (max-age) in seconds [3600], e.g. -c10 for 10 seconds.', ' To disable caching, use -c-1.', + ' -t Connections timeout in seconds [120], e.g. -t60 for 1 minute.', + ' To disable timeout, use -t0', ' -U --utc Use UTC time format in log messages.', '', ' -P --proxy Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com', @@ -95,6 +97,7 @@ function listen(port) { var options = { root: argv._[0], cache: argv.c, + timeout: argv.t, showDir: argv.d, autoIndex: argv.i, gzip: argv.g || argv.gzip, diff --git a/lib/http-server.js b/lib/http-server.js index 51aa4bf44..b6a831406 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -130,6 +130,9 @@ function HttpServer(options) { } this.server = union.createServer(serverOptions); + if (options.timeout !== undefined) { + this.server.setTimeout(options.timeout); + } } HttpServer.prototype.listen = function () { From 37f2dae838a8b612bd734fbeb192fea1e2091612 Mon Sep 17 00:00:00 2001 From: BigBlueHat Date: Mon, 22 May 2017 12:24:05 -0400 Subject: [PATCH 002/259] Update Node.js versions to latest list (> 4) Remove old notification and allow_failures settings --- .travis.yml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6d1d5b6e6..2955c867b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,10 @@ sudo: false language: node_js node_js: - - "0.10" - - "0.12" - - "4.1" + - "4" + - "5" + - "6" + - "7" before_install: - travis_retry npm install -g npm@2.14.5 @@ -11,12 +12,3 @@ before_install: script: - npm test - -matrix: - allow_failures: - - node_js: "0.10" - -notifications: - email: - - travis@nodejitsu.com - irc: "irc.freenode.org#nodejitsu" From 96231640c17fae2472d4d6d3144f8f5009bfd0e9 Mon Sep 17 00:00:00 2001 From: BigBlueHat Date: Mon, 22 May 2017 12:39:13 -0400 Subject: [PATCH 003/259] Remove npm install npm line Travis provides this out of the box --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2955c867b..f622025f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,6 @@ node_js: - "7" before_install: - - travis_retry npm install -g npm@2.14.5 - travis_retry npm install script: From 3e9a57f2c025e47454be08252025acb13218c1e9 Mon Sep 17 00:00:00 2001 From: ebiiim Date: Sat, 6 Apr 2019 15:05:04 +0900 Subject: [PATCH 004/259] Add README `--no-dotfiles` option --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 108618d3b..08dc12e81 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,8 @@ Using `npx` you can run the script without installing it first: `-r` or `--robots` Provide a /robots.txt (whose content defaults to `User-agent: *\nDisallow: /`) +`--no-dotfiles` Do not show dotfiles + `-h` or `--help` Print this list and exit. ## Magic Files From 88ff6082fc6ab44259718f69aaee515c85964d7b Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 16 Apr 2019 11:29:53 -0500 Subject: [PATCH 005/259] add process title set process title to 'http-server' so it can be easily killed. Fixes #333 --- bin/http-server | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/http-server b/bin/http-server index 24b54dd93..a73a311d5 100755 --- a/bin/http-server +++ b/bin/http-server @@ -14,6 +14,8 @@ var colors = require('colors/safe'), var ifaces = os.networkInterfaces(); +process.title = 'http-server'; + if (argv.h || argv.help) { console.log([ 'usage: http-server [path] [options]', From 090b08e0d6382b1e14b742dac4c851d2f016abe7 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 16 Apr 2019 11:40:08 -0500 Subject: [PATCH 006/259] require at least node 6 Fixes #232 --- package.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e38e5259..92cd0b2ef 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,9 @@ }, "keywords": [ "cli", - "command" + "command", + "http", + "server" ], "scripts": { "start": "node ./bin/http-server", @@ -20,6 +22,9 @@ "lib", "bin" ], + "engines": { + "node": ">=6" + }, "contributors": [ { "name": "Charlie Robbins", From 801fa120ba690e297cb7822a2db1e8094334e196 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 16 Apr 2019 15:33:06 -0500 Subject: [PATCH 007/259] add man page This page will be added to `man` when http-server is installed. --- doc/http-server.1 | 156 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 157 insertions(+) create mode 100644 doc/http-server.1 diff --git a/doc/http-server.1 b/doc/http-server.1 new file mode 100644 index 000000000..c578fdaaa --- /dev/null +++ b/doc/http-server.1 @@ -0,0 +1,156 @@ +.TH http-server 1 "April 2019" GNU "http-server man page" + +.SH NAME +http-server \- a simple zero-configuration command-line http server + +.SH SYNOPSIS +.B http-server +[\fIPATH\fR] +[\fIOPTIONS\fR] + +.SH DESCRIPTION +\fBhttp-server\fR is a simple, zero-configuration command-line http server. It is powerful enough for production usage, but it's simple and hackable enough to be used for testing, local development, and learning. + +.SH OPTIONS + +.TP +.BI [\fIPATH\fR] +The directory to serve. +Defaults to ./public if it exists, and ./ otherwise. + +.TP +.BI \-p ", " \-\-port " " \fIPORT\fR +Port to use. +Default is 8080. + +.TP +.BI \-a " " \fIADDRESS\fR +Address to use. +Default is 0.0.0.0. + +.TP +.BI \-d +Show directory listings. +Default is true. + +.TP +.BI \-i +Display autoIndex. +Default is true. + +.TP +.BI \-g ", " \-\-gzip +Serve gzip files when possible. +Default is false. + +.TP +.BI \-b ", " \-\-brotli +Serve brotli files when possible. +If both brotli and gzip are enabled, brotli takes precedence. +Default is false. + +.TP +.BI \-e ", " \-\-ext " " \fIEXTENSION\fR +Default file extension is none is provided. + +.TP +.BI \-s ", " \-\-silent +Suppress log messages from output. + +.TP +.BI \-\-cors " " [\fIHEADERS\fR] +Enable CORS via the "Access-Control-Allow-Origin" header. +Optionally provide CORS headers list separated by commas. + +.TP +.BI \-o " " [\fIPATH\fR] +Open default browser window after starting the server. +Optionally provide a URL path to open the browser window to. + +.TP +.BI \-c " " \fITIME\fR +Cache time (max-age) in seconds. +To disable caching, use \-c \-1. +Default is 3600. + +.TP +.BI \-U ", " \-\-utc +Use UTC time format in log messages. + +.TP +.BI \-\-log\-ip +Enable logging of the client IP address. + +.TP +.BI \-P ", " \-\-proxy +Fallback proxy if the request cannot be resolved. + +.TP +.BI \-\-username " " \fIUSERNAME\fR +Username for basic authentication. +Can also be specified with the environment variable NODE_HTTP_SERVER_USERNAME. +Defaults to none. + +.TP +.BI \-\-password " " \fIPASSWORD\fR +Password for basic authentication. +Can also be specified with the environment variable NODE_HTTP_SERVER_PASSWORD. +Defaults to none. + +.TP +.BI \-S ", " \-\-ssl +Enable https. + +.TP +.BI \-C ", " \-\-cert " " [\fIFILE\fR] +Path to SSL certificate file. +If not specified, uses cert.pem. + +.TP +.BI \-K ", " \-\-key " " [\fIFILE\fR] +Path to SSL key file. +If not specified, uses key.pem. + +.TP +.BI \-r ", " \-\-robots " " [\fIUSER\-AGENT\fR] +Respond to /robots.txt request. +If not specified, uses "User-agent: *\\nDisallow: /]" + +.TP +.BI \-\-no\-dotfiles +Do not show dotfiles. + +.TP +.BI \-h ", " \-\-help +Print usage and exit. + +.SH FILES +.B index.html +will be served as the default file to any directory requests. + +.B 404.html +will be served if a file is not found. This can be used for SPA hosting to serve the entry page. + +.SH COPYING +Copyright (c) 2011-2019 Charlie Robbins, Marak Squires, and the 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. + +.SH VERSION +Version 0.11.1 diff --git a/package.json b/package.json index 5e38e5259..850babf13 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "lib", "bin" ], + "man": "./doc/http-server.1", "contributors": [ { "name": "Charlie Robbins", From 36a806f194bb8645b6fb414f67b8f5e946f6ac31 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Wed, 17 Apr 2019 09:03:32 -0500 Subject: [PATCH 008/259] test all maintained node versions --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f622025f1..69269a38b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,10 @@ sudo: false language: node_js node_js: - - "4" - - "5" - "6" - - "7" + - "8" + - "10" + - "11" before_install: - travis_retry npm install From a986e72ea16508c99a28ad6c76c5d664020210e2 Mon Sep 17 00:00:00 2001 From: "Bora M. Alper" Date: Sun, 2 Jun 2019 21:48:06 +0100 Subject: [PATCH 009/259] Send Accept-Ranges: bytes with every response --- bin/http-server | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bin/http-server b/bin/http-server index 24b54dd93..52c270fca 100755 --- a/bin/http-server +++ b/bin/http-server @@ -135,6 +135,10 @@ function listen(port) { key: argv.K || argv.key || 'key.pem' }; } + + options.headers = { + 'Accept-Ranges': 'bytes' + }; var server = httpServer.createServer(options); server.listen(port, host, function () { From 175f96ee1d452f861c51834287423197865ae3fc Mon Sep 17 00:00:00 2001 From: "Bora M. Alper" Date: Sun, 2 Jun 2019 22:10:34 +0100 Subject: [PATCH 010/259] remove trailing whitespace in bin/http-server --- bin/http-server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/http-server b/bin/http-server index 52c270fca..0e454d771 100755 --- a/bin/http-server +++ b/bin/http-server @@ -135,7 +135,7 @@ function listen(port) { key: argv.K || argv.key || 'key.pem' }; } - + options.headers = { 'Accept-Ranges': 'bytes' }; From 975cc4f600e6e50c117adf71647bb81164a2c04b Mon Sep 17 00:00:00 2001 From: epugh Date: Wed, 28 Aug 2019 13:16:51 -0400 Subject: [PATCH 011/259] fix issue #402 by documenting magic command to generate a SSL certificate --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index cc922fd12..6831d0181 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,14 @@ http-server --proxy http://localhost:8080? Note the `?` at the end of the proxy URL. Thanks to [@houston3](https://github.com/houston3) for this clever hack! +## Need a self signed SSL Certificate? + +Create the `cert.pem` and `key.pem` via the command: + +``` +openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem +``` + # Development Checkout this repository locally, then: From a91c95ac46a2f0f0c6a42dfce2822624c2410edd Mon Sep 17 00:00:00 2001 From: Xmader Date: Wed, 23 Oct 2019 17:12:14 -0400 Subject: [PATCH 012/259] add a hacky and direct workaround to fix #525 --- lib/http-server.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/http-server.js b/lib/http-server.js index 4cdd1b1c8..bb45ee2a0 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -6,8 +6,32 @@ var fs = require('fs'), auth = require('basic-auth'), httpProxy = require('http-proxy'), corser = require('corser'), + path = require('path'), secureCompare = require('secure-compare'); +// a hacky and direct workaround to fix https://github.com/http-party/http-server/issues/525 +function getCaller() { + try { + var stack = new Error().stack; + var stackLines = stack.split('\n'); + var callerStack = stackLines[3]; + return callerStack.match(/at (.+) \(/)[1]; + } + catch (error) { + return ''; + } +} + +var _pathNormalize = path.normalize; +path.normalize = function (p) { + var caller = getCaller(); + var result = _pathNormalize(p); + if (caller === 'decodePathname') { + result = result.replace(/\\/g, '/'); + } + return result; +}; + // // Remark: backwards compatibility for previous // case convention of HTTP From c4956ecc93fbf90e4074289fb6f7699107af9132 Mon Sep 17 00:00:00 2001 From: Xmader Date: Wed, 23 Oct 2019 17:15:54 -0400 Subject: [PATCH 013/259] add comments --- lib/http-server.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/http-server.js b/lib/http-server.js index bb45ee2a0..c2558e135 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -26,6 +26,7 @@ var _pathNormalize = path.normalize; path.normalize = function (p) { var caller = getCaller(); var result = _pathNormalize(p); + // https://github.com/jfhbrook/node-ecstatic/blob/master/lib/ecstatic.js#L20 if (caller === 'decodePathname') { result = result.replace(/\\/g, '/'); } From f929c9fa9636c940857d2a3236e718150c227f42 Mon Sep 17 00:00:00 2001 From: Xmader Date: Thu, 7 Nov 2019 17:06:24 -0500 Subject: [PATCH 014/259] upgrade vows to v0.8.3 tests can run on Node 12 --- package-lock.json | 33 +++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4edd92392..23b7f9550 100644 --- a/package-lock.json +++ b/package-lock.json @@ -805,9 +805,9 @@ } }, "diff": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", - "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", "dev": true }, "dom-serializer": { @@ -2521,13 +2521,30 @@ } }, "vows": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/vows/-/vows-0.7.0.tgz", - "integrity": "sha1-3QBl8RC6DAptY+hEhRwyCBdtWGc=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/vows/-/vows-0.8.3.tgz", + "integrity": "sha512-PVIxa/ovXhrw5gA3mz6M+ZF3PHlqX4tutR2p/y9NWPAaFVKcWBE8b2ktfr0opQM/qFmcOVWKjSCJVjnYOvjXhw==", "dev": true, "requires": { - "diff": "~1.0.3", - "eyes": ">=0.1.6" + "diff": "^4.0.1", + "eyes": "~0.1.6", + "glob": "^7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "window-size": { diff --git a/package.json b/package.json index 5e38e5259..1ffcfa7cb 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "devDependencies": { "common-style": "^3.0.0", "request": "^2.88.0", - "vows": "~0.7.0" + "vows": "~0.8.3" }, "bugs": { "url": "https://github.com/nodeapps/http-server/issues" From 458e97b572347da7e4232d084095f84969c23e06 Mon Sep 17 00:00:00 2001 From: Xmader Date: Thu, 7 Nov 2019 17:09:09 -0500 Subject: [PATCH 015/259] fix vows hangs after all the tests pass add cleanup --- test/http-server-test.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/http-server-test.js b/test/http-server-test.js index 0a7f897ff..e9826277c 100644 --- a/test/http-server-test.js +++ b/test/http-server-test.js @@ -125,7 +125,13 @@ vows.describe('http-server').addBatch({ assert.equal(body.trim(), file.trim()); } } + }, + teardown: function (proxyServer) { + proxyServer.close(); } + }, + teardown: function (server) { + server.close(); } }, 'When cors is enabled': { @@ -156,6 +162,9 @@ vows.describe('http-server').addBatch({ 'response Access-Control-Allow-Headers should contain X-Test': function (err, res) { assert.ok(res.headers['access-control-allow-headers'].split(/\s*,\s*/g).indexOf('X-Test') >= 0, 204); } + }, + teardown: function (server) { + server.close(); } }, 'When gzip and brotli compression is enabled and a compressed file is available': { @@ -209,6 +218,9 @@ vows.describe('http-server').addBatch({ assert.equal(res.statusCode, 200); assert.equal(res.headers['content-encoding'], 'br'); } + }, + teardown: function (server) { + server.close(); } }, 'When http-server is listening on 8083 with username "good_username" and password "good_password"': { @@ -341,6 +353,9 @@ vows.describe('http-server').addBatch({ assert.equal(body.trim(), file.trim()); } } + }, + teardown: function (server) { + server.close(); } } }).export(module); From 5dcf680bbcf24efa47f39a69ad378fd89117100e Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Sat, 9 Nov 2019 15:27:40 -0600 Subject: [PATCH 016/259] use latest versions, back to 6 --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 69269a38b..54fd4cdd8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,8 @@ node_js: - "6" - "8" - "10" - - "11" + - "12" + - "13" before_install: - travis_retry npm install From 3addf0981416e2559dcab269ac7ec777ffe59fc7 Mon Sep 17 00:00:00 2001 From: Xmader Date: Sat, 9 Nov 2019 16:58:17 -0500 Subject: [PATCH 017/259] test on Windows --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 54fd4cdd8..e4740d0a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,10 @@ node_js: - "12" - "13" +os: + - linux + - windows + before_install: - travis_retry npm install From 8028337ef6999f88d24be76eb8c9f113f25b8eb0 Mon Sep 17 00:00:00 2001 From: Xmader Date: Sat, 9 Nov 2019 17:15:08 -0500 Subject: [PATCH 018/259] force to check out files with LF EOL --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index e4740d0a3..3fd59dbd9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,9 @@ node_js: - "12" - "13" +git: + autocrlf: input + os: - linux - windows From e708c7980c43bdcbd77a40510f5b779f705adb08 Mon Sep 17 00:00:00 2001 From: Xmader Date: Sat, 9 Nov 2019 17:31:37 -0500 Subject: [PATCH 019/259] force to install ecstatic v3.3.2 in tests --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23b7f9550..29f23e9e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -870,9 +870,9 @@ } }, "ecstatic": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.0.tgz", - "integrity": "sha512-EblWYTd+wPIAMQ0U4oYJZ7QBypT9ZUIwpqli0bKDjeIIQnXDBK2dXtZ9yzRCOlkW1HkO8gn7/FxLK1yPIW17pw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz", + "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==", "requires": { "he": "^1.1.1", "mime": "^1.6.0", From 5f06ac85c8b8dd4a7fdc0f601da59b23137327e0 Mon Sep 17 00:00:00 2001 From: Xmader Date: Sun, 10 Nov 2019 14:44:07 -0500 Subject: [PATCH 020/259] bump ecstatic in package.json to ^3.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7e1d2345f..c8e4817a4 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "basic-auth": "^1.0.3", "colors": "^1.3.3", "corser": "^2.0.1", - "ecstatic": "^3.3.0", + "ecstatic": "^3.3.2", "http-proxy": "^1.17.0", "opener": "^1.5.1", "optimist": "~0.6.1", From 0f65fc67ab917423906c8a8fbdd55917efe7b8e1 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 11 Nov 2019 07:51:35 -0600 Subject: [PATCH 021/259] update readme badges to use new repo --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b4af01b94..d8965d5fa 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -[![build status](https://img.shields.io/travis/indexzero/http-server.svg?style=flat-square)](https://travis-ci.org/indexzero/http-server) -[![dependencies status](https://img.shields.io/david/indexzero/http-server.svg?style=flat-square)](https://david-dm.org/indexzero/http-server) +[![build status](https://img.shields.io/travis/http-party/http-server.svg?style=flat-square)](https://travis-ci.org/http-party/http-server) +[![dependencies status](https://img.shields.io/david/http-party/http-server.svg?style=flat-square)](https://david-dm.org/http-party/http-server) [![npm](https://img.shields.io/npm/v/http-server.svg?style=flat-square)](https://www.npmjs.com/package/http-server) -[![license](https://img.shields.io/github/license/indexzero/http-server.svg?style=flat-square)](https://github.com/indexzero/http-server) +[![license](https://img.shields.io/github/license/http-party/http-server.svg?style=flat-square)](https://github.com/http-party/http-server) # http-server: a command-line http server From 6b2fe2577604a09c5582168f1402c879ab51c840 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 11 Nov 2019 07:56:15 -0600 Subject: [PATCH 022/259] test on osx I'd like to test on BSD as well, but as far as I can tell Travis doesn't and won't support it. Supporting OSX should sort of handle BSD testing, though it's no substitute for the real thing. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 3fd59dbd9..70ee55c3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ git: os: - linux - windows + - osx before_install: - travis_retry npm install From cd0bbc885d831dd9b234d5597a17b87e5e0e8842 Mon Sep 17 00:00:00 2001 From: Danny Dalton <33505454+dandalton1@users.noreply.github.com> Date: Mon, 11 Nov 2019 22:28:29 -0500 Subject: [PATCH 023/259] SSL Certificate Checking and Grammar Fixes (#479) * Added some existance checking for SSL certificates; changed caching policy algorithm; fixed grammar in testing Signed-off-by: Danny Dalton * Fixed wording Changed `could not stat` to `could not find`. * Changed README arg list to be a table. * Update README.md * Undo README changes --- README.md | 2 +- bin/http-server | 25 ++++++++++++++++++++----- package.json | 6 +++++- test/http-server-test.js | 22 +++++++++++----------- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d8965d5fa..31140f7b0 100644 --- a/README.md +++ b/README.md @@ -114,4 +114,4 @@ $ node bin/http-server *Now you can visit http://localhost:8080 to view your server* You should see the turtle image in the screenshot above hosted at that URL. See -the `./public` folder for demo content. +the `./public` folder for demo content. \ No newline at end of file diff --git a/bin/http-server b/bin/http-server index dedd7f66d..5578c16ff 100755 --- a/bin/http-server +++ b/bin/http-server @@ -7,6 +7,7 @@ var colors = require('colors/safe'), httpServer = require('../lib/http-server'), portfinder = require('portfinder'), opener = require('opener'), + fs = require('fs'), argv = require('optimist') .boolean('cors') .boolean('log-ip') @@ -41,7 +42,7 @@ if (argv.h || argv.help) { ' -U --utc Use UTC time format in log messages.', ' --log-ip Enable logging of the client\'s IP address', '', - ' -P --proxy Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com', + ' -P --proxy Fallback proxy if the request cannot be resolved. e.g.: http://someurl.com', '', ' --username Username for basic authentication [none]', ' Can also be specified with the env variable NODE_HTTP_SERVER_USERNAME', @@ -52,16 +53,16 @@ if (argv.h || argv.help) { ' -C --cert Path to ssl cert file (default: cert.pem).', ' -K --key Path to ssl key file (default: key.pem).', '', - ' -r --robots Respond to /robots.txt [User-agent: *\\nDisallow: /]', - ' --no-dotfiles Do not show dotfiles', - ' -h --help Print this list and exit.' + ' -r --robots Respond to /robots.txt [User-agent: *\\nDisallow: /]', + ' --no-dotfiles Do not show dotfiles', + ' -h --help Print this list and exit.' ].join('\n')); process.exit(); } var port = argv.p || argv.port || parseInt(process.env.PORT, 10), host = argv.a || '0.0.0.0', - ssl = !!argv.S || !!argv.ssl, + ssl = argv.S || argv.ssl, proxy = argv.P || argv.proxy, utc = argv.U || argv.utc, logger; @@ -139,6 +140,20 @@ function listen(port) { cert: argv.C || argv.cert || 'cert.pem', key: argv.K || argv.key || 'key.pem' }; + try { + fs.lstatSync(options.https.cert); + } + catch (err) { + logger.info(colors.red('Error: Could not find certificate ' + options.https.cert)); + process.exit(1); + } + try { + fs.lstatSync(options.https.key); + } + catch (err) { + logger.info(colors.red('Error: Could not find private key ' + options.https.key)); + process.exit(1); + } } var server = httpServer.createServer(options); diff --git a/package.json b/package.json index c8e4817a4..9021670e5 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,10 @@ "name": "BigBlueHat", "email": "byoung@bigbluehat.com" }, + { + "name": "Daniel Dalton", + "email": "daltond2@hawkmail.newpaltz.edu" + }, { "name": "Jade Michael Thornton", "email": "jade@jmthornton.net" @@ -95,7 +99,7 @@ "url": "https://github.com/nodeapps/http-server/issues" }, "license": "MIT", - "preferGlobal": "true", + "preferGlobal": true, "bin": { "http-server": "./bin/http-server", "hs": "./bin/http-server" diff --git a/test/http-server-test.js b/test/http-server-test.js index e9826277c..66ac644f5 100644 --- a/test/http-server-test.js +++ b/test/http-server-test.js @@ -11,7 +11,7 @@ process.on('uncaughtException', console.error); var root = path.join(__dirname, 'fixtures', 'root'); vows.describe('http-server').addBatch({ - 'When http-server is listening on 8080': { + 'When http-server is listening on 8080,\n': { topic: function () { var server = httpServer.createServer({ root: root, @@ -44,7 +44,7 @@ vows.describe('http-server').addBatch({ } } }, - 'when requesting non-existent file': { + 'and a non-existent file is requested...': { topic: function () { request('http://127.0.0.1:8080/404', this.callback); }, @@ -52,7 +52,7 @@ vows.describe('http-server').addBatch({ assert.equal(res.statusCode, 404); } }, - 'when requesting /': { + 'requesting /': { topic: function () { request('http://127.0.0.1:8080/', this.callback); }, @@ -62,15 +62,15 @@ vows.describe('http-server').addBatch({ assert.include(body, '/canYouSeeMe'); } }, - 'when robots options is activated': { + 'when robots option is toggled on...': { topic: function () { - request('http://127.0.0.1:8080/', this.callback); + request('http://127.0.0.1:8080/robots.txt', this.callback); }, 'should respond with status code 200 to /robots.txt': function (res) { assert.equal(res.statusCode, 200); } }, - 'and options include custom set http-headers': { + 'and options include custom set http-headers...': { topic: function () { request('http://127.0.0.1:8080/', this.callback); }, @@ -79,7 +79,7 @@ vows.describe('http-server').addBatch({ assert.equal(res.headers['access-control-allow-credentials'], 'true'); } }, - 'When http-server is proxying from 8081 to 8080': { + 'and the server is set to proxy port 8081 to 8080, ': { topic: function () { var proxyServer = httpServer.createServer({ proxy: 'http://127.0.0.1:8080/', @@ -88,7 +88,7 @@ vows.describe('http-server').addBatch({ proxyServer.listen(8081); this.callback(null, proxyServer); }, - 'it should serve files from the proxy server root directory': { + '\nit should serve files from the proxy\'s root': { topic: function () { request('http://127.0.0.1:8081/root/file', this.callback); }, @@ -107,7 +107,7 @@ vows.describe('http-server').addBatch({ } } }, - 'it should fallback to the proxied server': { + '\nit should fallback to the proxied server': { topic: function () { request('http://127.0.0.1:8081/file', this.callback); }, @@ -134,7 +134,7 @@ vows.describe('http-server').addBatch({ server.close(); } }, - 'When cors is enabled': { + 'When CORS is enabled': { topic: function () { var server = httpServer.createServer({ root: root, @@ -144,7 +144,7 @@ vows.describe('http-server').addBatch({ server.listen(8082); this.callback(null, server); }, - 'and given OPTIONS request': { + 'and the server is given an OPTIONS request': { topic: function () { request({ method: 'OPTIONS', From 7f13eedbf7230bb639e7a520ee69f0cdaf254394 Mon Sep 17 00:00:00 2001 From: Jorge Esteban Zaragoza Date: Tue, 12 Nov 2019 15:31:21 -0600 Subject: [PATCH 024/259] CLI -v parameter --- bin/http-server | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/bin/http-server b/bin/http-server index 5578c16ff..037e740b2 100755 --- a/bin/http-server +++ b/bin/http-server @@ -55,7 +55,8 @@ if (argv.h || argv.help) { '', ' -r --robots Respond to /robots.txt [User-agent: *\\nDisallow: /]', ' --no-dotfiles Do not show dotfiles', - ' -h --help Print this list and exit.' + ' -h --help Print this list and exit.', + ' --version Print http-server version' ].join('\n')); process.exit(); } @@ -65,6 +66,7 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), ssl = argv.S || argv.ssl, proxy = argv.P || argv.proxy, utc = argv.U || argv.utc, + version = argv.version, logger; if (!argv.s && !argv.silent) { @@ -99,6 +101,11 @@ else if (colors) { }; } +if (version) { + console.log('v' + require('../package.json').version); + process.exit(); +} + if (!port) { portfinder.basePort = 8080; portfinder.getPort(function (err, port) { From 66a32d17e1247e55f0147a40748ccda52fc8ec37 Mon Sep 17 00:00:00 2001 From: sowmiyamuthuraman Date: Thu, 21 Nov 2019 23:20:46 +0530 Subject: [PATCH 025/259] Add version flag. --- bin/http-server | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/bin/http-server b/bin/http-server index 5578c16ff..83e69084e 100755 --- a/bin/http-server +++ b/bin/http-server @@ -11,7 +11,8 @@ var colors = require('colors/safe'), argv = require('optimist') .boolean('cors') .boolean('log-ip') - .argv; + .argv, + pjson = require('../package.json'); var ifaces = os.networkInterfaces(); @@ -55,7 +56,8 @@ if (argv.h || argv.help) { '', ' -r --robots Respond to /robots.txt [User-agent: *\\nDisallow: /]', ' --no-dotfiles Do not show dotfiles', - ' -h --help Print this list and exit.' + ' -h --help Print this list and exit.', + ' -v --version Print the version and exit.' ].join('\n')); process.exit(); } @@ -65,7 +67,8 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), ssl = argv.S || argv.ssl, proxy = argv.P || argv.proxy, utc = argv.U || argv.utc, - logger; + logger, + version = pjson.version; if (!argv.s && !argv.silent) { logger = { @@ -110,6 +113,11 @@ else { listen(port); } +if (argv.v || argv.version) { + console.log(version); + process.exit(); +} + function listen(port) { var options = { root: argv._[0], From aa78ed6c0f2cad5894ecdbee6488f5e2facafa08 Mon Sep 17 00:00:00 2001 From: sowmiyamuthuraman Date: Thu, 21 Nov 2019 23:34:08 +0530 Subject: [PATCH 026/259] Update README.md to include the version flag. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 31140f7b0..69993b046 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,8 @@ Using `npx` you can run the script without installing it first: `-h` or `--help` Print this list and exit. +`-v` or `--version` Print the version and exit. + ## Magic Files - `index.html` will be served as the default file to any directory requests. From d366540aa4e6ff1f6024323d49e77d33da74f7e8 Mon Sep 17 00:00:00 2001 From: willjin Date: Sat, 23 Nov 2019 22:36:15 +0800 Subject: [PATCH 027/259] correct gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 7b8cf3fda..bfbe96d60 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -node_modules/* -npm-debug.log +node_modules/ +npm-debug.log* .dir-locals.el From fee644f5908cd2723817846c43ad8fa069618b47 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 26 Nov 2019 14:11:14 -0600 Subject: [PATCH 028/259] fix repo urls --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9021670e5..68cabecfe 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "./lib/http-server", "repository": { "type": "git", - "url": "git://github.com/indexzero/http-server.git" + "url": "git://github.com/http-party/http-server.git" }, "keywords": [ "cli", @@ -96,7 +96,7 @@ "vows": "~0.8.3" }, "bugs": { - "url": "https://github.com/nodeapps/http-server/issues" + "url": "https://github.com/http-party/http-server/issues" }, "license": "MIT", "preferGlobal": true, From e6f6358c900dceac5593eae0c4aed32b09475feb Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 26 Nov 2019 14:14:02 -0600 Subject: [PATCH 029/259] 0.12.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29f23e9e4..6b84be830 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.11.1", + "version": "0.12.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 68cabecfe..c12cceede 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.11.1", + "version": "0.12.0", "description": "A simple zero-configuration command-line http server", "main": "./lib/http-server", "repository": { From 29b82a9535bdf868243ec0a3fb85250f6890051e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=94=BE?= Date: Mon, 16 Dec 2019 21:55:06 +0800 Subject: [PATCH 030/259] Add TLS/SSL usage description (#571) * docs: add ssl usage description * docs: add openssl link * docs: change ssl description --- README.md | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 69993b046..968c53e6e 100644 --- a/README.md +++ b/README.md @@ -96,14 +96,35 @@ http-server --proxy http://localhost:8080? Note the `?` at the end of the proxy URL. Thanks to [@houston3](https://github.com/houston3) for this clever hack! -## Need a self signed SSL Certificate? +## TLS/SSL -Create the `cert.pem` and `key.pem` via the command: +First, you need to make sure that [openssl](https://github.com/openssl/openssl) is installed correctly, and you have `key.pem` and `cert.pem` files. You can generate them using this command: -``` +``` sh openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem ``` +You will be prompted with a few questions after entering the command. Use `127.0.0.1` as value for `Common name` if you want to be able to install the certificate in your OS's root certificate store or browser so that it is trusted. + +This generates a cert-key pair and it will be valid for 3650 days (about 10 years). + +Then you need to run the server with `-S` for enabling SSL and `-C` for your certificate file. + +``` sh +http-server -S -C cert.pem +``` + +This is what should be output if successful: + +``` sh +Starting up http-server, serving ./ through https +Available on: + https:127.0.0.1:8080 + https:192.168.1.101:8080 + https:192.168.1.104:8080 +Hit CTRL-C to stop the server +``` + # Development Checkout this repository locally, then: From 3571e188cd73b8411cbed48d8f8e7badf69f0b0c Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 16 Dec 2019 08:03:52 -0600 Subject: [PATCH 031/259] only add logFn function to before if logFn exists This is a new implementation of #387, but fixed. Previously, we added a function which would use logFn if it exists. Since this is all this function does, if logFn does not exist, we don't need to add the function at all. This should, in theory, provide a small performance boost as well, since the operation of checking for logFn doesn't need to be performed on every request log. --- lib/http-server.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/http-server.js b/lib/http-server.js index 626a5a845..8124fc69d 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -92,13 +92,12 @@ function HttpServer(options) { var before = options.before ? options.before.slice() : []; - before.push(function (req, res) { - if (options.logFn) { + if (options.logFn) { + before.push(function (req, res) { options.logFn(req, res); - } - - res.emit('next'); - }); + res.emit('next'); + }); + } if (options.username || options.password) { before.push(function (req, res) { From b2bf05778865fd7d179fd7f7575ee7769356078e Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Fri, 20 Dec 2019 08:46:52 -0600 Subject: [PATCH 032/259] add test for auto-ext --- test/fixtures/root/htmlButNot | 4 ++++ test/http-server-test.js | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 test/fixtures/root/htmlButNot diff --git a/test/fixtures/root/htmlButNot b/test/fixtures/root/htmlButNot new file mode 100644 index 000000000..3d6a33f6d --- /dev/null +++ b/test/fixtures/root/htmlButNot @@ -0,0 +1,4 @@ +
+

I am HTML?

+ yeah i guess +
diff --git a/test/http-server-test.js b/test/http-server-test.js index 66ac644f5..470267619 100644 --- a/test/http-server-test.js +++ b/test/http-server-test.js @@ -357,5 +357,27 @@ vows.describe('http-server').addBatch({ teardown: function (server) { server.close(); } + }, + 'When auto-ext is enabled': { + topic: function () { + var server = httpServer.createServer({ + root: root, + ext: true + }); + server.listen(8085); + this.callback(null, server); + }, + 'and a file with no extension is requested with default options,': { + topic: function () { + request('http://127.0.0.1:8085/htmlButNot', this.callback); + }, + 'content-type should be text/html': function (res) { + assert.equal(res.statusCode, 200); + assert.match(res.headers['content-type'], /^text\/html/); + } + }, + teardown: function (server) { + server.close(); + } } }).export(module); From a2de1ccf3a4d6cbfbb6cbc1c421f0cadeead0c52 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Fri, 20 Dec 2019 08:47:02 -0600 Subject: [PATCH 033/259] when ext is html, serve text/html content type --- lib/http-server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/http-server.js b/lib/http-server.js index 626a5a845..ab340d813 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -82,13 +82,13 @@ function HttpServer(options) { this.showDotfiles = options.showDotfiles; this.gzip = options.gzip === true; this.brotli = options.brotli === true; - this.contentType = options.contentType || 'application/octet-stream'; - if (options.ext) { this.ext = options.ext === true ? 'html' : options.ext; } + this.contentType = options.contentType || + this.ext === 'html' ? 'text/html' : 'application/octet-stream'; var before = options.before ? options.before.slice() : []; From 0f504faf22dc523c7d6b08eb61b63ab7ad0a318a Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Fri, 20 Dec 2019 09:11:29 -0600 Subject: [PATCH 034/259] add test for serverHeader --- test/http-server-test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/http-server-test.js b/test/http-server-test.js index 66ac644f5..388595f7a 100644 --- a/test/http-server-test.js +++ b/test/http-server-test.js @@ -16,6 +16,7 @@ vows.describe('http-server').addBatch({ var server = httpServer.createServer({ root: root, robots: true, + serverHeader: false, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true' @@ -79,6 +80,14 @@ vows.describe('http-server').addBatch({ assert.equal(res.headers['access-control-allow-credentials'], 'true'); } }, + 'and serverHeaderis disabled': { + topic: function () { + request('http://127.0.0.1:8080/', this.callback); + }, + 'should not respond with headers from ecstatic': function (res) { + assert.isFalse('server' in res.headers); + } + }, 'and the server is set to proxy port 8081 to 8080, ': { topic: function () { var proxyServer = httpServer.createServer({ From 5663452b7b89c7f2eccf340047be05af24a939d0 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Fri, 20 Dec 2019 09:11:37 -0600 Subject: [PATCH 035/259] add no-server-header option fixes #237 --- README.md | 4 +++- bin/http-server | 3 +++ lib/http-server.js | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 968c53e6e..07b38c690 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,8 @@ Using `npx` you can run the script without installing it first: `--no-dotfiles` Do not show dotfiles +`--no-server-header` Hide the `server` header which identifies ecstatic + `-h` or `--help` Print this list and exit. `-v` or `--version` Print the version and exit. @@ -137,4 +139,4 @@ $ node bin/http-server *Now you can visit http://localhost:8080 to view your server* You should see the turtle image in the screenshot above hosted at that URL. See -the `./public` folder for demo content. \ No newline at end of file +the `./public` folder for demo content. diff --git a/bin/http-server b/bin/http-server index 83e69084e..f1a004266 100755 --- a/bin/http-server +++ b/bin/http-server @@ -11,6 +11,7 @@ var colors = require('colors/safe'), argv = require('optimist') .boolean('cors') .boolean('log-ip') + .boolean('server-header') .argv, pjson = require('../package.json'); @@ -56,6 +57,7 @@ if (argv.h || argv.help) { '', ' -r --robots Respond to /robots.txt [User-agent: *\\nDisallow: /]', ' --no-dotfiles Do not show dotfiles', + ' --no-server-header Hide the "server" header which identifies ecstatic', ' -h --help Print this list and exit.', ' -v --version Print the version and exit.' ].join('\n')); @@ -132,6 +134,7 @@ function listen(port) { logFn: logger.request, proxy: proxy, showDotfiles: argv.dotfiles, + serverHeader: argv['server-header'], username: argv.username || process.env.NODE_HTTP_SERVER_USERNAME, password: argv.password || process.env.NODE_HTTP_SERVER_PASSWORD }; diff --git a/lib/http-server.js b/lib/http-server.js index 626a5a845..51086a5ee 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -80,6 +80,7 @@ function HttpServer(options) { this.showDir = options.showDir !== 'false'; this.autoIndex = options.autoIndex !== 'false'; this.showDotfiles = options.showDotfiles; + this.serverHeader = options.serverHeader; this.gzip = options.gzip === true; this.brotli = options.brotli === true; this.contentType = options.contentType || 'application/octet-stream'; @@ -153,6 +154,7 @@ function HttpServer(options) { cache: this.cache, showDir: this.showDir, showDotfiles: this.showDotfiles, + serverHeader: this.serverHeader, autoIndex: this.autoIndex, defaultExt: this.ext, gzip: this.gzip, From 3d64f8490be9c206be9957f9ff2b046a1e8fe5b8 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Sat, 21 Dec 2019 18:40:40 -0600 Subject: [PATCH 036/259] remove unused package requiring This require is made unused by this PR, since it's required within the `if` later, which is much better (only load it if you need it). --- bin/http-server | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bin/http-server b/bin/http-server index 07091dccf..e043e812a 100755 --- a/bin/http-server +++ b/bin/http-server @@ -11,9 +11,7 @@ var colors = require('colors/safe'), argv = require('optimist') .boolean('cors') .boolean('log-ip') - .argv, - pjson = require('../package.json'); - + .argv; var ifaces = os.networkInterfaces(); process.title = 'http-server'; From 8413355fc45b54a82c7d2e9aa003d9c5a484f54a Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Sat, 21 Dec 2019 18:43:59 -0600 Subject: [PATCH 037/259] Fix bad merge The merge added `-v` but the code doesn't respect it --- bin/http-server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/http-server b/bin/http-server index e043e812a..f2810c1d7 100755 --- a/bin/http-server +++ b/bin/http-server @@ -65,7 +65,7 @@ var port = argv.p || argv.port || parseInt(process.env.PORT, 10), ssl = argv.S || argv.ssl, proxy = argv.P || argv.proxy, utc = argv.U || argv.utc, - version = argv.version, + version = argv.v || argv.version, logger; if (!argv.s && !argv.silent) { From c600a1d41d6ffb30219685dc463be08b2548c61c Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Sat, 21 Dec 2019 18:55:54 -0600 Subject: [PATCH 038/259] Fix bad merge yet again Sorry, I missed this bit too --- bin/http-server | 5 ----- 1 file changed, 5 deletions(-) diff --git a/bin/http-server b/bin/http-server index f2810c1d7..3de29f68a 100755 --- a/bin/http-server +++ b/bin/http-server @@ -116,11 +116,6 @@ else { listen(port); } -if (argv.v || argv.version) { - console.log(version); - process.exit(); -} - function listen(port) { var options = { root: argv._[0], From cfc497bfc3da620d1adfe4c80c94fc21f62d6cda Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Sun, 22 Dec 2019 10:03:47 -0600 Subject: [PATCH 039/259] use logger for version output --- bin/http-server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/http-server b/bin/http-server index 3de29f68a..895e1910b 100755 --- a/bin/http-server +++ b/bin/http-server @@ -101,7 +101,7 @@ else if (colors) { } if (version) { - console.log('v' + require('../package.json').version); + logger.info('v' + require('../package.json').version); process.exit(); } From 4eb14ee006215517743d12e86bb91f458ee28901 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Thu, 26 Dec 2019 10:35:24 -0600 Subject: [PATCH 040/259] move accept-ranges setting to lib --- bin/http-server | 4 ---- lib/http-server.js | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/bin/http-server b/bin/http-server index 0e454d771..24b54dd93 100755 --- a/bin/http-server +++ b/bin/http-server @@ -136,10 +136,6 @@ function listen(port) { }; } - options.headers = { - 'Accept-Ranges': 'bytes' - }; - var server = httpServer.createServer(options); server.listen(port, host, function () { var canonicalHost = host === '0.0.0.0' ? '127.0.0.1' : host, diff --git a/lib/http-server.js b/lib/http-server.js index 4cdd1b1c8..212271c75 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -44,6 +44,7 @@ function HttpServer(options) { } this.headers = options.headers || {}; + this.headers['Accept-Ranges'] = 'bytes'; this.cache = ( options.cache === undefined ? 3600 : From 83650d3330d787ea083097743f2871436ec9522c Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Thu, 26 Dec 2019 10:37:33 -0600 Subject: [PATCH 041/259] use correct spacing --- lib/http-server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/http-server.js b/lib/http-server.js index 212271c75..f30ec1de3 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -44,7 +44,7 @@ function HttpServer(options) { } this.headers = options.headers || {}; - this.headers['Accept-Ranges'] = 'bytes'; + this.headers['Accept-Ranges'] = 'bytes'; this.cache = ( options.cache === undefined ? 3600 : From a5db868b9471a56a56a98c8802fdba018eb73cfe Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Fri, 27 Dec 2019 14:31:27 -0600 Subject: [PATCH 042/259] Update issue template --- .github/ISSUE_TEMPLATE | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index 89a10ffff..27116f2f8 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -1,20 +1,16 @@ -**Do you want to request a *feature* or report a *bug*?** - -**If the issue is a bug report, please provide the steps to reproduce it. Please include the actual command causing the issue if applicable.** +**Steps to reproduce the issue, if applicable. Include the actual command and output and/or stack trace.** **What did you expect to happen?** -**What actually happened? Please include the actual error trace and / or stack trace if applicable.** - **If the issue is a feature request, what is the motivation / use case for it?** **Tell us about your environment** -- **http-server version:** +- **exact http-server version:** +- **Node version:** - **Platform:** **Other information (related issues, suggestions for a fix, etc):** - From 813f77d0aa704267bcc778555bff0ac29bb8dbeb Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Wed, 8 Jan 2020 09:04:54 -0600 Subject: [PATCH 043/259] 0.12.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b84be830..0cd6d9015 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.12.0", + "version": "0.12.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c12cceede..11279decc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.12.0", + "version": "0.12.1", "description": "A simple zero-configuration command-line http server", "main": "./lib/http-server", "repository": { From 486b4cc98fd35965bd82e12da079b307501a6178 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Wed, 8 Jan 2020 09:21:30 -0600 Subject: [PATCH 044/259] ignore macOS files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7b8cf3fda..8df73ea22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/* npm-debug.log .dir-locals.el +.DS_Store From c7901f82f5e0735ca9659abac4f494ecbb6e0c75 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Wed, 8 Jan 2020 09:21:50 -0600 Subject: [PATCH 045/259] update image of serving public dir --- screenshots/public.png | Bin 59617 -> 62498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/public.png b/screenshots/public.png index 95bff8bfeeb96980e5744fe6331ad63628c4e98b..1a732c4611533ee473d5c738c081927432cc5e11 100644 GIT binary patch literal 62498 zcmagF2{hE-{|9WT6rz$OTPajR$Zp1-RQ6=2>?OuF%~&Vd6S9RY6DpNuMAjKILdcrz zWX3-BF$QDI_RRPD`)}tw&pFSWGc%vh>%L$2z1;V`_jAv@C&|Lh_$2oQZZw0`a0sRXR61>_AQNv_V_64o;}#gSf8zGKy;OLUG(IEU5K6O zeNA_epZsGFkejDG)GvS~#m1%$)nr}zd4@c`2=#mBAFK%lNd7CK$-4drR*<~-uSke5 zK+?|C;-Ud4$n&C#{4M#Ll0fc@7cXiDd3b4B8Q%UcI_nM~=@SwXpsAn$fk5OT%JQHf zZv{mS4Go2xN(xF!ax4kC;86dN$51){;LHE%^fxsaE zNy&c{{m<(^c6vge{I4ee;Qw-q<)FepEeeYAHx>S;Zx&ViA5_!g3DonMo#7KdPyb++ z4xr-An`+ws68>LJ|Eu!@|n6SA2!07&yz<8< zC=@0e+cRtH=8qq(balCo9jR`)T#=dS8zled*Dv97XB;129-DWSmzI{ga@Ntou`oLN zUEaIgPvTylUU9Lpqik#k2M20e{3hn-YHGg+g3~cF@THn~f;cy1GZhiRh(Ns$d z2mqE=U5-l;XPTKNywQA9AYo}?nZvn>kHEB7c|O^^V)uuS9+ zu`;t}yQW}v=7Qvr{ue&dL@TA-SO4|3|VKRq~9@@-k)1o{FO|+k(MhLHGZ!sA->rl4j@a z#b*nWA#3W;?OEdkq%Aaja?CVQLR1^N?LAA-Uk!RRALMan{IBR@kSHg=I4$%bKObCW zgD}2qW-PNk`@{7GCVHf40rr_aF@}quQA4xAul;R4uCX7`9?iPHKm#vgLzi!@u!(CQ z_!4tY4m61$vt?EvzZoDF@*9-x$ic$fLmgcKhscc*k#XSBQkVDw&{eKjv^AWarSBUm zY;72K)F5Q4yZj*feB4N5$I?+{vtzO>-SA|>8X;%^<#K8^Ebom=wz{tT@96$uRtx`5 z`{AE=<9tk`4zoh8g%BT12~%|!@PcL0@uIcf59I>X@O>3c&DSgGMqGk@dx~NG75J$i zFZz41yEMl^=g1<3`(s zoW5Y(uduP)Qy)AOV=vXY2gm>VT#DR%jr`G>5>8#D0@Yw0fqEgKeBv}%E;)QxSremH zM4x;(*Ca@hk=G8UpC(z@Zc$(Dj(SJ1{3Q%dAJzzMXIIz_!+Pu%@coh|HDy;%>D5cxkSCY&R)UFdf^vm5BHBq{1ePmE*ByIlMVNQrr*ZP ziNJ)dVM>VB7%mJyXfg^5S~h*O`F%$D)6J?DoALd{ zq%_GY#W%1uwH?oku%4WGK~@@eg<|TqqgA-7-RWUTPTsSkzOyM{{A&`hccAHX^Se*^ zB9^w|NA?TN}W#`CkZF}*7x)SPmI~sr7Z&f30}WIIAQ%NJTt?f$D!tOkG(@(z-ql{A;){p zR}3@cR+6I+sGZadIV!FV%^|3eqfX^MLa&dOE1kdc2zJK@yYbB1EIvi>{d(kRSF(siCFnt5-p)HX051dG-F^4NL6j64HlXKOqaih2j26%oD6>F#7SXB1z%wcIQ|Epr@AvzuIA{&*Hf+4LGyn;Rrbc+ACe4 zN)2em1)5&tY1$wF^PTMiyQFnD_)UEu znShOs+}*O*^10(yxvElE9(V%}$OF&c3K{pcC4g{De_~-Gb-fEC2Soq5H0zyAZU|n9 zba|s@RN?w?HS)UFwV%OxZD>xJb?2)tpu}-2sW019!;O$$ZVJ*Zfmblxn1Ha_s++A_ zipmT^97X)3Ute+EiJ#=b-WxR6%Ntu>3c2T*%Sx z5ls44pB(6tK3L_`u#Q{{^T2T-L35vh=tQbgbX3qqjs#NAXm~;YbQk?1=m^|fW0}zU zB#asS^n{CFcC9y2YsxS`S6t5G+M1g~w%pSn(_u{iU52w5^=26JxBH7BDs?VQLDlly z&pFkevAXCRJ!6(h=$Lzr0#bg}HhRJw*?UJt5sG>A&~gFY(Y;%_#ika(lk1 zi!3O;H+ZB>w(26(cB=y|qrqOX+bZ8uu7Rou_JpLW(C51DS~${YY(AO3cLTRILv|Ux zEA$-A{r(ktzUF@BZ0}sy;EtPhd2r_2N!5X#kj%Iza`=kECgWe)_a0ha+I4w$ZV#XQ zH8iW=I8LU;KHD<*WrVZVxJd!}fz8`j!4K>oJg}|auKJtw&mhL^Ro&NijxICVEg;nH zR2?Ps0tlV;XKBq)q^xC z$^Oy&#F$`wKr-&bCFeMNtHP?8WSq4kkgoJtX~4{ruxfV+kJAxqbN3!F2kM8ybB!(K z2Q59z%kR%>F|=8ubs~&>r*&ZR#Guc@#N1c#_j%NyNms7!mzg2zI(QyzMMySHzr~2K z`p$?LI@mUGSO=uO^3%%83B!%egTy^aLk~SX(Q>sX+jZWeo{t4RCnb4( zHOBV=uwNxjL*Wy4)I-av@ySnx3kcOoX+N`Sv$mR(n|^C)NvzmMY~;?+)yoZtyyMCt~ zV(o_=j|44lL~7DGsh-tLvBo?sGuMPuXHUDF|0r3D>eboYso1a{Jnhi7IK<7VldngZ zVDkNq#+oDot9Pq{*AG%_z|xw8;BrtF-+;MyHKCf&Dz*~2X1G#V6!c-?KFoT;EU8EL zfTS7dGJq?FuzY+QCi5~!Oqzaid*$PA;iS>L2l=fTTDyEy zzP}F%wF4OiQ%7;mu@a^gmwN-f6bC;1X@e(3a&74ntRodI6|VQvRqJyvb(=@*N(9t#`S`exV+Y4 zi9+Z`ul$vAHHytgUNkp!gN;%9APCzs(~oyBDW2dZWD(+^*zc}xtwtww|V zBF0~`_7PSL;C*3YhpqU+>uM1<^6S;Wz78};YfxnKdDg)H6_Rd}CVN1?jo3FuY zld6&q#(U_$RhkpP7qbm-v}U=ZsE_uY9iZmm~r`l$%5!Z zrb$Pd2TtTC(n#Ts0(7AwZ32>^jmtd%lCZ~JRwM6h@z4G-AhdF>(@ivY0bvl4AIiWp zg%C9i7uve#)!GbS-*m1*F@!A)Q-GBLgf+B-pWSFl4J`YdT_^JVt}V_6<==FHeV6Yq zAY<{{9qEab(^GZ~ZHX=6Cr?^30f=@|%3pX9zA98iNd8J&TSwg z=P^P52yfIil+c;AL$VOmHo#Sj+HCX8a@~WX2+MwaW##_hF;suGuk3HxP^YHGbxQ zOapb*!8IyW7$snyoMw^;={s%p8eXc;cl3j9$p{p5m#rFfCUtqm%x#zw2k$%Sh?!r1!_k)w-)T|=XkIEbMqxSHk4o#kNoKO zudu}Pgukxe=h(4<{ZBhz#I%0%TD)pEQ+<1(Q1QT4|IFW@>uHH9Codn7Z~x6NvXb&WQv^bQbc zLLe`kALF5I)%SJ`_yNUW@Yj%vK!4_(B}&JgUKrr?75zd(xD&a0?GpCrBQZ7J-pc_Y z(36R;D@LFQHu8M;+L_pc`Qz=ar?Hibp+9@Rym+Fi>Y$_Vtp6qJ+geqh_5?fdlLeqO=ST;$#MM#uq8xvxWMgQ-2G1dq@`u z>Dp=ModjNgEsZi~*B#%{ru~8*wa~d+%?Zl^^z`E%zv45L!zSIk1BHFoMu=nu1;1~p zBU_bQYMC)rcWBHo+Kf>&u6c>ExqsH#3^R*uPZM$}SC;IGEG8@58+J;x`N$3r8a4h8d-H(V&?HTFwvoeu0?YtYB zq$G4`;aT$Z7`(G(I?U;jInrTIzfYb2`D9{?X%|*%_T*GUId)&&&s=L7yZjO{IsM`e zE~7+UJ_WMEbHsiAu=7Z`NNe~{v!ln?0z8b^Gs1)CkMeBGFCCP4ogG&>eP*B6QUxaS za{g}l!o7-A)#z8;0_pY3I(*ws(^e<#hdH`(Rx8W89gh<(tjr7TtDc6Doqv0$C*&s) zaRyWhp)~?KHK_BusD5MPi4ab~x<|!sYmn|gIm~_RVx_P_z~xGN=SNL{pX;9?jGh)o zxp&yfS>8~{wz}Yx73GpQd8*DrX5QDIXU;I(!uOG zmiqY>>*87o4C2BbRI3Ft5?3?%RO>F5vR3}7CwG-rXM#P zHDO55KI3EUb*jpc`W%`@36~iJ8E`$fUBGzj(a5?wn4Jwjv?w+clWfS83M->mqZ34u z2BRs++V>c7=FA)*2q>|NC$|qg!F5DCw}qELI>Vn?_?8i-yT$fC91y%3?wh~oXU+TB zOiYjA34(bR9ufLINXx6{+oqCzwX;_urhG{~fxMWeIRtxR#*C*$`T?v!T!0DZWTtrD zw1>-Xqh91p?wvGiRFWa#I2qDLosG{+nPK{;;A_i?ICoCu?+9!yoS8FkB6T?UgC03= z5_(9fGo&_PXj^h!GdCM3+gadfjY_xe>vkS}IGn1>BJgMO{oN{}Br|TEfYZCP(pT9E zd;N3;c|ZVAn~R!EVHvLUPS4q6+tC3$=5WKglTjyMxQTEKwl z0RmyjzFckiRm+k%B13R;x-A+OVYP#F} zwSmvhb;8I(iv_x%11jYWi;VwmPa@xZpB3!0v`Zq*V?bOpHdQJxoYdW{75l|yLR4$_ zo%irl|7vyQs(Xw&Q3^M=DY`nO%+k6EBdp``9Wb0nG?ij=US4SqU|CW|BD2FDUV>n} zT*i}`{-s@^b2y9u%sgu)ZZTB$HzFb?9~+ftPsDL;`dMYm+}-sEjq1jjszt*^n33z- z=)KJ+<0h^-SBJ{GNj-l*)iw}c`zbY`fos@L!>m&#K4EkHUm7>mwTl+H-US=<`Uy+h z1LHcyz^vpkG|#~&Y~UO8XpO&!xY4s0vCN_a7L14^cenc22A=-7+zG?EBr}V?YFn1b z^pXmru+#FHe)vw-9l88Z4yomWix(R<~@>WF##uZwyiJC%1Gl#a@6 z2{f*_K2Q6k&bQ|%FTTq#@zcg6I%|I+V526GtfXKq&kKjmJgv^QGZa1)JV*3kNL}gM zYD&Y7!CcVMu9#@~cd3xQim=b$Wx7^BstH%PvJv();Jjof{*zr)Vk#lR|GFS2)Yv*d zgu~Qlfnu~vbFN@YGpOfbcrhJA$ZVnf)glgS^y~e5)=O$T!#)EQw>7}eyk?#4a?9l( zI?k3pX;l=CU`Msn{C3!Uw_UI)kPN0G)>49CtJxFLJktp|t5^?bt{)JXFHf8bnk`Hr z3ryPf2hn$xu**NQXs4#3rlT1%El?csvi$SlZLH@u1)5_pzsSDd05zrvY-5-2&C`n{ z8LWJA4JG2#(vq0K4xCh}meMeqL_}ZAF6}l<_+sPoGX)}nElZ=f@B+mMU(XKDq6cBg z$pW z)>DXx%wIY1==KH6SXtMZ!o!pMi$`4Fmvp`Jy#3BO`uY7)suAG&u*N0PP?e%!XkK`e ztkG`gpD!f4n6RCQ_NA`A_M?~HfSIAmkeuLYp=WiuRzimFqjD^SL!dc(9nX>JYw=T$ z_C=y9N0C!HkB7)koo}48cJD2ksE01N{A@nAS_HcDc(%y)`j0LxgV?hz`^2sje8O%r zZSfAr*6N{{M{b6+uuy!>-Am!_$_eBr#XsJ^Hj$hQKCP0peMba(_ zcA6Qf(ue!z63`lz9bgmB`Hfc*w|;j-Ga}RklAlaLs)97Wer%z&ri}ghD+dVL*$%Jt zmp%$l9$-^M9RDo- zCeWPK8H~>dg!LbErMBe;1Jt`eaQUzARD1@*W^&(k#tSRO1aAJx9es7-Q~R3gun}Kf z_OYa<_8aWosb|&B zO1= zt8NCHpJ|Pp6B}tUAn!)Hn|%%ADzte%I2#^!X!h|Wui4|I3RRKv^7HQT^3B@3^z*mW z*4FLtRi8)plsntnk$rfyKOcoXZgYX>6u#u#c3vh<>4HKt)9FER`8#_sx3Yl?1GZoF z(bh_g3v|0y&f@OKCm}tzQ(v#1d3EN}LmCsN@}^Ae{pVni#7dPrDD~Z^i_d9NQ5n+D zIM!t+c_%|M%0+%a6JEJ_YE6uX-29NX^!gyxtaCmkhWU?+Yujo7Py& z{ps4tu5Ns8zZz?I zApwsl>!vse*)0(=)5m@4+eUl-tyCc?9#oD zQY~8Je>Eom410O~pp8K;4EJ8f$f`9{%qxksBf*;A_H5vtpA^GnE5L=?`Jz!^S%NdI+WFT)MuMYfwaub&sNCr)WnrG~urP(i*ZlX(87&~>Gkz@D2Y{c^2*OlM+(k^(+P#6pC# z4j1>$mT)&akDnwXzTPZogKENac$VE$$&y{+`M0XS#~^0z*2F>5=OR@-A1EE+VM;_u z5JbDL2{arJ68Zgh@tNO3oJ#z}(|w?K1<_swU!GXXOZZhU6aeka53CfNKZb1*B0K_% z44QMpP37;T61SYrw;UjQoO7Z+ra%65TCaPsQZ`pY{022j5OGh$U^SB6GxE6n7+ zp9QWHCpc`Ee~R)n+DQ-Kh&Xd?rWnU|-b0ry$eArR$78$$-1aBL_XZBHN5qjeUl3Pq z%37kYMW&Dy*E(L9rb!(1rCr`sCCcAp?w2_h@)70RYj2kyFP?qK9sHX7fqQ>E z6H_|UXdoqQ6@{o7ea(b)9|^#=O!TsSA8joDa3_(|gA zI70r(un9^b=doW7djfNfXR7_~xLG`_j>#Yn*ECLS%sa=1AL|?|%FD@A)}B9JH#2?@ zCZJQa&@H)4yGNuDbeLi}SB>(cT#giGtMSGNJrukA$b|4IzaoEH8p}DL;!xHf4i!>g zSi0Xlm7tZGH>UFOxWQy+ctrh1cqq#dGheSNU+R7Qlpy^%kZ(aOjM7VZMY%?<9wW>H zx~~Z}h`2TMq&x-LnF3#o-Vz~*=&H*utVE)Ox)WNV4InuD%MIym+WT3L-r!EhSPh%0 zrCZX-v)^A0kMUP|(9Y@+U1k9T&*7d{#RV0->y8%;gg3kOFp6E1Zo=wJD+Zl92phyo zaA0dU1UW}!%+=0LG)9;aYdH=2u<>V6F`7qGLV%BvNJ{14M;~t_dX=Ex7N^QIN z%piXRgF~h%8Uiidm>x+G7>eYfU!$;Q$f89?X&R9)=2w(p z4N$#1OYPhW9f&2rqq`6Y?-f+*`|A^+LY|^^UiQ`V{dDIF?Y+Pj2Ybt`IDS=AM}p%f zL8K5(SSTcH5F)~(=8te?ehiN$i=WRFf#$5s=EA!gHVN^HXJ@tFxwlF#()_|11tc8% zVcYMI!LOV9ihdEd`p-orLZ+qBR{|31E+6*5%o`L$Hh&-CRKR*(IMqDW8U8b1WDdXt z^eg4~bLuN&gb?eQx;>loy_cDh&6T}+eai+F-f-=?jYx|$<Y z1WB@D%se?Rk_B$lvOtH*KMWw#f9*C#<9ICjvCE?n(X_&%KVNfB5f*WT zKw$W%*S3cod-bf<SzCw7O2hH;#{dpsQi2% zYi`GH{adp=M&{rjfsC0{Q*7Q3l0fX)O00|Ssh5+*=Kua`3agD`d?(@RWQTcs0cp`Q-voZPVcq?lzBaa~ zZ%jXJucmbH-?{NeHtUQe$TmQ*7{zl!7ZZ3*jO;n!lL z*B{ucmSTUNdy+O4cM-qG>m&C1?Wmq1iKDB2 zWo!0q(5U&6?iRP*H^kk00ZbEj2$KEn&4#y-zKX>W zlN(!Ci~Bnlr$AQLQ!#VY45~|&mZq(N_J$7ioq%V?iDk48~W%3KP?_SaiYt+9ak(%%KU}gP6kzyLtu=xt< zwac~TqqRPxH$w0jWc;z->`k> zYd{0mq{)K4?AH>u8an;MmgaZ2D?o6Kz=u?NU~BMd0IWb@=-FZSv`BD47JneNU6A(P zb(uAHmuk9Kqt1t&x6h0??-C&uk0Gh(D(kmi-czIh(XKEkMWv1RD=gUoNzQ4ZK67gk zG0YPXAx{bUKGAKk$M5HtVRN!aq_vHn-;0_04O<;wtqUDwV%Z=+ok#M?PhEd~vNW1r zrUs?fBufu0&Ogh$yT$j6?z0;8y-0$*?f*nWqJ+Ppy|Lo2T<@&stASNu6yR~B=g+iJ zuBNe(4_EWyY!hB*_b@up@s@WHSAqxU-vu+WqbB}&)}5qPmc@1MT)g}Rvz?M>F5^e+ z>M&n$tSoU{gTo|AgJpwS%$eEuR_0Kc?bA`yLUJ6ajcNmBR+DgC7NSG`@%f5aUk+s2 z&8sA1*zIi*A`pe%$%8WAkZ?^@-rgGTFEOF(lQIfRuASk|Ow{I#QEk__EpVWS`I&_C z!?`)%niKIvWxYD=auJH=2YYXgyz=pcRR2zcRMtbH1rlNGae zkhbuSOK@c$5%C^ij>ia`rXMLG;gS-g&SDj`nT3goD-kHyV20M|(?f#$G^u|iP8X(< zdk0`Ll9J7xFw86sA}Lw2zCo!S{1@{1Z^(B$>L-O@XlOV-N%Dp>%?u4g3IVYFe<7i% z|AsahQOo~AIR}LCf`6s*0I(nbAx@C~3p!*(G5$l`BFOxwua5xO*1wSLEdAX-7AICs z;Rbd7HMxXNfB7GXgc}6@3+ewmmsnErQ#b|ne<96qM(_YkC-b0%VWSP3)w^#9s|7Gk z@EEuWT>;W~5h*aA#E=hXShIwJAqw_GH=GLFB8 z1sExqG$b+}gfmK6gp?z)ly(7-aBV_A$=gI4I0R244{9*!6`L&{^XV%CMQW3RJR|vE za>b~wcbV`O<==q3*5~=6X7cc~4CBipZHe&mIY>^}))% zPWk2A%%=&bb&(bh^_y}BOPSQ%87c50gr+x?Wj^RJDe=Byr+G0t&U?PaJnKb=QGAdeGnGNuf2G+K z$azM$+AAUG=0B>nEZGjcG@-CevtT6q{4S1zj zwU0rwN-5fh7{{v$rh&MCM~!_J|El#rJp;J-mlrac5aYdlmApfVqvQBP_0se^KiZlU z1qvr$1`{`$yW2GLWF|Ww@TN8nSeSK^CH7%DzbmA*ueP+n^3D#Y6Qq>VwL_$I&*?iy zaO&UB4E=aqy-GRj9+hlF!|{m!H82~%TUU~r7^d`lToGnDXqR_3hcbWCq?^Ab64Vcm zEx7=hwG2YS;@fR&hxG-$)zt_dpsYZ;T=t^S$L3R)YuqxuYx+_G2Z_3TOOJreb_SuQ zlla*IZK*~9)2NIpbxmVPA3 zSfc^v+RAL<$cRE^Ie!4r~iryO!^ zxWMW@Nq|~Q3l<_3ndGEah-4(W_XyD7W95xVvE`+!iyF}@e*!aq@=7{lFKee8G-VAc ztTTa}+om5dLap+s&nHPg&d(c2M1TSELWj6V-CApa9f~In=gommfQVy#WC5&ar7`5H z8~RWDhaT3Fd5e%t#gIVk zj2ajwI}w198qa`U1E<3|?9OdmHLEtz$R1Q6Fr%&nm|;>NUw41faLL~(jMgl( z>ecL*A|oxK{cE}j`&x@eXHuHs17R1|_B@hZW=A_QZB(VJ<2#g}blj*#_ql`6L>>0< z#g@zo5)SMpVSjFTzAI2oWlP*9kOr(Ly^kuHeJtAZ?O-dG8UBqc=xMaM_gu@y68$Zu zvKj8;u(^<|c{*Kee!V3TVo|t1J9Gcr$C3w@Is<{(#ee5#PBY1ENcJdAqIV)!C{r@Z zb`806uG{scifPB&ER+LY=_NkD0P`lq4V)b)iu1NRz)r(friVjJd9`+7zKiK zwaK^MEkmC2MIf|xn)F>L_d_@5#IrX#PYwzkM+R#ik5tY4J-V}%!9;SW<7Kyp-}sjkpJywKZ;Eq`vuyE{c$V9!W%nTAa;$V|6^LZ`-UOrev?SaFy@1l9K{K{s7Z( z(d0K5aW!NE=_{CeHt47S5V|x3s9TZdMsM?L5Y8F*hz5So#y9 zMD#w0#5s|(4gzEuEAPe5OY{tvp1LGnPgk}Q9IX$1Ifn6`yb$Wz!;Cy7`AL=dL{l)7 zW4<_l->44At0P;#yg3t|3~{*fz`J9O&-@$-2D7Zwf<&8lJ;VJ{-54(KLu=elKC*?u z$)uGvpX+TdjZcO~UW#I+cbSBFi7IjR*1Y*_9A}tKHLl0UqgJlRXew=uZSP=Rs7V6w zPVr($9E!D+FeFJ<`3Fy01@5%{etUqh4xM>KSRhhFX2sb~aV+NQU?Z-gvME%#WhO)a zF?|tWdWmr>YXHN>NTv+pO63PiHVorV;hK`G(vR7nWq;F%_i~>@_^SSJV-Tbzh7HU> z(KLIt;rQVgn0T;vXA{wHnABdI;=Xg? ziE8e^xFUO@bFHp#aBF6wR{dkqp?0L&QuWU8#)*SJ)vLF6IgXWtg3t>ph;d<~v!0Q) zM=1z{K)cff9tuXpBkbv4r!q>X=z)K2|CPliV2OKBJPN4uFt&34v$Wb zTG{K7ute{}$o{p;GuMm)Rc5cD#gCER-Y?pz;u2GljF3VpEHnKx=;AFd|L`}`K|6D*URWKVkS!zH@-orxYtd`mt>9stjMBK8Xi-pRQ z0z?dXiH1wb`a=DR&vZ_NIai9LkFSRT-n51(nCCa`eaQO_IaZI(V5YN)ESp7kjDv*M zW_FgtlJ%i&NH%zbxtPu1Liuc@1`{%zcEiUFrLiqNswuLp0K3A``7XaYzL#hbtNrBe z@3LO=f-?Xycjrdgm+*~}6Gs|w=RB&etW+li9e_Cr>$*V1*v;EednROoO?aHARkB0m z;d);Zh^fmlRMlk6l`e|Dnwj8q#YR~1&(_JovT2F>V`wL#?Ku7)!}&ZY(SE*k0d5qt-P=^Guh!FRe__5$)M^aVJmbrV8|tnncwLvJoAZ z^6`(Hpp5C8hVrq=Q|7b5<=?5V!MWbHTs;L|T^GPX(X@!KD!YbXqtk3-wGzs_-3(eA zc3SL?+uL)P_tsBP7Z5K=M3^wian6M%O!zV}Jrl{7ETfSZ= zFWPGpjz$6eoVhUJ3jL=JdXh`-di<=b_aePD;kd%89#*`-zBi7~*?~2LdX>jl@amzF-=f}B`H7QgB(?WC` z)}U2b&hEY{Fb{^3+cb7xkyXEWn;H#-9S%HwF}NWH4lnoZI}j@m%yDsv8jQ^=!>&b1^!!Jd4ynSH%}BTcuYh?5c3sV-r6HyQ|ZcI@`nn%!SD;cD;_ ziM6{reoFXJ`ymRw&0vcR7H`-bGP~6-U-<@Medr_B+SR(E&5r$iSz0t1`E<7wG>GJ6 z5b95qyt56u(6a`HA}$q(9p0pIEo_{(pIRxI6c zfVJ`~nnVs49lk*F5rnwgLk0CvVq+>jWy=CPIELL;fQC?M@Ri-@AF|xr$wZVlOOXKU zakYb>U{jN@&7l0GqPjurhJn-vNW;sZ3ybSnjG6u`vKL><_E*Q@PYK)bbgbAWV(FxS zPUcL}K`GiZu$i-HCZ3!Zo%7YH!S~i3T3LPZcE8#30Qg4O`kqvA7a+W1q{TjF+kd)u zT;t6GVE`%1AY4A%`N0H^2^g;glX(YzhM!<=`m5;D%oxT~1MhR(ZeLr&IKGo`)?CLI zqN*T<0&UdmP{>bafoZi6cj}^-S}7Y40+@MMwKZVNBu+-X?H>nLbdiem=f9T7SMs~$2c;;b zWCzjr zqK(jV=DO~F*q7aFK?bTXhq^u$j@x5}Fl^unu~fM&G4@Q_j1i%Yh9dHGyDG)%#Dm_s_CN+=;kQ)FR8&RJi2AI2a~VFllEf z0kRMOkQHQnSmj(lTBhZ)V$@ALbcCAtBu>J8ZO)jRa6yc@D>Ldz(+Lj%C~NN4pBzrM zt<(k;&ktkNYxWdx-JXW!y+_@VQKkgyL-D*Nv6ilap>XOHz0KN98^U6 z%WyHB`x1Vt>q~TBI&LrSas=!fVN7Sq5lX(-uG*lFdu#XnESG`!P6&U^Nk-h^eP_PE z0{bNmx;iVM#AyKvb_ut%(JtuBffy!(_F&@&S(s!K(KgZ{dmU2j>fnI2NKTi^M2w<| zNRusO<*p?2MF8@~?Bx#GPq*?P4HpwQg&bl5tdcdIx3%^v1l$I*N(~_tkfc|D?(Tw@ zS5qQ;@XF-4vrnR|%E@=r%{!pK-Sb*Os9Q|rkR>WPK?^wZ5s%wPPgdlU709sh!&L!g z|3q8DA$X04E(?M!MH7ar}S+CHxfwR<>q2c`W&%A55kohzZ5T}cO=Yj!D8?m@(4 z0nM_0uT2!Jg^9$P!_Rj_$F?jXIbEk;XNJ&t44j|k`9j%;#G-*Gyt%K?Su|yBd?73S4a6I?Dx>Uff#3yF% z0P@XGLKzdb*G$-ljTcTN=LyX}zqf8Mfx4dAlr`>Br3uV~8doZWT2>|aq$7hk<9!w0 zXPkDbm$iFD#qCg7UczVP2IXS%Q{5N8Av8Q}45QML4T5b1UUQY^9@&%)$y=rDbn2lP z$ZZ$T^lZmC?8$FaQ08+cgbvqB&RLInjtf^~Buk5W<-{G0-d&$J+xqRu~N;rogCo8QeX;LI?Vk&+7h^Ro`#>LT;4n{^^WnHSPwZykg8%qh8% z-fZ{IQ1nm>nF5YnZuU_t!Vk*2@%ULLPb!=u<3kRCmzm@f^KA+fm$N(FvElqL(H;0wBK!=0$$mi*X-mE8RH!~aEn)(< zFU6{4^>_1$j51>oGCM}`TEp<4nrH9)4Hr-lSsVP?t(=5wK+j*|t^E}_RHD_PY>c(u z$0;n#U`=^h2H}}N6ZLaKxTkJ~%dG!WDEz%@G-jqV5cuTt#E}M z@|y4gk0(rVx^p^fWLsm18d=0L(_=44PcSoUOLQOFrI$zkp+GT~DwFws0{RQtb=g?F zzgaH(Ey#8Ii3YDo{2KCak*cCL9R86>y>*??ot)uge$iqMtA)tH8N8Alydu7}-mvI= ze1?}?0F6f-;I5E1hLWa*t`>U}b_N%`z1RRor^Zc3UFEE+@>%Bs119;`+TNd()Q-E@ zaGk}ajBv}v(YQli=uld3=wK4$xuh){si1z3)<)yS@D9rPSlsOuLde?^L^~b7HwL%h z9>U?3OzHzA^Pf(#*e*TiU455P|@6#VNZR)@TSfb~xSv%yG_ z?}fK#g?IFBJon}wxsj23{xd9p#T6&;Msw}Z>*w{jg^ZX5(kTRw)3R+vc)c3@4^?VrVPsNPn-gkcmpx#S#ihi z=x2l0QX^n1t3c2Yz@kYdN8jmXvv6n*xhe5lK;BB`paScNESW+!+M5_NirCNMO6%gx zaR@&0DVwLs#oY_D0Bjta@j)f|AEI@cWE07^bdAUk@7|m9+z+FSWUiVIs$GH)VmCuW ze|YRkYmTqKWhJ;?bxvJCTFtHgnO~(4#A$)UHT31|Un#aiO63h7ZS&o8)rO?tt{<4l z{o|p|&UWUvo3EfB>0A?9AeT_FT$CH-Ib0h#0TS&U9w>zwW+cZfOx)b%toM_aavsXY z^-7=q$LBQw(SwO;))`_AExCjBNe+>&jZEZL7ULSgJ+?bJ%ZZCHE+^VE!+6mjR~ZS(Dzv&z`=nMQ1fR@KT@%*5iJ^iwRM zm$hYZ(=MyUyK5YnevWv*4oE8|d^ZvyraCq0oL@Bkj3fAN!^Q=PJO^;NalO9xlc{%0 zqoIw#1;h?-g@S>Ai4A|EW3QXzw7$` zf6jBx%$%7ybLKub5+b^jEUk9sNAb!J)4?EGymsHqcOK|zh0bhB*Bra236AWHnzTb~ zDh`uH|1thhG?Dbs*`2wrNO+b7nCykYNx~8Wy+sba$}Oq>Pe`H^F4IBgzyo$>i;kWE29SMKHuO~+^~rKKNg_G+D4}8 zWe(AFeZvmpfY8Jo{x{?;ABq9++0i9FCNcsR?;rm>i?DEt;$IQ`Y)n0e!%$&FB)wX7 zB@?79D4wz5j9O+H*@ZfvBJ|L0{RGY5=10j*IoYR-KJWC(s6OfQU#tv~#wBFCs{S5-bn{@k~4Wa@7mp9>9kO< z9^VO1w8Hs!uMq1qTpR7R`y^T22NZP|E^xekc-{Adc>V3qJF%qU)a(=SdGAKqmTqXr zWgvawMIIh3x9~JHk>7~}95vhi_9fW2`1O2t(q+~Jj{f^?(p({T&mnDl`!Q{jm(orR zH4HOkQ!0e;p0m-31o<<*kxaBvxseJS`vfm*tyDZ(+!sq+;jFRvK~m1pZ_Ic3^2N)F zy6a)FZhcpOA;OX?;gS;hmQ;T*3`jsgACf!8SmG!ppED}vvs*&~OX!;6{N5R0F*o(J z>qpJg{P7OeU$fg#Ueft-Gh+Ca*Z4oBSMa$CamZkP-3Z*N;-JH^{vBOXCJdE>2DB_M z-7PeMy+QRqDLD$IkT*<7bz&bOhEqo4K4ba|6!4cqL0D=f!t{HNGsgBLF$C`$w^_C9 z=JVQnK0RRhb6;Kk%T|MOoVQ0FR`U7;;|FQjsha(c2aDqSr7kxk6fFnAucx^05Khkp z+7Ous_e$3fDM`y-y2LkqgzAS$UR)!F37uw7Wi!m5a6<2bx~}CT!>BNu(eJ}RhtHGD zg)(n{pKKFv9AOe^1P$WuNeCPk!x4Ux-v3EgF97` ze%zfwr9<4h<<$HO-tfjti?DK?i@{D_6sezvs8!0`J|WJk(%1T3XSmDht?RhHkjK3Xf-y*Tai z>w0|dA*l}k8)NOv&%)^!WtHj7X`_NUbgW^}aQE<#KqSODm|M%9n=8Pdm8%=C7xmZk z314e5^XxNs8jeDW_ zn_2s^Y42znyulUz1oeG*?o~3_=@02_pi#ZMZb{Q+9VcD?{o!3YIfcjXDz3~I; zUUZviN5v>%cEAgHg!-E56(j!KtrW2E$&bCBISVdl_DIRr9Q7XORP4=(L`#cG@44q1 zZpE6w7$WuIOkTS^6vwB&F4Uc9=@#+dC^#f)+9PjxG2~)L9f<_Df0I^7KKVWl7WFar z3s{#HC%sji#-Af{XgNdNKX>#3$*$n}lJ6D6PZfhH+FNQ+?*j7`RJo~i_z825NKL(G z^Swcb|Jez6=}t(($MMW75d?cx=8@4+fBv^YBWt0Z?ZCoELHv^^2`sx@Fl#VHIH2Zm z_6b2T^zJT08}cUsc*q;41`vF#kr&ggw*QFC@-D;rdH;@WboX;N@c9KQ@M-MzQNDXM zxQPus-?JoSoW2I_tu}7`1skNiOxQUK_fOhmof?Dw&3V@4W+nJY|K4mh6_y7!z!2@o z21x0i{7EqFNt7*GB;}#l|3Y)7ADr#gwfCQFJXhxDWnNxrruy#NeI|wuZXT56<@?^B zE?vzXk4l2c?}#1xkF@{W6bKE-dD3~7JO#R^Vv`a?sA7I#+(4--i+stw9zgo610nFU zOrT1yc9NkoFR0O|Qpdj?+&cs34da21w<@(m+RREJPkwBAEd%6h^ zq?DMZn080|7k!LTv=0|}`=he+mDmFi%GzvR!+um)*{VvJS+w(bMLS`R5i_`$B&mh> zo2F3shFb;vK1V0Gbhi8iptW!t^E2|1=kQq-@N)3z9xp_saO&N9l;iu^Xm&kJ{=-Hpaa<|;6I(5!*;a!5Mp6|nypTA#WP%0)3X%B__ zXyt>^R%#^WG#LRpCbO5@n>?pdpu}X!DD{u6L;o$4;(mY!^6$8n;MmWxM`wr}T9gWQ zqu71N+9TnW$1{Bwyd&13BL1G9+MXlvaS+^bhSZa+WFZdR{copr$(y`RI`U=5uf18d zO_Y>y%#MGa{kF+t<}=1R#e!z;*ANzblBq42DKi*q1n!Dj*|ys20BSBnm})2vhRreA zY3X)_c6I(!u|%x8CDfvI1S3ZDm%nzAs(q5nkWPsRFUG@;zm%|{*I+-%c_Mf~iEXB= z76+cI+RWFrCZy*)ENcA=#%LD~`k&H8Bqy81Nmw}Ev8z`9^}YAsXHnHxqyJ5BL{N6A zomhKMW+RoQo|-l&zP^??Z$JYh1D>3{&TR~!IgeI0Z!8q-q|W`8Sw;~2YuoC17j;2L zAl3G-g8lBFm$u5kGPYp&os1^bkJ;W|JI9;7>h59&nPluVylmhhE#donI?&ViTYA;- zq8?7_R@#o;e^Ld+Z&3M~cyGy!vDMW+7d$d0V-T6@GacLZz=ly;gjcJ|?_z$4L5odgyes_OmBh z^5<7`xFR=fT>zmX~u@EF>Pry+Rh!w1$(b_rAS`HISxWsy(KxyA;tW&zSigQ4e&5#cvs9~ zoRa(|ZR#0JfYkUfpIL$)SNt5KNki)_-6dsD!d%=Z>~)7%`DtUxk2gP#c63!}mYZ_o0>+ioPz$*l z;NCR#w&7%mu>U-Ohr%T>b3DZZTR`4mVX5PV1|T8nOLc9JE~TlP>Zu2^URta$hW!rU z)cXw7y;M4rOi=*Z^C=uQdauWM1$>A%{i*a{UrzeRsyD1irhy^*wI=H#a_klL}pzeD%q(?)>LtwzWIoP&1bgg;?ERdZr8A z8=vRawakitHL)de#L0>&47(|bu-}^NrD(Q2Mrw)2HMnH47_CQ>8LqwbN=;%&g42J z@THFprIQaeL~nt{S@7hzQM@aAH{xr}HWn{ki}H2)*2(`8-TUSbjNN@%595pe-TGJ( zRDc+$`RmF@?}=g>HggaGO0Ok$qVmFuPb>V;ts2kfR`4X3A&2}}+{5c|!cs2OQ33Pw z{3a%9%1@=#2Q?3ZuSRtcOn-`}!Gy|BQUddUV;`QMIaZqTnHhFdq@ zBd@zjH>seL{?`)Fj0?p69EDcozI9_rxeAqg+TQNGD5t!c59hu^Bc1V2BoUY*%qWf5 zz$XLb>vj_m{CBcxXCaUI{Gw{vNs2_!VH6%`Zs92L-}!)GklV)L9%=neMd+93V9VBc zEWo9o^dyrNs*CMo(XyJDn#Py$y(zBfw>s1ra2^pyVa#_Me=&vQ`gyXx;g^`W-Oaa{ zSEo&TNg4|Tu{MKv{VUBa7rq+!Er!|ur4A$-k;agavz7mKC{NZ?Al%?rf6EtWX3E%2 z1)*Nwwxp_PI$6Zo#oUNT^8RgU!ihWx@6rlTThm@cx4GDXeqPd{mmH7gb}SU$*!wV6 zjb_ieTpogq%*s9Sc+N|0ECldODVokr(naS*J@szVioejbYe?wWjTS}w)e4?kZj7=D z*I&H*$)Pj4T)T27n?HLWq9_w^N5lAO9$zvjn`H2r7H`vJHf9JYXoU#hzVspddUBNsgcUChp87W#aqvsWIqJQbUNA;ig zL5QJ7`%Cu+7nk{VH^ntaKtU~7a@0L&4W7&6y+8eH+IWj`f!Vyt_en!);ve!7s`^)) z0M4o{LT?1m^V6*hl&yk#CvM#m|4Gd8ti72bPXWC0Hutf4mqn)RcTAbL@!@Z>sY^7L z-USLoj`Wnu`&o_n%x3-;&TCTmob9tV(8=K}x^5k7s++th=yXuavh&fI#J_Y($z#m0qvEH&us}Srm?Wrn!`eG-_hUd3zgSRf{ng2Q>U{!gK<93j7GjT z+9MaJV6?2Cz_Mo)oF4@dpX8J9pwN>q{5tTtx)F2vuezz@dYM5+h^1jTutoOv#l)!n zgf{Sr^Q_|cKH7(kaO=&}X3zvnCADZqhJQt91=5t1lXYwUy{R0?ea$Btdfg_|x&3%$ zwsx+0vGu+lm_21GbUJ>%5vqIT5k!C1^%I<;;nzN&9&>XK!y7s`Dspr2K%acE5IQp79`!)@ zW8Xpo_}9jBM60{~*g^9Vr9ZgwGXJb}%U#`#7610;8UFD~H8lPaqv+ZeAW(te73QYR zYEbl1#VB8mgGs`GQfHrqIgOIM^id#fZ?sk-i4XYzbDh6(9a8w)CJxCi$838GBbXjv z^@;V%7@$+SKq|Igb$ESC760VV+|yG0-74j9x&}=A;Nkb_77aoHtD!#79o{mV)Nl8D zm#YfIW57k+_dX$_wvBO0)7fb&?-svIu&daoBt3|sb3*5Ta1OM6qg@Wyl|@%$znNgT zh%YLjOz;{#~l1JTmv+j;n~+>8yZ^*5;Os5$TG(DyxQ8Mze9e{@&z+ z;`mAz(fo6+E1c`>;#AVk``4jQaK2nLP}>qeM{V(kO6}g3q!cs5$*08}D2;bu;Ne^v z#LzK$e0%?^fPv?QiX*+jrpo9$VtccgORwr}f4Y%|unBgELN|`Lxbz(!ztG7GKj?{@c$zm_*(RTD3aIFwdkr1z|XH`Bub31%=9xz_+)7yKUesC~xOR(?f zA(aTF52udx^6+NsDK|^Usj`qIfVlUZpml#@r$gf`vTZ!P?1Gp$e7PPSXUhPCx(rR> z{e?^6Tk3;=wRBH|sa=}ctCE~ng1>xA4S(rA0EsFQHIr{8X!L3?GiA!}3=#iXvC$V4 zW`@0X6^Ar=i>8LN--@{8`Mn1qhJ5)Es_XG(x5R;Q68lX{$=4&Y?j)D~T|Xt5>X1dl zZy$N^4I2B>ww4L=`qwjOl)!z0_zI7cGL93QAi#BYp)1EHK~D!+QTh)nB@*NxDw8jH z05FxiZ3&CV_d!UmT>8h&+-u9P!j&#$_5crl&*O%}kVL7J#9 zT7~|Z_@EWps0#x-M}%XA_|s(Rb)ryzIqhkE+%RanE5F7%wu8S$gR<$5Z^w8YN?@gw z)Uy?Q1OsDnUqaiMFhyZt zf8uJrut6zt)}1u@lIe=wqD?+ByYc6(VO4+&|G-oJLo z=5GAYo1AEVLa~ZoDC8cl-LLz|#~5X*4O2|G_&|!+)1Mu@HsEo7qi%Xn*7Iam(Rn9n z%vhl$AImgKo9_Gh6dY9d1=W5-uOsSC_b-qx!>gau%kB}I7Bp@-+v_*ROj=yM3j09O zfAcu`zZH~Dhx0`);rbkW*};g}Hh~lfxJPXG(X_qY`=Xvp=M8$5^-2$=^%qnGRw2!Xjvk9d3DJ@#!c8mQO{}vD|lCOW^&D51^Rwz4r6tDNR zvc0etn^s>S)&Lyp4f-)+PwIPuqL?GoEn>d4PE)c5$V}^J-vJ9UO`^;PxVpx+l&>9e zZ6-5YApAzU_vXEAGvblt68>HxKa0aZ_K|7rUsr^=X()2?o7>^;Uf0zHhIx$1ex~NY%gq z*JqaA(=M|a<;9{c_9$}u`kzo{Igg^|@OYC)JAfuXh0_Z9+v!Dahk583Wf3(MI-B*x4t^aJZaQ}KOK|-JWV&Ulz<0Fp`B=)*_CvM(sbrmNOS2~SC)Dl$k!Bfjt(SoBY&OKMFI|RNA4?DV{66j!j6yhr zjVtb3FwPhXFRj`>YYJmt;Er6J*eF31pf1344|gkiU3srhV<%jH@bJ(9p|s!A(x*(L ztY9WGN9ppOyicbCGqJ$J|2(lj{s!GoVkPW)oV(cr5dgatSGM#Hro5%VAMhM0>({Ph2XV#reKM}*~%BCuRfmOnh|A)MDMQ| z52z}_=-oEs&X$R7J2WQ<&jaS`ktw!;0bDKLDWaVYMr&}48_~Hk>Hga`wGG=!677up zZ&y-`O=sgvj`Fc3u9>CQ> zyW01Hk7#f(Zu|ZnWeaZh_H;zxvf!mo|1-Vske(qO`i~c{=O(!G*|Fd^H4Lg9UW9F- zjx@%-JcjeF7i-#L-G2(8X^_Ue)Ox*jX)w!*3(6m=z4@x zB=Hqr((2MorACzG@Oylq&9Md@-Nt&F?y1p>TK+6Nx4oLfJQ~lFNXp+)FrDzc4Llw` z@0*rOe$IZoy#TTLgLT_8iSnW=VBX2@&fS(V`z1X~mbS0atUI!4sG4AZasnutQJI1Ch`2;_;>-8pkGsWQzDlb>i(Y|NHGS!ZWi^ zY+6w{K|e;MsWF`jEZYNGNEwe;ywhU`h59@ne(=vd{-*i6v&PN`Ke`)(tE&j)$Tlmb zopXN1Uf$gZTlDGy>>8Uvub z_iG_0d2-}=7akRsCR2j+h^WBNOXIg}0Vkb*lN?v63q6^^jNyw>k3-Yos7pY*+sYT(e*CPz2?53-aHo+S8m#_T8gqh z40`HFbs2A_RhB?o5izpri|(}8TPP8{B-Sm-`xKP>kK989_SJnD3Y>r1FlFbX%;p|n zHspQ!7Ax8f`9^__5)lm%LGFbWNm4|*O!d(OOpPBK8*gsERhG634hB z{u1bSkG3OZw4R5!ePi2NLvWGrmp0dWc4R+t(s2R>PCe1mnt3OOzp8xq`Dq;7#N9M$ zKdWdr~kDK%WB_F=Qn6IitfFcFqm(t_hbr>4c z(%4LNdSXTmVnbqQGkN1NCAi@J`HLL>#j_lpv1^4DJf$^pCUQ+I72A=K??OU)8CBfk zOX!Y0BQ@K(I{Eq8Y($f;mR9!n-$^~9b@#fn>6$t@wTl$5)O$ zd^^syiyb9bjiw~m=W?8ORPJO8-rF98`EFoeW8>gg|+)kQ%KF*xkV zKp6Ym0GjlV>8@{@_Jx@ZT-tFDcmbHx31$Sw5>8c5Surq9gOmR(h;ux`g%OfU!jOCX z;#8;u_(XAFbMgdWU)xi zBEaF({t*-3m>Jdjv86~qK$OQ9B2yZ&^ zLQHiAg~FAmo5b(z{6vjD;+VRYiV=zgf!cSj^>0uG%y9*|61}( zE{tdN@aVxS}nq$=v=sR>8Uo`=VVSF>8-o%y=^9Y(ffrIB~g?%&Mjy@C@pHy*%xY zezjXn+mx|;xL@0@iQpi9q3N5Yd-8tu`lm0m3bFTk`dhLr zVymNKEa6vZmk5U!fw>MVKi1qw-w@C3R(0_46GPgIh%1ID~QZ4zpAi_iR# zUO=rF?-CLB=Yk9@vs}XMuiu86UHV3quTMrux#%W1j?a7lrZ;&6$msqVpdEVAZ4{YL zd($*CjX`@n{S6>+aO>NV(JLsKF?ZbtN zU+3=U)$Id#DWlX^-%lC#PUVmP>2F}ciN*}@VWZ{p&4lJoWYTrwkS#R^1HPz1NP}cU zfi(NChQB#bD+9a5w6QEV!EOt2Gk4RvI_{GGb2U%22B&ggn;&4rEACpd&jy`Zari;q z@YFPO4fZ%DUy2TfAoB!iMTxPU^7g~GJm%d!8IC7)mv6i~y0wf*J29XZAQcIr_G!$-hTT$N<}$I(x(;0|(-K%# zjbKtTsQ=2Ped{0rww*2orLLXpSrZD40Gj@WHe`m@owZ)zCn8?Cxrdh3Mqc)ZzAqb% zmTQ-s+2UAfZ6|<;C+=#Tsa!Y_cFXAiM!tmjXj%S@{7;>Q1^6+sZz0IB(X7<$r_Pnoy=ox{7+1gTzQZ|0i+tjGY*cKD#f% z+!bj1lj6)zadx$0_7O7@Ae{b>^ELIasS%D!AGPk><6F3DN zcs^eX@F9soO7#hvBCFWD@og-`h^2Ds5RnQf{!BqyCHg@y8H*& zau>@p>+Sc-8X}KvRV;+p!gnO&K5YWVZA=_Q2^W%(O2AUN6;yv7bcgaYhsiGx@A=4Z z%M`yhr$EbLl$ek`($ORl^&^>EFEbt&^A`1=e-2ONdMn@ZwIY4{hpj*kY{;}6ci_nG zE$iTYlnh|pP1vmrG`;W)0C0*fMqXfG90}1cU-N0TuV|WYd0q3 zLJ0m|&!$J?FTqWHPC5j%XLyHwwvf9$+#bxMs2I`soi&cv?dvYqnIwsCr|75pHbu21 z#?4AN;U>|Rn8Tu9=L92YnkGaPKziYU-dW4Ul=b#&C@Nh}@0qL}c8OOD+JGUJ3&KZO zNon=|X#0K;T3Z7~z_=nowbsO&Hiu7uak(=CfcK3xBk;>HjAEyQIZBl2t{B7i_}l4+ z-J-YSq+mlT{nE=U675PuBi1&Jt4kf?Owcn4!&mCy^_P_{^LRmL$+CYlUwZa*&q(w9 zHX#oL)s&)%xO-J!n4HWAIttHKEs3PH2xnNVVPXshQ5M~F^-7=|Z}#4sk(y=i??2=` z{(h|e=u9HwH1ge&r&1~$woQY-c=B{dzTtq_^r{@bb*kRm$eru(KJjyA7@)@Uj?5Qs zqjC*tk#T?92_nY=ScX4O8>L`2?}H4qV|pz zw%C1E;5_;fi=+MR4BrK*M@wxLiNVjq^SJ5A+(4s6G zP7vtfpIiO}M=08RbP~c-WNjZYRMYIEhb%ZJ&3w2M@>nR2$?ES72B(gmp0QP59QO<^ zNX|$4%1;em6j24oQjA`0Vek#6KR&5$%qz|baLpBv7mm-+FJ6tJ<2J50rZ=z z&t%R9=I24)WNud6+R75Vj=zvxDmD<}Mtmvr7j|u(ZH%CFqD|7PhqocR2MMrqT$aK^ z&japXoXhib-}FfGrrKgbTxbGP$IQ=_3${cvu8Ry|lVwDlKky{lZ$CtIms}vnADW#9 zS|kpMvhU@rAS$a*UA}|hiQ;5u|HI81Zi;I@wVfBsXK{}DjB4rwoN|2~&_;ddxsuq# zjoA`#b)ry0ct$^)YcdEdfN>P(=U;AOOL@?j_TJeB11zZgP^IG9^x*AenlL$+tg6~Z z#3V#2pnclbTY3ag+pWj5NbR?G(65egl`w9&A651FsQ6~{&%_eHKy%m{6km~h8UaqgeEZD~WtFwHzgo~odkAy6rA@uIQ66EgRyrQR)GqaUls;35 zyhrFO(bAAztg&grRUM5PR|L$({<7{hnR}n7R(@Jw&zW`Y6EJtk(Z2l-1!?e0*KQf8 zop6})M@k)tEJAFC8Fk76r@GdD%+&o;rfY+Ks1QDh8Q0Mmo1>Rq>LQ&LIA0e;*PJLBYuI!LG-wTdz?v7E6)m4aNMvMX%AkNgC}N*wdw67b)5KBE%Q# zf=fn1LgJjFPKGXDa^Qo|kr?L-R#@|VP$0WylWGb%G|ESpP^vtoEJ@~F7&KG2L#K0v zYJ(Tc7>tOzM0`YSLQE5>T&SDmo&5g8MK_{>wHdQQ-l3~#;$4;BVUmgK$4B|^dhRh!bu#nzWWKNe zJieho?E4e6ji0CKPs@(CV8d^*%cSy=25S+|CzD~Lt1^K!{uRlfFM@N#n~j&5I4T9{S&DQ<%H!wV4jVSF>dmN7M@%h;GV_%qWWq_EA!| z?hKx11~f<*Vn^MnW&Is_^dcx8Qu<8H5hzpYiH!N?=Od@K-U;95vnu&&85RAez3eW= zfUa{`Klh9SdrL@ThEwB<@7UU(#{1dG(d%W)=~lD>t=w@aj>qMNbp2~}Se-J+^&VVj zAuuBH>$Y+ZWs;o?*COum82*0dl=9-{vta#@g7Sg4h~+=OZ}j8L9XNu57SHCr3JS~V4aiN zxZMj}0)8VQ9X8D*Ua)OC|I@h2)(u6YWiKJ@j}Q3L1Wwi%A=%a^QQcK@jI?P7#JnjC znH-HkCN;%;@z}}7>GWrRf zzd?%Gyw8w3s4e6Q6HhwCx`;a16nhU1__QyB`_N}V_OGulbo&=0!$!K>zv8#OJJ})u!y_C>+XH^%k@af9^poc90AkY_Yhw7MPKj+1Qd0Ss z6UUrd-%;}4QB~@fd&zVa%^~HW+UOp9~vi2m=Rug4K)z9N}Tv0G~bn1sU3`p_g z+>)nGJX4c=G5^^HNhzOm|4<%q;N1?5MW8+jY6#L3pv2c64^NU9>Tf81bU!f;5gqnc z^1>yf_O0#m;j!-*Oba3QeG>`>jQ;_G#o6w5%c`?#a@+*0y z8nJPF*J1STI_d+9 z&?Rgtf&ScZ6>@S(=$z$gjiPQ(xedozh`)kmDJ9DX8M3x$b%ZL3RcI3-O&kxR#*psD zNI9b1{jN!oT>Es@iebp6DZ#zg8Ys8>ms>j$f)U&B^-9BLesad7H~v9$h?6>UT|bS} z>)(dFRTH3F;qXHZxW3WOB&GZ)HbL&f>-(7GI9EG{`E0OiayCs#C@0RvF+*qClu0{V z>oY36$f_f}hJjU9cgLT4AP+DY?b804fQ;7Rxc$7ZL=NEB2iHdj(Q4%f zT3>$h#zy0Mo8RL2HKNw$QkQ9B(+%banR50UER;)a?!TWTR1v-&Bzkcq8o%o+^b=Zg zctQ6zIPG8itAniyge#X`s|sEM1Or2Vys?9BRPN9S#Q$fOPCU$e?~3@SGtbKrd>4PuA8s>(1Qhk0Me3W&hm603eFaoP@&z+h2?YtXdSobvV&WRw zjBnG53y?n z-U9=V-2B+GBZ*dAYdub0brw-VvTq$_tG7ACQ+o*>JW8xbNWhxN4OvFs4pEcj3pz(| zPA^%Hp{vYGXpA7!&vJY7tFfAb*NzrK^Y4QCao|fA1@;{j)n9vB5<0(C$@NMiz?EBx zW4qPQH;c9_ToFpQVyv$U#M~W^)AVB|S`p>jryb0IUoewy62j^1uwe+$hmKMF?(F&k z@CyksrMXCXIr0I9O}bOhGi*np?mIo&a=Y@io#OWgef3Kxjp&@%JPENW=$*801*O4v zALoOD;*j-n)a|c$#S;Z4nZM{Kx30?K-&lQleaL)wqW2cZU|w#%=KXntVJty2P3;@z zJeX6$ln^8QK;UhDgc=6VsPw?ORe#kJSrT2N*i+m0!H(^0?6}>`gGZX_A#vn2Jz?OT z2wMC6Gf?o@#;Pb(Er33GN#cgvOi1qYWfjKfCZcB5=$c(}KBfv^MQx|qc`=SH{jcPo z@X(0e{Gsw?a}+w5!TytJgTDNq-;{pM-=gKG^<2-)A4keY}` zV|=i{CX$fqOXzTkg!A(rP#pU;QK7wt3>XZjub>P$ce&%NX)#jA&lA5gKLT)Nv?<*)&% zC$h$@lsGvhFNYap@V^~4#AfZ5FT1{@_9BPws5Z>xlZ(Dk7dD83d$OTAo09|e{JrTg zAw*c8FV|r*XYnyn!w0MODwW@L(--TU&Athpp>~X35*5rhD2D%Ysx(QO33(y+ezuXU zvUVjR5Eb%fa+l>zCD~vNHbI~$;RDYn;yt+@R8hYGtV`NoUM9APjg7(gJcsKDoFEFF zC-<*RwG#JN8^E7X>Z?Ft_zCmUzNgOKP-TT3)!v%jDe1AfgFM5*aw4C;VyjKapzjGH zxoTCnu&s3Eom?Z!(M$e1{5mvv4fC8t?>X$uXt#Tvn zxXB&gK^#18*6tce-&jAM8pNgg$tJx|C#wrHrzgJ^Max#youmEMU;%IVNFPJ)hVIw+ z_Vciuya>)CK56&$!~qdJ0)`KW$M9cl7RGR(-d|9gsNA1WYbQC6qixyXr$fy_K$&`J zYe4rNS(sA2M^uQhM0%_2bWMHL6j9s6j6ea&z6t#pg%9vV za9F0)TXo&^+Ar-;oPy;|64mm@vzBU+sDn{klWsz2dKI3`W!!KQO1}?OdRojP;A8JI z{cJ$d?cEWQI5PJ<2Gk{e0^=clDfr)zq?n#zo1RwZikP;3 z=K1VDfdw5Q%%yBeETFP9uUyq&j#C!<=rPD0DXKPpj=1pf z1;7sp0l6a1j2da6&2MqI7S;;X2cucJidd<6bOOSx)8rJR_uHpdml=D~29oV&v}4Y4 zdZ|B%@3u++^RRh_gRtbj@Z=38G8_gulb|tx=aunaiKia#Qzt?a;QoLAh9++IE$XVw zhuam1@v$;G1>gQI^!zi`|7}>_BC*?z5T;7oB4rk^KOqA+ctjv7gQUnWPp6F;5`mwe zpqv#eE0+yeC+GtJ+KO9${9fH)Ve}cC?O@KB5%e8}jCRy~=fb8MD)Cj1NNzm~f613n zezT+(9Y4=iINi{3Zm3ow+A^m&!7Guwe8i!zn>6SXr&~1lFgeSch)*Gs0K^bk`{1w}DzbMFPEngn$nzuyc=Qn7;rTtXS@Hy5 zTsZxr8#`nr;pKLlkx_d_<>nc{)d?0P_on9~qC2$`*RkkLq=jzT8#0UCc(3fly|;uo z{%M?j+5IXbE#loqlQ{M_rt2%>%kJ+J7VOiqEzB9NS7PAjJ;Y9@ zH&EsYYHxmn{<{ea65{ZAPq+IJM`>^Wb<&`g;kFUoq8j#@aCCYcA;jW$b3esqb7rdH z&Oyk+LX7ICjgKx`yJ|Tkm^jG-2bqGgb0oLw^a>h2Akn2OclY7UsV0YKfZG=JyN%lA zVookxyI;iH+0@Q2JPCbqL2VYGzLXWXb94j=x(|e$z)&E_vmGX}RT^=;dFruOYBK;o zd$wx-E$WY4Kb6%K50vvt-)_%;GoQ&PSlw?Ls^yMVTKgM=3x!_zPD}@-9CnaOK=wqw z@mYum)m*#w3s);fOtjm8vB7H$pF6%AQ*}kDmtGNWySyn{%0d!8l0<~hJS;{kkju|# zi}d6uP!bCUD6-ngbol?%e0_uWC2ghL&I>2`kiz;97#8n$iVR}`(}JT9_cuV-Ls075 zKp?(?>Std(h)20GtnGL$R%Zb2tMSn8sntj^wK^7OjW}*b2@wC6I$4vfe?&t~ zuTArY-)`H0pKJ=d?=9?ccQ#=&qj~m^84M{AH7P1(hV)s)r`g5qc@nNkxMaUXlsu>G zy@zjIe+KWgSJNu1#z2C^3x}gb1rZN!6d4xQdpC^E!R%bql(aRMj&|LpcH+A}%NHJ; zs$+l8n@#RgYC(R!R{=7OpJGOxB(zu*Lg$CgPnYULBQSi%Es8A?S_XN`1O=AN!(1B4 z4`P1&hW_bJW6u)wc@%xMcWse*Mc~(ejg$KEXLY|K8?E=esuUVszYqo*@|yDK(Gd*q`BqcTGbyf#PFZ}@+{@hI-|G-@5B!6VAB20-?2u*|L&lJlYW|J^FN~+)RZ?) zQ&@nk>c|#Oei!ai$qJQ!rFb7VmCbi=h(U8uwdb*h;w)6*o@(vfH&>ah4|f;X-6xij zB)y*Hsj-rJTTv8j6UrwSOMfpLL)+kU^FqwtRld_-N93n)g2f`IoUO~vzoFju=L@?y zu*-R7LaDWs0y>s|5e&6>*QnP7jS@Xlv_?(W=P_4JLT66^E|63&9+KpQLqB2!(TdDz8{Axkcy#7HZoQWy08vpb1d!#SmDwzJ`)A87;Ezf08J#4 zdQAz4Q_v0q_-m-~$@;%YFw}C1A`NI!h{5K@oy_Lp4+QRy>gCPO7#&6v7kWVAIs+*IPr%+(Yqu69}6%9|1Tj--cFsAtkWcwc~q=S z<|`OWt0+VYH_ulkeE(eHW-G-THLcd&SZ-9BKCW@U!G@*(`_|gaLnp<~zm4LUk+n7h zYPlg4yZYspTFF)#jF(Q3c;xqgG<{`QTg~$}@)QabFK%to;zf%?aWC$!#ibB}YbnJF z#a&9V;tmNxio1JoC>kI@fB<>v?|;2tPfm7c@40to_U!J=>Ei_S3c#GeIh9!Z$^Q%_ zeDF2*2PLuE3oRBFhlpSl&()#64=Z}ei*50biI)sVe4$6JtJM`IdWbt2iN1#rXc6F8 zG8Oz~(!Ed!&naH^aiU>pk@*glI@e&40TvIL*jU3DhV#%9TvV+4BQk`$uk?6=;F4WZ z2Xj&bUt#~QU2&wI5q%Z{icx?RqlP!>Pqak$(P@}(K_7j;o?8xBaZ?OV#-}EmQMP4} zx!`xx6O8}15mTDdO5zP>;xXvo*p&}seJv^CZ#;jTYZA3Pgv`R}$SRVUZSJDAj>ql= zr}+HW>NiWq=CO}WQ(!FF<*sD^6Xw; z6sGGmE3~yMXU%MID$ZK7i`8KbU1piySA3UPmnR)1_(AN!v}|{wuusy(chAeex!;(s z3?A4r@%u!zK}b|Aa)^dL@3=ctxvQANE!*HW6z;Ej` zoNQh%>Pm8`I!+cJxKW-sN8jPRj!)m7pMSTbwcq2ziGwT)WSG7+T9VhBE!^(Z8=4`N zFj;rqHbcUUwO1!Z1}mS!98jvF<-mo+U%&RGmnE-SG1->0NBGlc7`ss7rXJoVpP#P0 zaWn|I(|($CjWH7W@xG~Z9Ey1(MSpOZK-{JQaqy6H!{Mz56@S`Z|PvG$JDK9-LigGI1;M%&CumDasZ8bFCk4+!B zs|Nn6v#rvl(wwDbSmG+8pW$qQ?J#4$n|EULxDg`6K5t(I$Obca!rb#+VmnsGk6qtS z`QMfv+&^q?BLUYTD3X1aIeC?^_OI*&Cs-alo48~Xt=Ol0cHbHYPiCO%3ujsE8?@KKQ(|IF z*bouA9R_muTkXxvqoAG+)uVUZJ0=&ZBE`HAE^|CncoN0t)XYq6W9`lU+4(~U5)u-2 zM$hQvH5iwza!?eZhlJFImWWF{*Za`a%zA*)H-_jUy-Jw^NV3K5H@q{aqkjfUxyZ{s z`ejxv?uG5f!`;nVfCNbAAs7PNX!1zz3b5A2L<;GX(bZOI=HssnWJv69W#$3H#_{t+CF9#O1y1M4|pI;*IByP_)?BTdBbjjw;=L~=Cf z81%)eouKID7}16UG|9<)`ctuedQ%H;T+E6+0L?wk|A_taF$Y9%fBLdzw>CFBa%DvH zV0W``(cKLQf|{Fyac|@Gmw?SuTNAe=OY-;AMxE~4{tdV1L_eWDF3Iqm~%{xU)b-iKoW0jv3yrbbIKDg;kvH=-v1ef%e&Zc;ub%>y0gKfe=-R(4z zzGa6xQdToJDRkd{thupjXmrE^`j&c3U*EUbq~7bNyd`C#(vJewa~!pGM;_cY)md>- z7-a2}JPIlDnzr3u^}a_8rN0VsyJX(TvxCXshx$(y?G&!`)!^NAtgWtDnC9eej;wh~ zDYK#wHIso9g$@-JI$tgRwC9d{Lmewg`y`WoQz1&iC7=Qz?ZgI%B`2g1n;)wk(R5@BXfG@S_Ee;0h<`TW; zv=7CfpTN8CLk{l<39={rO8W8^6vg=akJ@D;_zfNNiL$o0QjM8o{&UU5#I(kl_GF@* zfv-LCo3}t;7oUpr$hNi=sOgaAQ`*}G;jE|2MCJX67+nZ{9AH5%GSQCRmLm#3T+xAmn-91=S;(>Q)Fbh=nmYOICWD* z%s-wUIUauq7^e9qPQNX|{kExwnxTdf3ORbZrbiMi?liL^q3X-)?A89?me%i@B9@~2 zFxRpLQ%FFUccbv{z6c4aQdJ((kQsJ~9g>^a$cO$0!1n@v|6Fij-rOb6n-F40;yRPg z&!*o|ndQZETs7zaLr=HOq6afL%j9gnZNE!&Z2Y%w9f$i1Vy`m7CItzGS{o*c(YRl7 zgCJ|7D#rnr+>w1(DF6c2cs>*~5`>oXb-kZirV0P*9n@@i<22r>)xs8o^3doi62H7o zoV4|tb{RVgp4;8S1(7dD+Mt?i=vV32K77i4IK51g34RVpFGPr2&?ag0ubl8)t|%ug6-&) zdMHD(ZLtD%qrh+ZuzQB0cmq*?_XTucTO1QZV2zy9LduUAi@WIZwgiW@)ux>rX$5M+ zP=|_|pq7x?NkP7 zFcGU%{#yLUc=?>*7{?6fn={}i{3^@q;TOkCP_fw``ni?guiByzpX9@gOXQDgA~F*% z=O#Ntp1~;h3jOJfn=|@kdC=TEKhFF|qgft<8Q8T160Cn<1cq-apmDd|f3M_suLE4* z-NV)~AH_`|#9Is%uo0ZYhmZ~Oha1xlOLuc;TV#r+uhy~>x$=4_= zE>4R}O^gA4m&iaR_K9+7DhQhEf!!VS+TI#}OvcBWxQ5+MJ?PugXhOI=yiirges~U8 z_0^%@u;gn0rl>8PQ%f#?JX-eanpv21j6g>h!x9$_I~*9ehq_k>4}P7zvcP<#U6X`g zwwgZf<6m%_tum0p{=qafTB+-I3;g}Qr}SOm_H$Utyx>aL^IQ4C+=bC;zci=c{Uoc* zzu^L0dgo2EgYe*mC^65VPP6zG*bDE*yERODkUU31Lb46WUvTZsfj3A@J}#37S(^HL z15amQ`;p*m)0i1VCxP&LNq#j)VvoVN+Cd5ld#xB}U+TQGM- zUNrj7D@1ZrZpJ9L3YKDY(RFw=|H@xEW5yH)QK{eu+@7NdS69W5 zHVKMYqx8vWN{CIYBmYh(1#rS+zyGGSjBo+Xk&mS)n93rCy+E|9gZ6ND7QfCbj{Mc$ zcB~qTS@AQ5X0Xp$zKkD2^H( z@9v>xY)o}aOj}(lTs(-H`)8AVqb|M1;P<5&BbS)mYidIG zN|U!Zr(!C90d>yU)YTrYEt`j8r$?<2NmI9x^aME<;v=y8GP4q5%%gy!xSg{WKmI_fRl7647TyjVFOGCjc*+Qgv}ui2S7YU6;QQ4#W)EMH0J;Ay zN*;Nzw1%_|Z3Q0(ALWGy`XaY4{UA3GO`dFbt2L%L?_~lrdUpN%blWi{^Ej55t2k$# zB7$jgIg>EnC<>xa3@@(O1alg)*Ii~pfy+Ir&4M%gP=kqfr5!Ly_fKb3>%2Ho#LQ`AZ zmPFIv1@fF*x0BRT=b(U~gEhm3BF1UG@=$==(9HY&tpu~56FileO?dU;CC0g;pP3yo ziN?sqBRKd|Ur%7y2(3P63Pj(15yd4@qfhGhvIR3{35FS#<>Bsnx_&Sff^2RpX12Y$ zPE20vWnXQ{j-YUJYrZ48m<5TgMV@Y&uaa0vQOvwuQ42>NA*e#Nbk)_%>R#SYr@fXbqf^Pqk`NBWSEQt6N2hJN`dQLfg&Pd$=#yCkTzN``O2*G2% zpVMKPGgH|Q7@hdp>3{R#=rdYSv_Fs!`{pSh_%}wAK#kh`pe0} za(S4h2Tuycj^vb;MAAv404Br%_JRU#*5a1A^RtRi-bC-Ho844U)ASDTw-J9`WQS)# z;H148-aJY2VV3!PC&1XO)$jK&`%vzriPD@r42ecSodx`T>V6#wEJlTKat26~v*^L_ zzJIWzl7WZh&T#u@@Q+!?{5)9Pu?$M}8|fbW$)1$k!HHTun)#Mx$5@1>y-zy+YIvH< zO=Z!;$Q&*!{Cu9DnRZr6mMA{6pso9QxX5?a^>^t&AkKt^G3#||+F&EyNPhyfb)nuX ziMOWQCVDyd`Ywapy^h90TbHK|nAjm>lg^{dBvlHR{_s%MiGpvEqCwjHThqLRK8|(q z_*3@h=eet~26@+a{9{^M!<+pw1>oKcxsXrCkP3Ua1S@?k)pjmZg+&vdRMbeQqY&{? zESFx|E?XDE{Nr1YPJTgrL$K12k=xLKTVQ%sxGG*+@GxH4I$+ZCd7qTfH6Pm~Nmh#q z`>YRyj#25e<{ugvBK$<(yPqIP7Wu}ykN5i)L+D)Hy>UV!_cSuUZRu9+JO$ zTTZ=UHs2$Z(b-XrWOiELF$=8$*+Qac&9^VsC=X{w%Jise^E|h?S56bK{rqH->ea>@ z&1&}_ZpZ|b1_nkG_uxuIjuCDGA})BCr^nWcm7bHe%hPh)C;ez=9vN@6oNRAnGiEAh zklgp5V#rjEHPId^L{=;kTMmU`DV&;>Pvk*OJyl&<0B7!VGi|f0uY>tSLuGHc2MzQq zT1~a9f*KOQqNhtner==nRB2n-@nW7#U1Ac}8=(>~0{1BPzGK8$Uc{oNSMzUwdC`C@ z7FfwJ<=N)UQgV~v8V}{_HuGja;P2tP0bfOXu2MkOZA0mWPVnFu82cVRM|#gH*1BH# zaUON${RD@pXwA1g{`{8QQRlCFUlCDd0bS1AnMIyLhxxU>7kq$Tfd^%k-fjR?|>n`X59smHp%^usqvR?=3d zi|MGZGm;lb1Guv_G0cO|V-MYGg$*QgNdLLLPdN_B#aC|_QhW5eVm@W4tnow<<{p%iu)TIROnF|Y=xHHkazz~|zO6Gpo`AeMuk=5Y+ zAevPSZLTt52J34Lq779og%fsmG&H|S?XuaAv!xC#jzFw~c~nkvMX`6=Iu^*#Y)wi2 zq&-0CE@i)f)a-t})K}qt7ww zEBs$C4W)&vCw8NzhVf6Bu%Pc=bG3l3Ke&p{{|@_*i@qh+O8B=`OD^v{fbULz>`fty z`pRFy)eX$;wBN`4hqHwZiUIt0u)~>0=aizo6<9e`OX1DUl28m5VK6Xb~IxsGCnUOa0 z18TAs3&mWvYmWTa{2dQYxc-QG8crAU@w~MMgi^fLF{m>zxNY^LiS=_y^3127S{qjO z_(UlBX_vL#cU`vKyW^W&F{yjsy+PnVzq$`nsx-@{DL?rt0*jJiR4aeV&NF)xKQK$6 zCt?I4Q;4J8$YNHxN%$OrW2ST{8*0EAXH}(SAYa%<_?;TA!Dfnw40T_gXCN+BzZZAF zW)}`0%NI$_Ps)s&H*AUpt$EbwuBI1AO0a$UEc^=0!!n->+qdJn*p3hx{J38A-NJPo zkoiBos3=p{)}KW=D!c^`q#19^=hnp6t8at(i`-&L!o1os9ZA6}cw1Al-END;1|*nw zCH(du2Wd{HNOOAo&>e=l#l*d^E(~6;U{4A@@Aw4opPm;x`Qut#H|m0gPa~{7eEdFu zcW~Ja=agyd{oLkI)pz9QJE_BIhswFb9P!Pk={lRx&vKlV=-7Q^5{?~e}Pd$E6k-^>tY$%}4Kl&@Lgk@)O|bm!lT_0Vl{5-luDFPC49E=INC zMC`96neOP;*Lt%*u)SIEQTJDO0)WL8FhICNt)$!EPv2||ZRmMK(3`-1o2(f8*H`ef zrLkP~!e99h?vnV=OvP{`cwN4@h$#|iS27WHbL?4>_}4rzkUTNxalq(2_{m1;cCyKi z8%%_;f8GPtp0xY4Z(%0mU+&8`yGvB{E@;TlbeD>em(ZVYj@EibYq;vCiM>saaJ?0E zPcCmDwwB5x-4N+>Ffb(frPHXwxL$sM>7{zyz*wQEV`w%my}w{nTrLw?T9<=skXtO# zwH(c}w>zTCpsjQ$B^pa8@<4?i@+8Be(c78#vE7X(+cXT;=bJTH*?h0jzGN`)p)E(Z zWK{PB!wwz1f=|z&wW3#Uu|_#>cyI^hmKU0LPpF+v>we{uDmM7q#lO#+tK9Na*Ngz* z6Cb*er&|JWO;^IvA)|y_9a@vscoxYEJ1&J;v@m=AIljkttLE^Sg<1PCTiu=`J zK2Tz3?li)%bD?SG)R2O3`!bGv83?Bv6IIsn5jgj0`MQ9O5QP5m$Yb!LX=MAv^Ec$! zEY^*>gZv?Ki}DTK=2SPig4(aej4*8%vmcKrO*5G5M67t0w1$1wxLb+t>$k7%fsh4U z&z>FL*#IMRvzCBk;NBx&Zpm}0k8!USW43o3FvPjL zxhrL8jxSrBedk{<%X}sfg7f~GI&<=NwPf)tGrI5mzF>czn4%#Zv>h}X!Vsx0t@ow* zERQNru{A*D!!qqE&?8mL4&&XE-9o~0j-?z%NVyV>`UlWgS(&1N;N#2BRt6pR zxnJ(Hw_3+0emMbJe$q~+F-s1Iy2mzBoB(s{`;oEgejpqd*=)8`!4kgwqtI$meLd+zS{HJ=}bjAHhy zKUbTq@&dNldOkzwq}*Xve# z8$M?6lz_hgrNX4lK9V;lQd3!Dadu zBffg$cIlX&NjKHdidfTGteeB{T^I-DyfOK;L}MfVq}Yu9j7$fkFFZ?pTKo8_K2T3g zkJs$}-4@)9Eu>!v_O~NRi zkg4<4@zS?>`;Ol3J2V)Pb@XK}Pl$kXowowe0bZpO)X>lz!CJ(uF!M}2P_-j7kFoa| zc2T>4119jE&-SH}^NfD&bKkE2&oqU^ySOUeXbl zI)o5n!@6+AoX<|n$7my1#9r$vxDb_WVSWWXdNpS1j#`Ne;!m;~{YR;r&f`17VUc(H zvQa8C>9?xm}m`f^}I=Z9b7f>t3FcNB~+u-*>XplC?U++{3q4M47gN?&+^y zLmeXMYND7PE6ne07)(O{P19pF!EX|_astRxa{cXB9nanxxDFHT?i=@KAbhq;gOVaY zo)+Lu)Ji9cvN0u@N!rzUbN#nZ47+W>tUX9@d=vCc6D>5c=pCBhMr}dkuhkbZqHgfa ztQ5Ro4|*#0h*&hFGTC4Lh?kk+vQpZ0-Cr)(Pu~IkAwQnL2k*e11o-Hp@`L{heNEx* z8+KdA3VS=MeGfIIUbDMn_nbeEwZR$Ea{2o9)Ah7J&+dlK;yOM?4kw53s2+(W{g?{e47o&Q#%5_i{#5hzN#J${9S4J%1u-J^5 zwb**!Q}T4iIO*G&8CAAEE+IjuzqIu-5xSISX!MTRa)_25_4W(DZ;d#UA3%kgm&~ED zbf(~DWeo?39h;Ru_n`qoBMj-V%@7qBdSKX&0XUG zItFKP&c9q4nbY6|2afyb$F(HbJrkRl%7KDvpSF3w!MOXPXrz^XkEU)t8x~bdAmiN3 z!3yz>rUM!nqWt;}f?R@vXG35sl(QfuW9X&qzv zp5d|4vzC?+@5}YKU>Np48e2lSUjE(pmaT;_H>C)9e>7>KFS732;kMn3?X^N#bUp~j z+MIhxnvHhpStq$34C3w?Tclx3TGx%S{TC2%T>;MnJ`<3r!86m|Y3v-#^!eerpw?e-dUa&ctpS>E*b?M!gq80ydtYX9USlMCC`E@0#W zb|Bri^R z)K$5eE<8qJ+>@Oze*>kAB8bPIs41(uuJyF|7k#9bE&rI$gS&g z~Euf!2a<5*h7qeFv|)^Nf=R39NA48j$9 zj}UNafRR3-7J#~zW@eKwbTiEq*)}=%+Ix%o9(N&U@$L)KI|tO{=WAHAGlPoC*YCi1 z6Qz^26FVzt9Qpz4+qyo_FmF;oc|?E(>e+sPVZJii66#Q%$^8ie?b(4^Ei!-{Gh_0Z zZ>!n?_T_5gq&#NfqMc1rpV!h>Yc`}*#CMULa0bVrfbePG^>?MIC26dlsi9S%b2545 zb!q@Bfr!MNn`EH5Xb1yP$xy1s@2TDIWYUaOm8Rc5VIK>PI`|x`9$a1%T(w&@1T5_V z;-Ky2Z3Ff%4}K3eesOaW!kesLNJ}1D_a0A*w!Nrg0R7W)+nq9)hC+K&$-P)_<`}~Q z*h&Wzx4z4t&sTj~?zXtO6}FP;RCCHMS2vOHS2dR7`q<5{T62q2P9vU*@y;W+4;M+H zPaeCw6`&22`t)Ws3EJjx0O67=y`3%_&Z zo4tCgd`Yi%x(Spw9HE5*0}vWYhsOI%Z2;SH9bG>3F_Dk)9X`EVdE6Gy0(y`aU-o$Q z|0}_h!6la5IqjF%&kNL_ATiA-4dm}cmz;q7v!=C-{N@!(|CN%idJlxAinIcAMHUl( zw4~J$rl7E3@UIAt%7JXbl;V{9)Nk2d_Rn>aw}0pEH)N8Fe3J)O#c%zxI$`UFqgMU? zXAhZbuD9$}bp3?+NJ%_2X_XY)vT;a+;vlDMjL=;lKgDvqUz`M(>9rV^ue7y1;&0EE zbL@FF(Xtw}d;JI$F1J(@rU~BX{qrs@m@dOgxx+qW(A2><{7ocj{;ci{-6_XDtp<+| z-!PW#2Pi4NRLIS}%O0XE%h*^}eLFnLm>IuknD;&A+l-bM`zdM!TOg$Z9D1|M z;D63ry6T;#TlWlyNm9?4iuAPA15rGOkcL>o#o=jk)I~%l3m{!p^Kv*ExR`l6ZdCVm z58>o;IzYpQjl`*+!_Hn`_iuxxe9)V1EFbR`e5p z|GK6#-xC!+5@t#Vo7Y^H$>|CYYC%I-d$MhKAJ4obpN|k15Lg?<)n6SO8gNopkWG)z)sS#c z%G9t_eI_~z&Tnj_Dr(we57GtoiII~TM-2#pHz_UBVt;jRigSISo`hcp0(}073ZX{i zhT2MiT_vh~f3iVW7SXmpE*FImV!n9{QYrR)8&n(|ku0m#s)D150f`0$F}zzywE|(8 zD~}n%rMwUR+j84bl+^KWral7xuetuf!oK|NwsY!08A;QD!bk(0w zalqfHg>zWharDD(uffY7azQdw81zoqhQ`=gO_dA;anfa-;t2`7T^-@XP|I>b7OQxP z<1sPL>pPS??~HKB8LSNTC~9(^OxQg~LRmst(s{{4eV5j*{eF#d<>(hfykCBU;nZU$ zpJSy+oI`k-tB;()DS=uEQ$YJi5Cg%-l9dj*{`=qyn+3NZv2KoO6XMtz}#;KhXfA_`7yhJ4-jR*^yPoipLLZjxr@vUeEQECqbRMR=y`Klr@Mdom&h#&6)u zO6r4utV1-Qh=m=qXt>ex^r)k>GAVRyA11=_3H5R+u7t#$xTL(&_&*zrr`1eWfBG7n zN^P`jHV4%)FrRZ#XMZ;iVG{9RDe4 zVy=d;R#4=_&DHI{h9`S`GVw}l)0#swGTP=21Jg?4noB}8%IvcD>?El#XZ%n1OGna< zQkUg3l?}MpkW$2CuS7T7#ghkrnAE-PG*J&mQH3HD8x3qL>Ny{01Yo>dz}b+Hx@VL1 zBpnsXTvck{U^A50g^fP_pOrV9kKp|p4^1!jZ5*R~q%-MT?cFM%2S9mdj@>=LfE}-9 zj+A6|nlLCr7@}}d8t}{&!Q8R=DEmlvwJv69oFJDHz+JFW^1&*ob97}!RgEoo84Jqg zEe9gYPa5<=FJhwgh-UVkcl%7M)x50nbqI1%GR;Q63TbEL~jp!Hh3B(T_PN zI!4T;Ot24LhJxaI2U1bgPIpE2-oeQmkte zfD+Zyx;tsZgp*(YBM8Cm?SAKdBp)g4&uS9;pjq-U5hByMoOZZ>T@Gg9@&zRPZU1R; z%^QWGq7KrrX96gnUTS^lkJ#@#S{gdunDZmJfQ~}`1&4kuM~T~`CqA1LB0tx326R6t zP?Q3SpH4aro+zDP3WYp%W|jIp4rBrm?HbQtY2tSD^cTiR1PRCe>wxXo1)!r-e7zg% zl34vJrXvYKb>a5EUwG3fk9=}z-y2QcTs|&#J4}8lOWk#-a>4yu_pi;@OKBt#A*^OQ zK^pQ)T8LWSkfj&lk86fCvQHsp#_c`$2Z%K#ZvBWZ@Dtu~%e#Rmv=Tt+tt&rc{oO=L zjB-OD7#5aNCpJ%WG03rb8nogA0!%`p<4%u`d>l4B&HFdj|9xE8qXF*cno@2~^?c0Z z0S*8c{ZUW4i>PP3iUR?NDPwFUTiF;UjB;WD33!S+QjESKvOJ*8qQC-qUGS;xo`ihZCmr!858S&2 z77A(+HghrbWD64D(V5#H#C;mZ{L#lJrRPI$Y2fFG39SljJ-v=?^Ji4-pdjMsXI~EXBt5=sczW|o8mFUw^NJzmT?vti zL4FGmA*!Ea0_C?OOx(iT0c-v1AG21lWX8A-rw>{0>@HTY!}}y#_6bFF5!x>MWnLIC`sgKQ#CoUAaW!|0ua9A(_x2 z>i6%#^*;$;*(8p@4WJ#1meKPh|9dd&{<9I9$^ZDP1-$mC8^TX(Ue_x9In_OXw zX%{WRHqwypgxS1*%#(b9=QQHu04;sNOmhc&A_^F_CyM}O0uqwdz+?Z2Bi&r=OA3|P z0k8jaZiKyl{7_+N$dOIdrYIms8AB-Z{UV*?*MH(sl2a#akAqCM25Rn6eu%cnW##0P zK>Gi>oeq%2YvUL1+wwDe-3mqj@ieGDu-=D0A?`gs5D_fI`=dsD7?cDFV!66?Qa*|& z8pr8MT>F6a?@b9_ht77jcw=9se#dAqT3=*Sqm}5*x1#q6 zX2PlZwB*Q#N%vaL1cSS3BLadIa6;a-Tq&oSt z;$mxwPr)+q3aEg=CHuqg+9zfX=NMch7ltfjfJ^@O0EqFcPd$KoI(S~R|HnfZm`Lm_ zVj;Czk_u;BZ4j#cKK%IocxXev2U1bc;yNhizU;ouwp;~=w6q4#^Kv*MA$}i*3>MdG zd~Zi2N}O#w`XLBKR1i4o1HocoHe0`9+N*V2|M7Ii9$U$Ejhy{8wuBIT{|Mi;b=y+& zIV9Q^)a?jHqbv@2GUzh*U>sOHx&D_SC9_tqx#=;TcIWh)$O{fAMNRN+?2+uN5{#+p zbJ)YwQ+e+!uzgNIo}H`YZ19!xZgZ{)1$mX;2#zCLgHuQw2Jel6n7N94EKPdy+OzAH z%3SdK9k|Qq^5SRsKvsOd4WCzK*C)Ho?k?Nii9Hi0yScj0Ay(k_4EhBY&c|~dDiztbQ)>k9fZZm;>JSKCJ}R2>;&0p__45?Z_*%7I8KHob%mzPyHa$rg0Szw;kI9TL3{ULiaXfr zk{K}u12FysVDE%(v&;1$C>pXBqGo>CD*s zcYWgkyMhPTvZ|+D$7`0FbiMV*)E2QFpZ4iEMAB>7sl>V#d3Ehu*>Ri9-n#{;KtI7lF(@| z5z3Blc-uN~I?|KR<52_Ix;uEK4!U1YD%{s7!;UGA0`Iy+M2^V`+@w&N-u4&!()-R` zfP@}8(_iCC5rl&I&U4PO2Ytm@RG`G$+@6~I@ZH)a@$*x(1%J|2^6iNtGa(UZX(LL4 z+d&ZhtZ#ixA;5w?h~C8`DgZh4k(9?>Cn=s^ZsX!j^TYC*WX1iBQ-(e)I*P-BcJn>q zzQiPXL2uo>^l~iXKhpeFSDq4N8ab%A6%)3CKEl0{N^!yeFwpVR;E-#iJ$_P@^=K{F z38ZO*5{uTujcL&OGa{weX*PiTU}}W8II4aOO6f`*%=#pco`cO?jIV^&ua&9o_x@z; zGmRNmfJ5b&H|8hz(EL7t)c6ubcZczVBsMgD#MPHQf~3M3d0<9yT!IRm-8H#?X*aVG zq>WrZk*0EFeH*ICGZf&(EcQwM#ItL_Va+=dq&vReNY2%;ESd{vf_6wZVp|j8pK+V?F58$N~N3hNodyNEFqMSLlWmIn4-kw#m)$* zlVf>ju*{bmt-1zE(`KBji+sdP*w#?WjXEHQZBHJk5W_xaQw=FnZX5BL4Yu@6rgyDG z>DY|hb_tqq_uQ2bIkfn%#r1ShI#%8mI7}gbfEw=}>Ldb|{f@R(1^ppy-IzGO^25V@ z3jnE9_MinU2>MwZaGoRi&N-U@_#r^Ux#^(n%RAZ~Z}|4aJza;WVqolmu;@dcq*TlU zjOvV_HX^Ll<2$G_OLU8%>d2bu3=a-_wR5XP^ZYHUbNJ=%h?or_Wlz8W0DrbY7f^3v z5#&zm!T540GA9qw(@wE=&VUttY&Xf=xo^BW^>ve!oqqn@87^7!01I|qf6b`444CUt zwqOihH`$I0Sh9QrW4+Li(nhTU=})*q9@7xL>gDxce3Ngy*y%f*6XnN{VpdRfzi7U2 zS5e5{vAbvLFwFBr7uS0vNYe?`VX+8E4K5ubQ2>N2ty=TD>2s6h|8X=hDSR_Hch_33raD&I?yhy$Y&How<^0@>0GQC%Y$Q@b``l@8GWMZ7(bEK3wV_s?qHIfjJQ-m`@3UT@9fNQqwwLu~I_}V-o*J z_%XhGx^toC2l=MGO|`9PM(Y_s;^T4~5*~H#hpIXZg)j!EOTD;UGre0ro;-5K^G1K5 zXol%5p*n-bVRjijFK|B;7qt_Ltug)adA04{r$nq7I(1sK@P0K>7{vOD<~`f#WOVNc zl`pt!gu&zUbBMzzBha901|-{giG@Jib{!pII=w;E3?pr?A&P<|gcS9*w&2r%MUQ)z z8KMPGFYr$vvqN_!q~#V3)V;C2OD6T!+FwyCk$UI9Gqv1A0e zuT_geBIrS>M)J}k3GwzMBr(rwon}K>*t0v+=1TzKnKAu*gohOU+5en~`wbg4GBw%ExmK(}YJKGCyj#)E__d9b+A(0*k!B&zZsoe=p zYgB-?Ub9FD-HjU2MAqv!LbOb75_h9Q{STBc=jX9(j$SZzx+QKK7@J8mLG=uhsH3T1 zML*czw|GBf&Jnsd%nTAqTINfD0t8^wdbgPdBxV$dMqs|=mIP0r#0G0KDhRFy)k~xx zCd0K^rBnHn76RPQ(KDe}gc?8SxTbIVj8MeoP-6s+b*!beaDEU%12DOa`W*8VV9PsB zd_HPn5R<M>OHahQwS+<%gF>zzV3nm81Y8U>;s$$@tu*8X zJt3dH^e=>(Xd|YDD4F>qWbn_SQcO{GT;Cb~bj<8Yl+)Y#ufk7tiRK{bIuqc~c+;Ck z>yf;h-0OV~JN zBs;oJ)n|V-h0WO(CaRpa^GsS~5nE;=pH}#ub?%upCMp02rg3-!SqtuIZ{weAQkViT@rPOT(4q<6LcLl+EJO~ z;Q~Awqa3j~p2t>q47n#LXZ-C2KVKH3D?N8B@fYC&(84;$CWAvU5Fhua`(p@h^v_=R ztCNI<8_Q{HB7up|kUtfy$Y8ZDur%@&cS6M98BJdc*)E>_b&DWWz?ln_`6;K*_*OeB zfqMP9m&4IrEi}hZF!u}ZnZZB~b(2OSlK9Kce-5sBmC||p)gmx`iK)!fYwz>J0y5pd zL|rSKl$*FUM(+o-_dfB!E-~H_9WkcfxG09%Ad?Hg62aZlNko3JR2K$_Nl_2` zBqIva8WPz~x%D1sqBnkQfJRtnzm_NSb`#K9rqACZ{zIls)31U>43GDItTO03Jq+p- zhaC7{!p{<{S|Jq+>Q<W{6*}TVo$b zi8zbus#a4FwR|vL%#RxKn_`035yR+llgEMmNf>wEjKUESe6ZF#toeu1Y|%5TD{dlG z^`^vwHD`c4l(i0(`wp=LvM_;8XHx{V0s=8IF0)8M3`WkqW?%)()DHD!AUW?FF%NaW znk~fdcd&$cP>m8-t~2Wk-Dp#Z=@&ePuZ2TOSr$uf0<%fK`uqguhb%3>4ft*ysbPu_ zo9?Qy_=doFG6q+^XN4!57cBWcAYf6gh6p@K$Z8_dc53XmPq@ePRW2RXgZ%6(eFc!B z&t>()6lI&PmpexbHvU$k%Z>5CV@&FM7!@gaPvWU;Gcmy;q6F^bC&#&TyL*h3yM{Pu z?ysSfSGN$WxJ$BTc+@7iGhb|CNxI+0#LR~|=D^V5hO#Q`pWT5{T3178oJMZi34>kM zH}nX!*u}@VT?uQ{7O2$jEJ5g~`rBw%38_?IqK8iKQm3XJsslyg2PlyZX&px=G4pid zjQTQK4=#=GHZ95wEsdV1X>eaZNra!Q-uk*!EXNi!Ut=DjfB6e{xy-H;Du} zeAlHD>QObP zA(b7H-}Q)i%5ouJ2XuC(But3#1IROW*$D~u3^xVntH>4-3i^eC?;{3^iC*+Ni8qWKkEP>MAt=89W0DnSe-Oq|2yk zZ-%SZUf;|=>jO)tqsYT0F?S*XgpRhP)n%*6pkqb<<1_#D_Km_(gFXzOeZ{CQqASXC zdT(Qbq0JvF$6I+DVOtNp_Xeibkt}`-uxPS}KA)e`JW}ye|9Szv76biH7l^XB5~N3T z^OT-X_Gz)@cN0SNz{yp)lxI6&;CYmJedUFoayRSDY*k!(D}@3GMsqvU4cre`-C2lz zVeG-bZgEU-#HNxw=Hy!+{?X71k?oGS`HiB6y|ekVQ=tzNH=cKwfj#VA>+y^r|GS2; z$_pAYoOY|PlvOx5guR1}2`Gxbwrq-$5VwoEpns`XWen)dI~4~lVs;+TgR3(X!7S~e zDXUaFr{`4}rM*=C&kTPgGJX+Gm*;w)^sWm54NiFDdRMC9qU`!+5_I1Y%bCmr z0=g-7^lEtao4Gb{!(Y_|^9rC#g(G~1kaq83wxZR1AH6O9|5*UHe3V=)nSl%N;SU=F zam^6&tQSu;l1SJep#1d3la3X&z|9DU#Hs4mDYc8 zzCZH?(V*|9IwS+X0>u)3m3f?4YlE>=ezv+N!HtV18i=fO)D4$^sg*tZ6A_}7E%K_M zVgALei^Z#ThV|^$CfED1EFb^86VaJQtV93z@C%hmekk@1D)`+F?D^@%wbQn&U?r|E zm1u~<$th5HEU(o-qn}^W6cBC?m;GtxQZ_*YB&;~N723w>oa;HsMW`Yfps65K^A7mN zwKG_1K&Xo+apFI82?hxXu2z9udn{flZP^<>!U|t^#u{ak(K$E;)V(EgOsd4`pY@ zAbXa{zRzGV)_E})V~qJm-}l$&AJ_Gs^KAEXpYxt;-gC|~-jPE|DG%qhA=toevsB@2 z7_BLvdeR%K&HyxZ*GVLWbTt)N6l8+-cgCO+2vx73wuwNx;K!YhK3^6N&%!LT@A7y> zJyOQwvVuS}B^Udr)m3?&Nerw-7>?)R3ftDV-EjQc!(-)!JE4zG0C7(A z@qvQ4tj`waXRm*LAil@=_!Q*_LFKcbU3DmGVP$+&wWsgR5>P9o>H93~gcVpv-k10n%R-SNCt$Bmt$b zpuaCxxa7|0GfKu2-u*Bxw#1eQ2X`OA-x4lLTMPLBKMO1MOGJWk1}0ZW?Chpq+r+AL zq|mheNgy!zRShSnbJ;yUe%+E*^?S-IkoO%$ML>Q1uZz>6$HN#@{T->YNUKsVw-yHT znLoL!ft6kM<~@#nedtbb&U?bS6)Q4bcw9d3Znw8V(TLVwWvY@7cg1*sp61_6SBp*A zgWnMjHD?7U5o1YBr%R&pjbuVI*w z4qx>^I?m(1s5lJ8dY8%L&*ztRDV_ITym&P8i4gP(+F`wX=aa*`GXQn3hw3rt@PPXw z_=o8UThNQV2}JbtK{m#=Yh$uA4ew~BYP7S|d%H)u_g>>4WFr?~={+B!ii!V0-L_iW@z@MlAPC+@p7(%E6FtM$^Uq zLZ~hhAe7q*h>5FRR|sA1v8l`wk2sM;Ns2%RA<_uuc8XOOKdo`} zI|isB-lHD1XlhG84;11|^^!!;{?4B+q;)tCiG<+%(Ci(~s=xg~2JUhmi#?$q-??2u ztC=Do7H1(+yJ3?S>~fJGch)persyq5MVvew$xJ^ktOxS{fC^#X>i`@ox#+W zMF=sWHTy(sQj3r>xx^Y+gf5mi zeK@FLA1So08dKk5W}ppjAHnOxb&;&kT|~eZ;h>%qmO->B*i!?_`+(gnh1dk^>|#2k z3$hi!Fz!jws{O8LJ_hh3yQck0A6f#z+f$-xAj-9eAk2yG&xZ}MaX3Ps!uffy`7oJ6&lU2ILQ2FFMBqjL{-5W6 zTe-lRl0C}YGZSKlZ6$k0Ebb^^XKUPjBi=W@C9q%U+HHT26Z6=^ScN3dLHHoN;S>^Q zQxZBzA*|6Ws#u3_`w)kpZoHB(85H1Nx>n!C`wlxAHLf<*)l(0(F`oN*H9-Mo{hQ=Z zKYmG?*P*Y7ZE`wR)Ssx4`=nUvq(U6}K5iJ)OVT~JP|Zhp@p(+FdqREcK64)>w45a& zC_6~u<6!($)i-5TpS?mWxGv3)TeT^k!aIn%vp8GqG3Bo@jgX%~Q{l3d&mHzp_fXI`a9wWUgR41RP5}>*$MU&1^t>(;XP$!Bt6Foy8=$nB4>`Fx#bz~=wIW}o zj8tgCuv}iAeq0*QbeN2o+vc{iCTNH36!SPQfeiQ+yNs?Mw_o(RNy!X^n0APTQ>060 zlL?-dJV#p19%oK~EAwza?A$l8jXS!|Ciit&X{G(@tgfB4Ts(gVCxfQ1z!%VfcM`AD z!jWYGb{QJr{Yb7BEfxLgfw8xl_pReg_Bg|tJ0a!jKyQ5H#F_PUzpy9=qpP>!KRF`I z&mTF@lczOhi}zuL8hh^F)FwN}&P*XU=F2xij_ z+|1Ump&0`>O=U!5*<(w#wd~C5X3q$ixlNoHDecboWV-rQNG^$9U1YS$zj{CE3MY5b z@kQ}@r(kh6>t6??W0F6c?2SV$XUU*7et=AX7~Xg6G@hM0P!kPeCsk`RKg@mUs-+6G zRwQ}_RwgA-D`*t_`2Dt2!N1N@+GXRZ*w*;Wz1ZOhxb*ug&))r)fKHM76NL<5@!%2g z9xJ?1xUOXVWmbeuzVZ%`$j;Qv)=D{EEZm6;WpGY|6sc>Rp@7;-2?{761&4S~U|yJW zDg3L!-cc!i1EhaoZT=IaCvdcDb;GPOwi?f}iHH$;CYQm=FO+%KIwa(6S|Z1i>!={l zKKAayeuz^3J2BS=!=mdSqtMY8RsN84$&==G3MU;wpb)H(++_+u>?ggnt9Ksqtt%Va zFuL@pmM&(|nDSf?vnCuHVjBw5)Kfcz@ymcB-8Qkt zzNsC`U6lS2t=?-MPQH_CT z_nPb-aoWy{SH`^A6HN9#Xg~fiyDpSxxb|}YEZvl38|LiDap{#~%p=+E$Bt#lV-@)lxzzOFjs&Mb=Ito$ zlb7w|W5w$GNbBCQ(a9JT zYFcBBzixwD7yaR3>F22=U~|lJ1!eP6;t;)#r`?9Mti@?Pi5--G`$-J2k2`w9JKvd= ztEDs@yxR(c{|6+AV&d*;IewZ9c+)J^-M7h{IrT$|!2jVQ@A|&TY+skfMOAmyN>R6k z*eq{*!hHPZ6Vxp&C#T@tE9V>M^!`e87;p@>?<oW4KQhx@c9^oD#ARU)|o`)*;W zfIq7GKg%iY^j?rzn6k8Y&7>4yzPYC0_S~sYMZ@WbVN#sU=max0cL3!VsJyS2&uII~ z+3Q2Ruh=-g#Iq(?-tL-y-bvCJ9sCcJ!6gXu7944jM|W{t9BAxUnk%+UmH+QSl+PnB z_cbuG1g!JBZicYo47$J+hw%m}TeV0|Vh*k>h733{hn;+Dn4krl_fW{c7hv)IZ~h7! z<5Mx0+R~)WjP$cd-B;CHTqhK(>$WC5+qH$F9gos84S1lrtvc|KQAxjZ$TPF@iBJF2 zw2KGEZNbcK?`J_O(nx1p9yEx#*!4JoToFql#oTb&dTpIN^HYQrp%Boe(xAq0F3`nD zf8Ek#4dpQ2uDXu#)44A9Rk(iZebV@alIr;F>|h$}rZ?Bo3f`Xi)s8#O-q5c*+*j+1 z+>`%?dfQ)0l{!S#ZU~ngR-{m1_w7)v{1J4GHE1(TIzU=z?XtPLe=brb3DMzyuyi&% z)w=YE>jyqUN7=l-mw4Q#yDt+BWcn{?HhCt5JqYb5WcGtHrytV6ap|B+N8!ZSRqnTp zF!3Cyla;m@1(aIa#W(wt#dV@Nr9eU?7csl>Bk!TJMZM?&_xw98?JHk$=iGMe?yk-I z$6o-~>wp!2#7Tf9?DIE&vlllSbuY94#<9o62foJuPT6_yLnq|LSN@bHQ_|uC8$j+9+ z?CA6zh>&N|bec+XePe^m1V*tV`_XcPL5uehw=n#mE$8dbQf54;`eC(so4R#TX4+Lt zSGTO=ov_Gl40b0DyXWMa@&@;62V7FJt zGH#j+BbQMpJTodynETMc`!wi*9|1)R{~=nCAJSgSd+KJ45zoGoOWn3VpSNUlEx0{X zn~EkdAky9cH|i2f4kldvvl>tddC1}Ku(;{%j^!^u`JiUQj+*MNP#hgLxlZ1 z&54<;g=ZIE?M-FwYTmQgDpG7R%Wo>r4eiZmTIzo0?Ryyw@=SHEQEl>+x1M3sigOv~ z5@=O8dVkFyA|PcUA-pJg{94&|<6L){>4c|V6BZ^gZi<}9gHBU&S_!b3&l^+g!+Xzx zFpd|~O;>_E6~6AL49EKZfS-g^#~>Dst$U#v*1Ij_o!%sUzhe*3NV+%I9{oArlDm71Dk#eA`SgKuF2D=>Yv22t8G zgPO^07uCV=tWN@L+t65oMV1ZFx5C^}f%cVsRbP~9qLlX^=tWeV z(Fah%49$Lrf>s`-!S-G#S=>R?55P=iOct;69v6#PHyFCc{SBXz+x3wg#NyoF!Kw9T z1&*ihnK2Jk%Iuv8K}#u52N)L8+VW>|`Pjtsw(mYS%+@wRz9{!5H!J24;JWdgPCfjU zH}=FYWV;_C^7DS*)~+|S7_oQU@P1e6dVa1xCLFG)DyR$q9%bZNl*s3Ce3>+6$vE;y9&Hdq=#;l5B!XZGMe&5N7oV3UrlfrrhH zF^Y=a*2WDZs1m;kXI970$Ahcp3eBww;;$_mm&uL!GIG9JEm(p6Z=+(DSlh27t1op< z%P5p81gQqo^K(95h}x7wcwVCY+!+mAqfS-hXvOpM!VdxyOI}PE;GQfqsw4m|htw<7 zDB+g=dLI{aVWI(gmVQw(NL~J$XC+wF{Pf2ev0S@E_gzN3+h+#_Br8Ru=K@Row>zu9 zgxY8zzwthMbB`UWrUxIp9T-p4Fx@_$kP(D6f&gJBg3<4gn_O!XM)J>;z&eI|hU*O8mxI??O?lc>m18v2ecy zEp8um_~#D#Zh@16GYem0K?!?yx{D?eX@#E@X5V*6KFUZOa(SMj6@rfn{TciY$l`F= zJM-KR;d_1+b`>={o_aOR5>DUx==Ks!`2_Gj^e6d+o7588G z&p^qq3gNa!X*=!;p6yeSdi1|F?twZEwyt~|S-`Zc-_ z3Bze3Y|b4H=6OGirqp~I1A9J9ChenKj29}6TH@3++ zfB9N_OWDsIf))KWGAIKje<)crxcfc;G#kD8O$1`w6{do-oaQ3IpLBA}*(;}4XN=wge+SaLMzUySkH`TSf z{G7Vt-zdwnRvZ9(NXvzNnAg_>JYS!z!k?G+edu zDxhLxr}aQ|-h^fI?VR$v;4N9vx4>3#_RnvYSHI51xQbt!e(gok#B-;QvRmGzfEd@- z1K-dvzg2_$$0|vK9FJPM?N1IBLgXjVM@7`nT>7b|TZ`#rie8yBgd> z2r>OnA?jD4+>h$vLCmKeZr!V2gSy*st}2fguL!z9bQTp9%nvroKb}eyhrhTyYxnB! z))qQZ7V&!M%Y{P9pir|Kx}tk4kgtP~)825M@qnqQ5`1lZ2t05=j-EvLEVrOeBYzav zk)=Pv{towCrL}cCYhP32$zKIPG&qEZTJK52Kv!6#$|LWtBF-Q$^kE*v+OS&--}3Ag z?9B;qLiZiDyWz%3()P6J_8DMrho=Zegaj7IFQ?%}8tRR@s9JPN>Bx z6c=faFDbSk{r73dGXP*w_+304R!5idc@GV*bu_9L&KfEzfs1y?e`K!DSF0!U)iC}PXBn%gqb_qejkOQ^+ekI~ zE7?+4v6pYS7W#;;kf49TbG$L9%|5@~6Z}UmFS75JB7u~Sf_2>Hs6*XkV=dBw@R-*qW z_Ju|z*RXoO0Ev09`%n8b9a*J!Wskwg^10p63=QfsaT_x6l>4rv*paNeh!a~6cKv{B z$105K+&&TaVsERVOWoi>%1gWz9R-x!@)4P~U$m`Q?lJM}-&#C&vEe^*Q)U-|egaJ~ z1DjKS@YLG(BrVmU|nhL=WIfW z)+YV0MCbC@d;UEeX{Wnc&tW`TUVz#64w}|TN1looX)D)-6_KhTq2{>M-mGz$^1?3Wkm`eMn#j&ehiV(Z6CTD~jHVil^({d$ZE%A!E)i9!+MnYbzNu-< z@uGvsJef$Uiv!D#_2t=@$Gtz_kLv~Dlh34){B z7pa}Lkv-%$o-mJKWR1SlDGtZ^KJ}HaohM>WQE1l?1^JQ(eWtg;JXB{8vxyGQ`s$E& zKP$TC(=0$kzD~Qhq^vcy{$D$xcn;OQ!%-KBq6P>t#!)}a$1?syylaQ`4rrz#s{{bM zr|$+)@wjD4->1f~y_s8i^&cEw1QWX2^#|dp6YC!=jom48UqFBw}%RMY`BD;Ng< z<#{LctHVZ#jDtxj!AeuZs?-(H6cyY};pXhx(i5|`Y~&pe>G!h={1!PF1Y;EkY=VCtf7D{xbEuVd%OGdE38`l)-0qtSsxo{Ccj%U6t5JqNM|99U+v zZS*(_%K!2BW#H4aHKSzZuLS7zeE+diRy}3b_~PIX@z~e}@t8Jv zc{_I;*lB(#{n(;8jEbhqt3r=Lzv(N!YU3Z7|B!P6DeaV9JIke9cKSCxqtAUyF;}|Ga?U>kd{a)QHwJBmexkD_K&TJ8N4vZqPBHR- z=T;+JJih-U8SydE69?j{Li6MWG83f!5srby-{dA?f_fyfIV=llgR(Y<^_+l7+~ts0 zr_35{D+nGa2~{%^uXe=EP&C05Dr5R5+QM?jrW1jU7~{0E?lNp&`KBY(F?B*Cev|jb z>6BmVU0^10F=GREhisv$3tr>ZVin*Rgb#`c#WjQYG33*0Ln6g1U?k2V1 ztH`-5?e3|G=Gc1h(wA?>%<={y#qStKOEaJnnXHA z*GKa1rqhmgNdgr0%Lm>=QYV1Xv+TbtXd2GT=#b`AJcNL14=~KAq;*O``C{Zz0a@!O zK!CDn^iRA;(vIdJ6Sw5&BHjXI3>ocDN3FRjfS?`aM9)0L<3p#u zXlznYA5>gOQw)a{WuQfsd$fzN<`fZYN7FG%a~>X2zpoNZUu*=pJ7yn@dX(LGFc@Q5 zX1YQVUq3`Ra;%*T++%tQB3rxhns-v>rd~lUo{Fr4sLwpXpjp8H8id3a+PzY|gAzJX zk+>O}om-?<5JvB$4fbSDns`A0!Qz8~=p5V2uI!V&5nMTc^FiT9_#kiI`ff_IX&Xh2 zb4h-3?My0)W_3(6)JgOaq$wbR=3w1M_F0~0+EE^KNDNLo>W*~4-^KfGpD7{F z6z}CJ_W!qYaIQEJZO~G&k%Y`5Hsw-xIs%zIOcFZ=;DXkN1(x>i8`R;S+}9fhXP9}ON6+fRV<9;tLrR>bG)jJ(AQH0oJ4%1%nd`q zvLUasUpsf+TNK%r^WjrpgE08E6W~qZc&N+>cY{g^sDec$dPyf^k)@YEBph^SExPI^w^ViY?U9FB<&llGHxnFuBf6V+y% zEsS~txNPNbjazM=^e~Z2vi@SvY1~MFtCOQvX@ujg${Yf};SXigp+5CHYJk8pB1|F7 zsNe(`G$^yXG4ayC&t5xEI4oOOonf1w0KH2h@JutOIUKbwJjMw{_zt$LHeOhlZb+4` z1G(Uq{yx_i!YuL==2r)0cO-gW{C!d(w$C zgtu@o##Q+t&4I=l(650%;`!n`5W<1ggD@JveA_t<^?k3<6u7HSxng)Jj7brDERq)@ z2iqE1>w@>JgoF{*SEoI4WZX?~6r5=DY9E)9nkGPcvaAVr9s|-trG%(fVvrB@kfZ9N zmtiS5VqZgrC!_1ZO!Q$3mVUEl(Qqy!>xVt`VwkGWb(iJTCC4d}Osf*s1`n345&rcA zX-wSX8;m7bBb3m!F!!a3KU&mJ_626YO%9O)$996yh@g5uXGdi;pT1b>k?JxbVY zixR~*NLjhT2jhct&9D)?(UMzH?X{ow<~~z~T1OV|o8Qe`JlPwya!tR0$SIjC+{YM+ z4>RkW#9i6CFsOu`eY@`LtokXzGep5#iGTI}DAEc6ty#@~^drAc#3Mm@Z`WY3Bd{!x zdpUH7w)K9OhZ_>NVCN?hc$9lHw=3Nm0lOaBH{-+4(*`r}(cX5KD1tJQz8_1rnA2&{ z+7d&$sNo%fv-6*BHBQfE6tE>oG^V;<{H1GN5&`QPd~gVcBJSZa-ld=s5XVf4?U4x; zk8DTm3T1^2x0tLao}*ChAIklee}UiBL+J`JWV7l$7v8Ch9XxY;-@TmZZN2+2NfDck zzxv?v*snQ8z-mn-jd3Dqrnpbc;gYJucOcq%2s8)vQ5g^luAd7wKj2ol-%IB6qK1A{ zZ2PTg;uG?vzcx+~PFS|cFuR>Jr#npilu?PVvz}Ctp*3oqDUvBn04?Xngs8pF+s6;L ztlHJSCD#1olgdjm<29AqBIZTuM%WlEh?6~|+gp1l1kN{?oG$j7C&yspGf%UOog*Jy zh*(z?^p(7+(abAJHLa>MW7*b=fCmX;P@VhBg4CS}6*X#}^jq)XnB9 zg@Hn-L}t_DyHrekb$~7SWC*M)BamLC2~V~JsdHtyr=wa)uI1mHUM0Or4*IV05@rIf z-1?Am!D+638EMunwojGB%c|CmXjF{*CKD?@X8}03*ZKEZ8xhjwS_E%Y=F6#HBiu*N zb`73L2mrzejEfD$S4ia%q*XcFcd(HyQD{HFu$Vl0o=^c>`KGao6~gKYIydL$6ca%U zYQq;pJ@y|O>=5tRJSf`ZRl**-=54_0>zThK3OK2b}cdP4Zk{i|u4Z zYPo@Ze=<&8p$d;n_lgH#M*_Tnbrx0S{dM9Y2a{p>AE;2E>zYQt`1@`R zz}WqO`B4dh`LQw=DQ27BNhMBo%Zj$lRPz~i?VkRRQ<{I!;pI@_j9Ebw02_Vf-^ELm z+scPm>-KUBEpkGwTDNAT(-nlbqp3Nm^S5dG+*&qKu@}HEZaP*%s8%Wqc&F^w#+mty z;;h$_%Qt*q{l=OID}A8w>svxXXzYEx)p?S(IuW#!;my9E5=R!@-~Z&kCLfJEKS$7U zS&J@cer#Z%j^#40+_G*;F_q^u@rI7(P7ft^Z05?954?wcC)-z?g2i&<0q%{tr@c&X zdr5q}_1@O6s%uZyw8T+I(`-PD(GP$;iXpvxDxa5>ovpfFR1*j;*Y_w*6V2W)9M1AF z=M{34`EE;07L)Ew0FOVJL9{8X0qVk3-hYISo1#McT4qB$b*}h$t&hwvP1{fIp#D1^ z*g5%6w%%1?NtduUHB~7w6M4_T0MTAO?y4K>>H~bJ=;W@=*6=W8&{_~UhszAHp$*)! z-%9rSK|M>hT$d$ZK*vobKcP{+5_dHG;`3mUc2C=bNz6?(+(x&6z#X)@QN(Jq`@Y3% z>lhHVBhqWjHrLT8ND+jd>B1(;Jon~L>nte19;I_aLm~0kyaSu9LLkj%td9%~Jivbq zN6ne~7;dBF3Why-7RJUZVdJUnx$@ileZuEnk@=|T&#(Ob8d;&2id$4GULJjvfss_R zn}6tq*lQ>!K*#y&CzW|x5RAXsm4+?mXtOmZ@Xlqk-MD%GNh%rXiW_fGKaomMg zcJ{ReSu2=DN{2qDX3ymOQP!#ns;-C`zwj`&?!}0oRR|OHxe9m`x9T^wqWmym&=@Fzn_j<@xc#d$XLVf2lqxqftK}Ff1K{T*WQ*YM zljDfni+7v81kP8x-J+&c36U=Wryn4e`9tTqOQh9o^lvenGYZ~(hQ<-leBqT(+66ay^0>b+YrkN_@ z=D_9IjVX=ZD(~&>t=ztE<4X>mZg*Xeqan*tQwT|=#KsVZImHM6NJ28RvyWwt6$Yx$ zOR;=jF-%KKgM?G)81h_)g;S|bzQ;g30^K?$tAXH^r^=##Q?5k4JIkYbym_CBXI@{6 zn^y?^S@7qVH>tT?*32JrlI2X+{{R0@Yz}xIEiibaG(Hxbq5eI7Xz-vy^Ht>k04MKv A7XSbN literal 59617 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 From 91ff74be37f845e1b0b79a70c56814bda96933d3 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Wed, 8 Jan 2020 09:29:33 -0600 Subject: [PATCH 046/259] update start image --- screenshots/start.png | Bin 7341 -> 15350 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/start.png b/screenshots/start.png index feecdd747f3436c46d8e4e7fa97f4683d1c0f5ec..a81cca104a0e5d660299840248fbb3c3c8c9a7eb 100644 GIT binary patch literal 15350 zcmeHuWn7f))-MXu0}28nJ1*AHYi8tQ*oT%dw9S_;b4;to#c)L>Q+ zD?5!4E;Ti^fRmX8pXvw6e~Y8;1Zk{XTpan>*gk#w#QNzytAmpz8wW2hFB>~28z(0V zii5@3!`{W%oyFdn_Fo|Xh4aDO+0@C}(Z$-qp85gT*u=rrMUaN(LD7Fc|FYBE-TJ>Z z**pK+EtG?74=ZdOtn6(6!A6M+JW%?tf&~8I|36m#TjT$b z)c$WtFxUSk`9D_vEh)hE;K2WI=wH$Lhl&c95Uv2*e?l*Wi?Q;a7L^TKWqF8%y!FR_ zQuBX%5E2&R;pJ`ZR|bJVbabSIPjNRlH-ke%)AGdJz2E1R!ZkJCE;LC9i@h2e8Zxu6 zaPe?g)KFvi&UYp+vGaKG1xgR0i>jg;8smEv60uj0u?f7s8bHr)IwEG!(5TU5K8Qlx z|Lo`kyx@HJl5Ds_UPBlXq7A+o$M^TkcGhEWtyQ=__RPIe{9Gtv?9r#G8~Z`}fBS5Z zs}>5U+)v;&n@eAO_v5_(`84Jc`$;OaRr}0v5$}Hc(vOVTr}>??$~U5#*WQcw3U>=4 z5*92BrIVaUp&BOd#dfrNXsyJOZOadBzmcaXk<|;sC9M}$SK#qz4D=VGFQa!}vv@Bm z^{gL}B@GwNs4!?44X>wC(W6*PFF7u~;d>pPoh48Iu$yg}eP>hHVUG670JKC&3v?I^LTm zOV79Hv~^A;QZU_3gZ@PumW%eo_Tuoh^Jb z!?kU2p{Y-gee_|aabY7Z{r!&>Tk(tUS((GpF=p@J;2`cjpYZ0kItNImY4OS$mi~v# zbw_QKzM@O{aUMr2>|d7@2I2D0(qv=#Go!4%N$ogBsZqpOsapJV1)*VXI5EmY443bxI9RAJBTgYoUtrTYP z_F8Tb+YQzw^HtA4DRsxMxqy}BlEZg+SKubQB#SU3lP8)+Nx{8bhPZ|oQ3uneJeB$; zhqDoV=j)!tZ)ND5jh6?XlhoZZwT8>tT|Jl2SxQ|)k(5KeN!j1}7X3K2xgr_MZjyFsHI8droZdNAFIbxt4Ntg>%Vil>Lh(l(g?XPY#6t8sKPenNup-N zqT(ZX76y=9*&Rqax)b&1W3PX#i%{NC2Q1{}vkWQDW5aF&~m@SFd7TtJFiY)TKW_ft*7`r(62X@B&MI-=j2z2Gy^OH5#R z{r0LSOJJZua)qq)0;!PPt7GooYu-Klo#nk?^3L`5^VV0TJb3JZ22>R5OPX7r&}

U7+SdWYBF7A<7Vuz7%{RyC6QH=34>+hPl! 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�x*{I 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 BsNw(s From 61668b3f0e2f65be134ef93ba9f76a0f6a147560 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Wed, 8 Jan 2020 09:32:58 -0600 Subject: [PATCH 047/259] update README image link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 968c53e6e..265703569 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ `http-server` is a simple, zero-configuration command-line http server. It is powerful enough for production usage, but it's simple and hackable enough to be used for testing, local development, and learning. -![](https://github.com/nodeapps/http-server/raw/master/screenshots/public.png) +![Example of running http-server](https://github.com/http-party/http-server/raw/master/screenshots/public.png) # Installing globally: @@ -137,4 +137,4 @@ $ node bin/http-server *Now you can visit http://localhost:8080 to view your server* You should see the turtle image in the screenshot above hosted at that URL. See -the `./public` folder for demo content. \ No newline at end of file +the `./public` folder for demo content. From 15726130b24f571a2c1f7f64d7fddc053f558e7f Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 13 Jan 2020 13:46:26 -0600 Subject: [PATCH 048/259] Update installation methods --- README.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 968c53e6e..121b1e80e 100644 --- a/README.md +++ b/README.md @@ -9,19 +9,27 @@ ![](https://github.com/nodeapps/http-server/raw/master/screenshots/public.png) -# Installing globally: +## Installation: -Installation via `npm`: +#### Globally via `npm` - npm install http-server -g + npm install --global http-server -This will install `http-server` globally so that it may be run from the command line. +This will install `http-server` globally so that it may be run from the command line anywhere. -## Running on-demand: +#### Globally via Homebrew + + brew install http-server + +#### Running on-demand: Using `npx` you can run the script without installing it first: - npx http-server [path] [options] + npx http-server [path] [options] + +#### As a dependency in your `npm` package: + + npm install http-server ## Usage: @@ -137,4 +145,4 @@ $ node bin/http-server *Now you can visit http://localhost:8080 to view your server* You should see the turtle image in the screenshot above hosted at that URL. See -the `./public` folder for demo content. \ No newline at end of file +the `./public` folder for demo content. From e5673c527247557ee8056ed41e30d2ffc4b97f20 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 13 Jan 2020 14:06:28 -0600 Subject: [PATCH 049/259] update badges --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 121b1e80e..b5e34aa90 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![build status](https://img.shields.io/travis/http-party/http-server.svg?style=flat-square)](https://travis-ci.org/http-party/http-server) -[![dependencies status](https://img.shields.io/david/http-party/http-server.svg?style=flat-square)](https://david-dm.org/http-party/http-server) -[![npm](https://img.shields.io/npm/v/http-server.svg?style=flat-square)](https://www.npmjs.com/package/http-server) +![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/http-party/http-server?style=flat-square) +[![npm](https://img.shields.io/npm/v/http-server.svg?style=flat-square)](https://www.npmjs.com/package/http-server) [![homebrew](https://img.shields.io/homebrew/v/http-server?style=flat-square)](https://formulae.brew.sh/formula/http-server) [![npm downloads](https://img.shields.io/npm/dm/http-server?color=blue&label=npm%20downloads&style=flat-square)](https://www.npmjs.com/package/http-server) [![license](https://img.shields.io/github/license/http-party/http-server.svg?style=flat-square)](https://github.com/http-party/http-server) # http-server: a command-line http server From 7c09c2304294d393f61c036ae460b2412494536d Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 13 Jan 2020 14:07:09 -0600 Subject: [PATCH 050/259] remove broken badge --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index b5e34aa90..2db4d856e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ [![build status](https://img.shields.io/travis/http-party/http-server.svg?style=flat-square)](https://travis-ci.org/http-party/http-server) -![Libraries.io dependency status for GitHub repo](https://img.shields.io/librariesio/github/http-party/http-server?style=flat-square) [![npm](https://img.shields.io/npm/v/http-server.svg?style=flat-square)](https://www.npmjs.com/package/http-server) [![homebrew](https://img.shields.io/homebrew/v/http-server?style=flat-square)](https://formulae.brew.sh/formula/http-server) [![npm downloads](https://img.shields.io/npm/dm/http-server?color=blue&label=npm%20downloads&style=flat-square)](https://www.npmjs.com/package/http-server) [![license](https://img.shields.io/github/license/http-party/http-server.svg?style=flat-square)](https://github.com/http-party/http-server) From bd36f7b6999aa195c09b10112f845ce5f518effa Mon Sep 17 00:00:00 2001 From: zjhsdtc Date: Tue, 3 Dec 2019 13:40:59 +0800 Subject: [PATCH 051/259] Fix basic auth options type issue --- lib/http-server.js | 7 +- test/http-server-test.js | 135 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 2 deletions(-) diff --git a/lib/http-server.js b/lib/http-server.js index ab340d813..dcd3c1030 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -108,8 +108,11 @@ function HttpServer(options) { // an attacker knowledge of whether the username is correct via a timing // attack. if (credentials) { - var usernameEqual = secureCompare(options.username, credentials.name); - var passwordEqual = secureCompare(options.password, credentials.pass); + // since the `name` and `pass` attributes of `credentials` are always string type + // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/HEAD/types/basic-auth/index.d.ts#L15-L16 + // so we use `.toString()` to fix https://github.com/http-party/http-server/issues/583 + var usernameEqual = secureCompare(options.username.toString(), credentials.name); + var passwordEqual = secureCompare(options.password.toString(), credentials.pass); if (usernameEqual && passwordEqual) { return res.emit('next'); } diff --git a/test/http-server-test.js b/test/http-server-test.js index 470267619..6d5fce462 100644 --- a/test/http-server-test.js +++ b/test/http-server-test.js @@ -379,5 +379,140 @@ vows.describe('http-server').addBatch({ teardown: function (server) { server.close(); } + }, + 'When http-server is listening on 8086 with username "good_username" and Number type password 123456': { + topic: function () { + var server = httpServer.createServer({ + root: root, + robots: true, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Credentials': 'true' + }, + username: 'good_username', + password: 123456 + }); + + server.listen(8086); + this.callback(null, server); + }, + 'and the user requests an existent file with no auth details': { + topic: function () { + request('http://127.0.0.1:8086/file', this.callback); + }, + 'status code should be 401': function (res) { + assert.equal(res.statusCode, 401); + }, + 'and file content': { + topic: function (res, body) { + var self = this; + fs.readFile(path.join(root, 'file'), 'utf8', function (err, data) { + self.callback(err, data, body); + }); + }, + 'should be a forbidden message': function (err, file, body) { + assert.equal(body, 'Access denied'); + } + } + }, + 'and the user requests an existent file with incorrect username': { + topic: function () { + request('http://127.0.0.1:8086/file', { + auth: { + user: 'wrong_username', + pass: '123456' + } + }, this.callback); + }, + 'status code should be 401': function (res) { + assert.equal(res.statusCode, 401); + }, + 'and file content': { + topic: function (res, body) { + var self = this; + fs.readFile(path.join(root, 'file'), 'utf8', function (err, data) { + self.callback(err, data, body); + }); + }, + 'should be a forbidden message': function (err, file, body) { + assert.equal(body, 'Access denied'); + } + } + }, + 'and the user requests an existent file with incorrect password': { + topic: function () { + request('http://127.0.0.1:8086/file', { + auth: { + user: 'good_username', + pass: '654321' + } + }, this.callback); + }, + 'status code should be 401': function (res) { + assert.equal(res.statusCode, 401); + }, + 'and file content': { + topic: function (res, body) { + var self = this; + fs.readFile(path.join(root, 'file'), 'utf8', function (err, data) { + self.callback(err, data, body); + }); + }, + 'should be a forbidden message': function (err, file, body) { + assert.equal(body, 'Access denied'); + } + } + }, + 'and the user requests a non-existent file with incorrect password': { + topic: function () { + request('http://127.0.0.1:8086/404', { + auth: { + user: 'good_username', + pass: '654321' + } + }, this.callback); + }, + 'status code should be 401': function (res) { + assert.equal(res.statusCode, 401); + }, + 'and file content': { + topic: function (res, body) { + var self = this; + fs.readFile(path.join(root, 'file'), 'utf8', function (err, data) { + self.callback(err, data, body); + }); + }, + 'should be a forbidden message': function (err, file, body) { + assert.equal(body, 'Access denied'); + } + } + }, + 'and the user requests an existent file with correct auth details': { + topic: function () { + request('http://127.0.0.1:8086/file', { + auth: { + user: 'good_username', + pass: '123456' + } + }, this.callback); + }, + 'status code should be 200': function (res) { + assert.equal(res.statusCode, 200); + }, + 'and file content': { + topic: function (res, body) { + var self = this; + fs.readFile(path.join(root, 'file'), 'utf8', function (err, data) { + self.callback(err, data, body); + }); + }, + 'should match content of served file': function (err, file, body) { + assert.equal(body.trim(), file.trim()); + } + } + }, + teardown: function (server) { + server.close(); + } } }).export(module); From dfcc22467a65bfc16f778ef7483de4cbe5b826cd Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Fri, 17 Jan 2020 14:53:13 -0600 Subject: [PATCH 052/259] better start image --- screenshots/start.png | Bin 15350 -> 98522 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/start.png b/screenshots/start.png index a81cca104a0e5d660299840248fbb3c3c8c9a7eb..b53f951823a647098621335f29563a81a3b41ea0 100644 GIT binary patch literal 98522 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

s7j1PYxv)?IX#6T< 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

U7+SdWYBF7A<7Vuz7%{RyC6QH=34>+hPl! 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�x*{I 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 r4oU+qA^Qt_%z#d#f1TW{?y Date: Wed, 5 Feb 2020 08:35:10 -0600 Subject: [PATCH 053/259] ignore macos files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7b8cf3fda..8df73ea22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/* npm-debug.log .dir-locals.el +.DS_Store From b2dbff5c294684771eec88186e1f68881daa1159 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Mar 2020 08:20:09 +0000 Subject: [PATCH 054/259] Bump acorn from 5.7.3 to 5.7.4 Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 5.7.4. - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/5.7.3...5.7.4) Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0cd6d9015..48034e9f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "dev": true }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "ajv": { From ed8ff1ffb6c6d56fb7d3d3ad5d7938b86991a201 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 24 Mar 2020 09:56:26 -0500 Subject: [PATCH 055/259] clarify auth types --- lib/http-server.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/http-server.js b/lib/http-server.js index 82d73a93e..8bafdf8e9 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -107,9 +107,8 @@ function HttpServer(options) { // an attacker knowledge of whether the username is correct via a timing // attack. if (credentials) { - // since the `name` and `pass` attributes of `credentials` are always string type - // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/HEAD/types/basic-auth/index.d.ts#L15-L16 - // so we use `.toString()` to fix https://github.com/http-party/http-server/issues/583 + // if credentials is defined, name and pass are guaranteed to be string + // type var usernameEqual = secureCompare(options.username.toString(), credentials.name); var passwordEqual = secureCompare(options.password.toString(), credentials.pass); if (usernameEqual && passwordEqual) { From 454851c32065b16787821b0e27ec10298b163f09 Mon Sep 17 00:00:00 2001 From: Andrew Dunkman Date: Thu, 9 Apr 2020 14:54:46 -0400 Subject: [PATCH 056/259] Fix security issue by using Minimist directly. --- bin/http-server | 5 +---- package-lock.json | 27 +++------------------------ package.json | 2 +- 3 files changed, 5 insertions(+), 29 deletions(-) diff --git a/bin/http-server b/bin/http-server index 895e1910b..42ebf651f 100755 --- a/bin/http-server +++ b/bin/http-server @@ -8,10 +8,7 @@ var colors = require('colors/safe'), portfinder = require('portfinder'), opener = require('opener'), fs = require('fs'), - argv = require('optimist') - .boolean('cors') - .boolean('log-ip') - .argv; + argv = require('minimist')(process.argv.slice(2)); var ifaces = os.networkInterfaces(); process.title = 'http-server'; diff --git a/package-lock.json b/package-lock.json index 48034e9f2..6402f60b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1680,9 +1680,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mkdirp": { "version": "0.5.1", @@ -1795,22 +1795,6 @@ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" - } - } - }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -2588,11 +2572,6 @@ } } }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 11279decc..5812eb708 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,8 @@ "corser": "^2.0.1", "ecstatic": "^3.3.2", "http-proxy": "^1.17.0", + "minimist": "^1.2.5", "opener": "^1.5.1", - "optimist": "~0.6.1", "portfinder": "^1.0.20", "secure-compare": "3.0.1", "union": "~0.5.0" From 817e11d148378c3004f24d6cd77e4a1ae5b2775a Mon Sep 17 00:00:00 2001 From: Andrew Dunkman Date: Thu, 9 Apr 2020 14:57:56 -0400 Subject: [PATCH 057/259] Upgrade sub-dependency of minimist via mkdirp. --- package-lock.json | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6402f60b3..f7714138b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1685,18 +1685,11 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "minimist": "^1.2.5" } }, "ms": { From 95119c6f5270bc4a96cd3119e5d88b23211dcf96 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 27 Apr 2020 10:16:48 -0500 Subject: [PATCH 058/259] update man page --- doc/http-server.1 | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/http-server.1 b/doc/http-server.1 index c578fdaaa..751d931d4 100644 --- a/doc/http-server.1 +++ b/doc/http-server.1 @@ -1,4 +1,4 @@ -.TH http-server 1 "April 2019" GNU "http-server man page" +.TH http-server 1 "April 2020" GNU "http-server man page" .SH NAME http-server \- a simple zero-configuration command-line http server @@ -124,6 +124,10 @@ Do not show dotfiles. .BI \-h ", " \-\-help Print usage and exit. +.TP +.BI \-v ", " \-\-version +Print version and exit. + .SH FILES .B index.html will be served as the default file to any directory requests. @@ -132,7 +136,7 @@ will be served as the default file to any directory requests. will be served if a file is not found. This can be used for SPA hosting to serve the entry page. .SH COPYING -Copyright (c) 2011-2019 Charlie Robbins, Marak Squires, and the Contributors. +Copyright (c) 2011-2020 Charlie Robbins, Marak Squires, and the 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 @@ -153,4 +157,4 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .SH VERSION -Version 0.11.1 +Version 0.12.2 From 6e9fc084f45287c9572949c54db7f426728f0e39 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 24 Mar 2020 10:17:03 -0500 Subject: [PATCH 059/259] update dependencies --- package-lock.json | 670 ++++++++++++++++++++++++++++++++++------------ package.json | 8 +- 2 files changed, 497 insertions(+), 181 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7714138b..edbc37057 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,12 +17,12 @@ "dev": true }, "ajv": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", - "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -103,9 +103,12 @@ "dev": true }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } }, "asynckit": { "version": "0.4.0", @@ -120,9 +123,9 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, "babel-core": { @@ -413,9 +416,9 @@ }, "dependencies": { "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -502,9 +505,9 @@ "dev": true }, "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" }, "colorspace": { "version": "1.0.1", @@ -517,9 +520,9 @@ } }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -550,9 +553,9 @@ "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -639,9 +642,9 @@ } }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -671,12 +674,13 @@ "dev": true }, "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, "dashdash": { @@ -695,11 +699,18 @@ "dev": true }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "decamelize": { @@ -709,10 +720,41 @@ "dev": true }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.1.tgz", + "integrity": "sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g==", + "dev": true, + "requires": { + "es-abstract": "^1.16.3", + "es-get-iterator": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "isarray": "^2.0.5", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0", + "side-channel": "^1.0.1", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } }, "defined": { "version": "1.0.0", @@ -811,25 +853,25 @@ "dev": true }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", "dev": true }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true } } @@ -896,20 +938,73 @@ "dev": true }, "env-variable": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", - "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", "dev": true }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es5-ext": { - "version": "0.10.47", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.47.tgz", - "integrity": "sha512-/1TItLfj+TTfWoeRcDn/0FbGV6SNo4R+On2GGVucPU/j3BWnXE2Co8h8CTo4Tu34gFJtnmwS9xiScKs4EjZhdw==", + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "dev": true, "requires": { "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" } }, "es6-iterator": { @@ -948,27 +1043,39 @@ "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } } }, "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "^1.0.1", + "ext": "^1.1.2" } }, "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, "requires": { "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.1" } }, @@ -1006,15 +1113,15 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "event-emitter": { @@ -1028,9 +1135,9 @@ } }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" }, "exit": { "version": "0.1.2", @@ -1038,6 +1145,23 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1079,23 +1203,23 @@ } }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "follow-redirects": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", - "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", "requires": { - "debug": "=3.1.0" + "debug": "^3.0.0" } }, "forever-agent": { @@ -1127,6 +1251,12 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -1162,9 +1292,9 @@ "dev": true }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "graceful-readlink": { @@ -1189,6 +1319,15 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -1204,6 +1343,12 @@ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", "dev": true }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1233,11 +1378,11 @@ } }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } @@ -1296,20 +1441,47 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "dev": true + }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-finite": { + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-date-object": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, "is-integer": { "version": "1.0.7", @@ -1320,6 +1492,48 @@ "is-finite": "^1.0.0" } }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -1332,6 +1546,18 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -1451,27 +1677,19 @@ "dev": true }, "jshint": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.1.tgz", - "integrity": "sha512-9GpPfKeffYBl7oBDX2lHPG16j0AM7D2bn3aLy9DaWTr6CWa0i/7UGhX8WLZ7V14QQnnr4hXbjauTLYg06F+HYw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.11.0.tgz", + "integrity": "sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==", "dev": true, "requires": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", - "lodash": "~4.17.10", + "lodash": "~4.17.11", "minimatch": "~3.0.2", "shelljs": "0.3.x", "strip-json-comments": "1.0.x" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "json-schema": { @@ -1559,6 +1777,11 @@ "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", "dev": true }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, "lodash._baseassign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", @@ -1656,18 +1879,18 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "1.44.0" } }, "minimatch": { @@ -1695,7 +1918,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "mute-stream": { "version": "0.0.8", @@ -1756,12 +1980,6 @@ } } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1774,6 +1992,36 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1851,22 +2099,27 @@ "dev": true }, "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -1877,9 +2130,9 @@ "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "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==", "dev": true }, "prompt": { @@ -1896,9 +2149,9 @@ } }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "punycode": { @@ -1993,6 +2246,16 @@ } } }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "regexpu": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", @@ -2037,9 +2300,9 @@ } }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -2049,7 +2312,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -2059,7 +2322,7 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, @@ -2084,9 +2347,9 @@ "dev": true }, "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -2108,18 +2371,18 @@ } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" }, "dependencies": { "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2161,6 +2424,16 @@ "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", "dev": true }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, "simple-fmt": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", @@ -2240,6 +2513,26 @@ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -2319,21 +2612,13 @@ "dev": true }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "trim-right": { @@ -2369,6 +2654,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "underscore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", @@ -2432,9 +2723,9 @@ } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "verror": { @@ -2449,9 +2740,9 @@ } }, "vow": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.18.tgz", - "integrity": "sha512-7QGozxlOhour77BCQbbyW5XFP8ioIz/DPK67IyO3DnJtF0WXrXueMwqrYFM9yqyfgENcyxL+vktz2oJeZfdWtw==", + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.20.tgz", + "integrity": "sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ==", "dev": true }, "vow-fs": { @@ -2467,9 +2758,9 @@ }, "dependencies": { "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2524,6 +2815,31 @@ } } }, + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "dev": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", diff --git a/package.json b/package.json index 5812eb708..4adb3111b 100644 --- a/package.json +++ b/package.json @@ -80,19 +80,19 @@ ], "dependencies": { "basic-auth": "^1.0.3", - "colors": "^1.3.3", + "colors": "^1.4.0", "corser": "^2.0.1", "ecstatic": "^3.3.2", - "http-proxy": "^1.17.0", + "http-proxy": "^1.18.0", "minimist": "^1.2.5", "opener": "^1.5.1", - "portfinder": "^1.0.20", + "portfinder": "^1.0.25", "secure-compare": "3.0.1", "union": "~0.5.0" }, "devDependencies": { "common-style": "^3.0.0", - "request": "^2.88.0", + "request": "^2.88.2", "vows": "~0.8.3" }, "bugs": { From 021e9f52b116881812b7c01288e06667fc7fe9c5 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 27 Apr 2020 10:30:37 -0500 Subject: [PATCH 060/259] update license year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 903b74833..57960369a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011-2019 Charlie Robbins, Marak Squires, and the Contributors. +Copyright (c) 2011-2020 Charlie Robbins, Marak Squires, and the Contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 5867a26d5a7fdf9010684e520e4f2a68833fbfec Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 27 Apr 2020 10:44:43 -0500 Subject: [PATCH 061/259] add testing on node 14 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 70ee55c3b..e747390ea 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ node_js: - "10" - "12" - "13" + - "14" git: autocrlf: input From 46cfd108d70ac8a5c95e7d0515d6feaebf49eefe Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 27 Apr 2020 11:44:29 -0500 Subject: [PATCH 062/259] 0.12.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index edbc37057..d71bc685c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.12.1", + "version": "0.12.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ede7e2c74..eaad6800b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.12.1", + "version": "0.12.2", "description": "A simple zero-configuration command-line http server", "main": "./lib/http-server", "repository": { From c0b67a97537db851efd8146055492bddca2a0d3a Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 27 Apr 2020 12:25:09 -0500 Subject: [PATCH 063/259] Include doc/ in npm package fixes #625 --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index eaad6800b..d354d0dae 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ }, "files": [ "lib", - "bin" + "bin", + "doc" ], "man": "./doc/http-server.1", "engines": { From d7bce39827d4db03190cb33b5f33d3a543464ee1 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Mon, 27 Apr 2020 15:07:20 -0500 Subject: [PATCH 064/259] 0.12.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d71bc685c..acb4dfd60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.12.2", + "version": "0.12.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d354d0dae..c6ecb7e1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-server", - "version": "0.12.2", + "version": "0.12.3", "description": "A simple zero-configuration command-line http server", "main": "./lib/http-server", "repository": { From 00eaefc797205a7e446282c1cc8fb5c2405f6512 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 26 May 2020 08:52:47 -0500 Subject: [PATCH 065/259] rename test --- test/{http-server-test.js => main.test.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/{http-server-test.js => main.test.js} (100%) diff --git a/test/http-server-test.js b/test/main.test.js similarity index 100% rename from test/http-server-test.js rename to test/main.test.js From 8792a27c0b6f9b21a491bcf1901caa9206951390 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 26 May 2020 08:53:03 -0500 Subject: [PATCH 066/259] internalize ecstatic as core --- lib/core/aliases.json | 35 +++ lib/core/defaults.json | 19 ++ lib/core/etag.js | 9 + lib/core/index.js | 450 +++++++++++++++++++++++++++ lib/core/opts.js | 213 +++++++++++++ lib/core/show-dir/icons.json | 65 ++++ lib/core/show-dir/index.js | 171 ++++++++++ lib/core/show-dir/perms-to-string.js | 21 ++ lib/core/show-dir/size-to-string.js | 30 ++ lib/core/show-dir/sort-files.js | 36 +++ lib/core/show-dir/styles.js | 20 ++ lib/core/status-handlers.js | 96 ++++++ lib/http-server.js | 6 +- package-lock.json | 11 - package.json | 14 +- 15 files changed, 1177 insertions(+), 19 deletions(-) create mode 100644 lib/core/aliases.json create mode 100644 lib/core/defaults.json create mode 100644 lib/core/etag.js create mode 100644 lib/core/index.js create mode 100644 lib/core/opts.js create mode 100644 lib/core/show-dir/icons.json create mode 100644 lib/core/show-dir/index.js create mode 100644 lib/core/show-dir/perms-to-string.js create mode 100644 lib/core/show-dir/size-to-string.js create mode 100644 lib/core/show-dir/sort-files.js create mode 100644 lib/core/show-dir/styles.js create mode 100644 lib/core/status-handlers.js diff --git a/lib/core/aliases.json b/lib/core/aliases.json new file mode 100644 index 000000000..94dcf4739 --- /dev/null +++ b/lib/core/aliases.json @@ -0,0 +1,35 @@ +{ + "autoIndex": [ "autoIndex", "autoindex" ], + "showDir": [ "showDir", "showdir" ], + "showDotfiles": ["showDotfiles", "showdotfiles"], + "humanReadable": [ "humanReadable", "humanreadable", "human-readable" ], + "hidePermissions": ["hidePermissions", "hidepermissions", "hide-permissions"], + "si": [ "si", "index" ], + "handleError": [ "handleError", "handleerror" ], + "cors": [ "cors", "CORS" ], + "headers": [ "H", "header", "headers" ], + "serverHeader": [ "serverHeader", "serverheader", "server-header" ], + "contentType": [ "contentType", "contenttype", "content-type" ], + "mimeType": [ + "mimetype", + "mimetypes", + "mimeType", + "mimeTypes", + "mime-type", + "mime-types", + "mime-Type", + "mime-Types" + ], + "weakEtags": [ "weakEtags", "weaketags", "weak-etags" ], + "weakCompare": [ + "weakcompare", + "weakCompare", + "weak-compare", + "weak-Compare" + ], + "handleOptionsMethod": [ + "handleOptionsMethod", + "handleoptionsmethod", + "handle-options-method" + ] +} diff --git a/lib/core/defaults.json b/lib/core/defaults.json new file mode 100644 index 000000000..d890da8f2 --- /dev/null +++ b/lib/core/defaults.json @@ -0,0 +1,19 @@ +{ + "autoIndex": true, + "showDir": true, + "showDotfiles": true, + "humanReadable": true, + "hidePermissions": false, + "si": false, + "cache": "max-age=3600", + "cors": false, + "gzip": true, + "brotli": false, + "defaultExt": ".html", + "handleError": true, + "serverHeader": true, + "contentType": "application/octet-stream", + "weakEtags": true, + "weakCompare": true, + "handleOptionsMethod": false +} diff --git a/lib/core/etag.js b/lib/core/etag.js new file mode 100644 index 000000000..d3cddedfc --- /dev/null +++ b/lib/core/etag.js @@ -0,0 +1,9 @@ +'use strict'; + +module.exports = (stat, weakEtag) => { + let etag = `"${[stat.ino, stat.size, stat.mtime.toISOString()].join('-')}"`; + if (weakEtag) { + etag = `W/${etag}`; + } + return etag; +}; diff --git a/lib/core/index.js b/lib/core/index.js new file mode 100644 index 000000000..2febec43c --- /dev/null +++ b/lib/core/index.js @@ -0,0 +1,450 @@ +#! /usr/bin/env node + +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const url = require('url'); +const mime = require('mime'); +const urlJoin = require('url-join'); +const showDir = require('./show-dir'); +const version = require('../../package.json').version; +const status = require('./status-handlers'); +const generateEtag = require('./etag'); +const optsParser = require('./opts'); + +let httpServerCore = null; + +function decodePathname(pathname) { + const pieces = pathname.replace(/\\/g, '/').split('/'); + + return path.normalize(pieces.map((rawPiece) => { + const piece = decodeURIComponent(rawPiece); + + if (process.platform === 'win32' && /\\/.test(piece)) { + throw new Error('Invalid forward slash character'); + } + + return piece; + }).join('/')); +} + + +// Check to see if we should try to compress a file with gzip. +function shouldCompressGzip(req) { + const headers = req.headers; + + return headers && headers['accept-encoding'] && + headers['accept-encoding'] + .split(',') + .some(el => ['*', 'compress', 'gzip', 'deflate'].indexOf(el.trim()) !== -1) + ; +} + +function shouldCompressBrotli(req) { + const headers = req.headers; + + return headers && headers['accept-encoding'] && + headers['accept-encoding'] + .split(',') + .some(el => ['*', 'br'].indexOf(el.trim()) !== -1) + ; +} + +function hasGzipId12(gzipped, cb) { + const stream = fs.createReadStream(gzipped, { start: 0, end: 1 }); + let buffer = Buffer(''); + let hasBeenCalled = false; + + stream.on('data', (chunk) => { + buffer = Buffer.concat([buffer, chunk], 2); + }); + + stream.on('error', (err) => { + if (hasBeenCalled) { + throw err; + } + + hasBeenCalled = true; + cb(err); + }); + + stream.on('close', () => { + if (hasBeenCalled) { + return; + } + + hasBeenCalled = true; + cb(null, buffer[0] === 31 && buffer[1] === 139); + }); +} + + +module.exports = function createMiddleware(_dir, _options) { + let dir; + let options; + + if (typeof _dir === 'string') { + dir = _dir; + options = _options; + } else { + options = _dir; + dir = options.root; + } + + const root = path.join(path.resolve(dir), '/'); + const opts = optsParser(options); + const cache = opts.cache; + const autoIndex = opts.autoIndex; + const baseDir = opts.baseDir; + let defaultExt = opts.defaultExt; + const handleError = opts.handleError; + const headers = opts.headers; + const serverHeader = opts.serverHeader; + const weakEtags = opts.weakEtags; + const handleOptionsMethod = opts.handleOptionsMethod; + + opts.root = dir; + if (defaultExt && /^\./.test(defaultExt)) { + defaultExt = defaultExt.replace(/^\./, ''); + } + + // Support hashes and .types files in mimeTypes @since 0.8 + if (opts.mimeTypes) { + try { + // You can pass a JSON blob here---useful for CLI use + opts.mimeTypes = JSON.parse(opts.mimeTypes); + } catch (e) { + // swallow parse errors, treat this as a string mimetype input + } + if (typeof opts.mimeTypes === 'string') { + mime.load(opts.mimeTypes); + } else if (typeof opts.mimeTypes === 'object') { + mime.define(opts.mimeTypes); + } + } + + function shouldReturn304(req, serverLastModified, serverEtag) { + if (!req || !req.headers) { + return false; + } + + const clientModifiedSince = req.headers['if-modified-since']; + const clientEtag = req.headers['if-none-match']; + let clientModifiedDate; + + if (!clientModifiedSince && !clientEtag) { + // Client did not provide any conditional caching headers + return false; + } + + if (clientModifiedSince) { + // Catch "illegal access" dates that will crash v8 + try { + clientModifiedDate = new Date(Date.parse(clientModifiedSince)); + } catch (err) { + return false; + } + + if (clientModifiedDate.toString() === 'Invalid Date') { + return false; + } + // If the client's copy is older than the server's, don't return 304 + if (clientModifiedDate < new Date(serverLastModified)) { + return false; + } + } + + if (clientEtag) { + // Do a strong or weak etag comparison based on setting + // https://www.ietf.org/rfc/rfc2616.txt Section 13.3.3 + if (opts.weakCompare && clientEtag !== serverEtag + && clientEtag !== `W/${serverEtag}` && `W/${clientEtag}` !== serverEtag) { + return false; + } else if (!opts.weakCompare && (clientEtag !== serverEtag || clientEtag.indexOf('W/') === 0)) { + return false; + } + } + + return true; + } + + return function middleware(req, res, next) { + // Figure out the path for the file from the given url + const parsed = url.parse(req.url); + let pathname = null; + let file = null; + let gzippedFile = null; + let brotliFile = null; + + try { + decodeURIComponent(req.url); // check validity of url + pathname = decodePathname(parsed.pathname); + } catch (err) { + status[400](res, next, { error: err }); + return; + } + + file = path.normalize( + path.join( + root, + path.relative(path.join('/', baseDir), pathname) + ) + ); + // determine compressed forms if they were to exist + gzippedFile = `${file}.gz`; + brotliFile = `${file}.br`; + + if (serverHeader !== false) { + // Set common headers. + res.setHeader('server', `http-server-${version}`); + } + + Object.keys(headers).forEach((key) => { + res.setHeader(key, headers[key]); + }); + + if (req.method === 'OPTIONS' && handleOptionsMethod) { + res.end(); + return; + } + + // TODO: This check is broken, which causes the 403 on the + // expected 404. + if (file.slice(0, root.length) !== root) { + status[403](res, next); + return; + } + + if (req.method && (req.method !== 'GET' && req.method !== 'HEAD')) { + status[405](res, next); + return; + } + + + function serve(stat) { + // Do a MIME lookup, fall back to octet-stream and handle gzip + // and brotli special case. + const defaultType = opts.contentType || 'application/octet-stream'; + let contentType = mime.lookup(file, defaultType); + let charSet; + const range = (req.headers && req.headers.range); + const lastModified = (new Date(stat.mtime)).toUTCString(); + const etag = generateEtag(stat, weakEtags); + let cacheControl = cache; + let stream = null; + if (contentType) { + charSet = mime.charsets.lookup(contentType, 'utf-8'); + if (charSet) { + contentType += `; charset=${charSet}`; + } + } + + if (file === gzippedFile) { // is .gz picked up + res.setHeader('Content-Encoding', 'gzip'); + // strip gz ending and lookup mime type + contentType = mime.lookup(path.basename(file, '.gz'), defaultType); + } else if (file === brotliFile) { // is .br picked up + res.setHeader('Content-Encoding', 'br'); + // strip br ending and lookup mime type + contentType = mime.lookup(path.basename(file, '.br'), defaultType); + } + + if (typeof cacheControl === 'function') { + cacheControl = cache(pathname); + } + if (typeof cacheControl === 'number') { + cacheControl = `max-age=${cacheControl}`; + } + + if (range) { + const total = stat.size; + const parts = range.trim().replace(/bytes=/, '').split('-'); + const partialstart = parts[0]; + const partialend = parts[1]; + const start = parseInt(partialstart, 10); + const end = Math.min( + total - 1, + partialend ? parseInt(partialend, 10) : total - 1 + ); + const chunksize = (end - start) + 1; + let fstream = null; + + if (start > end || isNaN(start) || isNaN(end)) { + status['416'](res, next); + return; + } + + fstream = fs.createReadStream(file, { start, end }); + fstream.on('error', (err) => { + status['500'](res, next, { error: err }); + }); + res.on('close', () => { + fstream.destroy(); + }); + res.writeHead(206, { + 'Content-Range': `bytes ${start}-${end}/${total}`, + 'Accept-Ranges': 'bytes', + 'Content-Length': chunksize, + 'Content-Type': contentType, + 'cache-control': cacheControl, + 'last-modified': lastModified, + etag, + }); + fstream.pipe(res); + return; + } + + // TODO: Helper for this, with default headers. + res.setHeader('cache-control', cacheControl); + res.setHeader('last-modified', lastModified); + res.setHeader('etag', etag); + + // Return a 304 if necessary + if (shouldReturn304(req, lastModified, etag)) { + status[304](res, next); + return; + } + + res.setHeader('content-length', stat.size); + res.setHeader('content-type', contentType); + + // set the response statusCode if we have a request statusCode. + // This only can happen if we have a 404 with some kind of 404.html + // In all other cases where we have a file we serve the 200 + res.statusCode = req.statusCode || 200; + + if (req.method === 'HEAD') { + res.end(); + return; + } + + stream = fs.createReadStream(file); + + stream.pipe(res); + stream.on('error', (err) => { + status['500'](res, next, { error: err }); + }); + } + + + function statFile() { + fs.stat(file, (err, stat) => { + if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) { + if (req.statusCode === 404) { + // This means we're already trying ./404.html and can not find it. + // So send plain text response with 404 status code + status[404](res, next); + } else if (!path.extname(parsed.pathname).length && defaultExt) { + // If there is no file extension in the path and we have a default + // extension try filename and default extension combination before rendering 404.html. + middleware({ + url: `${parsed.pathname}.${defaultExt}${(parsed.search) ? parsed.search : ''}`, + headers: req.headers, + }, res, next); + } else { + // Try to serve default ./404.html + middleware({ + url: (handleError ? `/${path.join(baseDir, `404.${defaultExt}`)}` : req.url), + headers: req.headers, + statusCode: 404, + }, res, next); + } + } else if (err) { + status[500](res, next, { error: err }); + } else if (stat.isDirectory()) { + if (!autoIndex && !opts.showDir) { + status[404](res, next); + return; + } + + + // 302 to / if necessary + if (!pathname.match(/\/$/)) { + res.statusCode = 302; + const q = parsed.query ? `?${parsed.query}` : ''; + res.setHeader('location', `${parsed.pathname}/${q}`); + res.end(); + return; + } + + if (autoIndex) { + middleware({ + url: urlJoin( + encodeURIComponent(pathname), + `/index.${defaultExt}` + ), + headers: req.headers, + }, res, (autoIndexError) => { + if (autoIndexError) { + status[500](res, next, { error: autoIndexError }); + return; + } + if (opts.showDir) { + showDir(opts, stat)(req, res); + return; + } + + status[403](res, next); + }); + return; + } + + if (opts.showDir) { + showDir(opts, stat)(req, res); + } + } else { + serve(stat); + } + }); + } + + // serve gzip file if exists and is valid + function tryServeWithGzip() { + fs.stat(gzippedFile, (err, stat) => { + if (!err && stat.isFile()) { + hasGzipId12(gzippedFile, (gzipErr, isGzip) => { + if (!gzipErr && isGzip) { + file = gzippedFile; + serve(stat); + } else { + statFile(); + } + }); + } else { + statFile(); + } + }); + } + + // serve brotli file if exists, otherwise try gzip + function tryServeWithBrotli(shouldTryGzip) { + fs.stat(brotliFile, (err, stat) => { + if (!err && stat.isFile()) { + file = brotliFile; + serve(stat); + } else if (shouldTryGzip) { + tryServeWithGzip(); + } else { + statFile(); + } + }); + } + + const shouldTryBrotli = opts.brotli && shouldCompressBrotli(req); + const shouldTryGzip = opts.gzip && shouldCompressGzip(req); + // always try brotli first, next try gzip, finally serve without compression + if (shouldTryBrotli) { + tryServeWithBrotli(shouldTryGzip); + } else if (shouldTryGzip) { + tryServeWithGzip(); + } else { + statFile(); + } + }; +}; + + +httpServerCore = module.exports; +httpServerCore.version = version; +httpServerCore.showDir = showDir; diff --git a/lib/core/opts.js b/lib/core/opts.js new file mode 100644 index 000000000..d4b170d55 --- /dev/null +++ b/lib/core/opts.js @@ -0,0 +1,213 @@ +'use strict'; + +// This is so you can have options aliasing and defaults in one place. + +const defaults = require('./defaults.json'); +const aliases = require('./aliases.json'); + +module.exports = (opts) => { + let autoIndex = defaults.autoIndex; + let showDir = defaults.showDir; + let showDotfiles = defaults.showDotfiles; + let humanReadable = defaults.humanReadable; + let hidePermissions = defaults.hidePermissions; + let si = defaults.si; + let cache = defaults.cache; + let gzip = defaults.gzip; + let brotli = defaults.brotli; + let defaultExt = defaults.defaultExt; + let handleError = defaults.handleError; + const headers = {}; + let serverHeader = defaults.serverHeader; + let contentType = defaults.contentType; + let mimeTypes; + let weakEtags = defaults.weakEtags; + let weakCompare = defaults.weakCompare; + let handleOptionsMethod = defaults.handleOptionsMethod; + + function isDeclared(k) { + return typeof opts[k] !== 'undefined' && opts[k] !== null; + } + + function setHeader(str) { + const m = /^(.+?)\s*:\s*(.*)$/.exec(str); + if (!m) { + headers[str] = true; + } else { + headers[m[1]] = m[2]; + } + } + + + if (opts) { + aliases.autoIndex.some((k) => { + if (isDeclared(k)) { + autoIndex = opts[k]; + return true; + } + return false; + }); + + aliases.showDir.some((k) => { + if (isDeclared(k)) { + showDir = opts[k]; + return true; + } + return false; + }); + + aliases.showDotfiles.some((k) => { + if (isDeclared(k)) { + showDotfiles = opts[k]; + return true; + } + return false; + }); + + aliases.humanReadable.some((k) => { + if (isDeclared(k)) { + humanReadable = opts[k]; + return true; + } + return false; + }); + + aliases.hidePermissions.some((k) => { + if (isDeclared(k)) { + hidePermissions = opts[k]; + return true; + } + return false; + }); + + aliases.si.some((k) => { + if (isDeclared(k)) { + si = opts[k]; + return true; + } + return false; + }); + + if (opts.defaultExt && typeof opts.defaultExt === 'string') { + defaultExt = opts.defaultExt; + } + + if (typeof opts.cache !== 'undefined' && opts.cache !== null) { + if (typeof opts.cache === 'string') { + cache = opts.cache; + } else if (typeof opts.cache === 'number') { + cache = `max-age=${opts.cache}`; + } else if (typeof opts.cache === 'function') { + cache = opts.cache; + } + } + + if (typeof opts.gzip !== 'undefined' && opts.gzip !== null) { + gzip = opts.gzip; + } + + if (typeof opts.brotli !== 'undefined' && opts.brotli !== null) { + brotli = opts.brotli; + } + + aliases.handleError.some((k) => { + if (isDeclared(k)) { + handleError = opts[k]; + return true; + } + return false; + }); + + aliases.cors.forEach((k) => { + if (isDeclared(k) && k) { + handleOptionsMethod = true; + headers['Access-Control-Allow-Origin'] = '*'; + headers['Access-Control-Allow-Headers'] = 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since'; + } + }); + + aliases.headers.forEach((k) => { + if (isDeclared(k)) { + if (Array.isArray(opts[k])) { + opts[k].forEach(setHeader); + } else if (opts[k] && typeof opts[k] === 'object') { + Object.keys(opts[k]).forEach((key) => { + headers[key] = opts[k][key]; + }); + } else { + setHeader(opts[k]); + } + } + }); + + aliases.serverHeader.some((k) => { + if (isDeclared(k)) { + serverHeader = opts[k]; + return true; + } + return false; + }); + + aliases.contentType.some((k) => { + if (isDeclared(k)) { + contentType = opts[k]; + return true; + } + return false; + }); + + aliases.mimeType.some((k) => { + if (isDeclared(k)) { + mimeTypes = opts[k]; + return true; + } + return false; + }); + + aliases.weakEtags.some((k) => { + if (isDeclared(k)) { + weakEtags = opts[k]; + return true; + } + return false; + }); + + aliases.weakCompare.some((k) => { + if (isDeclared(k)) { + weakCompare = opts[k]; + return true; + } + return false; + }); + + aliases.handleOptionsMethod.some((k) => { + if (isDeclared(k)) { + handleOptionsMethod = handleOptionsMethod || opts[k]; + return true; + } + return false; + }); + } + + return { + cache, + autoIndex, + showDir, + showDotfiles, + humanReadable, + hidePermissions, + si, + defaultExt, + baseDir: (opts && opts.baseDir) || '/', + gzip, + brotli, + handleError, + headers, + serverHeader, + contentType, + mimeTypes, + weakEtags, + weakCompare, + handleOptionsMethod, + }; +}; diff --git a/lib/core/show-dir/icons.json b/lib/core/show-dir/icons.json new file mode 100644 index 000000000..afac0a087 --- /dev/null +++ b/lib/core/show-dir/icons.json @@ -0,0 +1,65 @@ +{ + "_blank": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWBJREFUeNqEUj1LxEAQnd1MVA4lyIEWx6UIKEGUExGsbC3tLfwJ/hT/g7VlCnubqxXBwg/Q4hQP/LhKL5nZuBsvuGfW5MGyuzM7jzdvVuR5DgYnZ+f99ai7Vt5t9K9unu4HLweI3qWYxI6PDosdy0fhcntxO44CcOBzPA7mfEyuHwf7ntQk4jcnywOxIlfxOCNYaLVgb6cXbkTdhJXq2SIlNMC0xIqhHczDbi8OVzpLSUa0WebRfmigLHqj1EcPZnwf7gbDIrYVRyEinurj6jTBHyI7pqVrFQqEbt6TEmZ9v1NRAJNC1xTYxIQh/MmRUlmFQE3qWOW1nqB2TWk1/3tgJV0waVvkFIEeZbHq4ElyKzAmEXOx6gnEVJuWBzmkRJBRPYGZBDsVaOlpSgVJE2yVaAe/0kx/3azBRO0VsbMFZE3CDSZKweZfYIVg+DZ6v7h9GDVOwZPw/PoxKu/fAgwALbDAXf7DdQkAAAAASUVORK5CYII=", + "_page": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmhJREFUeNpsUztv01AYPfdhOy/XTZ80VV1VoCqlA2zQqUgwMEErWBALv4GJDfEDmOEHsFTqVCTExAiiSI2QEKJKESVFFBWo04TESRzfy2c7LY/kLtf2d8+555zvM9NaI1ora5svby9OnbUEBxgDlIKiWjXQeLy19/X17sEtcPY2rtHS96/Hu0RvXXLz+cUzM87zShsI29DpHCYt4E6Box4IZzTnbDx7V74GjhOSfwgE0H2638K9h08A3iHGVbjTw7g6YmAyw/BgecHNGGJjvfQhIfmfIFDAXJpjuugi7djIFVI4P0plctgJQ0xnFe5eOO02OwEp2VkhSCnC8WOCdqgwnzFx4/IyppwRVN+XYXsecqZA1pB48ekAnw9/4GZx3L04N/GoTwEjX4cNH5vlPfjtAIYp8cWrQutxrC5Mod3VsXVTMFSqtaE+gl9dhaUxE2tXZiF7nYiiatJ3v5s8R/1yOCNLOuwjkELiTbmC9dJHpIaGASsDkoFQGJQwHWMcHWJYOmUj1OjvQotuytt5nHMLEGkCyx6QU384jwkUAd2sxJbS/QShZtg/8rHzzQOzSaFhxQrA6YgQMQHojCUlgnCAAvKFBoXXaHfArSCZDE0gyWJgFIKmvUFKO4MUNIk2a4+hODtDUVuJ/J732AKS6ZtImdTyAQQB3bZN8l9t75IFh0JMUdVKsohsUPqRgnka0tYgggYpCHkKGTsHI5NOMojB4iTICCepvX53AIEfQta1iUCmoTiBmdEri2RgddKFhuJoqb/af/yw/d3zTNM6UkaOfis62aUgddAbnz+rXuPY+Vnzjt9/CzAAbmLjCrfBiRgAAAAASUVORK5CYII=", + "aac": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNp0Uk1PE0EYftruVlvAUkhVEPoBcsEoLRJBY01MPHjCs3cvogcT/4qJJN5NvHhoohcOnPw4YEGIkCh+oLGBKm3Z7nZ3dme2vjOhTcjiJJvZzPvOM8/HG2q325Dr3kLp7Y1ibpIxjs4KhQBZfvV6s7K5Vb0bjeof5ZlcGysP1a51mifODybvzE8mzCbrAoTDIThMoGXZiZ4YSiurf+Z1XeuCqJ7Oj+sK3jQcNAmg8xkGQ71mYejcAB49vpmeuzJccl0+dUj6KIAvfHCPg3N+uAv4vg9BOxcCmfEzuP/genpmeqhEMgude10Jwm+DuUIyUdTlqu2byoMfX/dRermBeExHsTiWNi3+lMpzRwDki8zxCIATmzbevfmClukiP5NFhJgwkjeRTeLShdOoVJqnAgwkgCAZ6+UdLC9twjQZ8pdzioFkZBHY3q6B3l4dJEEEPOCeD4cYVH7Xsf15F+FImC775INAJBJSkVoWo0QY9YqgiR4ZZzRaGBkdwK3bFxGLRZUfB3Rm2x4x9CGtsUxH9QYkKICDFuLxKAozGZwdTqBRs2FbLlXbiPdECMCHadj/AaDXZNFqedCIvnRcS4UpRo7+hC5zUmw8Ope9wUFinvpmZ7NKt2RTmB4hKZo6n8qP4Oq1HBkKlVYAQBrUlziB0XQSif4YmQhksgNIJk9iaLhPaV9b/Um+uJSCdzyDbGZQRSkvjo+n4JNxubGUSsCj+ZCpODYjkGMAND2k7exUsfhkCd+29yguB88Wl7FW/o6tT7/gcXqAgGv7hhx1LWBireHVn79YP6ChQ3njb/eFlfWqGqT3H3ZlGIhGI2i2UO/U/wkwAAmoalcxlNA1AAAAAElFTkSuQmCC", + "ai": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk5JREFUeNpsU01vElEUPTPzZqBAQaSFQiJYUmlKYhoTF41L3Tbu/Q/+AvsX3Bp/gPsuWLrqyqQ7TUxMtAvF1tYGoXwNw7wv7zwYgtKX3Lw379575p5z77O01ohW+/DVh8zj7aYKhflGdG9ZsGwLNydffgVfr19YHvsEa+Zu/nxndob5StQK+dyzvZzyw/gKlmMj7IygFM+xvNcanp4/t5dAomXHBy2UUBOO2MAl/B9/cPb6PULuoHx0WM0e3GvpUOxD3wZAJWutZqYUYmqpSg5OMgH3YQObL59W0/ullpryR3HegkKEqiWBSGV4R3vQ7sIhScTZFTpHx3A215B5sluVY/WWMg7+ATB/lcLsKpTonHzD+OMFEuTz8ikkt9Kwt9YJZB38cpBdoQAZJdLvCGByfoPB6Xdk90pYy6Xg3c/DaWwArg09DaG5lCsUFN0pckZAojdC8m4auBqaALuSgez7VB1RtDSUWOQvUaBLFUzJBMJ2DwmPgd1Jwm0WoSgJfjDvrTKxtwAIyEkAOQ5hU//Zdg5uowDlUNMnwZLW0sSuUuACYhwQRwFvJxupCjEYUUccOkoaKmdOlZnY1TkgAcXAhxhOwLsDsHoN3u4O5JTDfVCH6I9nfjId3gIgSUATFJk/hVevGtOMwS0XwQ3AzB/FrlKg8Q27I2javVoZrFgwD4qVipAEyMlnaFArzaj/D0DiMXlJAFQyK2r8fnMMRZp4lQ1MaSL5tU/1kqAkMCh2tYI+7+kh70cjPbr4bEZ51jZr8TJnB9PJXpz3V4ABAPOQVJn2Q60GAAAAAElFTkSuQmCC", + "aiff": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAohJREFUeNpkU9tqE1EUXZmZpE3aTBLbJFPTtFURtSCthr7UCyKKFJ/9An3og6Ag/oXfoUj7og9asCBYKT6UIPHaWtpq7NU2aZK5z5wZ9xxMpMwZDuewz9prr32ZiO/7CNaDx3OLt6fOjBqGg/aKRCIInp8+KzfKH7fudnVF58nE16el+/yU2mBFSWZKpWJKVc0OgUBo02K4NDmU6o75Mx+Wdu9IUXFeiOA/pn1xHeYaugVDdzpbp91qGlAKGTx8dC19/Wpxhjnsxj/RRwk85hGJC9d1O6fneWAuoztDYSSLe9OT6SuXB2ccx73Z9uukwDwfls1g0xZIY/Ad/Gnyt/XVfbyYrSDRE8PExHB6/8B6QuaxIwRBFMt0iIAiMx+LCys8jfGJEUik2WpZOD2SQf9oDtVqQwopCAiY66FS/om3b75CVS2MlU7AJ2WiJBCZjZ2dJuRkDJZFwFAR7UCBja3fNfxY2YEoCtRCj9em3Tpds6FpJseGCBxS0GgYGBzqw62p84gnYnAI2CSbSbPhEpFAaE2zODaUAlWWwDoS5DheGqbWpVE/0CmqCY9qkEyINBceb2uADRNQ8bSWAVVzIFKomCQim+0luS4yKYlsHlRyZo7EsSEC23K5vAsXh/H92zZkuRvxeBS5nEx2yp2KqhxPoV5TYS/8CtdApylM9sZQKKSQzyeRTseRV2QoAzIYY8jme5DN9fI0dQoUIjANGydP9VM7PZw9p/AiBpNYrdbw/t0yTJqRtdU9UrfJCUMpSJIgbWzsYe51BcViHzLHeqCRqhZ1YX1tFwNfZBxS9O3NWkAcHqR606k/n/3coKAoV/Y7vQ/OYCZevlrmv3c0GsFh06u3/f4KMABvSWfDHmbK2gAAAABJRU5ErkJggg==", + "avi": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAm1JREFUeNpsU8tu00AUPXZcN0nzTpq2KQ3pAwkIAnWHqCoeexBb+AQ+ABZ8A2s+AIkdm266QUJIFWKBkHg1KpRHi5omJGkbJ3bGHj+4M1EQrTvSyGPPueeec++1EgQBxHp+/9mbyuriRZdxjJaiKBD3W+u1+p9a856max+gDO8ebT+WT20Ezi9NZi/crqadvn2MQBAGfpCOpqNru2937vxPIpY6Onjccx3Twck9MBiSU0ncfHirXFmZX3Md9wqCUwiEVN/zaQfHt0vfbBe5uQyuPVgpl5Zn11ybL4/i/lkICOw5niQRGQShoiqI6Bo43W2ub8n3hRtLZT7gTynk6gkCX9gAOxpAnxhHZDwC1/aI1EViJolu/QhKRMHZ1UX0Gr1USIEn5FPWHy+/wTokkrQOq2vBaHZBN4hmY9Jwfr4An/teiEB45ZZDwDiMhoExT0N+sYDCuUkkplLIlXP4/XEXdo+RUhdhBSSfUwtVTUG8MIHK9QVqI7D/uY6vr2pwmCPrkz+Tk9gwARWQ9WxppbXZhNnpw+ya4A5HZi6L4lIR8WyCcL6sTZiAWjWgAmpxkn5+kqTamK6WkCwmERmLDLvjB0ML9ikWXPLFuozYOap3L8HYN6DHdbS/d5CeTVBndBz87FCBLYkNTyIjBQemnIEsSY5lYrK1+UoWcToLMjEHAyIQ2BCBSx/NVh+ZUhrqmEqBebS3WyhdLg0zt/ugAaIklsSGLHCLa6zDMGhZ2HjyGsnpFPqNHnY2fmHv3R5SMymYbROszSQ2ROAY9qHiofvlxSc5xsKKqqnY3diRE9h4X5d/pzg7lnM4ivsrwADe9Wg/CQJgFAAAAABJRU5ErkJggg==", + "bmp": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmZJREFUeNp0U+1rUlEY/13v9YV0vq2wttI5CdpL9aEGBZUDv0df668I6n+or0UQ/RuuD0EgVDAZrsKF4AR1a6COKW5qXvXec27PuVeda3bgcF6e8/ye5/d7niMZhgExnK9fbTrm5pbBGMZDkgCyq+VyhTUaT6Eo2ZHJePPWXJXRhez3B1yxmM/QdctXUSCgtV4Py4CvY3cky4e1x5DlLCaGbbzjXDcousG5OQe5HPRSCQPK4PpsEM/XH4WvhS4noeu3JwHGGRiULhsMoKZS4I0GtEIB9mgULJGA0+9DPBpBT7sffvf1W/Lg6OgJufw8C0CRGEXWazUwiiyFQjA8bsjVKjaJzovMD/Q5gxyJhG2cvyeXe2cAuADQNGBmBvLaGuTFRaDfh31lBTWi9pumjbK0B4JQul3vOQpM8JdskOLrdCvDcDjAsjtg5TIkoiKLaokMNR2cnZbqNAMycqG7XbHKR2fMzwO/dsxSwu0BiBJsNsv2LwAJAJCI5ux2gXYbqNetcz5PoORI1cDS0n8AxGW7A+zvEYBKZ2ZlcsEtJLbedMjePBaCTQMghx45ulyWkzxMVUQ2RMQhLfFO16YAqCrixPnm6iqKrRb2W23EfF4cUNSrHg90cr7hDyB33MTnSmUKALVs4uIlROjxg+AsPhGVl3fuIl2tIOB0Ya91gkOi9mxhAal0ekork1ic/kGLBORMxy2K1qS9V1ZQbNThIj2EGh+2tsyOnSai8r1UxMNIBB+LRTTULr4Uds0K1tU/uOLxIrmbNz8XXSrnASSpubG9fbKRyVh1n/zSw29t9oC1b47MfwUYAAUsLiWr4QUJAAAAAElFTkSuQmCC", + "c": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcxJREFUeNqEUk1rE0EYfmZnkgoJCaGNCehuJTalhJZSUZB66a0HwXsP/Qn+FM+9+hty0LNYCr2I7UVLIW0Fc0hpQpSS7O7MrO9MspuvVV8YMnk/nn2e5x0WRRFMvP/w6WSz5jbi/9NxfP693Wp3DrJCnMW5d28P7a+IE15lufR8o1ZEStwPhkWHsWbrZ+eNEPxsuubEF6m0TBv2Q4liPofXuzveulttSqW2UwH+GjqC0horpSL2njU89+FyMwjlTlxOJMTa9ZQHzDQIjgwdom9zLzfXPc75kbnOAswBJTlC2XrqQRMLxhi442DgB4UFBhgPpm3B5pgBHNUUxQKAHs8pHf3TEuFMetM9IKr/i2mWMwC0SnuSFTG2YKyppwKYVdGO7TFhzBqGIenVeLCUtfURgErucx5ECKREKBU4d3B718PHz6cICGT/1Qs8qpQtGOdyhtGEARWDQFqQJSeDL98u4VbLaKw9IRAJPwjtoJGlVAoDQ800+fRFTTYXcjlcXN2g++s36p5Lzzlve1iEROa8BGH1EbrSAeqrjxEqicHQt8/YSDHMpaNs7wJAp9vvfb287idboAVkRAa5fBYXP9rxO4Mgf0xvPPdHgAEA8OoGd40i1j0AAAAASUVORK5CYII=", + "cpp": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfJJREFUeNqEUs9PE0EU/mZ2WgqpXX+QIDFdalVslh8NlAOQaOKFAwfvHvwT/FM8e/U/MOnBmwcj8WD0ACEGghIkbU0baaEthe3OTJ0ZWV26q37JZt68ee/b9733yGAwgMbL12/fz+azbnAPY2Nrt7Zfqz9JMrYZ+J4/e2pOFjiciRvXlgp5GzHonXk2o6S8V6k/TjBrM/xGA4MLyeOSPZ8jkx7D+uqCU3Amy1yIYizB36AlCSkwfjWDR4uu40yMl/s+XwjeWThQQ4Z6QNSnSkYykcDXasP4lmfvOZTSF9q8TDBEFPbN5bOqCglCCCxK0TvvZyIV4CIxbgpC+4gm/PUmFCIE8iJPyME/e8Lon9j4HvyHYLjKSwRCSEUgf9+15mFbx8QS6CZJMzJ9SlBCwX3fJDLG4PX7ykcwkmQmJtpEhWa7g1dvNlSwjwelebz7tAXLolh0p/Fxe9fErK2WDFGEgKjxfNjegX0lDTc/heNuF99/HGEslcKXwyoazWNDdlCr6+DoJgrBzdI0T9rYO6yg2zszMlaKM3Dv5OBzbuyZuzm1B16U4Nzz2f3cFOx0Gq12F9cztpExncsqYoaHpSIKtx0zJdVIFpHQ6py29muNk1uTN829o/6SHEnh80HFaE6NjmLnWxUJy1LyTltB3k8BBgBeEeQTiWRskAAAAABJRU5ErkJggg==", + "css": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAk1JREFUeNpsUktvUlEQ/u5DoCLl/RAKKKUvWmIxjYntQtcu3LvwJ/hTXLt16coFC2PsojEaMKZtCqFaTdGmjbS0CG3By+vei3OOBSGXSU7uzNyZ78z3zRF6vR6YvXzzPrMUCyf68bB9zO+VfpROn5hkOdfPPX/2lH/lfiLidztX5mN2jLGG0rKLENIE8liWpdzwP7HvqJqujmvudFU4bFY8Wk1FZsOBtKppd8YCDNu77CZevd3gflfTUFcUhP0ePLibiIR9rjSBpgwAfe4dVcV6dhtep4PH5msylGYLrzeybErcT85FYiH/CyPAf74gObC2vMhzsiRhPhpC6eQUM+EA1pJzILEnjRSuJsju7MJqsUCSRei6Dp3yXqcdGlHZ/rLPazQWGCn8+6YW4pAkEW0SjzUzanWlCa/LgcR0lNfovTEi6lcIkzesnM/R8RlN0INGp3h4DHoDsE5YRvQyiKiRSMzikRAOS2WoqoZWu41K7RwzlOOAVDMMMHhIGvFlRxJFrKYW0ep0IYgC3SDh4b1lTJjNfENsrazOAMAw680mPuW+8lFno1P4XDigRhOiwQAyJK7TbsNS/PaA7giAIAhYz2yRgBIfsVA8wIetPG6FAqhdNrC5u0f+TUyHgyMTDDToEt/ftQsEvW4EPG5OZcrvw0mlimarTXkPfpXPcNlQoGtjACgpryQXsPNtH/nvRXqBJpoKHMzGNkNB0Odls7LNyAYKpUq1dt1iuvB7fRDp9kr9D1xOFwkpoksXusmXaZWFn0coV89r/b6/AgwAkUENaQaRxswAAAAASUVORK5CYII=", + "dat": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfVJREFUeNqMU01PE1EUPe/Na0uptmlASg3MoiZgCA3hQ8PHAjbqwsS9C3+CP8W1W/+BSReyYUPwI4QAVkAgUEgIbVIg1FZb2pl5b3zv2cHBjsaTTOa+e989OffcGeK6LhTevFv+OJoZHPHOfrz/sl86KpWfhxnLe7lXL1/oN/MSZqonOXU/k0AA6lfNhEFIrlAsP2PMyPtr1AscLpyg5pbtIHErhqez4+awmc45nI8FEvwNaiQuBHqTcSxMjJhmX0/Osp1xr878FxWEzwMinxAzEA4xFIpnOjedHTKpYbxW4U2CP4j8uWxmUKsghMCgFI2mFe9QgHZj0Ba4yhFF+KvGJToIRLuPC/efnjD6+26wB1Lq/xgbSCBXKeWJG/OTdky8cWTdT3C9RmWSGk2XCLlWo4xTNbfN5qh7PpXM72GjZeHt0gpq9QbmH4whGb+NpU/reDQ7hcWVVXxvXOHxzCQopQEKXKEbL6o1ZIcy+LC5g62DY2zsHeC0fA4zndIrHOjvg2XbAQRSfsuy9XxC2qzi/H5B6/68W0AsGkW0KyJPBLbDO0fg3JX/CUM81i0bD6WKe6j9qOPJ3EMcF0tSNsFA6g6alqW+VtZBUL78Vtk+Oqne7U9rs5qOQCjSheJFBeFIFOfVujSUYu3rIc4uqxWv76cAAwCwbvRb3SgYxQAAAABJRU5ErkJggg==", + "dmg": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAn9JREFUeNpsU01rE1EUPe9lkk47yWTStCmtNhFSWxos2EXVhSsRcasuxYV05V8Qf4DgD/AvCK5EV1oFI7iUBqmCNdDvppq2mWSSzEzy3vPOpFFq+uDNfR/3nnvueXeYUgrBWH1/9/NE7k5BKRnuRcfF2qdnmJq9DeF9tQ+2isuMsxXGWHh/a1mEVsPJSI5fSU3OPEj291IIlN49RXz0KqzEQjIeZS/L5Y/3wPGhDxIM/i/A7fZWgVG0t5EaG0ZUa0JGM8gvPrZmLt58QYwv91mfAqCIE0sAqgumBFITGQzpUYhuF0KfRa7waDyXXXolpVrsh/0tgSLDr5I+wUZo1UHCSkAficPzY6juFSmbRPrC/azjq+fkcO00gAqoU7B0ETKkfWbuCTjTYeq5oESAauexcTScX+ZACWFm0YQSLZKhHdr67+/wW0e0dgjYo3sCEXXybYtBDVSHLp2es3IpsILS24c42lkBg6DzRjgRzCDZ/xr0GNRJwwYiWgzt+hYMawleu0V3wbkT+kUirOc7IGJAz68R/Qak1BAlx3hqASPGBJRXpXOv58dkz3eAgQoOm4hyj57NgZm0MHvpBmK6QdUdg/DAg9cRkhicBSDaKJdeo1bdxmR2DtWDDUxl51HZ+QHTysD3XdQO95Gfv06aeGcAdBrY3Chi8lwO3768QWX7J5q1XWyVSxgajiOXLyBG2hzurRKV9lmt7ISNkkjo6HhNyjoK+2gXRsKE57ZIE2ot10Z1fz0Ue4ABVw3NMjnW14rInh8jTYywoTg3EOFpOM4mXNfH9PQUfGlrAwBOs3I8ljbtuMWhRWzIIPrkn+GcYcgIWEowbZ+0qB334/4IMADESjqbnHbH0gAAAABJRU5ErkJggg==", + "doc": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAppJREFUeNpsU79PFEEU/mZ39vZu77g7DokcP04BBSUmiEKCSCxs7Ei00JAYO2NlTKyMrX+CJhaGwopSQ0dMtFEsbDRBgiZEQIF4IHcg+2t2Z8eZ5QDlnM1mZ9+8973vfe8NEUJArfSNhzPG0VIfeIiDRSDkw1cWVt3N8rhG6SdSO2Gvn8dfuueqZwuNZqk3Jxg7iNcIfBbgXD6ZC8u5qffzX8eoYeyDxC77uygKhcouovgVUQj1H4YB2ovNuD9+tTTU0zMVBmG/+C8AIYh8F361DL/yE5HnADKYlVdg6MDAmW7cuz5WGuw+PsWDYGAvbL8ECFUt4K7/AHd/I9c7BLaxinD2Ld5Zo7g78RLuRhlBS2cpWbGfStfhfwCEpK0nUjCbWuGsLciSOELPhkq/YgdY3l6HsLfRcLYf+pHNbH0JigEPkLAyMsiEJ7NrqQzM1i7wyhoMZqOhvQs6Z0ovXgdAJACRoulEg5HOwrOroKk0zOY2BDtVpTF0CU6kLkQJXa+BNEoG0lMSsBBKQXWNQktmoGcaYeSaQCIVWOvUYQAiWZFQtk5mSMoSzEILtBrTfEcviC5bwVwQmoh96wA0ic5dB57ngeoaTIPCdb34zDITYNLOOIeVSsW+dQC+7+NSWx6jJ4tY/rWNV7PfcGv0tBoPTM7M4eKJVgx2FTE9u4QPS6x+kHzfw/mOAjarW2hJG3hy8zIceweuY+PRtREMdzbjzcd5WBqPB6xeRGUMGRzHjWvMmxQ7tiOF1JBN6FiTd6Sy9RuFbHpX7MMMqOD088Ii+op5OUAO7jyeRGfBwrF8Cg8mXuDL4neMXzgFwhwZz+hf7a9d5yu3Z6DTPjVQIY9k7erO7Y63Lvc8ErEeyq6JaM6efjai4v4IMABI0DEPqPKkigAAAABJRU5ErkJggg==", + "dotx": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAndJREFUeNpsU01rE1EUPTPzJk0y+WhMStW2qdVWxUVEQUF0I+4ELQiC7lz4N9z0T+hG9wrdZKUgLqulhrbSag1CKpT0g7RpYjqZmffle5NEKdMHlzfvvXvPPffcO4aUEno9f3Vt4dTp+BXOe+fB0u/NbVpv7h89NU1j1TCM8H7+xY9wJwPHZMbOjRadLAvE/2gToJTiTPx89k+OlVd/LT+0TPIPpO/SzyQk40xCMxBSZ9Z3CoAx5DOjeHT7SbE0XSpzwa8OWB9jINELolQg8AR0EgUKn1PIlIWpkUt4cPNxkTOU12trs8p95RiAXpqaztqou8q6SKQJJmZSqGwsodFsIJk1kcyLYv7IeafcLx4HUNkFF4jFTExMZ0B9DrfD4HUEusYhWs4GPEJg5wly/tBYRIOeDhpEwlS34xcyajdQr3UwOT2MlJOEBRuGNHWp9AQRVXDfQiFV/U5GBSiQ5p6ngBEa5z3fiIhC6g6IMDBwOdoHPkYnHPVyhN0tF7E4QSpr94CEOKELffq+y9Bq+DCJ7rWBoQQBVbPR2O6G4OlsLASJMtCZfQqm0NP5IVWnamdAkUxbyuIYtD7wWegb0YAzAVMkkI6NwPM9xEwHloyDGAmk7AKS9rAS0FKOdugbYeAHPu7OPEM+MY7q3hIKqTFQHmC3XcONc/fxdfMDrk/ew/edzyhvvTmBAddocVRqH3Frahau56qpZDho7+PnTgXffi/gbHYmLEvPSIQBp5JU62sYz13G609zKBXvoOMdYn2zgm7Xg2MVML/4Eu3uPgxhk2gXmNl8v/i2pcXTP8tKdTEcbWLZqDQXwu/l6pfwbEnSGsT9FWAA4mdHv2/9YJ4AAAAASUVORK5CYII=", + "dwg": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAoFJREFUeNpsU0tPE2EUPfOg006hD4rQh8WgbCSwkKgbF2owujaCiQsXxpX+D6MmbtXEsHCLmIAbE6NLo8YlGIxREIshIqVl+mQ6j8/zFVCb4UtuZua795577rl3FCEE5Bl79vPd5LHYiOP7cH1AUWi85ytmvlas1bJ9E5ryBntH3BpuP/X9i7ovkluuiE8N9SDepaLpCcRCCqa/VDCaMuIjSWP25Upl6n+QDoCz6Yh7KKzh3sI2LuUimPtRRyaqodj0MDloYiITSTi+mH29Wu0AUf9CsZPJoW5czJl48LmCc5kIKo5Al67B9gUGYxrun+5NnMlFZ+GKiQADj2a7AquseLIvjMv5KMaSBu4sWVir+3i8VIVKYSby0UTdFU8Znu8AYBHQgVOJEN5uOXi4UsdawwU0FSf6TaSoyw6DRvukPkgGWpDKy4F8a3jImCrqFDFn6rhKPR4VGnhvOTAY3WLcjifcQAsqRfhUc/Gq1MKNbBh9nIAMDjEppocxs9HCMktfGTCwP/oOBkUKNk/qF3pDYC6Ktk8RfWzyaaoKrqdDaBDwya8W1m0/CPCR3kFy7CcnmWQRUJqcRJFUKtTnPCeR71LwoeYF92CYyVnCFZpCTrRtCv5to2St8SOrKxiPqEEA4fkYT+mI0rdoeUiH1XZVuQPpsIKqw2QmfifTsnOABiWySlH9uU0Hh2MqjsZV5LtpPSoGeN9rKnhBX7ehoOSLIIPfnGONXGMMWN7xUfVldYDbjM3mrh5HCDgS17DhHgDQcIU+XbBxnDTn1x1UuQcJ9iv7l5Q5e1zLGri92EDJFnoAgHtcfr6wbbVXUqq193+0z97n3UJt1+d51n7aHwEGAAHXJoAuZNlzAAAAAElFTkSuQmCC", + "dxf": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAo5JREFUeNpsU0trE1EYPfNMmtdoH2kDNmJbaVFcaBVFpAsREQpFwY0bu3HjQnTj1mVd+ANcuC3qQixmry6E0kWFVIQ+bKy2tbFJm3emyXTujGca+4DkwsedfLnn3POd77uS67rw1vC79ek7fZEzpu3AYUqS9tKQGZPLpa3VXP0uFCmJ/8t9OLC3q/uJbcs5bkIybvdHoMsSbLKENRmvU2WcNnTjRFD7ML1WGSPJHI6sA4KRWMAWVDPxLYex3iCmfpuIh1QsFSyMxQO4GvXHHwOJ6XWSyIck8v6HQsnjAxFc7vTj2VwBg4aG78VdBHQFCk+dbVcxMdwev9gTSEC455sIBOu2KLsoJFzqasP9vjCeDBlYqzn4VXXwarGKZN7Crd5QfLDT/7KpBM84c9fFUFjFp2wdk6smflRsKKqMa7EgfJJ3Ac2OKlit2pEmBTQfngdpnupoU7BUtRGiiTe7fXiRqmK+KuDn6TpvYogmBRJcrOwIJLIWxmM+dOsyLKryQAaJpjJ1/AxrGO3SqdZt7kKZJrzJWBg5piHENuY8vV6e0UOye1TyftvC5l+gZB8SHJTwpSx4q4JeTUKaxhXoR57h7Rn+3iFolJ3xvPhab6HgJG/pJ7jsNP4sUX+jZiCgEsWd/DjH5IrSYpBUAr0yHpzSoXKOP25a6OBhndh0zcX1qIYM2RIbu6i0KiHD5B/GTMHG03kTGpEL7H80wHFOWwhqDZ+SpkBOtCDYJDhZE4gRcKNbYynAqbCMbXpwpVPFbEng0aKJGbYzK1p4wIegLlcEPmdt+DjXbzcsxFlCynRwwVAwW6hjqeg0Zt521SYCWCJvbe0Un29UDx7Hgrs3IEitHXkw3jOv2fl92D8BBgAJeyqBh90ENQAAAABJRU5ErkJggg==", + "eps": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNp0U01vElEUPfMFCEVArdoSqEA0KV246UJdUJM2Lo2JK/9FjXu3utJqTNz4D9worrsQExbFpAFT0TYp0CZ8pIAiyMfMvBnvm2Foa9uX3Lw7c98979x77hNM0wRf7ufPsq7Z2SQYw2QJAkDxQalUZa3WI8hy3gmZr15bu+z8kILBkCeRCJi6bufKMji0NhwiCQR6iitdatTvQ5LyOLLEiWcYukm3m4Zhmbq1BX13FyoxuH7xAlbvpqKRK1fT0PWbRwEmDEyiy1QVg/V1GO02tO1tKLEY2PIy3KEAlmJRDLXb0TeZL+n9g4MHlLJ5HIBuYnSzXq+DlcsQLk/D9Hoh1WrIUjlPcpsYGQzS3LWoaBhvKeXWMQCDA1D9pt8PaXERUjwOjEZQFhZQp9L2yERiqYRCkPt/z58ogTGqHQLE1BLgUmC6XGD5AlipBIFKkbhanKHGYLBDqQ4ZED0OAbfLlo8OIxwGvhVgyTHlA3xkomjH/gegBgDURMv6faDbBZpN+/tHkUApkdTA/PwZAPxntwdUyjYA/+ZMqJHjLgM9iv/6zRt2GgMaIE21aVIjnSm0DGPfmhzyde0UAE2Dj+p7urKCPvkZku9eJILOSMUnkvVhIo7GYIB3xSKYdhoA1erXGVKXpvFxZwdBonnD68PQ7YEwM4O4xwMPxc8RYE87g4FIcz+kvfmnA0YzIJIy77/m0OCqsTkkCTysKPjJG3viLei63Gm3kCO6UWqcMejjxecMPmxsoFKtYop6UNirYL9Wtc5OHqzznIXHq1na7OfMJROcK8a6O7MjW7nfzZdrd7jzT4ABACh3NGsh3GcdAAAAAElFTkSuQmCC", + "exe": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAo1JREFUeNp0k8tPE1EUxr+ZzvRJO62lUAQaKIQ0FVJFjBBdoIkrDDHuXJi4NnHtX+HCjW408Q/QmHTRaCRRohIJifgiiBICTQu29mHfnc7MHc+MlECKdxZz595zf+c737nD6boOYzxJLC6Nhwej7e/24HkO779s7G6mMjcEwfKZ21+/d+em+RbagaFev28qEpZwzKg3ZckqCPH1nfS8hScIdyhBe6JqTG3PfyTTeLrwFhvbKdy9/xi5QglXL0yGJsKDccZY7LDIAwWHpSferWBh+RN8ni4UylVER8MY6PHj0uSpUK0hxzfTmWsUtnoEwO3rer64jEyxim6/Hy67DXaHExvJX3jw7CX8XjfORUdDlOohhU4fAVjILCPbm9V1yIqK2FgYt+ZmsZcv4lH8Nb5upXD7+hVMjIRQa8qeDg8UTYPU5cTcxSk4nS709XTD53ZhpD+IYMAPj+TBz93fZiz5oHV4AP1fGdlyHZIkIZkrI7GyhnK9CZXy+Aig6p1+HQAY003AcF8AVtGGfLWG9XTO4MLZ5cL0WAixoT4zVmPHADSiMo3hzHA/xgeDWFjbNg8H3A7kKnX0koEcPdTu/ylgRGZgOjNv38zoSXC8BZJDRKOlwGEV0VJVGM0y4joAPO1spXbx6sNHeD1uRIYGUCxVSRlDt1fC8rfvcDnsmJ+dOaLgoAs6AVLZPJJ7WdhEkUyT8GJpBflSBcVKDTvpDBw2GzQqQT1OgaZqUOhtFQUTUKnVTVWNpgy51YLVKph7sqKYkA4A1ScEfT66vm5kC3+ofh6Xz59FQ5bpkvE4QW3M5Apoyorhl9ABIKnFgNdTOh2NkJG6WSf9eRBJtmFwLDJmriUzeaOkYvvcXwEGAIVNH6cDA1DkAAAAAElFTkSuQmCC", + "flv": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmtJREFUeNpsUl1PE0EUPbssLYUCXdpaC9gWoSTgAyFigiRGY+KjvuuTr/4A44MP/gx/gMYfwIsan0RjIjGiJIZgSIGFIoXSD0t3Z3dnd70zpITazuZmJzP3nnvumaMEQQCx3jx69SV3a3KWMxetpSgKxP3m242Do43SQy2k/YRydvds67n8a63k+FRSn7l/bdg5tdsAuM3he/5weDC8vLdqPLgIIpba2niux52mg//DqlsYSg3iztO7mczN3DJ3+ByCLgCBH4hOFEF7cDpzPCRyOpaeLGXSc2PL3HbnW3XaRQCPEgWI2MsRVAVqrwbX9bHxbhOKpiJ/bzpDOr2k68V2BtRNzMtqDEqPejY/4zSGjb54BM0mQ8k4xsDoIMauXxnqYOD7PmwScP31d0SS/eAuh1lrolFpIBQNQw2pqJdqsAlIceB1AJCIkkE/FZskXDQVRXw6IYHiE0nBEcaPXSSvJnGwWkQXAE4acAhbxPMJpOdHweoMhc9b2F8zwKizbdlyPLVH7QLg+JKBYzoorxzjz3oRzUoToaEw9KyO8XQW5AE5jrFT6AbAYVVNxCZ0Ka3So+DSTAoDiej5ywTySbls1OEDobhFlMcXxrHw+AbINEjNXgb7y6BndLhk8cRkHHbD7g4gEhiJFxsdhrDqaamBaDKKerGGSKwPI9kR9EZCaNA5ubE7A5s8IFhsrxQkgJhZoa/06xC5xRz2v+3BOjFlbqcGlquxsondT9vY+2pAJdeZR6fI355CgQCN2A4O1w7gkQ7cdLUOAKdhV6uFSv3kd/n8mT68eC8dKWLnY4FsfeZQh7nVVt0/AQYAsf5g+SvepeQAAAAASUVORK5CYII=", + "gif": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmVJREFUeNp0U0tPE1EU/trplAqlL0laiw40xASByEJIZFGVnSvj1j+gWxNXJq7VrbrwF7h10cSNhMRHojEuACVBKmH6SJQyJeXRxzzv9dyZPiCtN5lMe8853znf953xcc4hztDzZ1+C6fQMHAfd4/MBFG+p6h/n4OAeAoGNToi/eOm+A50LKRaLh6amoty2vVpZdotNXccMEK3LwZxa2bsDSdrAqePv/mLM5tSdMwYBYqyvw9zdhUn/L59P4OGtG8qlZCoH254/DdCdQBCxqZu+ugqnWoW9swN5ehp2NotgIo6bGQWGtaS8+vQ5V9a0u5S+1gfABEilAqdUgm98HDwUQkDT8JXoPPq+BoM5kCYmFT9jryn1+hkAt7heBx8dhbSwACmTAUwTgdlZ/CVKJaLnI1GD8TikZiPSR8Gxib8chH95mZTxgwWHwH7+gFMswqcokIRbjMO2HDCnZ1VvArpjEmnKZc8+cZJJYGsLsMiZ8AgwEqaY6Mb6RQR33JFhGECzCRyfAFXNu9v+RVNRZWIMuDJNuYMAaDycUFGhCOgtuAtFVDA83G5A8TrFDw+F5QMAxAKJJxz2xnW3RPJGbm+rCyjotZetH4DGzaSSeDA3h4Zl4R0JOEZWTpIzF4n/m995bNdqZwB6m0gFft3Ak6vz+KYWwFsGlqIxXItEcDt1ARMEtKdVgZb+fwA0G2C2hXM0ZTZNRcSf0b1pmXi7uYnjI+Lfanm5fRQsK8BIxKcrK7i/uIgP+Tw+FlREqHN5fx/vyU4uHBE6UO4gDWqk/JFaLuMxcXeFk6TuJ90V0HOk1in7J8AAjmgkPfjU+isAAAAASUVORK5CYII=", + "h": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAbRJREFUeNqMUk1Lw0AQnf0woK0ttVqp0hwqVCl+UBERT94F7x78Cf4Uz179DT14F8WbYHtRkBYRLNqDtdaPZLObuLs1NGlXcWDJZGbey+x7QUEQgIqT07PL5WKhHL5H46J+22q22vsWpbWwdnR4oJ80LNiz2czGUjENhvj4ctIE4Wrj8XmPUlKL9nCYcOFzE9j1OKSTCdjdrtiLdr7KhVgzEvwW6krC92E6k4Kd9bJt57JV5vFK2KfRQRV+RAMkzxglYI1RaDy2dW1rpWRjQo5VGicYIorWVooFvQVCCAjG8Omw1MgG8AM0uSBUDSnCfk/IGCHwf3DCD/7UhOLBrFkDuep/hDUSSCv1iYo4rIfqGwmUSNJjfYbBcQKhZw0aBMA4B48LwBhBt/cON80HmM9NQ6fXg/Wlku4TwmNWDzaQqzHG+0PSKod5cH5Vh2RiAhYKc8DlV1UPSyuFMGygVlMg1/P6BC6DqXQK8jNZDXAYA1f21V34wMXYFaiyVw0rJyzLgs3VMkxOjGtix/V0XWChZ0cI2i/dzvXdfTd0Qf91BMPrhyNzgKfOmxaWypqaDXHfAgwAtCL8XOfF47gAAAAASUVORK5CYII=", + "hpp": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAehJREFUeNqEUk1v00AUHK/XKf1yZdESVRBXjRSRFqMQVBA5Ic5I3DnwE/gpnLnyG3LgXglx4UDDLZS0RWkDLiRxSusk9u6GXSembmLgWZbX7+2bnZl92mg0goo3b3ffO/ncdvyfjHef6q2Dlvs8Q2ktzr16+SL60jhhZ69bO8X8ClLC7w9XdKJVG8fuM0r1WrJG4gXjgqU1D0MGc2kBTytl+7a9XmWcl1IB/hZKEhccq5aJJ/e3bTu7Wg1CVo7rNLlRhUh4oMnXoDoyhoHGyWmUe+QUbELIa7W8CjAFlMzdzeckCwFN06ATAn8QmDMMMGlMuwWucpoCHNe4jBkAMenjYvRPTyi53JvuwX8AplleAeBcRFrH6rXIxLim9I/pi3QA1RhKaYxdjkN8IwalCMIwWs9ljMkh0wzk+9M7w179C3LZNXxve2h+c3Hu91HeKmD/6zHOLnw83ilB1/V0CeqU3Q81LC/O41b2Btx2N2JVP2riR8eTUxmi0TzBwrKZMsqMoz8MsDh/DWuWhUBKURLKxQIeOMWoptYPnS1c+INZBkwISomOSsmBZS7B+3WOzZvrKGzkMAiGqNy7g+LmRkRfekBnANy2163PZXrSbrQ6vch19Xz8fPDHyL39QzkHBKedXjfu+y3AAGU37INBJto1AAAAAElFTkSuQmCC", + "html": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmBJREFUeNqEUktPE1EU/mY605a+hhZTBNKRDApNrWIRA4nEBUZdmCgLNi4MK5f+FNdu3bFv1J1EXODCR1JJSMTwpqUP6NiCpe10Zjz3hj5Mm3iSybl37jnf+c53jmDbNpi9eb+6Ftcisea909bWNzNb6dwzSXKkhIt/r14+515qBqmDA8HpqKagh53XaopblpIbe+knDpFAhPab2Dw0TKvRK7lmNODzePBgZlK9oUWSpmVNdpIU8T+jaMsyMaD4MDcZVa+NhJMN00w0n6V2nN3yQgdHWZag+LzYPTomIAtT0THVtPGanmb/BbjwLFkvn2IttYGYplKyDzsHh7gdmyAWfh5zVq0Guhg4RAHFUhmfvq3j134aXo8bd+ITnMFOOovU5jbGRoZwNxFn1cxuAIcDW/sZDjA/c4u+BNxOJyxqaenpI3z88gMfPn9Hv98HQZS6RazW6kjExvFi8TGdDSy/W0Emf4LS6R8sv11BmfzSwkPcm74Jo9Ei0GZgmkw8QCOao8OXcaz/5vSZnPdnp3ApqBBLkWJE0Ci7ASzbIhCLLQ1E0iOkBDh9NpUgiUejo8oNuJwyn0YPABtn51UYFFivG3yBGCNZkuDtc/MW+ZQI3OrYpBaARCKufk3B5XIiWyhiL5ODp8+FfFHH+KiKSqWKUL8fC/NznGlPBmz+24dZjKnD0CJDcMoyW0SqXuMtHBFw7rhIAD1ErNUNafxKBNevapwu65NpEQ4FqXIA+RMd6VwBP3cPSERb6gLIFIq61+UqGWaFdcrVt/lmAuWjAi2aiMFwmOYuIJ/N6M28vwIMAMoNDyg4rcU9AAAAAElFTkSuQmCC", + "ics": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhRJREFUeNqEUkFPE0EU/mZ2dra7bLNpi2AxQFKalkJrohICiYkXPagXrx78Df4K48GDBzmQePLMhUODNxQ5ciEkJVqDtJGmMWrCATRbd2ecoS5u3aovmezsvu9973vfPiKlhI4XL7c2r5YL81LIELEghLA3u/udxmHnPmfGW/Wuv+LpwwdneRYBx7PeWK0wOYYhcXxyckGV1fdbnbuMsXcklqPRJQxFMKz4RxDCtVO4s3xlRjWoB0FYjlQPEEBieChwKCRGMx5uLtaKs1P5ei8IKlGa/YkXMXYtlTEDlsnw/mMXhBJcqxSK6vlcpa4PEpCooUyIqs5M6hG1o2CUwqA091cFcYLf/sjzcX75EiQIojI9779CTYR4jwTBf+r7GAwh0AxCiL6JMT/04vQ79u8aI2O/7Jzg69o6Go8ewycUahtBpADhHKLnK/eVbkMdtROWIv80NQ2sPhncA9Htwn+9hZG0rY6DzFwJl+7dhs0ZstUy8rduwPS/wd/ehmi3kwq4zTHiWUgXp+EuL8FvNvFl5Rn4xAS86iyI2kY3n0Mv48ByrOQmancdi8I0Kcj3U5iuA29xAelKCUHrEIayzltagG2E4IwkFaQgSC6lYI09iN0d8It5uNV5nG5sgJdKYC0G8WoTOZvBISFNEBxnsuzD3GX4vfDsszzqAu0jkJQDedCGbB6AWg54pYbPo+NGVPdTgAEAqQq70PytIL0AAAAASUVORK5CYII=", + "iso": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjlJREFUeNp0kstrU0EUxr/k5qbJzdPYpGkpsUJoA2q1oLjTdiGiIC5cuXHlxv9BEOrStTvBnQvRrSAIsejCrlqpsURq2hCJNQ+TNLm5uc/x3MmzJh34mDNnvvnNzOE4GGOwx8+t9XQkfn0VE0Y5/7Z+kHm+dvOhtd3P9c/xwNZh7nWaMYtNUmX/Fct/vlN7/8J5aRRgyzm8xzpRDjGE2aVH4VTqdnoUYg/XkEhmy+Cx3DhA5tMzdFolvg5Mx3Fx9SmH0JIg79Zo3j4GADMIokJTKtjbfAKXU4Y/2NvSfyH75TFOxa9Cmr0XnlPFl5ReOQ6wNMDsoFX6AElqQlNV1KsOuNwS/AGFjEUIDhmn5+/DMM16/9igBowAzFKIswPJr6MjlxFP3sV04gaP7RzMPe6xvWM1gNUBM2UKYlBau3QghGphg29J3gDlLLilWNdD3gkvIIDRhD9yGe2mCV0V4HFXuCxT5Dlv8Dz3sIkAs03FalDxBMQSt9BRBMhNncuO7dyU28c9tnf8C/Q0ZtR4GImeQSj8APLRH772BWcgiFODffCv/t8H9tO0v3RjV7VqkeeXLlzDfvYjj88uXhl4JwIsrYxmLY/M1gYclIvGE9jZfNPrSCD3/QgLyeWTADV6wW9AryIcCkB0u1Aq/oCPumlufoF72vIheaLDr4wCLIOqrYnULA14PSoqpSJEAUilZrD77Sv3LK+cI0+Be8cAbbmAOrob0agtD491LYfkoqvnyZLsWRkA/gkwABL4S3L78XYyAAAAAElFTkSuQmCC", + "java": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjxJREFUeNp8U01v00AUnNiOEyepQyhQobRBSlVIoRCBEPTAjQsSEneE+An8FM5cuXLNoQduIAE3qopKNJAIIppA2jrOR93aa6/N8yZuUxyxkrXr3ffmzczbTQRBgHC83nj3ca28dD36nx6fvnzrNNrdp4oibyUmey9fPBezEgWVFuYLdyvlPGaMY4fl1aRS+9pqP5ElAkmcnknRwuO+Nyt5u/ETYfyj9WrpZnmpxn2/Ok1Swn/GvtnH5k4TLue4kNfxoFoprRQv1TzOb8cAIu3+ZD7oD/Hm7XuxzqRUNDtdkuLiTmW5tFxceBXlnXgQTAORSMt2oGezUJJJrK9dFWdEH7Ik4dB29LiESeUEJXd7/dAT3L+1ivlCHr8NEzutXTBvbJPPSdO/AH5wysChwM/1HzCGlmAzOrKxu2eCud6Z2Jke2MwThpUXL6Nn2ZAVFTlNw70bK0iRnGAq9qwHtOmTRpsx1NsHyKRVnNPnoMoK9kc2BjbD4vk5JGV5NkBoEPM4FFnCteJFWOS4ntHEfphQyKaFTWFLw704AJ26ZFx/ZEEi3YyY0O1Dmr4EKTUHA8hUnS6siI0DEHLYog+b28RCRuNXR/iQUpPUEQ+NVht6Lodnjx+GXYgDSFRnq97Ed2pXSlXhUSeGhxYc5sKlNXM5DGLR2TMwfZVPAIi+otGNWy1fEZUKeo4qc4ysI+F8VksLIJfYcD9QYgB/DNPMptWBlsnBIS86xmDMTBo/PWd0LB6VZfdEbJT3V4ABAA5HIzlv9dtdAAAAAElFTkSuQmCC", + "jpg": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU8luUlEY/s4dmMpkWxRopGJNNbiwhk1tItbGtXHr0hcwmvgOdWld6Bu4coXumtREE3ZKu8FgOlC1kIoXtC3jPfdc/8PUIpzkBM7wf+f/hsts24YczuerGUc0moBlYTAYA+i8sbdXtAzjITRtq39kr73s/Gr9DTUYPOeamwvYnHdrdR0SnDebuCbswJGqpX+Uf92Hqm7hzFAG/4TgNr1uCwEJ0trcBC8U0Kb1/PQkHt9JxSLnL6TB+Y2zAIMOJBGLXmtsbEAYBsx8HnqCGKVScAX8uHf5EpqmGXv18VO6VDEe0PXsKABN8+AAgiabmYFNNJTDQ2RUFc8+Z9G0OPR4PKYwvKari0MAgiY/OQGCAajhMNR4nDZMaInrKBGl70SPMScck1NQG3X/CAWLE3/dAWV5hRRVIJxOWNksrP19sFgMqqAebUGYHMI6teq0A9oTVAhqu2sfbYYjsL7lCZ3683gA70T3TK7/B4BNoO020GwB9TpwfAz8LgMtWn/NkV8EHgoB81c7nYwCyBZlEVkHcqMTKFnkmehJTOPvEfCnKi0fAyADJKfXC/h83TaZTJjaa5lANLpOFqAXtlEAorAwO9u5syT5UxLfU0e3o1FMu1x4u7ODYq02BKAMAVSrSNLrK1MhLPj8mNF0vFm+C1ZvwKBwXXE4AGn1WAASazESwUW3BzUSMeJ2o1Aq4sPurvQYSRLwlhRR6mSaYyi0WlpAJrFRx3ouh5/lMt5lv8BLwXp0M4lSpYL17e2uK5wP6lj/c2ZPn2RI+YT8fDvqoyegVLyfG5kBKaQQOfvF2pLc+ifAABiQH3PEc1i/AAAAAElFTkSuQmCC", + "js": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RUQ5ODY5Q0NGMTE4MTFFMTlDRjlDN0VBQTY3QTk0MTEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RUQ5ODY5Q0RGMTE4MTFFMTlDRjlDN0VBQTY3QTk0MTEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFRDk4NjlDQUYxMTgxMUUxOUNGOUM3RUFBNjdBOTQxMSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFRDk4NjlDQkYxMTgxMUUxOUNGOUM3RUFBNjdBOTQxMSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoT8zQ8AAAJdSURBVHjadFNbTxNREP52t7S0bktbKFAvTUVaw60YqkExUTD6oD74qC/yD/wp/gh885XEEI0RAyYQUiMpIBGMkYR6o23abi+73e2uc04v1LROMtnZPTPffvPNHMGyLDB7sbJ2ciUSli3U35smkK9t7x9v7n2dD/g8KUkUwWqeP3vKz23NxJGzgwOx0RC6mSgIo+WKuvP56MeUzy2nJEk8PWsGJVVTuhWbpgmHw47FB7d98Wg4mVWK52o1sxOg3Va3PmFp+Q2PdUquaFUM9/vw+O6cP3bxwm46Xwh1ALR3/vL1e+hGjcc9koScUsTSq3coVDQsXJ3wzo5HEs3clgZNMTVdx1T0Ep7cn6//QRQwMhzA6uZHLD5cIFEFSKIU+G8LK+tb0KsGZKcTJoEyP08AbpcLy6sbPKdQrigdAGaDwWxsDH1uGbliCYIgcM8WFPg8Mq5Pjzdyu4jYbCE44EepXMHuwXe+A8x3KKYxYsjvbUzmlPGpBmYdgI1oYjSMbL4Ao1YXMkcM2Dd2xnbAamPQAqg1GORLZdycmYTdJqFKk2DPR3fmwI4zBDrg9RADqxPAbPBif2WTSB584/3/TGegEOit+DRcvQ4OZJi1LgwIQKVCg2i6nb1I7H3Br3QWqT9pBAP9uDY5xjdSM3RqxeoUkfVnEOW8UkLykERTNXjkM7h3Iw6NNvHw6JjuhAhVrba0+QeALozcI9nQR0VvNxJc/ZmxCNGvIBQcpDG6udA22kyW29HC72wu8yG579ZoiSYuR/ly2+y9CA4NceWLmo717T1i5ULqJNtapL8CDACskxPFZRxLwQAAAABJRU5ErkJggg==", + "key": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlZJREFUeNpsU11PE0EUPbM7u/2AtJUWU6qiiSYYo5EmmPDCD9AH46sx8cEnja/+CB989z+Y+MKPgMiDsYQACcbaWBBogYD92t2Zud7ZlQZsbzKZ3bl3zj3n3IwgItjYeDO3MlWme0bjUth8e8/fO2tHzx3XqUEk50uft+Ndnhdmc3SlfNPkVZT8Cy600DoIISvVfKYtlvfX1p66XmoIYsMZdjJQWvEFbbsC/S5g2QhSkKUK7rx6OzvzqLpsovAhaAxA3DUBQn2TUFsl7KwTfm4Z9DoO5LW7uPXi9Wxpfn7ZKF09vyPxX2iWcNRkKGZz0mQWKoNs8AVB6x1yRY2pYnc2LLofuXTxMgAlmlXIfngCxNxEzM+DPv6NQa2BygLgZyX6JT83ngHTN5GAL0WSoUQkSQnXkyBh/k0GegTAaldM20sTKvet+yyhIZApECamL0jUSe3oFChx3TopM4TeEQP2gc6BgGIwb4KGNXRhCkMGxgg2kJeybRiZM45D8W61qEAknSmpHStBhywu0nFVupSCTAcM4ECwqapv+NQ6LS9JGALoMIIoPYDjZiEL1xHtbyO39AQUDaA7R1AH23DSeSA4hv5RG/VAhxomPYP8sw9A4TaC9iHkjUWmrtGvbyC18BLe3GP0m3WW4I5hEBEnPIStXzyuFIxb4EkMEJ79Qa/xHbKxCdM7xeCwzUZOjgEwnuzt7qLz6T3cySmQP43uzjeIiTJM6io6W19B/NLCKMVGCzkCoLR/0lrfOI2fNy/huKC1FTsK/rbGNeMRC8dHpHByfu+vAAMAL/0jvAVZQl0AAAAASUVORK5CYII=", + "less": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjZERjZENTJGMTE4MTFFMUIwOEVERjQ5MTZEMkVBREUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjZERjZENTNGMTE4MTFFMUIwOEVERjQ5MTZEMkVBREUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGNkRGNkQ1MEYxMTgxMUUxQjA4RURGNDkxNkQyRUFERSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNkRGNkQ1MUYxMTgxMUUxQjA4RURGNDkxNkQyRUFERSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pl1w97IAAAJhSURBVHjahJNLbxJRFMf/wPAIMIxMkUI7tS0VYqlGDLGhjdKkqyZ24cJFN925de+XcONHaHRj4k7TND6SGo1VWwmp2kSLhlqMDbQ87gzPYcY7k4GgoJ6bmdw598zvnvM/95pUVYVma+svcovx8yMnFZHAMJPJBJfDzq5vpX6+/vD5qo/z7DOMBdo/d26t6jFMJ3iY51jBz4M+LP6wxEw40Gy23qYzB3HO7fpmpZCOmfEfa7Xb4NxOrC4lvbPToe2yKE3K1PdPwNOtHdx79ESfq4qKkijB5/XgevIyHxEC24USmewDqD2ABxubaLRkfW6zMqjWGlh7/ByyAtxYnOPnL0Q2+gGGmKRaw8zUBJaTiS5QOO1FJnuIAM8hciaIWHgi8NcSNt+loVDY8JBXh2ojJAR1HbTSNFMUpV8Dxcjg0nSYBrtBxdLbqI1iheCUh9XXNGurAwCdEkb9QyBSFam9TDfoPZ1LUg1BH28IiwEARTVAQOzcFKRaHZpLoa9avY6L1Gfs0c32t4PU6W2lWsV8LAorw0Cs1nXftYWE3qZGqwWHzYp2zzlgetuolVFvtiDLbRRKFTAWCxx2G/KlMtXFhWPqOzsWHJwBx7rxKv2R7mwFz3lw9/5DLC/M4Us2RwV0g3U58XJnF7dvrsBOoX0Abbej/DFKRMKI30fTVGC32WA2m5H9cQQvhYi0vE/7Wdgczn6ARA9QPBrBszcp/XvpyqxebzQ0Tlsq6llxLhe9bD4cFMr9XdjLHpLv+SLGBYHAYiVu1kNOpAaRTWbCejgiw0zGhFGSK1aw+zXbvfK/BBgAPwADAs5GpGsAAAAASUVORK5CYII=", + "mid": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNpsU01PE1EUPdOZKWUotKUKFLEWkQ1EASGGxGBi4sIVrt27IixN/Cn+CxfVnQsXJiz8IAoqRBGEaMUUWzofnXkz781436QDkjKTyXuZe96595x3rxJFEeTzaKW6dmdpfIoxjuRRFECGn7/4Utvarj/syWgflU5s891qvGoJePJasfBgeSpnW+yEIJVS4DEBx3FzGT2qfvh0tJxOE4mCU0yy8X3BLdODRQTJZ5oMzYaD0UuDePzkbnnx1mjV9/lMp+izBKEIwQMOzvnJGoYhhBDgFKtMjmBl9XZ54WapSjLnknMnEkQYgflCVhKXLt+/dRMy2d5OHdVnPoxeHUtLV8u2w5/S78UzBJwLMC8gAsosIqy9/ga37WNmvgKVKmEkb7JSwI3pIdRq1kBXBZJAUKkb6wd49fIzbJthdn6cIhE0XUWbyP4cmshmdZAE0eUBD6gCN0DtZwM7Xw+RUlVEJCui7CmyPaS94zC06ZMedREERNA6djBWHsS9+9fRS3p9AraOXbhELMlUQju2G2O7JAQENk0XhpHG3MIVlEZzaDbdOKO8jWy/TraGsMmL4L8KTgnIfcfy4JBWeQNp0j10MQtB4EJOg6qFMI/bEH3pGNtF4LOAjHMxO1dGvW4jXzDi7Iw60TB0jJRyONhv4MdunbDneMA6BMPDA6iMFzExcQH9AxkUiwby+QzevtnF2OU8lBT1i8fOa2UO1/FwdGTHE2STHM/14+vlPOz0RxibKPfn9AHXZHBzYx866ZdTKkuVndhHuqenS1h/v4ffvxqyvbUuAtPizZ0Dp7X1fTs+FA9cMnWd4ZG90NOjomVFzeTcPwEGACDGeYddZX86AAAAAElFTkSuQmCC", + "mp3": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNp0U89PE0EU/ra7XWxpSsFYIbVQf9REFBHkYBRIPJh4wrN3DsZ4MPGP8b/wUCIHEw5EY0w04o9ILcREGmwVgaXbbXdnd2bXNxPahGyczebtzrz3ve99740WRRHkWn5cebu4cH6SMY7e0jRAHr9c3WxsVvcemmbys9yT6+uHJ8oaPefypdPDD5Ymh5w26wMkEho8JtDtuEOZFCrvN/4uJZNGH0T59D58X/C27aFNAL3Xthmsww5GCyN4+uzu+OLtQsUPxPQx6ZMAoQjBAw7O+bEVCMMQgqygs+LFs1h+dGd8bna0QmXO9OL6JYgwAvOFZKKoy3V44CgNfv7Yx8oLH+lUEgvzF8Ydhz+n41snAGRG5gUEwClzhHdvttFxfNyYK0EnJozKK5eGcf1qHo1GOxtjwI+pfvm4g/W1qtJgerYE2SXJSIL9+W0jk0mCShAxDXgQKgbNXxZq35vQKCiKQkSUXdc1+gcch1FHGPmKuIgBCdc66qJQHMG9+1NIpUylxxHtuW6gEiTIu+N4yjdWgty0yTmdNjFzcwKjY0MU7MLt+IjoSad16FoIx3b/A0DZ7FYXnsdpAjUMDOjI5zPgfoBsRodhhGhZHfBBU/nGAGRtxWIOg5lT2NtrI5dL0SB5KJzLodloqXaOEatPGztKq5gG3S5DNjuAK5NjKJfPYKI0okBkSdemCiSgS/rkQNLSePtxBj4LSCwfFtE0krqqX7ZVMnu9XlMXy2l7ME0dzA3iANQyY6vWxC61UY41zTyNcYh6/QCNXQvzi5dR39nHVq1BUyuMGAARsF6tbbe4iKD1r7Om5iFBdmW1SsDflLiuB6sX90+AAQDHAW7dW0YnzgAAAABJRU5ErkJggg==", + "mp4": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnBJREFUeNpsk99r01AUx79psrTrujVtbceabnZs4DYRHSoMh6Dgq77rn+AfoA/+If4Bok+C0CfxVRDBh+I2NqZzrpS1DVvbtU3SJPcm8SSlsJlecsn9dT73nO85V/B9H0H78OLdt/LDlQ1uMYybIAgI9n99OWxoe83nkiz9hDDae330JvxL48O51Xxm/enNtKPbVwAh0Ec6kYpXat9Pnl2GBC02HrjM5Y7h4P8+7FtIFVJ49OrxUnl7ucIdfhv+BIDv+fBcj7p/tXMPrs2RXVTw4OX2UnFTrXCbbY7tpMsA13FDSDAOQ4gJEGUJLs0PPh9CkESsPrmxxEz2lra3rnpAt3G6adgdQhBpmeLkFodNmsjpOPoXBrQTDcmFFNS7i3MRDzzPCw/vva8ikU+COQxm14BBhvJcHLGpGPTOAJxxeLbrRgAkYujBdH4G5oWJWXUW19YL4XqunAMFhnq1BqWYgaY1MAHASQOiU96zKzkU76mwehaOvx6h9uMv7KFN3RopL4oTAI4HRh4wSl399xla+00YbR3yrIzM9SzSqgJJnoKcklGrH08CcJjnBtLLCsSEGGpSWJvHtDKNoFippsJ0ulIsDDUCCATMlBQkNuahEyiZTcLsmFBKaQxaOk53TlHeKkM70AjAooCghBOk9sKtIvqtPqS4FBaRnJSRX8tj2DOh3lFB5Qw2ZNFK5LRo6w4sKt2ggAzywidAMN/9uIPSZglBLDO5FF3mRD3wHE9qVRvoHrUpfn+UEQK0/7ShtwboHJ6jdH8RZxSC57hSVETb7e5/2u0FxqPHJow+8iZ4lYY2QGu3idhIxO7Y7p8AAwALCGZKEPBGCgAAAABJRU5ErkJggg==", + "mpg": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNpsU0tPE1EU/ubRdlqmnUBboa0UeUQDiUGCC1+JmrhxoXt/gBvXJi74If4AV0Y3sNKF0YUaICqoIfjgVShEiGF4tDOdO/fOeOaSKtie5GZu7pzz3e/c7ztKGIaI4vn9p+/P3h4e4a6Pv6EoQBDiy7P5rc1P1Xt6XP8M5ejXo6UJ+dWbuemeTGdpvNdiNe9YvQLe4Bi4PmTpRmyq8m71rp74BxKF2twIHvAo+f/l1T2Yp0zceHizfOZa/xRnfBRhG4CQqAYioBWeXDyA8Di6ei1ceXC1XBwrTXHPH2vW6ccBBBMI6BsSUEQzakGL6xB0tvjyBxRNxdCtc2Xf8R9TyaWTDOg2TjfVdw6hqIoE9B2GxkEDWlLH7s4ette2kSp0oDRezrQwCIIA3oGHr0/mKMmE53qo23W4+w5S+Q5ohob9X3tgHgO8ULQACC7gMx9mKQP30EW6mEHpYi8xcJEdzMucjfkKcrTfmqmiFYBxCF/Id+gayKJwoQjHdrA5v4HK7Cq44KjZNWpagaqp7QACks0H9znW365ia24DzoEDozOJbH8eVtGShXHTwNracnsG7q6LzsEuaAlNPm9h7DSSVjLyCMkppDI+GS2StQWA1RlKo0X56n2X+6QHkmkDakxF9WMVqWyK+s/BrthYfvWz1Ug+zUDcjMPMm0h3pxEjFma3CbIuCud7oMc0LL1ZgmElpGJtW3B+15HIGNITrMYIlOH7i0U41NrInREylYbu4R5qQbQBaAh95fVKZCnpQCnb9DrWZyrRERS6NDeUw+yHaXh7rt4C4B8y+9vkwn7kwKNRpDoa9aiFKBYnF+RcREqQ2e1m3R8BBgAy9kz9ysCE6QAAAABJRU5ErkJggg==", + "odf": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAi5JREFUeNp0UktrU0EU/mbu3FfE1KRRUpWYheALNBURUVy7cy9UkO6KW/+Lbt0IPsFui4gLBbUqFaUuXETUKCYa0jS5yZ2ZO557b5MmTXpgmDPnfOc7jznMGINYPi0de5UvmpORxpjE/kbNqW005DVu8TWw1H758ZfkFgNgJmtyxSPRjJIj0QTW/RDiYGXGb7Dl32/eXrVsd0gSCx9miqC0ooCdp69g5Q/h6OLN0ty5ynIkwzMwUwh2FwMdcbDiCZQXlkqFCpEoPT/wih1YjLInANcD+/Ua9bu3wJlGvrBZCmet2+S6ME5g4oGlZ9A/I70XCDhhDexPNTFmswJBwcnuXkF86VSNZxVu0ukLSGnBcqlnN4HoCQIaIuIv7LUooMOgQ7q75LAAb59B9gCBHSKgqemRr94mMKmD24CfM8nb7THYGQNLpAkUkcb66JyGBFFEWRVL57gFEH5qj8Lxwca2qS3EZaugmzAw24dR/XQgwtsCSBjPIdWbUoE2UJLBnV8Ac/ciWHsK9/glWLnD6K2vgPszsOdOQdfeQ1c/ThKoTgDn9A3KUED/52d45xchZsvorD6Bf/Z60riV3Q9Z/0bbGU1uopYGkfERSQ3VbsMwl0qlqoIARmSoPYXWy0dor79LfBMEEd8jGs/uQ3Yl7PJFNFbuEXiV2riCf88fovXhBbo/vqP3t02/ZYmJFqTkzY160Go9uEMbFK8hR/NrdXtFuUVmnmySVGgO4v4LMAAjRgmO+SJJiQAAAABJRU5ErkJggg==", + "ods": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAetJREFUeNqMUj1IHEEU/i7u7Z23e8tGgneGQPw3hZDkkhQiSuwMQREba4uUgpVlCrvEQhurkCoWqcQQ0oTAaYKNqJygGEwgHCSB6Knn7eXcdX/GmdHVPWYFP3gw78173/vmvYkQQsAwNvckq96UnyIEh7/d4t7uUd/8y+85P+bXSX4grkhI6nJYPW7LrXpBK2YxiSoShhu4Buq1NPofDeqdrZ3Z4cl7D4J3UtA5VyVAlmJoru9Af2ZAp1lcCQ3nqgiuKmbY3l/BH+MnHM9GVLP0Ww3KNA33CQoQQnL834Fj74PUGkANEIkCSSsa8gQqgYTIcB0PVsXB318GInRiCVWCkpRFAs+j5gKlA4t29Ggh4d0t04FKt9PQqF4UFgumSEA8ApeaElilWbYRVy/lsns/N1QBkxtENF4jxPxcgcB1CZVOrvMteK5IQDtJJIGh++PcX9iYwWjXK37+vP0WdYk0Ht99jtX8JywWFkQChw4tc+cZcvlF7rMze+ubbxN40fMalRMDP/6twaiUeK7wlZ0TD0a5hLTWxo2d45KKprqHKJslTsy209s2wnMFBTYNZjc/oLt9gPvLOx+hxVJIKS2YW5pCbSyJTGMK775O8VyBwDJd2LTDl/X5i8v3S7NVw9vJb51tITDEUwEGANCx2/rXEEFFAAAAAElFTkSuQmCC", + "odt": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAepJREFUeNqMkz1II1EQx/+7Ca6JkqyYiJ8cKEpAQbBQFDm0sVOsFBS9wt5KOTgEG5twxVlZ+XEnKNiIghYKxx5nwEpIIXaiSAgKGmMi0d23u8+3T7OaZJEMLG9mmPnN/w1vBUopLPNNhRWXHOyDg0nx82TiJtZPlPVoNpftc2cTotcHtxx06kdXpSQ/BvzKESZzIDmAz6y+NojOjpDMZiqRPIgNoFyWM8DrKUV7axO+gcp4g7AzmquAdVNqOgL2z2I4id1B0wgeygOyt/rLL5buLwAIDgA9dY+L+DkuDQOCrkMgBsRglcMOqAGwIstMg8AkGsuZMNUMRMkLqE+QGloglvlA7uIOAKvZajR0qJkUj/XHe0BTIclVKKlrfKsj9qA8gA6wqSJzPaXlr7ky//tdLEUfawsBjExUFGVWbT7AxSa42H2LMfODmvd3wKb7RAMLYwM8nts8xJ/pEe7/3PmP2eGv3D+9usb35W0bINoA7RmjXSHsH0f5Z/mUSZ0Ir2JmsBtD80s8/rGyzWsLFTD5yUQCbfUBHl9d38LvkdDTXIuHVBo0k+bbt06qO+yAPGXwe/cA4wO9PN44jKDG70GougIzi2tQ00ms7/3lpwnBBgjZ37Kkd1Shht5XzBIFl/ufFtniT/lFgAEAU//g6kvdGBMAAAAASUVORK5CYII=", + "otp": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcJJREFUeNqMkssvA1EUxr+ZjkdbrfFKVD12ErYSRELY2fkH+BMsLcQaSwsrSzZi47EjJEQkEhYkFlhYSVtFpdqOqpk717l3jKZmiC+5mZlzv/s795wzCuccQncz3YeRBj4KHz0/RrOZe2NsZPP20o255zQ3EAxzEAC+6uzTw13G4TFQAakA/CWtIYbY0KBOrx7IvwDQqlHV1o3YxKTOvyAUvfQCfqmA3e4ikyS/zRAKvOot7eoSHEgZIHrCfQAfBqBaKQQDKScQAExd8emBANg+2U2CvNMkkgSqBmrCxFB8mujeoJBWwEqARcssKTAJEGrmaGrjqK1zvNknH4BtyxKl2VUpRxmj5W+x73q9AEaZrR/ND1EJluIpS3i9JQiA+a+hSq8HwJjTsLrRaWitPTCOlhEZn5N75sM1qigmlN+dB3u++Qao5W4TtbEXXIsiszGL4PA00itTsu6XnQWo0TjMTAJqfMDx/ryBJcaVzSNSH4fW0Q+rkIf5rsjRiid7yyN7uoXS3Zn0egE0NiORAN9bQ017D1Lri7CLlP2EDr3Rf7C/itzV2bfXA/igLDaRixfngFhSCooH2xVPCWBlwKcAAwBX1suA6te+hAAAAABJRU5ErkJggg==", + "ots": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAfZJREFUeNqMUk1rE1EUPS8zmabJdDKB2glEwY9ExJYiBUEQpV25qgtBXfgbpEtXuujKf+AfEKRddOdOGHClbYVCvyKWaijT2mhjphk7Sd7Me76ZONp0EsiBYWbOvfe88+69hHOOAE9f3zTVnDKNHvhlsfqPw/rM0ovyWsRFdXJEpDIyRnSlVz0KSkmvabaJeXSJBEhgAJzTDNybmtUnS5Pmg/lrN07H5NM/f13FoMgpXDSuhiIiK3Qi6LUugX7FAbaPPsJqfIHHKCStqRsXVFPQuZgD9BBxjikSiRq41AAkgCQBzVf0+BWEBX7GBm0xgHHUqk1UbBuEcIydzyCZlOI9YEGuDxwduCCitS3Xh3viCZ4jrcq4PJ6DLHd67tjtuAAXib54dCPVEfQ5XIcik/0/2iDeOYz3ceCxrisMi904y0XiMQFfkB7lg6xFHwFxEqUMV0anUNBLWKm8xd3i4zBWOzmASx0UsiW831mA59Xjm+h7HCOygduXHqJatzA7Poey9QnXjTuoVD/j/sRcmDOWLgqnLC5A2wwST+Pn8T629lahSCo291bwu9XA7vcy3m2+gTaUR14thrk9BXasbdiOjSe3nmPpwys0xSi/HpbDd3bIQC6dx/q3ZbRb/j8BEi3Po5cTJpHI9CBNDEa++GyDBN9/BBgAwfDlCVUQaNAAAAAASUVORK5CYII=", + "ott": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdFJREFUeNqMU89r02AYfpJ0iVm7EqhVOxw7dDBEdpiCE1RoEZRddvUgbIex/Rs7eehppyF4LOzQu4MxwYp0HgShIuwwUVSCVtl0s13afl+SzzcpyZYmyF74eN583/s+PO+PSEIIeJZdrtQVI19Cgmk/Ph39bpllXq82g7sgLxVcyKNZpIx8Uj5u5zSjc9Gov8ZihCRC8D+7On4JczevGeTGSEIC4ctKJtB1DTPXi1iCCEkIm1EFlC2Em0iwtWfinXkIzjiO0jljtDC5TtflGIGUQMB+mfja/oPv2Rx9MMjpMdJxOXyXTwkcwIkewfqQ1QtQNB385zcI14FrtQexsSb6SRysZ4Fbf+F6eHwATc9gJGNAm5iCTL5n/LCVRGADNoeaGoHqyaXj5gqQlTODovcwNk5Aj6wXqV8eCo7EDhMonEHpW+dZC7gUG98D3geo7vkb01h9cAvPdt76OGy1xntUd3bjUxAk3+l2sHJ/FgtrT0MUJNfDSm0bjQ/72Hzxxo+NK+h3B7XRNO4UrwymQtMIkdTBU0m+sBOayLsn8Ka78mQDjx/e87HXPkb1+UsfP37+AmZ1fP/suknBb6nefVQXjl06TxMlJfWKNWr+Kv8TYAAkUueexJF47QAAAABJRU5ErkJggg==", + "pdf": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmhJREFUeNp0U0trU0EYPTP35qYxaW6TlDapNKWGbgo2FkF8rARB6rboXusf0F/hyq2U4krFqugqSBeuAyL4SERBstHa0iR9JKZJ7mvu+M0tqZGkH3x8987jzDnnm2FSSqh4ns0VU1ybFzj674Wa3uWiWbfsFQb+jrGj8Xvbm0HlvYVRxhJprpmTlGmum+OMm5uNPZNbtjk3l82ey8++8oW4Jv/H/wdA456g2kvH99FyHNiuAz2dwflbN8YW8zMK5Go/CMfQkAhpGsyQgRCtlpE4jIULyC9fHzu7MPPEl/5ib6WOE0JJNRiHHg6j86mMjw/2gG4bkbY4PW4Yj2j64skA5FTHdaEMPiAJszt1sK0d4suJmY4k0+IDDGRfqmh0u5gejQc+fG8eYCIahRQCEfgQnIuhEkgtONE+dGxYxEDj1DhiEycZ+1YXdUpHCqTMJIYyEES5aXXQsi2kYlGEia5GtHVKn+amPBeCutPgfLALPuVu+xDVPw2EQyFEjHDghbpYNm1yKVVnYjTOerepn4E6XQmLGSPkPkOXWATMSDcjQEkAaqOu6+i/rccALtFL53LI3r0Nq1ZD4/MXZJaWYFer+PXiJc6s3IEgY3+uPYZHTAcAHM+DTE8gnM1CSyaCulv+GrRy8uYyElcu4XfhLVpkpNtn/DGA5Uu0abFH36WnzzCayWAkmYJvWeCkfb9SwY+NDbSoOx4bYqJF8rZqVRRXV/HhzWtUSmWwmWl0RmN4v76OUqGASrmMOkntSHF8MOs954dT08W248wzYsJDOujRBAaqqikTpRo/qqd0/dv97c3Lat9fAQYA4z8bX9nTsb8AAAAASUVORK5CYII=", + "php": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhNJREFUeNqMkltrE0EUx//ZbDaXNrvZzdIkbYOXGgxYQlCK2IIY6EufxGdB8Av44AdR8AP44JOPBR+Ego0PClUKTTXQSmkTYtOkmubSJrQ1e3H2yJSEJNIDs3PmP+f89pyZcdm2DcdWvn7LzkxFHmCIra7nm9ulg8yLZ09yXON55Dgjt1PM2iPs0+aW/frdh8bzV2/SvQBnCLiEqcFxLKSSodlrU9leiGPihWePBkgeEZO6ShC2dCAZNuf6ADb+ldQ5PUPx4BCFcgXfdwq4Ph1Dtd5CZi4Nw7SQiMdCXkl6yVIy/QBWgcU+yx/XsLK2cdHndqlK/lZxH/OpJO7fnsWY3z/YAq+g0TmHpoUH2vB5PXi8RD9Fo10aAmDJTgWyIuOupmK38rsPcOvqJO33XWEvwLJsmKxHRVEwf/MKWl/yUMf8mIloWN8rw+sP0D6PHQmYuzGNgCRiMZVA17IQV4OIaTI8buH/AJMFd02Tkp05PO4jnWvc57EDAINt7u1X8Pb9KgI+Lxbv3cFR8xjx6AQ+b+Txs/qL9KePlih2CMBCq92hg2qzt1AoV7H5YxdhdqhHzRbgcpFeqdUplpvQW4FhmAixZ/sws4BoWCM/qmsE5XqE3dDQCrqGAYWdejqZgK6GUD8+IV9VghBFN1RZJv3sT5diBwC15gncggCPJKF0WCPN8dun55jQdVpz3Ynl9leAAQAJhiGatD9AOgAAAABJRU5ErkJggg==", + "png": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmtJREFUeNpsU9tOE1EUXXPp0CAUWmJbC04xBANNTF+kKhG8fID6aqL/gPEj9E0lIf6Dj30HL03wxQtVIC0QKrWxNG1Dk9Z2Oj1zxn1m0oIZTnIyZ8/ee+211z5Hsm0bYg29fLGpxWIJWBYGS5IA8ncKhT9Wvf4Yqprtu+w3q85X7f9QxseD/pmZMZsxN9fnc5JNw0ACGGv6tPSvyvEDKEoWZ5Y8OHHObKpucw4B0t3agnl4CJPs2YkQVu4s61ORaBqMJc8CDBiIRhhVM9bXYdVqYAcH8M3NgS0tQQsFcfdKHEbvlr6WyaR/V6uPKPy7B4DT7lUq4MUipMlJ2MPDUKtVfKZ2nn/5BoNbkONxXeb8LYXe/A9AJLNWCxgdhZJagDI9DZg9qIkEytRSkdqTSFQtGILSbgc8LViM+tc0yPfukzIyOJ359k9YR0eQdB2KmBbpwXoM3Dod1SkD+scpEapCI5DdpsJhIJcjajQZagcjI+5oLe4VkeQnyiZgdIH2X6BJ7dSqQLfrggjw0AQwP+/GegCIHppNoFAgEMO1RZKo7BQgRi3yN05cnwdA0BQMAgF3C6pnbuNg92M9AFT1diSCh6kb+FGvo2MxnBB9ocZxp4Mns1cde213B81e7xwAcl4jkaa0IUSjUdLJwkL0Ej6VSvArCt7l81iku6GrKnYEU89VJlSJRmR0Dax+fI9suYxSo4HlWIw6M3FBlnD9YhiXabyOsOeIqG7TzDeIYo6EDGp+ZPb2kKKqH8h+mkxiI5/D1/19J3bwYPvPWXq2skkiJVxesqt0XzghpKM8nRVV2Lv2q9eLIvSfAAMAaacnllcFBmYAAAAASUVORK5CYII=", + "ppt": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkhJREFUeNpsU11rE0EUPTM7ySZpmzT9DNamWAtFfSiCigr+AxF9zKtv/hvf/Aki+FEi6ov4ItWHPGiwiBUKoUqqTUJImmR3M7Mz3t0kNe1m4LIwc+65595zlxljEJzdR5uf5nLmsvZx6gSvtd9W9bjhF7jg5dH9nRc/wq8YXaTSJptb0xklx7IZoKUEz1zJ2DUU69/37vFYrDxegJ9U0lC+AoIIVGg9CL+vIObP48KDQn7x0sWiVnJrnEDg7KGk+i/Ac4iUM/R7BsmrSSxtXMfa3X7el8+Kjf3KfUJ+iRJQw4w0Tc8BRyWGRAZY3rBR/VlC+XED2ayDhZyXl03+hNA3TxNQshlGLAnE44zCIL1goXZwiMNvB1i6zbC0KuAsxNITWwgNMYPeLVJiFEO9ArjHAivrAjNzBr4f4vwIgdGD4YUACsZCE8AtYGWT5jCsGQw5wEYJzP/pj5RwYTA1b07eQmfZ8P0sgdaM2FlYwWkMgMpl6NQAO33GKM0wsQWflkh1uqGVmVWblsiDkQyqxwfag35SqcktaEWTUTHYNx4iGU/C29+BvX4Lpu/C7zYgFjegSY63WySsHyXwpYHU00ieu0bAOuJbBTArBkiXKiaAmTzcvRJUV9E8rOgqBwqlY8ASs/AadbRLb8CzeTjVClqft6FdB17tL7yeCbFRBYoLr6vR/PiSEl5BZJaBD0/R2nkOZqfQ2fsKt+0SEQ+GLSIEUvJm+6jbah2+pS2aon+4g/afd4SYJVuA7vvXdC/IHQtSoTnK+yfAAIEaId1m+vudAAAAAElFTkSuQmCC", + "psd": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAqxJREFUeNpsU01ME0EYfbtdKKWGtoItRWgJHApCBE2I0YuoiSaaeDJeOJh41YN3TfTixcRwMfEk8eDJGA+Eg0YTTRRMg02KKFooCBbTlkJLS7f7P+u3K9Xo8iWT3Zn55s173/uGM00TVlwZfzJztD92iKO5ouvQGQPHcQDN380vlDPr65fdLj4Oa41i9sFt+ytgN7o7woGOrqgvvpLBaF8vWj1NUAwGTVNRM3mf5vU/zaU+XySQuTqIFXz9hxmGLkoS7r+YxvVnrzGzlgXPDOzUZPT4m3Dt/KlIuH9oUjXYEHZZ/wOgGQZi4TZcGI5hLb+FO++TSOSKcLtcMA0dI0EPrp4+HtnfG5skiUecDGwQE2MjAwiGWlFVNDz+tIyCokJhPKYSX7Gdz2I01hOJdnY9rJ/7UwPGTEiqjtbmJtw4MYx78S/4Wa3h5UoOYwPdIOp2Xi/t18rlFgcDw6o+ydiWVRwOBnCpL0oOAMmNEhLZIgSeoxwGSWcERon/M9DoBknTIdNQNAMnO4PIVGpIFXcwndlA2OtGc4MAxml27p4AIulWSIa9QVadiYSoJxhqBJivKgh5ad3k9gaw6JdlDaqq7q5wINY4F22HaLHSDZQkBW72O9cBYFEviBIURQH7a7MN0uDisUW12ZZcaGlmdq4DwCqeTo1zNtZuW7hUqGIw7MNqSUS2ImNsKEpSdEwt5lGhfQdAkQBEoub3NNrDJfAIeBuRrcrY5xGQ2RFJAjl00I8PCckJUCB9q1URBnk38XEJEuk41tmGwZAf66s1VOh2keqwoUnYpFxHH4iKIixkN3HzVQKP3iQR/5GDKMuYmE3h+fx3MHqh1sMafztHLuiCg0FAk0uFdLqcpGY5QEXbTC/j7mIaVjc18DxufUtBJ/vcggs+3ijVz/0SYABsJHPUtu/OYwAAAABJRU5ErkJggg==", + "py": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlVJREFUeNpsUktvEmEUPTPzTUFmgJK2UqXQFG3pA6OBLrQxamJcaYwuu3Dp0l9iXLvVtRuDpgt3JIYaTVSaxtRHsJq2xEJBHgXmifebMhECXzKZme+ee+65516h2+2Cn2cb2VwyHl12//vP2/zOQaF4uD7GWN69e/LogfNm7kUsPBFaXYwHMeK0OlpQEJApHJTuykzK98dE98O0bLM/UNgr4v32Dj1fwSQRt9dSsfmZcMa0rIv9ODaqYrPVxuPnL1Cu1aEbJu7fvIZUIo4bqeVYRzcyv/8c3SPYpwECt/dmu4ON3Ed4TymI+hQc1ZqoE+F+uQLDsnHlwkKMscJTgl4eJOi9fxZLePNhGx6ZQRRFqH4VjZaGSv0Y6cQcJLpra0ZguIWegqDiw7lYBBZV6xiGk9DQDLzK5bEyF4Hi9VLMsoYI7J6Es5PjeHjnOl5ubqHaaJGBEkzbxplQAKIgDmBHekDTgI+qKKqKLvNApgmEgyquLs1CoFn2Y4cIeLJpkjoCLkWnUSIF3JxISIUsCjAoxhWNJLBIJs3YeXj/08oYZkOKY65HllE/bkMmY504YUd40HUq2JSSyW6iVPmLiXE/ZMYQCU+hXK3h1toqdNN0sEObyKtqtDQ6kXDwcadDS2TBryp4nX2HxXjsJK6bDnZIAZem6Tp5YMMmicn5OC4lztNWtvB9cg+hQABtWjKL2jH/T3GgBcYDXEE6mcDM6SlaJAGMWkivLBC54ZgniZaDHSI4rNSqn7/t1vgkGJPwZXffSeCjk2iUWz9+nSTQN8e6ef8EGAClUi/qoiOc3wAAAABJRU5ErkJggg==", + "qt": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnVJREFUeNpsU8tu00AUPU5sp41NkzRxpfSZqi0VIIQqEEJUZYXECvbwCWxYsuBD+ABUFrDrCnWBQEJdIWigBSr6pqRJ1ebhxrE9M7aZmSrQ4o505fHMnXPPPWdGiaIIYrx89GKpNDdxmXkU3aEoCsT+z8W1Sm21+jCpJctQTvaerj+TX7WbnJ+0cpfuX8mQtn8GgJ4AZtIFY2Hz3foDVRcgyt+cRHcS0IARh+D/8G0PpmVi7smd0dLs+AIjwTVEiANEYYQwCHlEZyJgIQKfoX84g9uPZ0cHZ4YWmE9nuufU0wABCSSImMsWEgqSuoqA/39/swZFTWLy7vQo7dDnfPvWWQa8GuOV3IYLJXmyzDzG2/ChZ3pwbHdQ267BKJoYuj7SF2MQhiF8LuDK/Gf0DKTBKINz1IbTbEMzU1ANDW7LAfEIQKIgBsBFlAx6LYOz6MAcvoDCtAVGGPKlAiIu/F55F33FDA6W93EOAOMaMOl7biKPwRtD8Foetj5sYPfTDtxjl1f3Ubo5jkQieQ4ACSUD2iE4XDpAdbUiW9D7UsiN9WNkZgxajwbd0LGzt3keAJPUc1N5SVeENT0Ao2BKV6QzwlZeRBSKAYhe3aYHcZWn7l1EfjyPypcK9LQGa8qCvW9j9+MvaasQOHaRhGWdhsNLR8hwodYWf6B4tYjDjSOovRqq32rSYq/lytw4A77o1V2ERiAtzY5kkUrrsH+3QF2KY87ArTtQuQ6nAf4x6FCV1D001+vYersBM2vA4y1Rm2D7/Rac/TZIw4d/6MrcGAPf9htN0miJh7Lyuoyvr8rQeP9iVJcrSKgJ+TrFcyYebXTP/RFgAFQobmIOBxbsAAAAAElFTkSuQmCC", + "rar": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnpJREFUeNpsUktPE1EU/u68OgylZXi0hZACQU1LEKKCMcat7jTRnQsXxsQtv4E/4M74P1iriUaNCw1FgxpjCJQKKAU60+m8mJnrmSll4XCTc8+959zz3e88GOcc8aq9evChOHl/lvMoubvWX/z4+BwTlbvw7bXdg8b7h6LE1gGW+O88CRMt4XTlR6/rYxce5Xv3jlHH19fPkBu+gWy5mlcFb3Wn/umeKOEMJF5C7xCFbtA9dRXjFoYKGiTRAlPGUV1aKU9O3VwNQ74A8DQAIZxqAuAhBPIMFYpQVAVB4CPSZjEzv1weH5tbDQN+JQ2Abu488mnzIbAAA3o/VK2PwDJo7r5Fy7ZRuvi4PFS6+qIXdVYD8Jg6BUcuOD8BozSLlRWyicgVKkTMQWwUlFF0Ooe5FIPk57BD7G0SiywyjD8bCDyHsOkeeeR3SUxEkROmU6BfQYFJMHfhWXV8efkUrb13VPMTsrcTQSzxZ/+n0GVA6EGbSGdgG9vo15fg2nFgbO8k70SRdd+mahDT81vUxTZRlJBRMsjq89C0EXCvSf7TIBZ136YZUJEiE7LgJ2dN01BZuE0dkIhxE7KcQTK1QUj+cwAEyrPZ+IydzRoyah+mLy2isbWBweESJEnB9q+1RM9Ub9GQOWkABg8HjRr2d9Yh0hTlBlRsfn+D4vg0BvUC9rZqECUJuk7Tzr1zahCYlB6HJAREPwfbbMBzLBzsbUKVI0qBgQkc+SxgWUYaIAqOpKwKXJ6bgGlaaDV/YvHaFNrtDsKTfVSrJeqIg/bRNwjclFIALeP3saybhu8SC4VBHwnhBXXIKocYRXD9QzBi4Xgchmkd9+L+CTAAMqwy+ZzluBgAAAAASUVORK5CYII=", + "rb": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAixJREFUeNqEUktvElEU/mag5f2yJhXLwxIt0kiqsVEXujP+A925cu1Pce3WtXVtYuJCF7KtTY0NrVQIpRVKeXTkMcO9F8+9ZVooJJ5kcmbmfOe733fO1YbDIWS8+/g1dycVX7W/xyO3vdsuVKqvnE7HZ230783rlyo7bVBicSGyfjsVwozomVbIPe/c+FmsPHfoRKJd1HT7hXHBZjVbA4aA14NnD9bC2VR8gwuxPi5Sx39Cp+M0XUP0ahhP1jLhW7HFD4zze3b93ILtXYyyVKlR8/5hFbnvO9gtlrGSjOF+OpXkYviWyo8mCS4R6bqO4p86vm3v4fC4DrPfw4unj1XN6JvBaQtjChzUXK43sVU4wNFJA43Tv/B73edQwTmfIhAjCVL6UdPAj1IVFSKhCdAcAI9rnjBiAjtBYEu3GEeh1sKJ0YXR68sVIujzIhzwY8DEBHZqiLRKkicQDfvABxaiQTc4Y/C65pCOXwcjcmlvJgHtlwi4epYifiQWgmoLZwPW6HQG07LgcOgKO0UglAKOTt/E+09fwAiUWU7QAE9xUK3jbvomsispZVHMVEDSZdHo9rCZ/4VIMKAu0XGjpU7d2S8hk0pCELHEzrjKnCQOYJoD+Dxu1RyiwUm5LaMDo9NFt2cqDLvY4oQFp/QpfT/MrmI5FkWebt+NpWto0j2QmQkOjZ9hpwhqjXZzM/+7LU+cc7lRrjXh8/lVLRK5ovLWXglOsiOxdt8/AQYAzv8qbmu6vgEAAAAASUVORK5CYII=", + "rtf": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAe5JREFUeNqEU01PE0EYfnZmd5FSvgLYFuwWt9EgHyEaox68eDJevHvwJ/hTPHv1N/QgZ2NC4g3kUAQKFKGhjVKqRrvbnRlnht262FHfy+y8877PPM8z71pCCKh4/ebt+rJfXEz26Vjf2mnsN5rPKKWbVpx7+eK5Xu2kyMtNTd5d8MdhiJ9BOO7atFI9ajy1UyAqSPIRMR6ZmoNehNHMMB7fX/UWvEKFMbYKE8DfQnAhwRmmJkbx6M6S5+WmK2Evup2c9yUk2nnKA0XVcSiGXAe1k5beP1i+4RFCXqnPywB/AKVzK34RjHNYlgVKCH50w7EBBogbTa/AVM5SgBdn0gc2AMDjPsbFPz2xye9asweS6n+NTbG8BCCfUtLjff2WoVnVpAH6z6hMUtJE3EykYfpF4vUiL3QNS7FMeSAQRBHW3r1Hq91B+VoBQRji4+ExFsvz6Hz7jm7Yw5OH92AcJKW9G4SoHhzhy/lXbB98Qmm2oCXN5WawsV2TACEoJXqwTKOsb3BtR2ucmZxANpPB8JUhyPnHWDaDpfJ1eZFALzJJ4MKO5MEtv4TSXB7V/br8iQLMz+almRZWbvoo5q9qRlxwewCgeXbe3qrVO5ZkUD/9jJGRLPaOm6COi92TU1DbxYe9umRD0DrrtJO+XwIMABWp9nS+FgaoAAAAAElFTkSuQmCC", + "sass": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDNDMTBBM0JGMTE5MTFFMTg3N0NFOTIyMTQ2QzhBNkQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDNDMTBBM0NGMTE5MTFFMTg3N0NFOTIyMTQ2QzhBNkQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowM0MxMEEzOUYxMTkxMUUxODc3Q0U5MjIxNDZDOEE2RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowM0MxMEEzQUYxMTkxMUUxODc3Q0U5MjIxNDZDOEE2RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Po72XUcAAAJcSURBVHjahFJdTxNBFD1bykc/ttvdtttWGgI0bYrUgDZoNYqRJ014kMRXHvwB/hQTH/wFhMREJfFBQxBjhMRIFEQSCAlQxKYGggiU3e3HbnfX2bFt1EU9k9m9mblz5p4zlzFNExYmpue/jmTSZw5PZAl1MAwDT0c7O72wvPdudeNakPNtOZ0tsM7cvzdOc5yN5LDAsTFRAJks/kC2PxFRVe39Si6f4byez62EpAEH/gNN18F53Ri/Ocxf7OtdLMpKT42s/ZPg1cISJp/P0tg0TBzLCoK8D7eHh4RkLLJ4cCz12AjMXwgez8yhqtVo3NbqRKlcxcSL16gZwJ2Ry8KVc8kZO0HdTKlURn+8G6PD2SZhLMQj96WAiMAh2RXFYKI78lcJcx9WYBCycICnpNbojUWpD5Y0C4Zh2D0w6hWc70uQZC+IWfQZrXF0IsHvY+meBd08haAhoVMMQFJKWF7PNZM+klhRyogGhbqxOIXAMOtEwGAqDqVcgbVkkE+5UsEAWavf0az2t0ZqvK2qabh6IU3joizDwTgwej1LdVfJXkdbK8mt2QkayO99A0/0trQ46I1lVcX+UREhnsP34yLp1AD1xibBMuntpzU8mJyi3Tc1O4+l9U06n7x8Q/8PHz1DrrALt8tlr0CrkbJMHTop9Sk5sLa1g8L+ARJdnShKClY3tunN69t5iGLYTlCtakjFY7gxNABdN3B37BaqqoYT8pyX0in4ORbRkIA46YlDRbUTbBZ2Jb/Pw4qiKFnapcpPo9pdbrg8DjAOBsFgELJmsGs7eWkkc5bu/xBgAHkWC6UPADTOAAAAAElFTkSuQmCC", + "scss": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM4QjYyNDVGMTE4MTFFMTlBREZCNDNEM0ExMTk0MUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM4QjYyNDZGMTE4MTFFMTlBREZCNDNEM0ExMTk0MUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGQzhCNjI0M0YxMTgxMUUxOUFERkI0M0QzQTExOTQxQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGQzhCNjI0NEYxMTgxMUUxOUFERkI0M0QzQTExOTQxQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pkf1yeMAAAJbSURBVHjahFNdTxNBFD0tLULpB91uodVWPmorUIxo0VSiNSExMYYHE33l0Ud/in+C+OSjYgjRGDBRCKJIUkIEWi0WKlja0ul22+5219lJ26gLeiezuXvn7rnnnrlrUFUVms3Mvd2bjIyezRVLBA0zGAzo6jhjm1te+7EU37rFO+w7JlMbtG+ePJ5mOaZmci/nsPl6ONBtw18WDQc9tZq0sp7YjTisXV/NFKRpRvzHpHodDqsF03djzuvDg6vHJWFAprF/Arxe/oins6+YryoqCiUBvNOO+7FrXMjnWc0WyIAOQP0N4Nn8IqqSzPx2swllsYqZl28gK8DDyRvcxKXQvB6gISYpiwgH+jEVi7YAfW4nEqk0PJwDofNejAX7Pae2sPhhHQoF63U5Gai2Bn1epoPWmmaKoug1UBoMrgwHabIVVCx2jdrKFwm67TZ2plldPQGg2cK5HheIUMbaZqKV9In6giDCy3MNYXECgKI2gICxoQAEsQItpNCHWKngMo01arTY/jFIzbutShJuXh1Fm9FImYiM7tTtKOtbO+toN9Nc+fQ5SGUOIVYl7HzPIH2YRZ0y2KZ+sVzBHn2v1mpMGx0DTaR3nzfwfGEJdybGkdo/wEigDyvxLzg4yiESvojZhfd49OAeLJ2degaSLIPOO6vwgiYaaRErTRREEdn8MeJbSVZ5M7nLdNExqFLaQwEfFfACQn1+HBWKSKb3MT4Sgstuh9vVDa+bQ4DORE6o6RlspzMk9TOPfr+fiLJCLFYr3TZSKNcI7+aJwWQmPM+TkqRg49tu65f/JcAAMwMas6WUKd8AAAAASUVORK5CYII=", + "sql": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAh5JREFUeNp8kctrE1EUxr+ZyXMkoa1NBROaSkpTBE23PhZ25cql2y5duvAPUdGFS1FxIRRBXZlFQ9GVdDENIhGJxkDsw2mneZnM83ruNZlOmNoDhzlzz3d/9zv3Sowx8Ch/qlYK2XM3cEJsbH0+qjV/rd6/u6aN18b7RMFT+9aosP/Ex+0ae/puw7j36PlKEMAzctKJ3aGFamMHjV0d+wcGitkMrpWWp6hVIciEk2MAOwbUWjosx0UiFoWqJpGMx5DNzODq5aIPoa82AWBg/lyKLMH1PMp/a9XvLXLzG1cuFlBaWpiKxaIPSLY6CaC93ggQjyiQZRkeQSzLRovGaPciWLt5faSWEBoh6KBvOhiaNga0+Y9pwaFxvu7rfp8F5pWDt+qNMp2IijHGwddWCvN+33/CoAOP5nVdT9SdoQ1JkggiQ6Yvr7V60+9z7akA2gfH9cRF8hO5F5Ve4lQAF9uuK+qFsylkzsQxrcaQm04hdWkR83Mzfp9rQ3fAFzu9Ph6+WMfjl6/pGBdb2jbKmx8QlRjWy5vkyhUZBPgOeGNHN9AbDLGUz6He2hVj3Ll9C8/evsdgaMK0HV8bcmDTU0UUBYXcedR+NLGnH0I3jvDk1Rsy46FP4C/1BtrdntCGHNiOAzWZgEKQ5Qt5lIqLojbaXSQTcRy2OwT4SZqk0IYAOgkVWUE+lxX/zb0DpFNpkTzmZmfFtzewhHYcfwUYAMZmVaZQlLFHAAAAAElFTkSuQmCC", + "tga": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnxJREFUeNp0U89PE0EU/ra725K22ILRGipb22pMG6JcSEQTbUIwnozxpBcvepeEP0KPogcT/wlNT17kIKbEmChFUYKGVtL0R2gLtNCl3Z1Z3+zSAlonmezOe/O+973vvZEsy4JYnqdPMu6RkSQYQ29JEkB+PZcrslrtPhQl23VZc8/tr9I1yMHg0EA8HrBM04lVFAhoY38fSSDQVN3pfKV8G7KcxZHl6v1xblqU3eLc3p2VFZjr6+gQgwsnhzGTuq6Nhs6kYZqXjwL0GFhEl3U60OfnwWs1GGtrUKNRsKkpeIIBpKIRtI1J7cX7hXRhc/MOhXw5DkCZGG2zXAajzFIoBMvng1ypIKOqmP30GW3OIEcimovzlxRy5RgAFwDEAIODkCcmIMdiQLsNdWwMZdJlg8pzEUt1aBhKq3XinxKYqF9yQbqRIqsMy+0Gyy47bKgUWXSLtDENE5wdtuqQATm50F1VnPbRGeEw8HXZbiV8fsDvI9ldju9vADAyihLEbrWAZhOoVp3z6iqBUiB1A4nEfwCEsbkL/M4TgE5n5jDx+oTEzp1d8m9tC8H6MaAB0imzx0NU/WKUYE+loEyawDBo2ui6TGfT6ANAxrvx87gYCGCxXEKVJvCWFsG3eh1vN/J4OD6Od4UC8o0G3TX7TGLHwI9iEQmvF9X6Fh7F4/iYy+GcLOMSlfEgGsP0qdNOmX0BiGKpVkV1bw/1nW2b/gCpf1PTcI+Y7eg6ps+G4bG4PR99SjAVo9HE4q+fKNE0vl5awuSohjeijbRefVjAtUgEQRK7Yhi9OKn7nKWZxxlSPWl3QwgnaIrW8QMhD542vUbx/W49m7sq4v4IMABOqi3Ej7bAEAAAAABJRU5ErkJggg==", + "tgz": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnhJREFUeNpsU1trE0EYPbMzSTfdtInFtkkpiaXVWou2FRUEn/so6JugL/oH/Af+B1988if40jcFERQURNBSQdDWlLQN2lsue8neZsZvc7FoOrDszM75znfOmVmmtUYyvry++36yfOeS1qqzDtvH2P76ApPlW3Drb2sHex/uccHWAdbZX30kO2+B3siN3zhTnHuQ66+95i423jzFzOVljBdKOZNHazvVT7e5wF+SZBj9iZJ+3J11mbW2kR8T4LwFli5i4fqTUvnczTUp9RLtDhKgJx0q4dEwWAxrREKICHEsoYYXMXvlcWmquLgmY71yCkG/c0AkARgLMZpnMDMpGNzEYe0dGp6HwvmHpbHC1Wf9MnFCkHQOyYEPzSJwQ2B65Tm5NZG3Fshim6wbMNJn4bpHowMKtIqo2COgR2IcAptwjvcgo6i77igjEmVDqbY8xQJ1VwRULhiBI6+G9Zf3cbTziuzIDkmHSNqECTFgQScEcYuc2NA8TcdYwXD+GkK/TYVN+u72WrIudiAD8o6oAR2RRCmQMjis3CIy1iSpPySCXhFTXeyAgh4BR+JVw8pauLi0Cp4yCX9A90FQhnSBYtnF/k+Q+HYam9itfIZB3QvT8zj8XSW5EhNTs9ivbSLwPUzPLNPJBIMEKnaQYg6aB9+RGR5F5VsNgnNKXMI1NdJGG5WfHzFVLJ7k8c8xUngpVodlDSGbFYj8Y4yMpOG09lHf3yIFPzA3fwHZTAQVtU4JUTeFDrdgDdlI8wAz5Qy2KxswReI7QODZcOr0ZH3q2hIDBI7zq16tuk3FNPxAI4wN+pkoccYoE4YJU5EdUtM4Qst26v26PwIMAKj3P/2YUKgYAAAAAElFTkSuQmCC", + "tiff": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmRJREFUeNp0UktPE1EU/qYzHWstlrYJNcWUElyUJsaNGh9B0g1Lo0v9Ey78EbrVxBhXuHShm25YGBJRQpAYBDEWpaEPEhksdVpbyjzveO4MfZDCTWbauefc736PIziOA77OPH2yJCcSGdg2uksQAKofFou/7VrtASRpvVNynj13f6XOhjg8HAlMTIQdy/LO+v3uYUPTkAHCTb+cK+0pdyGK6+hbvu4/xiyHbncYAwfR19ZgbG/DoO9LsSgeTd9JXoxfyMG2rvQDdBlwIZauQ5ufh12twioU4E+nYU1NIRCNIDs+Bt28mXzx8VNuZ796j9q/DgAwomwqClilAmF0FE4wCInAlkjO4y+r0JgNX2os6XPYS2q/cQyAcQatFjA0BPH6NYipccAwIGUy2CVJFZInkKlyJAqx3T4/IMGmJkeWIWSz5KgI5pdhb3yDXS5DSCYh8rTID8s0wexeVD0GtMd85KkkefFxUfE47M1NokbJkByEQl6tL+ouAI+MUwbFhnYbaJKc/Sqg0x4H4eDRGDA56fUOABA9/GsCpaIHwr8FOhQ823O5RfW66tUGADhNy3RNRDjcN41HLxdQ8J6jYTsOQLfOJBK4f+s2/uoathoNGKT1MtFeVHZxdWTEZfEq/wMKl3rCJOIzTV6ADs2R5ulYDDNkYjp0DhrF+zCVgkw31+v1UxjQZkNV0SADd2o1MIuc9gmY+/kLxb0/UFoHePd9A1qzeUoKpilx9xcLWzgg+u/zeVfuQqkM9bCN1ysrWKXxdtPgvScwUAm58XZ52W16QyPtifRUzi588GbEi1ztHPsvwAC4uC9qhnsZvwAAAABJRU5ErkJggg==", + "txt": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAeJJREFUeNp8UrtOG1EQPfsyXiyzBguIJSyChZBBEFCKpKHLo6egpErNn8CHgH8gkZIiTSIXLhJAWCgkoMgRMSiRBSK29z4y9+I1d/HCrFb3MTPnnjkzlpQSynY+fP70fGF2gQuByCz6lfdd9Uurfvrrjes6762eb3tzQ69uFJwPsqOPC+MBEmxxphi4tlU5OGmsOzaBWLc+O9oIIVhScidkyGZ8vH62nHtSKlaI4cse6TjAfSaFBBcco0EWqyvzubmpyQrj/FXk75cQaSEMeMXU8xykPA/Hjd/6/LRcyjEpt2i7HAe4A2TeLZWKUOJaVLxj27j813EHGKCXaAJExu/4BOdiAED08riQD2riOrexyRoYc3CvsAbLGAAjZga7vgZG23WMCdBvoxKJc36TRBlMiaa2JByjNqqD8qkYc1pjDK7abey+/YhrWlfKswhpiCR96aEU9o5+QE3g2ovVWDm2Sc22bBQm8vrVpbkS9r+doPr1EOWZaQ0yFoxg2PcREosEAI4uvZhJpzFMP+cSXRbq+043RManez+tNWKMI6GN0g0Z04HFR+NoNC/0yx717efZOSbzY3AcR4Op2AGA5p/W31r9e0vNgSrh9OwCrpeCkqvZuqTybnpRqx/r2CjvvwADAJC/7lzAzQmwAAAAAElFTkSuQmCC", + "wav": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAApFJREFUeNpsU1tPE0EYPXtpKbX0wqUQKVQMFdIXQBNCQBs06KP+B8ODGh+Mf4b/4IsGE54kxhcMBrkp7YOQgBRvSKG73fvsrt8Otoask0xmd+b7zpxzvm8E3/cRjPkniyulW0NFy2JoDkEAguOlpXJ9p3L8MBqVl4O9YHxae8pXuRlcGO7KPLhfTDVUqwUgigJMy4Whm6lEXHjxYf3XnByRN0QB/2KaH7btMlUxoRJAcyqKhdOaht7+DJ49n+2cvTnwynXcsb+kLwJ4rgfmMDDGWqvneXCZS9ND7mov5h9ND85M9y86Dpto5rUkuJ4Py3YDJpy6QGJPayqB+Njf+43XL220t0cwOZkfrNXsBUqZugDA6CbLdAiAwaek1ZU9LmP8Rh6S78GsGxjOp9FdzKJaVZIhBgGASzK21w/wbrnCk8euX+EMAjaaZuPHdwUdHVFYluuGPGCORwwYjg5rqOwccRk+3Ux0IEvntmsNG4ZmUayL/wAwKHUNfZfTKN0ZRaw9Cof8qJ/pMAyHy5KkAMTksSEJtnMenM7EMVMawbejMzJRh67bXEYiIXEAVTW50SEAhzqwfqrBcXx4VOhYm4RsNgHbsJFOyZTsQ1MN+hcohoUlkFiMT+TQFpMwXOjGpXgE+XwGk1N5pFJtKNCequgYGupCRBbCDOp0KBJc4VoP3dyBONW8uydBgBHUThqQKCk3mEZ/LoUG+RBioJO7VarAwEAntjYPiUUW9Hh4b2R7k9j98hN37xWx8fGAt3eIAdVMLn+uUv+b2KReSCZjZJiB9bV9jIz2ofr1BKvvd7G9dRC80lae0HzOt+cWVnrSKDrMJykifwNBpCgE/UAllEXufmDu8Zlffvvm8XSQ90eAAQA0pF7c08o4PAAAAABJRU5ErkJggg==", + "xls": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmxJREFUeNpsU0trFEEQ/mamZ3Y2+0zIC2MmITEkUYgERFQErx5E8KTi1b/h79A/4SW3nCNeYggBYZVEMU/y3N3Z7M7OTD/G6lk2ruw20zRdU/XV91VVG0mSQK/3n1a/jky6d6Xs3G8WXS+Pw5N6LXjLLGuna/78oZKerGsYKtrDE16uJGL1L9gEOOcYd2dL1fNwrbL//aXN7J1efPMmkUqEFAk0A0VZNbFEaQCBscIkXj975y3NLq9xye8PBkAniHOFph+j2eC4rsdoB4LsFubGl/Hq8RtvYWpxTQi52o1jvWiGYaRZL0/auDgOkC/Z8BYL2Pqxidp1FZkhoDxpeaXA/Ujuj/4HoOxKKjiOiek7RUShRNQWaNYFQuMafrYCxiw4ozZKfqbYJ0EvRdl1DQyyTs8XCNTA6UELMwvDyLpZWIZNNlNLlQOK2LMJRJ+5AkuZ1S7CFFzJzk56GnUjQWlYkqCoBWFbonEVYcLLA4dNnB624GQsDBWIgfZJEgxkoChzSFWvn4VpQemDm2VwXQsXJwF1h6c+gxlQ5jgSiEUEt0wdIe7tMES+nEG2aCLiJMOIIWIr9e0DEELAMUrwRuchVAyTKimUwO75Jm6VF3Bv7imOaj+xd7UFKVS/BPJF1b/E4tgTrE49J60O5kceoNqowiuuYKa8ghHXA48U9MT2AQgyRvTThE30bQiaSGa4yLMJNFo+Dq/2cHt4CYlwyFf2S6BHwwrMw/avDbR5C1k7h1YQ4KH3Amf+AcZyEbZPv9CItzQD1l9EbtYOjv74v/d3O9RMPTDrsEwGIWN8q2yk7XNYRs9JrRv3V4ABADSGR6eQ0/NQAAAAAElFTkSuQmCC", + "xlsx": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAmlJREFUeNpsU8tqFEEUPVXdPY/ueWZIoiYZiSYKYhJc6EbduHOhgijo3t/wH1z6B0JAhOyMILhxo4kJGk1ASTAxwWF0Mpp5dHc9vFUzYwidaoqmq+8959xzbzGtNcx69PTS26ETmQtS9r4Hy/xv7MW7jV+th5yzVcaYPX/++It9u4NAv+CVR6tBUUTqMJsDcRzjZOZM8W9ZLKx+/XDb4e5/kH5In0lpIYWGUaC0YTZnBCAEKoVR3L36oDo7NbsglZwbqD6iQKOXFMcKUVfBkBAoQhlD5xxMDp/HrSv3q1JgYW3z0x0KXzkCYJaRZljru23aHWTzLiamAyytv0O9UYdf5PArqlppBfMUfu4oALErqZBKcUxMFRCHEp0DgW5Lo4N9NIN1dF0XXsVFOUyPJTzo+WBANDidjp8tgHGG3c0DnJ4uIRf4cOCBaW5KjY8xkZL72xpJ9QcFz5bVqHUJGHZL2YtNmKi06YCyiVFb4s/vEKMTAf1p4edOG6mMi1zR6wEpdUwX+vLDtkCzHoK7ptcM6ayLmGajvtex4PliyoIkFRjmUEASelB2rXQRSfjUCT9PlWpmW21iTGzCAyEkUixPRqXhe2V4zKczbdmybgkpJ0cGOuA6Y2MTCsKoi5HsNK7N3MN+uwYaWbxYfoLLkzdxcew6lrYWaZhm8PHHG3zffp1UwJSHz9vvkU8PodbcQYYYS5lxYkxTkGdVDQdV1Js1qPgYD6JIuIE7gsXVefIhIuM05k7dwMbeMmh87a18ufIMaVYyprrJLgje2Nr+1tzYXANnDnr3zRhHj37Vvy2wpXHtNAd5/wQYAD6WMuT2CwoVAAAAAElFTkSuQmCC", + "xml": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAilJREFUeNqMks1PE0EYxh+g3W2t1G0sEqyISynUFJsSOShNwCamiYZED3LgIkcuxoN/iCZePZiYGD2aGD+i0F5KMChxlVaakAK2ykcAt+WzdLu7zkxo3WZL4pu8mXfmeeY3885ug67roPFh5nvc62m9hjoR+5LMp7MrkYf370qVtco+VtCUFpbj+jGR+JbWn76OyQ8ePwsZATQb8R/hanZgINgj9IqeuBFCw1Kt9OMBnNWCs24XwkG/QKYUEiGjVAPQof/rq0783pShET3ULQo8xz0iS5FaANmrHQH2DoqY+DSLSz6RzecWlnD9ymU47LYjd4O5BXqDTG4FM3NpTEkpdJ5rw0AowLRMbhUfp58gTOaD/UHmNQPI6YmvKWRX1zESHUJ/oBs2nmPa+Mgw0ZIM3tZyGoJwygzQNB2jNyJIZX7iB0lpPoM70UGmPX8zCU+rG8NDVxHwdiC5mKsPUFUN/gvtLLf39sFzVqaN3YrC6TjBauqhXhNA1TQoqloV7Da+pjZq1FsXUCamF29j6LvYhf3iISamZ3Fv9DZevouhRzzPfOG+3hpA9U9UyioOlTJ7pFeTCQS6RGzIebyf+oz5pSzWtmSW1EO9phvQ00slBRt/8qR3DoWdXbiczUiTzd52D+tdLmyTB14mx1rMAKVcRpEATjrsuElee/HXGmnFRyBOGD30C/nEDjNgs7CDpsYmnHG3YPegBCvHs9oYfm8nG9dJa5X4K8AAQzQX4KSN3wcAAAAASUVORK5CYII=", + "yml": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAdxJREFUeNqMUl1rE0EUPbM7m5Y0Zptu21AwWwhYpfSDFh+kvvRd8N0Hf4I/xWdf/Q158F0QoQ+CVsFKaLSQpt/dpmvztTOzzky6cetOpWcZZvbO3MO5514SxzEU3r57/3GpWllM/tP4sL3TarROXuSo/SWJvX71Uu80Cfhlr/T4UdWFAVfdnmsTUtvdP35OUyQKVnJgXDBTcj9icAsTeLax7j/052qM81UjwW1QJXEhMF0qYnN90fdnvdogYmvJPU0/VBApD4hcDrWRcyikfB17srzgW7b9Rh1vEvxDlI4tVytaBSEEtmWh0xsUMwpwnWjqAlcxogiHd1wiQyCu87iI/+sJtf6+NXsgpd7FWCMB50KvkYMGMbLdZgLlfj+K9K4+FnFQ2x7WntIs50AbmiGwLILt+k+EvzvSNIHzdigdJ/AmXQRhiHv5POSwYmG+cqPVo0HqDxj8uTK2vn1Hfa+JmdIkvtZ/4fOPXU3WPDpFeNWVyUKryCiIGMN4zsH98gym3CIcOTwT+XHdXrdQQHAZotE8kBPpSqPNHtBOr48HUmLOcXRJT9dWNMGYJFby91pHOAvaykSaITg+bwefdhrteDRTMSwyrFCgI88E056Hy+4Ah2cXQZL3R4ABALUe7fqXWFN6AAAAAElFTkSuQmCC", + "zip": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAm9JREFUeNpsk0tv00AUhc+MY6dOmgeFJg1FoVVpUWlFC0s2IFF1jxBbhKj4BSxYdscPYcEmQmIDq0gsERIViy4TpD7VFzF1Ho5je2a4thOqNhlp5Mz4zudzzp0wpRTC8fPrk0/TC6+fDtYicLH97T1Kc2vQDcs+rH3eUAxVznn0fn1DRM8E+iOdv5ct3XmZG6yVlNj6solUbgVTt0q5FGtX6vXqC6VklTE+KAO/OODHSIQPRQpsXC+kkEz2ELA0ystv84tLzyucsbWByisAGf+QAS2CCDRRLMJMmxC+i8C4jdLCm/zM7OOKFGptcO6/BTpJ0yeQB0Y+mfKQuZZG0jQgeRbW8Xdomobs9LN8scc+UPHNy4Dwq8IljotIIQEm59/RoSyM1CKkXKZNBm7kIVgyM6wgAnSgRK9vqQfHPiMFDHqyFVsLR9Cm0o4YzoAASrSjCelQfRPb1Vc4qn0EY5L2W9GEaBLcxQgFHpGbkMIDJ69e+wjJ8VXqRgKid0r7ftQdxkRs9SqA2kgAm14SSIQh9uhuLGPMnKJs/5KquL1x0N0RCsizigoDaLqBdHoMiyvrlBsHVx1wphD4BCewoqxGKKDwAgtOy8JufYuk+5golGGaGZwc1sIGoDz3AOPZSVLaHgVwydoJDM1H4DbQODughB3YpOD44HfoHgnu4e7So0uAi0stHLJ3Aud8B9bpHu6vPoSu9TtDl6tUuoFiIYOgu0+158MKmOxomtyD3Qi/3MTR7i8K0EDG1GHO5DE3X4DvNahZlJOwEkOATvdPc2//hx3mXJ5lFJaF8K8bStd0YGfnOJbMGex21x6c+yfAAOlIPDJzr7cLAAAAAElFTkSuQmCC" +} diff --git a/lib/core/show-dir/index.js b/lib/core/show-dir/index.js new file mode 100644 index 000000000..70cb5d1bb --- /dev/null +++ b/lib/core/show-dir/index.js @@ -0,0 +1,171 @@ +'use strict'; + +const styles = require('./styles'); +const permsToString = require('./perms-to-string'); +const sizeToString = require('./size-to-string'); +const sortFiles = require('./sort-files'); +const fs = require('fs'); +const path = require('path'); +const he = require('he'); +const etag = require('../etag'); +const url = require('url'); +const status = require('../status-handlers'); + +const supportedIcons = styles.icons; +const css = styles.css; + +module.exports = (opts) => { + // opts are parsed by opts.js, defaults already applied + const cache = opts.cache; + const root = path.resolve(opts.root); + const baseDir = opts.baseDir; + const humanReadable = opts.humanReadable; + const hidePermissions = opts.hidePermissions; + const handleError = opts.handleError; + const showDotfiles = opts.showDotfiles; + const si = opts.si; + const weakEtags = opts.weakEtags; + + return function middleware(req, res, next) { + // Figure out the path for the file from the given url + const parsed = url.parse(req.url); + const pathname = decodeURIComponent(parsed.pathname); + const dir = path.normalize( + path.join( + root, + path.relative( + path.join('/', baseDir), + pathname + ) + ) + ); + + fs.stat(dir, (statErr, stat) => { + if (statErr) { + if (handleError) { + status[500](res, next, { error: statErr }); + } else { + next(); + } + return; + } + + // files are the listing of dir + fs.readdir(dir, (readErr, _files) => { + let files = _files; + + if (readErr) { + if (handleError) { + status[500](res, next, { error: readErr }); + } else { + next(); + } + return; + } + + // Optionally exclude dotfiles from directory listing. + if (!showDotfiles) { + files = files.filter(filename => filename.slice(0, 1) !== '.'); + } + + res.setHeader('content-type', 'text/html'); + res.setHeader('etag', etag(stat, weakEtags)); + res.setHeader('last-modified', (new Date(stat.mtime)).toUTCString()); + res.setHeader('cache-control', cache); + + function render(dirs, renderFiles, lolwuts) { + // each entry in the array is a [name, stat] tuple + + let html = `${[ + '', + '', + ' ', + ' ', + ' ', + ` Index of ${he.encode(pathname)}`, + ` `, + ' ', + ' ', + `

Index of ${he.encode(pathname)}

`, + ].join('\n')}\n`; + + html += ''; + + const failed = false; + const writeRow = (file) => { + // render a row given a [name, stat] tuple + const isDir = file[1].isDirectory && file[1].isDirectory(); + let href = `${parsed.pathname.replace(/\/$/, '')}/${encodeURIComponent(file[0])}`; + + // append trailing slash and query for dir entry + if (isDir) { + href += `/${he.encode((parsed.search) ? parsed.search : '')}`; + } + + const displayName = he.encode(file[0]) + ((isDir) ? '/' : ''); + const ext = file[0].split('.').pop(); + const classForNonDir = supportedIcons[ext] ? ext : '_page'; + const iconClass = `icon-${isDir ? '_blank' : classForNonDir}`; + + // TODO: use stylessheets? + html += `${'' + + '`; + if (!hidePermissions) { + html += ``; + } + html += + `` + + `` + + '\n'; + }; + + dirs.sort((a, b) => a[0].toString().localeCompare(b[0].toString())).forEach(writeRow); + renderFiles.sort((a, b) => a.toString().localeCompare(b.toString())).forEach(writeRow); + lolwuts.sort((a, b) => a[0].toString().localeCompare(b[0].toString())).forEach(writeRow); + + html += '
(${permsToString(file[1])})${sizeToString(file[1], humanReadable, si)}${displayName}
\n'; + html += `
Node.js ${ + process.version + }/ http-server ` + + `server running @ ${ + he.encode(req.headers.host || '')}
\n` + + '' + ; + + if (!failed) { + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(html); + } + } + + sortFiles(dir, files, (lolwuts, dirs, sortedFiles) => { + // It's possible to get stat errors for all sorts of reasons here. + // Unfortunately, our two choices are to either bail completely, + // or just truck along as though everything's cool. In this case, + // I decided to just tack them on as "??!?" items along with dirs + // and files. + // + // Whatever. + + // if it makes sense to, add a .. link + if (path.resolve(dir, '..').slice(0, root.length) === root) { + fs.stat(path.join(dir, '..'), (err, s) => { + if (err) { + if (handleError) { + status[500](res, next, { error: err }); + } else { + next(); + } + return; + } + dirs.unshift(['..', s]); + render(dirs, sortedFiles, lolwuts); + }); + } else { + render(dirs, sortedFiles, lolwuts); + } + }); + }); + }); + }; +}; diff --git a/lib/core/show-dir/perms-to-string.js b/lib/core/show-dir/perms-to-string.js new file mode 100644 index 000000000..9e65821d7 --- /dev/null +++ b/lib/core/show-dir/perms-to-string.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = function permsToString(stat) { + if (!stat.isDirectory || !stat.mode) { + return '???!!!???'; + } + + const dir = stat.isDirectory() ? 'd' : '-'; + const mode = stat.mode.toString(8); + + return dir + mode.slice(-3).split('').map(n => [ + '---', + '--x', + '-w-', + '-wx', + 'r--', + 'r-x', + 'rw-', + 'rwx', + ][parseInt(n, 10)]).join(''); +}; diff --git a/lib/core/show-dir/size-to-string.js b/lib/core/show-dir/size-to-string.js new file mode 100644 index 000000000..a5fbec995 --- /dev/null +++ b/lib/core/show-dir/size-to-string.js @@ -0,0 +1,30 @@ +'use strict'; + +// given a file's stat, return the size of it in string +// humanReadable: (boolean) whether to result is human readable +// si: (boolean) whether to use si (1k = 1000), otherwise 1k = 1024 +// adopted from http://stackoverflow.com/a/14919494/665507 +module.exports = function sizeToString(stat, humanReadable, si) { + if (stat.isDirectory && stat.isDirectory()) { + return ''; + } + + let bytes = stat.size; + const threshold = si ? 1000 : 1024; + + if (!humanReadable || bytes < threshold) { + return `${bytes}B`; + } + + const units = ['k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + let u = -1; + do { + bytes /= threshold; + u += 1; + } while (bytes >= threshold); + + let b = bytes.toFixed(1); + if (isNaN(b)) b = '??'; + + return b + units[u]; +}; diff --git a/lib/core/show-dir/sort-files.js b/lib/core/show-dir/sort-files.js new file mode 100644 index 000000000..67be77618 --- /dev/null +++ b/lib/core/show-dir/sort-files.js @@ -0,0 +1,36 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +module.exports = function sortByIsDirectory(dir, paths, cb) { + // take the listing file names in `dir` + // returns directory and file array, each entry is + // of the array a [name, stat] tuple + let pending = paths.length; + const errs = []; + const dirs = []; + const files = []; + + if (!pending) { + cb(errs, dirs, files); + return; + } + + paths.forEach((file) => { + fs.stat(path.join(dir, file), (err, s) => { + if (err) { + errs.push([file, err]); + } else if (s.isDirectory()) { + dirs.push([file, s]); + } else { + files.push([file, s]); + } + + pending -= 1; + if (pending === 0) { + cb(errs, dirs, files); + } + }); + }); +}; diff --git a/lib/core/show-dir/styles.js b/lib/core/show-dir/styles.js new file mode 100644 index 000000000..85f6259a5 --- /dev/null +++ b/lib/core/show-dir/styles.js @@ -0,0 +1,20 @@ +'use strict'; + +const icons = require('./icons.json'); + +const IMG_SIZE = 16; + +let css = `i.icon { display: block; height: ${IMG_SIZE}px; width: ${IMG_SIZE}px; }\n`; +css += 'table tr { white-space: nowrap; }\n'; +css += 'td.perms {}\n'; +css += 'td.file-size { text-align: right; padding-left: 1em; }\n'; +css += 'td.display-name { padding-left: 1em; }\n'; + +Object.keys(icons).forEach((key) => { + css += `i.icon-${key} {\n`; + css += ` background-image: url("data:image/png;base64,${icons[key]}");\n`; + css += '}\n\n'; +}); + +exports.icons = icons; +exports.css = css; diff --git a/lib/core/status-handlers.js b/lib/core/status-handlers.js new file mode 100644 index 000000000..265b399e5 --- /dev/null +++ b/lib/core/status-handlers.js @@ -0,0 +1,96 @@ +'use strict'; + +const he = require('he'); + +// not modified +exports['304'] = (res) => { + res.statusCode = 304; + res.end(); +}; + +// access denied +exports['403'] = (res, next) => { + res.statusCode = 403; + if (typeof next === 'function') { + next(); + } else if (res.writable) { + res.setHeader('content-type', 'text/plain'); + res.end('ACCESS DENIED'); + } +}; + +// disallowed method +exports['405'] = (res, next, opts) => { + res.statusCode = 405; + if (typeof next === 'function') { + next(); + } else { + res.setHeader('allow', (opts && opts.allow) || 'GET, HEAD'); + res.end(); + } +}; + +// not found +exports['404'] = (res, next) => { + res.statusCode = 404; + if (typeof next === 'function') { + next(); + } else if (res.writable) { + res.setHeader('content-type', 'text/plain'); + res.end('File not found. :('); + } +}; + +exports['416'] = (res, next) => { + res.statusCode = 416; + if (typeof next === 'function') { + next(); + } else if (res.writable) { + res.setHeader('content-type', 'text/plain'); + res.end('Requested range not satisfiable'); + } +}; + +// flagrant error +exports['500'] = (res, next, opts) => { + res.statusCode = 500; + res.setHeader('content-type', 'text/html'); + const error = String(opts.error.stack || opts.error || 'No specified error'); + const html = `${[ + '', + '', + ' ', + ' ', + ' 500 Internal Server Error', + ' ', + ' ', + '

', + ` ${he.encode(error)}`, + '

', + ' ', + '', + ].join('\n')}\n`; + res.end(html); +}; + +// bad request +exports['400'] = (res, next, opts) => { + res.statusCode = 400; + res.setHeader('content-type', 'text/html'); + const error = opts && opts.error ? String(opts.error) : 'Malformed request.'; + const html = `${[ + '', + '', + ' ', + ' ', + ' 400 Bad Request', + ' ', + ' ', + '

', + ` ${he.encode(error)}`, + '

', + ' ', + '', + ].join('\n')}\n`; + res.end(html); +}; diff --git a/lib/http-server.js b/lib/http-server.js index 8bafdf8e9..ff9eb4f31 100644 --- a/lib/http-server.js +++ b/lib/http-server.js @@ -2,7 +2,7 @@ var fs = require('fs'), union = require('union'), - ecstatic = require('ecstatic'), + httpServerCore = require('./core'), auth = require('basic-auth'), httpProxy = require('http-proxy'), corser = require('corser'), @@ -26,7 +26,7 @@ var _pathNormalize = path.normalize; path.normalize = function (p) { var caller = getCaller(); var result = _pathNormalize(p); - // https://github.com/jfhbrook/node-ecstatic/blob/master/lib/ecstatic.js#L20 + // Fix left over from fixing ecstatic. if (caller === 'decodePathname') { result = result.replace(/\\/g, '/'); } @@ -149,7 +149,7 @@ function HttpServer(options) { }); } - before.push(ecstatic({ + before.push(httpServerCore({ root: this.root, cache: this.cache, showDir: this.showDir, diff --git a/package-lock.json b/package-lock.json index acb4dfd60..232bd77b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -911,17 +911,6 @@ "safer-buffer": "^2.1.0" } }, - "ecstatic": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz", - "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==", - "requires": { - "he": "^1.1.1", - "mime": "^1.6.0", - "minimist": "^1.1.0", - "url-join": "^2.0.5" - } - }, "enabled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", diff --git a/package.json b/package.json index c6ecb7e1b..0b620e7fe 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,15 @@ "keywords": [ "cli", "command", + "static", "http", "server" ], "scripts": { "start": "node ./bin/http-server", - "pretest": "common bin/http-server lib/ test", - "test": "vows --spec --isolate" + "pretest": "common bin/http-server lib/http-server.js test", + "test": "vows --spec --isolate test/*.test.js", + "test-watch": "vows --spec --isolate --watch test/*.test.js" }, "files": [ "lib", @@ -77,20 +79,22 @@ }, { "name": "Jade Michael Thornton", - "email": "jade@jmthornton.net" + "email": "jademichael@jmthornton.net" } ], "dependencies": { "basic-auth": "^1.0.3", "colors": "^1.4.0", "corser": "^2.0.1", - "ecstatic": "^3.3.2", "http-proxy": "^1.18.0", "minimist": "^1.2.5", + "he": "^1.1.0", + "mime": "^1.6.0", "opener": "^1.5.1", "portfinder": "^1.0.25", "secure-compare": "3.0.1", - "union": "~0.5.0" + "union": "~0.5.0", + "url-join": "^2.0.5" }, "devDependencies": { "common-style": "^3.0.0", From 758a23967eca0b0db26b25352c5fe7575cf603b5 Mon Sep 17 00:00:00 2001 From: Jade Michael Thornton Date: Tue, 26 May 2020 09:46:23 -0500 Subject: [PATCH 067/259] pull in core tests from ecstatic --- test/304.test.js | 231 ++++++++++++++++++ test/accept-encoding.test.js | 66 +++++ test/cache.test.js | 126 ++++++++++ test/cli.test.js | 121 +++++++++ test/compression.test.js | 187 ++++++++++++++ test/content-type.test.js | 31 +++ test/core-error.test.js | 72 ++++++ test/core.test.js | 74 ++++++ test/custom-content-type-file-secret.test.js | 31 +++ test/custom-content-type-file.test.js | 47 ++++ test/custom-content-type.test.js | 33 +++ test/default-default-ext.test.js | 22 ++ test/enotdir.test.js | 20 ++ test/escaping.test.js | 21 ++ test/express-error.test.js | 74 ++++++ test/express.test.js | 76 ++++++ test/fixtures/common-cases-error.js | 15 ++ test/fixtures/common-cases.js | 160 ++++++++++++ test/fixtures/custom_mime_type.types | 3 + test/headers.test.js | 124 ++++++++++ test/html-reflection.test.js | 21 ++ test/illegal-access-date.test.js | 26 ++ test/malformed-dir.test.js | 20 ++ test/malformed.test.js | 21 ++ test/mime.test.js | 46 ++++ test/process-env-port.test.js | 53 ++++ test/public/404.html | 1 + test/public/404.html.gz | Bin 0 -> 40 bytes test/public/a.txt | 1 + test/public/another-subdir/scripts.js | 1 + test/public/b.txt | 1 + test/public/brotli/fake_ecstatic | 1 + test/public/brotli/fake_ecstatic.br | Bin 0 -> 11 bytes test/public/brotli/index.html | 1 + test/public/brotli/index.html.br | 3 + test/public/brotli/index.html.gz | Bin 0 -> 50 bytes test/public/brotli/not_actually_brotli.br | 1 + test/public/brotli/real_ecstatic | 1 + test/public/brotli/real_ecstatic.br | 2 + test/public/c.js | 1 + test/public/compress/foo.js | 1 + test/public/compress/foo.js.gz | Bin 0 -> 41 bytes test/public/compress/foo_2.js | 1 + test/public/containsSymlink/more-problematic | 1 + test/public/containsSymlink/problematic | 1 + .../public/curimit@gmail.com (40%)/index.html | 1 + test/public/custom_mime_type.opml | 13 + test/public/custom_mime_type.types | 3 + test/public/d.js | 1 + test/public/e.js | 1 + test/public/f_f | 1 + test/public/gzip/fake_ecstatic | 1 + test/public/gzip/fake_ecstatic.gz | 0 test/public/gzip/index.html | 1 + test/public/gzip/index.html.gz | Bin 0 -> 37 bytes test/public/gzip/real_ecstatic | 1 + test/public/gzip/real_ecstatic.gz | Bin 0 -> 43 bytes .../show-dir$$href_encoding$$/aname+aplus.txt | 4 + test/public/subdir/e.html | 1 + test/public/subdir/index.html | 1 + .../subdir_with space/file_with space.html | 1 + test/public/subdir_with space/index.html | 1 + .../\346\252\224\346\241\210.html" | 1 + test/range.test.js | 132 ++++++++++ test/server-header.test.js | 40 +++ test/showdir-href-encoding.test.js | 34 +++ test/showdir-pathname-encoding.test.js | 55 +++++ test/showdir-search-encoding.test.js | 35 +++ test/showdir-with-spaces.test.js | 34 +++ test/trailing-slash.test.js | 26 ++ 70 files changed, 2127 insertions(+) create mode 100644 test/304.test.js create mode 100644 test/accept-encoding.test.js create mode 100644 test/cache.test.js create mode 100644 test/cli.test.js create mode 100644 test/compression.test.js create mode 100644 test/content-type.test.js create mode 100644 test/core-error.test.js create mode 100644 test/core.test.js create mode 100644 test/custom-content-type-file-secret.test.js create mode 100644 test/custom-content-type-file.test.js create mode 100644 test/custom-content-type.test.js create mode 100644 test/default-default-ext.test.js create mode 100644 test/enotdir.test.js create mode 100644 test/escaping.test.js create mode 100644 test/express-error.test.js create mode 100644 test/express.test.js create mode 100644 test/fixtures/common-cases-error.js create mode 100755 test/fixtures/common-cases.js create mode 100644 test/fixtures/custom_mime_type.types create mode 100644 test/headers.test.js create mode 100644 test/html-reflection.test.js create mode 100644 test/illegal-access-date.test.js create mode 100644 test/malformed-dir.test.js create mode 100644 test/malformed.test.js create mode 100644 test/mime.test.js create mode 100644 test/process-env-port.test.js create mode 100644 test/public/404.html create mode 100644 test/public/404.html.gz create mode 100644 test/public/a.txt create mode 100644 test/public/another-subdir/scripts.js create mode 100644 test/public/b.txt create mode 100644 test/public/brotli/fake_ecstatic create mode 100644 test/public/brotli/fake_ecstatic.br create mode 100644 test/public/brotli/index.html create mode 100644 test/public/brotli/index.html.br create mode 100644 test/public/brotli/index.html.gz create mode 100644 test/public/brotli/not_actually_brotli.br create mode 100644 test/public/brotli/real_ecstatic create mode 100644 test/public/brotli/real_ecstatic.br create mode 100644 test/public/c.js create mode 100644 test/public/compress/foo.js create mode 100644 test/public/compress/foo.js.gz create mode 100644 test/public/compress/foo_2.js create mode 120000 test/public/containsSymlink/more-problematic create mode 120000 test/public/containsSymlink/problematic create mode 100644 test/public/curimit@gmail.com (40%)/index.html create mode 100644 test/public/custom_mime_type.opml create mode 100644 test/public/custom_mime_type.types create mode 100644 test/public/d.js create mode 100644 test/public/e.js create mode 100644 test/public/f_f create mode 100644 test/public/gzip/fake_ecstatic create mode 100644 test/public/gzip/fake_ecstatic.gz create mode 100644 test/public/gzip/index.html create mode 100644 test/public/gzip/index.html.gz create mode 100644 test/public/gzip/real_ecstatic create mode 100644 test/public/gzip/real_ecstatic.gz create mode 100644 test/public/show-dir$$href_encoding$$/aname+aplus.txt create mode 100644 test/public/subdir/e.html create mode 100644 test/public/subdir/index.html create mode 100644 test/public/subdir_with space/file_with space.html create mode 100644 test/public/subdir_with space/index.html create mode 100644 "test/public/\344\270\255\346\226\207/\346\252\224\346\241\210.html" create mode 100644 test/range.test.js create mode 100644 test/server-header.test.js create mode 100644 test/showdir-href-encoding.test.js create mode 100644 test/showdir-pathname-encoding.test.js create mode 100644 test/showdir-search-encoding.test.js create mode 100644 test/showdir-with-spaces.test.js create mode 100644 test/trailing-slash.test.js diff --git a/test/304.test.js b/test/304.test.js new file mode 100644 index 000000000..a7e57512a --- /dev/null +++ b/test/304.test.js @@ -0,0 +1,231 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const request = require('request'); +const path = require('path'); + +const root = `${__dirname}/public`; +const baseDir = 'base'; + +test('304_not_modified_strong', (t) => { + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + const file = 'a.txt'; + + const server = http.createServer( + ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + weakEtags: false, + weakCompare: false, + }) + ); + + server.listen(port, () => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + + request.get({ + uri, + followRedirect: false, + }, (err, res) => { + if (err) { + t.fail(err); + } + + t.equal(res.statusCode, 200, 'first request should be a 200'); + + request.get({ + uri, + followRedirect: false, + headers: { 'if-modified-since': res.headers['last-modified'] }, + }, (err2, res2) => { + if (err2) { + t.fail(err2); + } + + t.equal(res2.statusCode, 304, 'second request should be a 304'); + t.equal(res2.headers.etag.indexOf('"'), 0, 'should return a strong etag'); + server.close(); + t.end(); + }); + }); + }); +}); + +test('304_not_modified_weak', (t) => { + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + const file = 'b.txt'; + + const server = http.createServer( + ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + weakCompare: false, + }) + ); + + server.listen(port, () => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + const now = (new Date()).toString(); + + request.get({ + uri, + followRedirect: false, + }, (err, res) => { + if (err) { + t.fail(err); + } + + t.equal(res.statusCode, 200, 'first request should be a 200'); + + request.get({ + uri, + followRedirect: false, + headers: { 'if-modified-since': now }, + }, (err2, res2) => { + if (err2) t.fail(err2); + + t.equal(res2.statusCode, 304, 'second request should be a 304'); + t.equal(res2.headers.etag.indexOf('W/'), 0, 'should return a weak etag'); + server.close(); + t.end(); + }); + }); + }); +}); + +test('304_not_modified_strong_compare', (t) => { + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + const file = 'b.txt'; + + const server = http.createServer( + ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + weakEtags: false, + weakCompare: false, + }) + ); + + server.listen(port, () => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + const now = (new Date()).toString(); + let etag = null; + + request.get({ + uri, + followRedirect: false, + }, (err, res) => { + if (err) { + t.fail(err); + } + + t.equal(res.statusCode, 200, 'first request should be a 200'); + + etag = res.headers.etag; + + request.get({ + uri, + followRedirect: false, + headers: { 'if-modified-since': now, 'if-none-match': etag }, + }, (err2, res2) => { + if (err2) { + t.fail(err2); + } + + t.equal(res2.statusCode, 304, 'second request with a strong etag should be 304'); + + request.get({ + uri, + followRedirect: false, + headers: { 'if-modified-since': now, 'if-none-match': `W/${etag}` }, + }, (err3, res3) => { + if (err3) { + t.fail(err3); + } + + // Note that if both if-modified-since and if-none-match are + // provided, the server MUST NOT return a response status of 304 + // unless doing so is consistent with all of the conditional + // header fields in the request + // https://www.ietf.org/rfc/rfc2616.txt + t.equal(res3.statusCode, 200, 'third request with a weak etag should be 200'); + server.close(); + t.end(); + }); + }); + }); + }); +}); + + +test('304_not_modified_weak_compare', (t) => { + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + const file = 'c.js'; + + const server = http.createServer( + ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + weakEtags: false, + }) + ); + + server.listen(port, () => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + const now = (new Date()).toString(); + let etag = null; + + request.get({ + uri, + followRedirect: false, + }, (err, res) => { + if (err) { + t.fail(err); + } + + t.equal(res.statusCode, 200, 'first request should be a 200'); + + etag = res.headers.etag; + + request.get({ + uri, + followRedirect: false, + headers: { 'if-modified-since': now, 'if-none-match': etag }, + }, (err2, res2) => { + if (err2) { + t.fail(err2); + } + + t.equal(res2.statusCode, 304, 'second request with a strong etag should be 304'); + + request.get({ + uri, + followRedirect: false, + headers: { 'if-modified-since': now, 'if-none-match': `W/${etag}` }, + }, (err3, res3) => { + if (err3) { + t.fail(err3); + } + + t.equal(res3.statusCode, 304, 'third request with a weak etag should be 304'); + server.close(); + t.end(); + }); + }); + }); + }); +}); diff --git a/test/accept-encoding.test.js b/test/accept-encoding.test.js new file mode 100644 index 000000000..e6fb17f72 --- /dev/null +++ b/test/accept-encoding.test.js @@ -0,0 +1,66 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const request = require('request'); + +const root = `${__dirname}/public`; + +test('properly handles whitespace in accept-encoding', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + autoIndex: true, + gzip: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/gzip`, + headers: { + 'accept-encoding': ' gzip, deflate' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], 'gzip'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('properly handles single accept-encoding entry', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + autoIndex: true, + gzip: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/gzip`, + headers: { + 'accept-encoding': 'gzip' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], 'gzip'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); diff --git a/test/cache.test.js b/test/cache.test.js new file mode 100644 index 000000000..4e4802205 --- /dev/null +++ b/test/cache.test.js @@ -0,0 +1,126 @@ +'use strict'; + +const test = require('tap').test; +const http = require('http'); +const request = require('request'); +const ecstatic = require('../'); + +test('custom cache option number', (t) => { + let server = null; + try { + server = http.createServer(ecstatic({ + root: `${__dirname}/public/`, + cache: 3600, + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/a.txt`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200, 'a.txt should be found'); + t.equal(res.headers['cache-control'], 'max-age=3600'); + server.close(() => { t.end(); }); + }); + }); +}); + +test('custom cache option string', (t) => { + let server = null; + try { + server = http.createServer(ecstatic({ + root: `${__dirname}/public/`, + cache: 'max-whatever=3600', + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/a.txt`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200, 'a.txt should be found'); + t.equal(res.headers['cache-control'], 'max-whatever=3600'); + server.close(() => { t.end(); }); + }); + }); +}); + +test('custom cache option function returning a number', (t) => { + let i = 0; + let server = null; + try { + server = http.createServer(ecstatic({ + root: `${__dirname}/public/`, + cache() { + i += 1; + return i; + }, + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(6); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/a.txt`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200, 'a.txt should be found'); + t.equal(res.headers['cache-control'], 'max-age=1'); + + request.get(`http://localhost:${port}/a.txt`, (err2, res2) => { + t.ifError(err2); + t.equal(res2.statusCode, 200, 'a.txt should be found'); + t.equal(res2.headers['cache-control'], 'max-age=2'); + server.close(() => { t.end(); }); + }); + }); + }); +}); + +test('custom cache option function returning a string', (t) => { + let i = 0; + let server = null; + try { + server = http.createServer(ecstatic({ + root: `${__dirname}/public/`, + cache() { + i += 1; + return `max-meh=${i}`; + }, + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(6); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/a.txt`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200, 'a.txt should be found'); + t.equal(res.headers['cache-control'], 'max-meh=1'); + + request.get(`http://localhost:${port}/a.txt`, (err2, res2) => { + t.ifError(err2); + t.equal(res2.statusCode, 200, 'a.txt should be found'); + t.equal(res2.headers['cache-control'], 'max-meh=2'); + server.close(() => { t.end(); }); + }); + }); + }); +}); diff --git a/test/cli.test.js b/test/cli.test.js new file mode 100644 index 000000000..2ac130b67 --- /dev/null +++ b/test/cli.test.js @@ -0,0 +1,121 @@ +'use strict'; + +/* this test suit is incomplete 2015-12-18 */ + +const test = require('tap').test; +const request = require('request'); +const spawn = require('child_process').spawn; +const path = require('path'); + +const node = process.execPath; +const defaultUrl = 'http://localhost'; +const defaultPort = 8000; + +function getRandomInt(min, max) { + return Math.floor(Math.random() * ((max - min) + 1)) + min; +} + +function startEcstatic(args) { + return spawn(node, [require.resolve('../lib/core.js')].concat(args)); +} + +function checkServerIsRunning(url, t, _cb) { + const cb = _cb || (() => {}); + + request(url, (err, res) => { + if (!err && res.statusCode !== 500) { + t.pass('a successful request from the server was made'); + cb(null, res); + } else { + t.fail(`the server could not be reached @ ${url}`); + cb(err); + } + }); +} + +function tearDown(ps, t) { + t.tearDown(() => { + ps.kill('SIGTERM'); + }); +} + +const getRandomPort = (() => { + const usedPorts = []; + return () => { + const port = getRandomInt(1025, 65536); + if (usedPorts.indexOf(port) > -1) { + return getRandomPort(); + } + + usedPorts.push(port); + return port; + }; +})(); + +test('setting port via cli - default port', (t) => { + t.plan(2); + + const port = defaultPort; + const options = ['.']; + const ecstatic = startEcstatic(options); + + tearDown(ecstatic, t); + + ecstatic.stdout.on('data', () => { + t.pass('ecstatic should be started'); + checkServerIsRunning(`${defaultUrl}:${port}`, t); + }); +}); + +test('setting port via cli - custom port', (t) => { + t.plan(2); + + const port = getRandomPort(); + const options = ['.', '--port', port]; + const ecstatic = startEcstatic(options); + + tearDown(ecstatic, t); + + ecstatic.stdout.on('data', () => { + t.pass('ecstatic should be started'); + checkServerIsRunning(`${defaultUrl}:${port}`, t); + }); +}); + +test('setting mimeTypes via cli - .types file', (t) => { + t.plan(2); + + const port = getRandomPort(); + const root = path.resolve(__dirname, 'public/'); + const pathMimetypeFile = path.resolve(__dirname, 'fixtures/custom_mime_type.types'); + const options = [root, '--port', port, '--mimetypes', pathMimetypeFile]; + const ecstatic = startEcstatic(options); + + tearDown(ecstatic, t); + + ecstatic.stdout.on('data', () => { + t.pass('ecstatic should be started'); + checkServerIsRunning(`${defaultUrl}:${port}/custom_mime_type.opml`, t); + }); +}); + +test('setting mimeTypes via cli - directly', (t) => { + t.plan(4); + + const port = getRandomPort(); + const root = path.resolve(__dirname, 'public/'); + const mimeType = ['--mimeTypes', '{ "application/x-my-type": ["opml"] }']; + const options = [root, '--port', port, '--mimetypes'].concat(mimeType); + const ecstatic = startEcstatic(options); + + // TODO: remove error handler + tearDown(ecstatic, t); + + ecstatic.stdout.on('data', () => { + t.pass('ecstatic should be started'); + checkServerIsRunning(`${defaultUrl}:${port}/custom_mime_type.opml`, t, (err, res) => { + t.error(err); + t.equal(res.headers['content-type'], 'application/x-my-type; charset=utf-8'); + }); + }); +}); diff --git a/test/compression.test.js b/test/compression.test.js new file mode 100644 index 000000000..332fcb491 --- /dev/null +++ b/test/compression.test.js @@ -0,0 +1,187 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const request = require('request'); + +const root = `${__dirname}/public`; + +test('serves brotli-encoded file when available', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + brotli: true, + autoIndex: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/brotli`, + headers: { + 'accept-encoding': 'gzip, deflate, br' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], 'br'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('serves gzip-encoded file when brotli not available', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + brotli: true, + gzip: true, + autoIndex: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/gzip`, + headers: { + 'accept-encoding': 'gzip, deflate, br' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], 'gzip'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('serves gzip-encoded file when brotli not accepted', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + brotli: true, + gzip: true, + autoIndex: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/brotli`, + headers: { + 'accept-encoding': 'gzip, deflate' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], 'gzip'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('serves gzip-encoded file when brotli not enabled', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + brotli: false, + gzip: true, + autoIndex: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/brotli`, + headers: { + 'accept-encoding': 'gzip, deflate, br' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], 'gzip'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('serves unencoded file when compression not accepted', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + brotli: true, + gzip: true, + autoIndex: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/brotli`, + headers: { + 'accept-encoding': '' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], undefined); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('serves unencoded file when compression not enabled', (t) => { + t.plan(3); + + const server = http.createServer(ecstatic({ + root, + brotli: false, + gzip: false, + autoIndex: true + })); + + server.listen(() => { + const port = server.address().port; + const options = { + uri: `http://localhost:${port}/brotli`, + headers: { + 'accept-encoding': 'gzip, deflate, br' + } + }; + + request.get(options, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-encoding'], undefined); + }); + }); + t.once('end', () => { + server.close(); + }); +}); diff --git a/test/content-type.test.js b/test/content-type.test.js new file mode 100644 index 000000000..d6bffa1e4 --- /dev/null +++ b/test/content-type.test.js @@ -0,0 +1,31 @@ +'use strict'; + +const test = require('tap').test; +const http = require('http'); +const request = require('request'); +const ecstatic = require('../'); + +test('default default contentType', (t) => { + let server = null; + try { + server = http.createServer(ecstatic({ + root: `${__dirname}/public/`, + contentType: 'text/plain', + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/f_f`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers['content-type'], 'text/plain; charset=UTF-8'); + server.close(() => { t.end(); }); + }); + }); +}); diff --git a/test/core-error.test.js b/test/core-error.test.js new file mode 100644 index 000000000..6f06279b7 --- /dev/null +++ b/test/core-error.test.js @@ -0,0 +1,72 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const request = require('request'); +const mkdirp = require('mkdirp'); +const path = require('path'); + +const root = `${__dirname}/public`; +const baseDir = 'base'; + +mkdirp.sync(`${root}/emptyDir`); + +const cases = require('./fixtures/common-cases-error'); + +test('core', (t) => { + const filenames = Object.keys(cases); + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + + const server = http.createServer( + ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + handleError: false, + }) + ); + + server.listen(port, () => { + let pending = filenames.length; + filenames.forEach((file) => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + const headers = cases[file].headers || {}; + + request.get({ + uri, + followRedirect: false, + headers, + }, (err, res, body) => { + if (err) { + t.fail(err); + } + const r = cases[file]; + t.equal(res.statusCode, r.code, `status code for \`${file}\``); + + if (r.type !== undefined) { + t.equal( + res.headers['content-type'].split(';')[0], r.type, + `content-type for \`${file}\`` + ); + } + + if (r.body !== undefined) { + t.equal(body, r.body, `body for \`${file}\``); + } + + if (r.location !== undefined) { + t.equal(res.headers.location, path.join('/', baseDir, r.location), `location for \`${file}\``); + } + + pending -= 1; + if (pending === 0) { + server.close(); + t.end(); + } + }); + }); + }); +}); diff --git a/test/core.test.js b/test/core.test.js new file mode 100644 index 000000000..d5b10572c --- /dev/null +++ b/test/core.test.js @@ -0,0 +1,74 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const request = require('request'); +const mkdirp = require('mkdirp'); +const path = require('path'); +const eol = require('eol'); + +const root = `${__dirname}/public`; +const baseDir = 'base'; + +mkdirp.sync(`${root}/emptyDir`); + +const cases = require('./fixtures/common-cases'); + +test('core', (t) => { + const filenames = Object.keys(cases); + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + + const server = http.createServer( + ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + defaultExt: 'html', + handleError: true, + }) + ); + + server.listen(port, () => { + let pending = filenames.length; + filenames.forEach((file) => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + const headers = cases[file].headers || {}; + + request.get({ + uri, + followRedirect: false, + headers, + }, (err, res, body) => { + if (err) { + t.fail(err); + } + const r = cases[file]; + t.equal(res.statusCode, r.code, `status code for \`${file}\``); + + if (r.type !== undefined) { + t.equal( + res.headers['content-type'].split(';')[0], r.type, + `content-type for \`${file}\`` + ); + } + + if (r.body !== undefined) { + t.equal(eol.lf(body), r.body, `body for \`${file}\``); + } + + if (r.location !== undefined) { + t.equal(path.normalize(res.headers.location), path.join('/', baseDir, r.location), `location for \`${file}\``); + } + + pending -= 1; + if (pending === 0) { + server.close(); + t.end(); + } + }); + }); + }); +}); diff --git a/test/custom-content-type-file-secret.test.js b/test/custom-content-type-file-secret.test.js new file mode 100644 index 000000000..a04b91219 --- /dev/null +++ b/test/custom-content-type-file-secret.test.js @@ -0,0 +1,31 @@ +'use strict'; + +const test = require('tap').test; +const http = require('http'); +const request = require('request'); +const ecstatic = require('../'); + +test('custom contentType via .types file', (t) => { + let server = null; + try { + server = http.createServer(ecstatic({ + root: `${__dirname}/public/`, + mimetypes: `${__dirname}/fixtures/custom_mime_type.types`, + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/custom_mime_type.opml`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200, 'custom_mime_type.opml should be found'); + t.equal(res.headers['content-type'], 'application/secret; charset=utf-8'); + server.close(() => { t.end(); }); + }); + }); +}); diff --git a/test/custom-content-type-file.test.js b/test/custom-content-type-file.test.js new file mode 100644 index 000000000..95b939287 --- /dev/null +++ b/test/custom-content-type-file.test.js @@ -0,0 +1,47 @@ +'use strict'; + +const test = require('tap').test; +const http = require('http'); +const request = require('request'); +const ecstatic = require('../'); + +function setup(opts) { + return http.createServer(ecstatic(opts)); +} + +test('throws when custom contentType .types file does not exist', (t) => { + t.plan(1); + + t.throws( + setup.bind(null, { + root: `${__dirname}/public/`, + mimeTypes: 'this_file_does_not_exist.types', + }) + ); +}); + +test('custom contentType via .types file', (t) => { + let server = null; + try { + server = setup({ + root: `${__dirname}/public`, + 'mime-types': `${__dirname}/public/custom_mime_type.types`, + }); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3); + + server.listen(0, () => { + const port = server.address().port; + + request.get(`http://localhost:${port}/custom_mime_type.opml`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200, 'custom_mime_type.opml should be found'); + t.equal(res.headers['content-type'], 'application/foo; charset=utf-8'); + server.close(() => { t.end(); }); + }); + }); +}); diff --git a/test/custom-content-type.test.js b/test/custom-content-type.test.js new file mode 100644 index 000000000..66f2b05e9 --- /dev/null +++ b/test/custom-content-type.test.js @@ -0,0 +1,33 @@ +'use strict'; + +const test = require('tap').test; +const http = require('http'); +const request = require('request'); +const ecstatic = require('../'); + +test('custom contentType', (t) => { + let server = null; + try { + server = http.createServer(ecstatic({ + root: `${__dirname}/public/`, + mimetype: { + 'application/jon': ['opml'], + }, + })); + } catch (e) { + t.fail(e.message); + t.end(); + } + + t.plan(3); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/custom_mime_type.opml`, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200, 'custom_mime_type.opml should be found'); + t.equal(res.headers['content-type'], 'application/jon; charset=utf-8'); + server.close(() => { t.end(); }); + }); + }); +}); diff --git a/test/default-default-ext.test.js b/test/default-default-ext.test.js new file mode 100644 index 000000000..bf3af397e --- /dev/null +++ b/test/default-default-ext.test.js @@ -0,0 +1,22 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../'); +const http = require('http'); +const request = require('request'); +const eol = require('eol'); + +test('default defaultExt', (t) => { + t.plan(3); + const server = http.createServer(ecstatic(`${__dirname}/public/subdir`)); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}`, (err, res, body) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(eol.lf(body), 'index!!!\n'); + server.close(() => { t.end(); }); + }); + }); +}); diff --git a/test/enotdir.test.js b/test/enotdir.test.js new file mode 100644 index 000000000..6134d78b0 --- /dev/null +++ b/test/enotdir.test.js @@ -0,0 +1,20 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../'); +const http = require('http'); +const request = require('request'); + +test('should handle ENOTDIR as 404', (t) => { + t.plan(3); + const server = http.createServer(ecstatic(`${__dirname}/public/subdir`)); + t.on('end', () => { server.close(); }); + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/index.html/hello`, (err, res, body) => { + t.ifError(err); + t.equal(res.statusCode, 404); + t.equal(body, 'File not found. :('); + }); + }); +}); diff --git a/test/escaping.test.js b/test/escaping.test.js new file mode 100644 index 000000000..a0f6c1e9a --- /dev/null +++ b/test/escaping.test.js @@ -0,0 +1,21 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../'); +const http = require('http'); +const request = require('request'); +const eol = require('eol'); + +test('escaping special characters', (t) => { + const server = http.createServer(ecstatic(`${__dirname}/public`)); + + server.listen(0, () => { + const port = server.address().port; + request.get(`http://localhost:${port}/curimit%40gmail.com%20(40%25)`, (err, res, body) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(eol.lf(body), 'index!!!\n'); + server.close(() => { t.end(); }); + }); + }); +}); diff --git a/test/express-error.test.js b/test/express-error.test.js new file mode 100644 index 000000000..2962f16fa --- /dev/null +++ b/test/express-error.test.js @@ -0,0 +1,74 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const express = require('express'); +const request = require('request'); +const mkdirp = require('mkdirp'); +const path = require('path'); + +const root = `${__dirname}/public`; +const baseDir = 'base'; + +mkdirp.sync(`${root}/emptyDir`); + +const cases = require('./fixtures/common-cases-error'); + +test('express', (t) => { + const filenames = Object.keys(cases); + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + + const app = express(); + + app.use(ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + cache: 'no-cache', + handleError: false, + })); + + const server = http.createServer(app); + + server.listen(port, () => { + let pending = filenames.length; + filenames.forEach((file) => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + const headers = cases[file].headers || {}; + + request.get({ + uri, + followRedirect: false, + headers, + }, (err, res, body) => { + if (err) t.fail(err); + const r = cases[file]; + t.equal(res.statusCode, r.code, `status code for \`${file}\``); + + if (r.code === 200) { + t.equal(res.headers['cache-control'], 'no-cache', `cache control for \`${file}\``); + } + + if (r.type !== undefined) { + t.equal( + res.headers['content-type'].split(';')[0], r.type, + `content-type for \`${file}\`` + ); + } + + if (r.body !== undefined) { + t.equal(body, r.body, `body for \`${file}\``); + } + + pending -= 1; + if (pending === 0) { + server.close(); + t.end(); + } + }); + }); + }); +}); diff --git a/test/express.test.js b/test/express.test.js new file mode 100644 index 000000000..e645de5e4 --- /dev/null +++ b/test/express.test.js @@ -0,0 +1,76 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const express = require('express'); +const request = require('request'); +const mkdirp = require('mkdirp'); +const path = require('path'); +const eol = require('eol'); + +const root = `${__dirname}/public`; +const baseDir = 'base'; + +mkdirp.sync(`${root}/emptyDir`); + +const cases = require('./fixtures/common-cases'); + +test('express', (t) => { + const filenames = Object.keys(cases); + const port = Math.floor((Math.random() * ((1 << 16) - 1e4)) + 1e4); + + const app = express(); + + app.use(ecstatic({ + root, + gzip: true, + baseDir, + autoIndex: true, + showDir: true, + defaultExt: 'html', + cache: 'no-cache', + handleError: true, + })); + + const server = http.createServer(app); + + server.listen(port, () => { + let pending = filenames.length; + filenames.forEach((file) => { + const uri = `http://localhost:${port}${path.join('/', baseDir, file)}`; + const headers = cases[file].headers || {}; + + request.get({ + uri, + followRedirect: false, + headers, + }, (err, res, body) => { + if (err) t.fail(err); + const r = cases[file]; + t.equal(res.statusCode, r.code, `status code for \`${file}\``); + + if (r.code === 200) { + t.equal(res.headers['cache-control'], 'no-cache', `cache control for \`${file}\``); + } + + if (r.type !== undefined) { + t.equal( + res.headers['content-type'].split(';')[0], r.type, + `content-type for \`${file}\`` + ); + } + + if (r.body !== undefined) { + t.equal(eol.lf(body), r.body, `body for \`${file}\``); + } + + pending -= 1; + if (pending === 0) { + server.close(); + t.end(); + } + }); + }); + }); +}); diff --git a/test/fixtures/common-cases-error.js b/test/fixtures/common-cases-error.js new file mode 100644 index 000000000..1847587ac --- /dev/null +++ b/test/fixtures/common-cases-error.js @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = { + 404: { + code: 200, + }, + 'something non-existant': { + code: 404, + }, +}; + +if (require.main === module) { + /* eslint-disable no-console */ + console.log('ok 1 - test cases (error) included'); +} diff --git a/test/fixtures/common-cases.js b/test/fixtures/common-cases.js new file mode 100755 index 000000000..2c2f0b7c1 --- /dev/null +++ b/test/fixtures/common-cases.js @@ -0,0 +1,160 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const eol = require('eol'); + +module.exports = { + 'a.txt': { + code: 200, + type: 'text/plain', + body: 'A!!!\n', + }, + 'b.txt': { + code: 200, + type: 'text/plain', + body: 'B!!!\n', + }, + 'c.js': { + code: 200, + type: 'application/javascript', + body: 'console.log(\'C!!!\');\n', + }, + 'd.js': { + code: 200, + type: 'application/javascript', + body: 'd.js\n', + }, + 'e.js': { + code: 200, + type: 'application/javascript', + body: 'console.log(\'π!!!\');\n', + }, + 'subdir/e.html': { + code: 200, + type: 'text/html', + body: 'e!!\n', + }, + // test for defaultExt + 'subdir/e?foo=bar': { + code: 200, + type: 'text/html', + body: 'e!!\n', + }, + // test for defaultExt with noisy query param + 'subdir/e?foo=bar.ext': { + code: 200, + type: 'text/html', + body: 'e!!\n', + }, + 'subdir/index.html': { + code: 200, + type: 'text/html', + body: 'index!!!\n', + }, + subdir: { + code: 302, + location: 'subdir/', + }, + 'subdir?foo=bar': { + code: 302, + location: 'subdir/?foo=bar', + }, + // test for url-encoded paths + '%E4%B8%AD%E6%96%87': { // '/中文' + code: 302, + location: '%E4%B8%AD%E6%96%87/', + }, + '%E4%B8%AD%E6%96%87?%E5%A4%AB=%E5%B7%B4': { // '中文?夫=巴' + code: 302, + location: '%E4%B8%AD%E6%96%87/?%E5%A4%AB=%E5%B7%B4', + }, + 'subdir/': { + code: 200, + type: 'text/html', + body: 'index!!!\n', + }, + 404: { + code: 200, + type: 'text/html', + body: '

404

\n', + }, + 'something-non-existant': { + code: 404, + type: 'text/html', + body: '

404

\n', + }, + 'compress/foo.js': { + code: 200, + file: 'compress/foo.js.gz', + headers: { 'accept-encoding': 'compress, gzip' }, + body: fs.readFileSync(path.join(__dirname, '../', 'public', 'compress', 'foo.js.gz'), 'utf8'), + }, + // no accept-encoding of gzip, so serve regular file + 'compress/foo_2.js': { + code: 200, + file: 'compress/foo_2.js', + }, + 'emptyDir/': { + code: 404, + body: '

404

\n', + }, + 'subdir_with space': { + code: 302, + location: 'subdir_with%20space/', + }, + 'subdir_with space/index.html': { + code: 200, + type: 'text/html', + body: 'index :)\n', + }, + 'containsSymlink/': { + code: 404, + body: '

404

\n', + }, + 'gzip/': { + code: 200, + headers: { 'accept-encoding': 'compress, gzip' }, + type: 'text/html', + body: fs.readFileSync(path.join(__dirname, '../', 'public', 'gzip', 'index.html.gz'), 'utf8'), + }, + 'gzip/a': { + code: 404, + headers: { 'accept-encoding': 'compress, gzip' }, + type: 'text/html', + body: eol.lf(fs.readFileSync(path.join(__dirname, '../', 'public', '404.html.gz'), 'utf8')), + }, + 'gzip/real_ecstatic': { + code: 200, + file: 'gzip/real_ecstatic', + headers: { 'accept-encoding': 'compress, gzip' }, + type: 'application/octet-stream', + body: fs.readFileSync(path.join(__dirname, '../', 'public', 'gzip', 'real_ecstatic.gz'), 'utf8'), + }, + 'gzip/real_ecstatic.gz': { + code: 200, + file: 'gzip/real_ecstatic.gz', + headers: { 'accept-encoding': 'compress, gzip' }, + type: 'application/gzip', + body: fs.readFileSync(path.join(__dirname, '../', 'public', 'gzip', 'real_ecstatic.gz'), 'utf8'), + }, + 'gzip/fake_ecstatic': { + code: 200, + file: 'gzip/fake_ecstatic', + type: 'application/octet-stream', + headers: { 'accept-encoding': 'compress, gzip' }, + body: 'ecstatic', + }, + 'gzip/fake_ecstatic.gz': { + code: 200, + file: 'gzip/fake_ecstatic.gz', + type: 'application/gzip', + headers: { 'accept-encoding': 'compress, gzip' }, + body: fs.readFileSync(path.join(__dirname, '../', 'public', 'gzip', 'fake_ecstatic.gz'), 'utf8'), + }, +}; + +if (require.main === module) { + /* eslint-disable no-console */ + console.log('ok 1 - test cases included'); +} diff --git a/test/fixtures/custom_mime_type.types b/test/fixtures/custom_mime_type.types new file mode 100644 index 000000000..8f68da38c --- /dev/null +++ b/test/fixtures/custom_mime_type.types @@ -0,0 +1,3 @@ +# This file is an example of the Apache .types file format for describing mime-types. +# Other example: http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +application/secret opml diff --git a/test/headers.test.js b/test/headers.test.js new file mode 100644 index 000000000..b79b18329 --- /dev/null +++ b/test/headers.test.js @@ -0,0 +1,124 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../lib/core'); +const http = require('http'); +const request = require('request'); + +const root = `${__dirname}/public`; + +test('headers object', (t) => { + t.plan(4); + + const server = http.createServer( + ecstatic({ + root, + headers: { + Wow: 'sweet', + Cool: 'beans', + }, + autoIndex: true, + defaultExt: 'html', + }) + ); + + server.listen(() => { + const port = server.address().port; + const uri = `http://localhost:${port}/subdir`; + + request.get({ uri }, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers.wow, 'sweet'); + t.equal(res.headers.cool, 'beans'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('header string', (t) => { + t.plan(3); + + const server = http.createServer( + ecstatic({ + root, + header: 'beep: boop', // for command-line --header 'beep: boop' + autoIndex: true, + defaultExt: 'html', + }) + ); + + server.listen(() => { + const port = server.address().port; + const uri = `http://localhost:${port}/subdir`; + + request.get({ uri }, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers.beep, 'boop'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('header array', (t) => { + t.plan(3); + + const server = http.createServer( + ecstatic({ + root, + header: [ + 'beep: boop', // --header 'beep: boop' + 'what: ever', // --header 'what: ever' + ], + autoIndex: true, + defaultExt: 'html', + }) + ); + + server.listen(() => { + const port = server.address().port; + const uri = `http://localhost:${port}/subdir`; + request.get({ uri }, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers.beep, 'boop'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); + +test('H array', (t) => { + t.plan(3); + + const server = http.createServer( + ecstatic({ + root, + H: [ + 'beep: boop', // -H 'beep: boop' + 'what: ever', // -H 'what: ever' + ], + autoIndex: true, + defaultExt: 'html', + }) + ); + + server.listen(() => { + const port = server.address().port; + const uri = `http://localhost:${port}/subdir`; + request.get({ uri }, (err, res) => { + t.ifError(err); + t.equal(res.statusCode, 200); + t.equal(res.headers.beep, 'boop'); + }); + }); + t.once('end', () => { + server.close(); + }); +}); diff --git a/test/html-reflection.test.js b/test/html-reflection.test.js new file mode 100644 index 000000000..e10f4dfac --- /dev/null +++ b/test/html-reflection.test.js @@ -0,0 +1,21 @@ +'use strict'; + +const test = require('tap').test; +const ecstatic = require('../'); +const http = require('http'); +const request = require('request'); + +test('html reflection prevented', (t) => { + const server = http.createServer(ecstatic(`${__dirname}/public/containsSymlink`)); + + server.listen(0, () => { + const port = server.address().port; + const attack = ''; + request.get(`http://localhost:${port}/more-problematic/${attack}`, (err, res, body) => { + if (body.indexOf(''; - request.get(`http://localhost:${port}/more-problematic/${attack}`, (err, res, body) => { - if (body.indexOf('