diff options
| author | kartofen <mladenovnasko0@gmail.com> | 2022-10-23 21:34:48 +0300 | 
|---|---|---|
| committer | kartofen <mladenovnasko0@gmail.com> | 2022-10-23 21:34:48 +0300 | 
| commit | 747097af03e422c72c2fe0065637e59a1685d219 (patch) | |
| tree | 6b965e4c5d4ee812d104c3537866f2e3b5e27376 | |
nearly completed, forgot to make a repo
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | docker-compose.yaml | 31 | ||||
| -rw-r--r-- | package-lock.json | 2242 | ||||
| -rw-r--r-- | package.json | 27 | ||||
| -rw-r--r-- | src/database/postgres.ts | 74 | ||||
| -rw-r--r-- | src/files/SwaggerUI.yaml | 206 | ||||
| -rw-r--r-- | src/models/Thread.ts | 17 | ||||
| -rw-r--r-- | src/routes/board.ts | 44 | ||||
| -rw-r--r-- | src/server.ts | 26 | ||||
| -rw-r--r-- | tsconfig.json | 103 | 
10 files changed, 2772 insertions, 0 deletions
| diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..763301f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +dist/ +node_modules/
\ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..0c4c746 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,31 @@ +version: "3.4" +services: +  scale-api: +    image: "node:latest" +    container_name: scale-api +    user: "node" +    working_dir: /home/node/app +    environment: +      - NODE_ENV=production +    volumes: +      - ./:/home/node/app +    ports: +      - "6969:6969" +    depends_on: +      - db +    command: "npm run dev" +  db: +    image: postgres:latest +    container_name: sclale-postgres +    environment: +      - POSTGRES_USER=scale +      - POSTGRES_PASSWORD=secret +    volumes: +      - scale-db:/var/lib/postgresql/data +    healthcheck: +      test: ["CMD", "pg_isready", "-U", "scale"] +      interval: 10s +      start_period: 30s + +volumes: +  scale-db: diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4915fb1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2242 @@ +{ +  "name": "scale-api-express", +  "version": "1.0.0", +  "lockfileVersion": 2, +  "requires": true, +  "packages": { +    "": { +      "name": "scale-api-express", +      "version": "1.0.0", +      "license": "ISC", +      "dependencies": { +        "express": "^4.18.1", +        "nodemon": "^2.0.20", +        "pg": "^8.8.0", +        "swagger-ui-express": "^4.5.0", +        "yamljs": "^0.3.0" +      }, +      "devDependencies": { +        "@types/express": "^4.17.13", +        "@types/pg": "^8.6.5", +        "@types/swagger-ui-express": "^4.1.3", +        "@types/yamljs": "^0.2.31", +        "typescript": "^4.8.2" +      } +    }, +    "node_modules/@types/body-parser": { +      "version": "1.19.2", +      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", +      "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", +      "dev": true, +      "dependencies": { +        "@types/connect": "*", +        "@types/node": "*" +      } +    }, +    "node_modules/@types/connect": { +      "version": "3.4.35", +      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", +      "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", +      "dev": true, +      "dependencies": { +        "@types/node": "*" +      } +    }, +    "node_modules/@types/express": { +      "version": "4.17.13", +      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", +      "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", +      "dev": true, +      "dependencies": { +        "@types/body-parser": "*", +        "@types/express-serve-static-core": "^4.17.18", +        "@types/qs": "*", +        "@types/serve-static": "*" +      } +    }, +    "node_modules/@types/express-serve-static-core": { +      "version": "4.17.30", +      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", +      "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", +      "dev": true, +      "dependencies": { +        "@types/node": "*", +        "@types/qs": "*", +        "@types/range-parser": "*" +      } +    }, +    "node_modules/@types/mime": { +      "version": "3.0.1", +      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", +      "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", +      "dev": true +    }, +    "node_modules/@types/node": { +      "version": "18.7.16", +      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", +      "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", +      "dev": true +    }, +    "node_modules/@types/pg": { +      "version": "8.6.5", +      "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.5.tgz", +      "integrity": "sha512-tOkGtAqRVkHa/PVZicq67zuujI4Oorfglsr2IbKofDwBSysnaqSx7W1mDqFqdkGE6Fbgh+PZAl0r/BWON/mozw==", +      "dev": true, +      "dependencies": { +        "@types/node": "*", +        "pg-protocol": "*", +        "pg-types": "^2.2.0" +      } +    }, +    "node_modules/@types/qs": { +      "version": "6.9.7", +      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", +      "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", +      "dev": true +    }, +    "node_modules/@types/range-parser": { +      "version": "1.2.4", +      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", +      "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", +      "dev": true +    }, +    "node_modules/@types/serve-static": { +      "version": "1.15.0", +      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", +      "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", +      "dev": true, +      "dependencies": { +        "@types/mime": "*", +        "@types/node": "*" +      } +    }, +    "node_modules/@types/swagger-ui-express": { +      "version": "4.1.3", +      "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz", +      "integrity": "sha512-jqCjGU/tGEaqIplPy3WyQg+Nrp6y80DCFnDEAvVKWkJyv0VivSSDCChkppHRHAablvInZe6pijDFMnavtN0vqA==", +      "dev": true, +      "dependencies": { +        "@types/express": "*", +        "@types/serve-static": "*" +      } +    }, +    "node_modules/@types/yamljs": { +      "version": "0.2.31", +      "resolved": "https://registry.npmjs.org/@types/yamljs/-/yamljs-0.2.31.tgz", +      "integrity": "sha512-QcJ5ZczaXAqbVD3o8mw/mEBhRvO5UAdTtbvgwL/OgoWubvNBh6/MxLBAigtcgIFaq3shon9m3POIxQaLQt4fxQ==", +      "dev": true +    }, +    "node_modules/abbrev": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", +      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" +    }, +    "node_modules/accepts": { +      "version": "1.3.8", +      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", +      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", +      "dependencies": { +        "mime-types": "~2.1.34", +        "negotiator": "0.6.3" +      }, +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/anymatch": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", +      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", +      "dependencies": { +        "normalize-path": "^3.0.0", +        "picomatch": "^2.0.4" +      }, +      "engines": { +        "node": ">= 8" +      } +    }, +    "node_modules/argparse": { +      "version": "1.0.10", +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", +      "dependencies": { +        "sprintf-js": "~1.0.2" +      } +    }, +    "node_modules/argparse/node_modules/sprintf-js": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", +      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" +    }, +    "node_modules/array-flatten": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", +      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" +    }, +    "node_modules/balanced-match": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", +      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" +    }, +    "node_modules/binary-extensions": { +      "version": "2.2.0", +      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", +      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/body-parser": { +      "version": "1.20.0", +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", +      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", +      "dependencies": { +        "bytes": "3.1.2", +        "content-type": "~1.0.4", +        "debug": "2.6.9", +        "depd": "2.0.0", +        "destroy": "1.2.0", +        "http-errors": "2.0.0", +        "iconv-lite": "0.4.24", +        "on-finished": "2.4.1", +        "qs": "6.10.3", +        "raw-body": "2.5.1", +        "type-is": "~1.6.18", +        "unpipe": "1.0.0" +      }, +      "engines": { +        "node": ">= 0.8", +        "npm": "1.2.8000 || >= 1.4.16" +      } +    }, +    "node_modules/brace-expansion": { +      "version": "1.1.11", +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", +      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", +      "dependencies": { +        "balanced-match": "^1.0.0", +        "concat-map": "0.0.1" +      } +    }, +    "node_modules/braces": { +      "version": "3.0.2", +      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", +      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", +      "dependencies": { +        "fill-range": "^7.0.1" +      }, +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/buffer-writer": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", +      "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", +      "engines": { +        "node": ">=4" +      } +    }, +    "node_modules/bytes": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", +      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/call-bind": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", +      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", +      "dependencies": { +        "function-bind": "^1.1.1", +        "get-intrinsic": "^1.0.2" +      }, +      "funding": { +        "url": "https://github.com/sponsors/ljharb" +      } +    }, +    "node_modules/chokidar": { +      "version": "3.5.3", +      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", +      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", +      "funding": [ +        { +          "type": "individual", +          "url": "https://paulmillr.com/funding/" +        } +      ], +      "dependencies": { +        "anymatch": "~3.1.2", +        "braces": "~3.0.2", +        "glob-parent": "~5.1.2", +        "is-binary-path": "~2.1.0", +        "is-glob": "~4.0.1", +        "normalize-path": "~3.0.0", +        "readdirp": "~3.6.0" +      }, +      "engines": { +        "node": ">= 8.10.0" +      }, +      "optionalDependencies": { +        "fsevents": "~2.3.2" +      } +    }, +    "node_modules/concat-map": { +      "version": "0.0.1", +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", +      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" +    }, +    "node_modules/content-disposition": { +      "version": "0.5.4", +      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", +      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", +      "dependencies": { +        "safe-buffer": "5.2.1" +      }, +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/content-type": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", +      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/cookie": { +      "version": "0.5.0", +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", +      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/cookie-signature": { +      "version": "1.0.6", +      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", +      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" +    }, +    "node_modules/debug": { +      "version": "2.6.9", +      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", +      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", +      "dependencies": { +        "ms": "2.0.0" +      } +    }, +    "node_modules/depd": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", +      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/destroy": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", +      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", +      "engines": { +        "node": ">= 0.8", +        "npm": "1.2.8000 || >= 1.4.16" +      } +    }, +    "node_modules/ee-first": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", +      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" +    }, +    "node_modules/encodeurl": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", +      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/escape-html": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", +      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" +    }, +    "node_modules/etag": { +      "version": "1.8.1", +      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", +      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/express": { +      "version": "4.18.1", +      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", +      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", +      "dependencies": { +        "accepts": "~1.3.8", +        "array-flatten": "1.1.1", +        "body-parser": "1.20.0", +        "content-disposition": "0.5.4", +        "content-type": "~1.0.4", +        "cookie": "0.5.0", +        "cookie-signature": "1.0.6", +        "debug": "2.6.9", +        "depd": "2.0.0", +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "etag": "~1.8.1", +        "finalhandler": "1.2.0", +        "fresh": "0.5.2", +        "http-errors": "2.0.0", +        "merge-descriptors": "1.0.1", +        "methods": "~1.1.2", +        "on-finished": "2.4.1", +        "parseurl": "~1.3.3", +        "path-to-regexp": "0.1.7", +        "proxy-addr": "~2.0.7", +        "qs": "6.10.3", +        "range-parser": "~1.2.1", +        "safe-buffer": "5.2.1", +        "send": "0.18.0", +        "serve-static": "1.15.0", +        "setprototypeof": "1.2.0", +        "statuses": "2.0.1", +        "type-is": "~1.6.18", +        "utils-merge": "1.0.1", +        "vary": "~1.1.2" +      }, +      "engines": { +        "node": ">= 0.10.0" +      } +    }, +    "node_modules/fill-range": { +      "version": "7.0.1", +      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", +      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", +      "dependencies": { +        "to-regex-range": "^5.0.1" +      }, +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/finalhandler": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", +      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", +      "dependencies": { +        "debug": "2.6.9", +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "on-finished": "2.4.1", +        "parseurl": "~1.3.3", +        "statuses": "2.0.1", +        "unpipe": "~1.0.0" +      }, +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/forwarded": { +      "version": "0.2.0", +      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", +      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/fresh": { +      "version": "0.5.2", +      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", +      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/fs.realpath": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", +      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" +    }, +    "node_modules/fsevents": { +      "version": "2.3.2", +      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", +      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", +      "hasInstallScript": true, +      "optional": true, +      "os": [ +        "darwin" +      ], +      "engines": { +        "node": "^8.16.0 || ^10.6.0 || >=11.0.0" +      } +    }, +    "node_modules/function-bind": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", +      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" +    }, +    "node_modules/get-intrinsic": { +      "version": "1.1.2", +      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", +      "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", +      "dependencies": { +        "function-bind": "^1.1.1", +        "has": "^1.0.3", +        "has-symbols": "^1.0.3" +      }, +      "funding": { +        "url": "https://github.com/sponsors/ljharb" +      } +    }, +    "node_modules/glob": { +      "version": "7.2.3", +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", +      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", +      "dependencies": { +        "fs.realpath": "^1.0.0", +        "inflight": "^1.0.4", +        "inherits": "2", +        "minimatch": "^3.1.1", +        "once": "^1.3.0", +        "path-is-absolute": "^1.0.0" +      }, +      "engines": { +        "node": "*" +      }, +      "funding": { +        "url": "https://github.com/sponsors/isaacs" +      } +    }, +    "node_modules/glob-parent": { +      "version": "5.1.2", +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", +      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", +      "dependencies": { +        "is-glob": "^4.0.1" +      }, +      "engines": { +        "node": ">= 6" +      } +    }, +    "node_modules/has": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", +      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", +      "dependencies": { +        "function-bind": "^1.1.1" +      }, +      "engines": { +        "node": ">= 0.4.0" +      } +    }, +    "node_modules/has-flag": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", +      "engines": { +        "node": ">=4" +      } +    }, +    "node_modules/has-symbols": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", +      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", +      "engines": { +        "node": ">= 0.4" +      }, +      "funding": { +        "url": "https://github.com/sponsors/ljharb" +      } +    }, +    "node_modules/http-errors": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", +      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", +      "dependencies": { +        "depd": "2.0.0", +        "inherits": "2.0.4", +        "setprototypeof": "1.2.0", +        "statuses": "2.0.1", +        "toidentifier": "1.0.1" +      }, +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/iconv-lite": { +      "version": "0.4.24", +      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", +      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", +      "dependencies": { +        "safer-buffer": ">= 2.1.2 < 3" +      }, +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/ignore-by-default": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", +      "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" +    }, +    "node_modules/inflight": { +      "version": "1.0.6", +      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", +      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", +      "dependencies": { +        "once": "^1.3.0", +        "wrappy": "1" +      } +    }, +    "node_modules/inherits": { +      "version": "2.0.4", +      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", +      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" +    }, +    "node_modules/ipaddr.js": { +      "version": "1.9.1", +      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", +      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", +      "engines": { +        "node": ">= 0.10" +      } +    }, +    "node_modules/is-binary-path": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", +      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", +      "dependencies": { +        "binary-extensions": "^2.0.0" +      }, +      "engines": { +        "node": ">=8" +      } +    }, +    "node_modules/is-extglob": { +      "version": "2.1.1", +      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", +      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/is-glob": { +      "version": "4.0.3", +      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", +      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", +      "dependencies": { +        "is-extglob": "^2.1.1" +      }, +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/is-number": { +      "version": "7.0.0", +      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", +      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", +      "engines": { +        "node": ">=0.12.0" +      } +    }, +    "node_modules/media-typer": { +      "version": "0.3.0", +      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", +      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/merge-descriptors": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", +      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" +    }, +    "node_modules/methods": { +      "version": "1.1.2", +      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", +      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/mime": { +      "version": "1.6.0", +      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", +      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", +      "bin": { +        "mime": "cli.js" +      }, +      "engines": { +        "node": ">=4" +      } +    }, +    "node_modules/mime-db": { +      "version": "1.52.0", +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", +      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/mime-types": { +      "version": "2.1.35", +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", +      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", +      "dependencies": { +        "mime-db": "1.52.0" +      }, +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/minimatch": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", +      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", +      "dependencies": { +        "brace-expansion": "^1.1.7" +      }, +      "engines": { +        "node": "*" +      } +    }, +    "node_modules/ms": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" +    }, +    "node_modules/negotiator": { +      "version": "0.6.3", +      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", +      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/nodemon": { +      "version": "2.0.20", +      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", +      "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", +      "dependencies": { +        "chokidar": "^3.5.2", +        "debug": "^3.2.7", +        "ignore-by-default": "^1.0.1", +        "minimatch": "^3.1.2", +        "pstree.remy": "^1.1.8", +        "semver": "^5.7.1", +        "simple-update-notifier": "^1.0.7", +        "supports-color": "^5.5.0", +        "touch": "^3.1.0", +        "undefsafe": "^2.0.5" +      }, +      "bin": { +        "nodemon": "bin/nodemon.js" +      }, +      "engines": { +        "node": ">=8.10.0" +      }, +      "funding": { +        "type": "opencollective", +        "url": "https://opencollective.com/nodemon" +      } +    }, +    "node_modules/nodemon/node_modules/debug": { +      "version": "3.2.7", +      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +      "dependencies": { +        "ms": "^2.1.1" +      } +    }, +    "node_modules/nodemon/node_modules/ms": { +      "version": "2.1.3", +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" +    }, +    "node_modules/nopt": { +      "version": "1.0.10", +      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", +      "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", +      "dependencies": { +        "abbrev": "1" +      }, +      "bin": { +        "nopt": "bin/nopt.js" +      }, +      "engines": { +        "node": "*" +      } +    }, +    "node_modules/normalize-path": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", +      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/object-inspect": { +      "version": "1.12.2", +      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", +      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", +      "funding": { +        "url": "https://github.com/sponsors/ljharb" +      } +    }, +    "node_modules/on-finished": { +      "version": "2.4.1", +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", +      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", +      "dependencies": { +        "ee-first": "1.1.1" +      }, +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/once": { +      "version": "1.4.0", +      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", +      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", +      "dependencies": { +        "wrappy": "1" +      } +    }, +    "node_modules/packet-reader": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", +      "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" +    }, +    "node_modules/parseurl": { +      "version": "1.3.3", +      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", +      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/path-is-absolute": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", +      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/path-to-regexp": { +      "version": "0.1.7", +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", +      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" +    }, +    "node_modules/pg": { +      "version": "8.8.0", +      "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", +      "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", +      "dependencies": { +        "buffer-writer": "2.0.0", +        "packet-reader": "1.0.0", +        "pg-connection-string": "^2.5.0", +        "pg-pool": "^3.5.2", +        "pg-protocol": "^1.5.0", +        "pg-types": "^2.1.0", +        "pgpass": "1.x" +      }, +      "engines": { +        "node": ">= 8.0.0" +      }, +      "peerDependencies": { +        "pg-native": ">=3.0.1" +      }, +      "peerDependenciesMeta": { +        "pg-native": { +          "optional": true +        } +      } +    }, +    "node_modules/pg-connection-string": { +      "version": "2.5.0", +      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", +      "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" +    }, +    "node_modules/pg-int8": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", +      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", +      "engines": { +        "node": ">=4.0.0" +      } +    }, +    "node_modules/pg-pool": { +      "version": "3.5.2", +      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", +      "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", +      "peerDependencies": { +        "pg": ">=8.0" +      } +    }, +    "node_modules/pg-protocol": { +      "version": "1.5.0", +      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", +      "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" +    }, +    "node_modules/pg-types": { +      "version": "2.2.0", +      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", +      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", +      "dependencies": { +        "pg-int8": "1.0.1", +        "postgres-array": "~2.0.0", +        "postgres-bytea": "~1.0.0", +        "postgres-date": "~1.0.4", +        "postgres-interval": "^1.1.0" +      }, +      "engines": { +        "node": ">=4" +      } +    }, +    "node_modules/pgpass": { +      "version": "1.0.5", +      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", +      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", +      "dependencies": { +        "split2": "^4.1.0" +      } +    }, +    "node_modules/picomatch": { +      "version": "2.3.1", +      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", +      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", +      "engines": { +        "node": ">=8.6" +      }, +      "funding": { +        "url": "https://github.com/sponsors/jonschlinkert" +      } +    }, +    "node_modules/postgres-array": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", +      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", +      "engines": { +        "node": ">=4" +      } +    }, +    "node_modules/postgres-bytea": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", +      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/postgres-date": { +      "version": "1.0.7", +      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", +      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/postgres-interval": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", +      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", +      "dependencies": { +        "xtend": "^4.0.0" +      }, +      "engines": { +        "node": ">=0.10.0" +      } +    }, +    "node_modules/proxy-addr": { +      "version": "2.0.7", +      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", +      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", +      "dependencies": { +        "forwarded": "0.2.0", +        "ipaddr.js": "1.9.1" +      }, +      "engines": { +        "node": ">= 0.10" +      } +    }, +    "node_modules/pstree.remy": { +      "version": "1.1.8", +      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", +      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" +    }, +    "node_modules/qs": { +      "version": "6.10.3", +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", +      "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", +      "dependencies": { +        "side-channel": "^1.0.4" +      }, +      "engines": { +        "node": ">=0.6" +      }, +      "funding": { +        "url": "https://github.com/sponsors/ljharb" +      } +    }, +    "node_modules/range-parser": { +      "version": "1.2.1", +      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", +      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/raw-body": { +      "version": "2.5.1", +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", +      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", +      "dependencies": { +        "bytes": "3.1.2", +        "http-errors": "2.0.0", +        "iconv-lite": "0.4.24", +        "unpipe": "1.0.0" +      }, +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/readdirp": { +      "version": "3.6.0", +      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", +      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", +      "dependencies": { +        "picomatch": "^2.2.1" +      }, +      "engines": { +        "node": ">=8.10.0" +      } +    }, +    "node_modules/safe-buffer": { +      "version": "5.2.1", +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", +      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", +      "funding": [ +        { +          "type": "github", +          "url": "https://github.com/sponsors/feross" +        }, +        { +          "type": "patreon", +          "url": "https://www.patreon.com/feross" +        }, +        { +          "type": "consulting", +          "url": "https://feross.org/support" +        } +      ] +    }, +    "node_modules/safer-buffer": { +      "version": "2.1.2", +      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", +      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" +    }, +    "node_modules/semver": { +      "version": "5.7.1", +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", +      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", +      "bin": { +        "semver": "bin/semver" +      } +    }, +    "node_modules/send": { +      "version": "0.18.0", +      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", +      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", +      "dependencies": { +        "debug": "2.6.9", +        "depd": "2.0.0", +        "destroy": "1.2.0", +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "etag": "~1.8.1", +        "fresh": "0.5.2", +        "http-errors": "2.0.0", +        "mime": "1.6.0", +        "ms": "2.1.3", +        "on-finished": "2.4.1", +        "range-parser": "~1.2.1", +        "statuses": "2.0.1" +      }, +      "engines": { +        "node": ">= 0.8.0" +      } +    }, +    "node_modules/send/node_modules/ms": { +      "version": "2.1.3", +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", +      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" +    }, +    "node_modules/serve-static": { +      "version": "1.15.0", +      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", +      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", +      "dependencies": { +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "parseurl": "~1.3.3", +        "send": "0.18.0" +      }, +      "engines": { +        "node": ">= 0.8.0" +      } +    }, +    "node_modules/setprototypeof": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", +      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" +    }, +    "node_modules/side-channel": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", +      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", +      "dependencies": { +        "call-bind": "^1.0.0", +        "get-intrinsic": "^1.0.2", +        "object-inspect": "^1.9.0" +      }, +      "funding": { +        "url": "https://github.com/sponsors/ljharb" +      } +    }, +    "node_modules/simple-update-notifier": { +      "version": "1.0.7", +      "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", +      "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", +      "dependencies": { +        "semver": "~7.0.0" +      }, +      "engines": { +        "node": ">=8.10.0" +      } +    }, +    "node_modules/simple-update-notifier/node_modules/semver": { +      "version": "7.0.0", +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", +      "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", +      "bin": { +        "semver": "bin/semver.js" +      } +    }, +    "node_modules/split2": { +      "version": "4.1.0", +      "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", +      "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", +      "engines": { +        "node": ">= 10.x" +      } +    }, +    "node_modules/statuses": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", +      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/supports-color": { +      "version": "5.5.0", +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", +      "dependencies": { +        "has-flag": "^3.0.0" +      }, +      "engines": { +        "node": ">=4" +      } +    }, +    "node_modules/swagger-ui-dist": { +      "version": "4.14.0", +      "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", +      "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" +    }, +    "node_modules/swagger-ui-express": { +      "version": "4.5.0", +      "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz", +      "integrity": "sha512-DHk3zFvsxrkcnurGvQlAcLuTDacAVN1JHKDgcba/gr2NFRE4HGwP1YeHIXMiGznkWR4AeS7X5vEblNn4QljuNA==", +      "dependencies": { +        "swagger-ui-dist": ">=4.11.0" +      }, +      "engines": { +        "node": ">= v0.10.32" +      }, +      "peerDependencies": { +        "express": ">=4.0.0" +      } +    }, +    "node_modules/to-regex-range": { +      "version": "5.0.1", +      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", +      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", +      "dependencies": { +        "is-number": "^7.0.0" +      }, +      "engines": { +        "node": ">=8.0" +      } +    }, +    "node_modules/toidentifier": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", +      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", +      "engines": { +        "node": ">=0.6" +      } +    }, +    "node_modules/touch": { +      "version": "3.1.0", +      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", +      "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", +      "dependencies": { +        "nopt": "~1.0.10" +      }, +      "bin": { +        "nodetouch": "bin/nodetouch.js" +      } +    }, +    "node_modules/type-is": { +      "version": "1.6.18", +      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", +      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", +      "dependencies": { +        "media-typer": "0.3.0", +        "mime-types": "~2.1.24" +      }, +      "engines": { +        "node": ">= 0.6" +      } +    }, +    "node_modules/typescript": { +      "version": "4.8.3", +      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", +      "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", +      "dev": true, +      "bin": { +        "tsc": "bin/tsc", +        "tsserver": "bin/tsserver" +      }, +      "engines": { +        "node": ">=4.2.0" +      } +    }, +    "node_modules/undefsafe": { +      "version": "2.0.5", +      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", +      "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" +    }, +    "node_modules/unpipe": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", +      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/utils-merge": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", +      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", +      "engines": { +        "node": ">= 0.4.0" +      } +    }, +    "node_modules/vary": { +      "version": "1.1.2", +      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", +      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", +      "engines": { +        "node": ">= 0.8" +      } +    }, +    "node_modules/wrappy": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", +      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" +    }, +    "node_modules/xtend": { +      "version": "4.0.2", +      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", +      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", +      "engines": { +        "node": ">=0.4" +      } +    }, +    "node_modules/yamljs": { +      "version": "0.3.0", +      "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", +      "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", +      "dependencies": { +        "argparse": "^1.0.7", +        "glob": "^7.0.5" +      }, +      "bin": { +        "json2yaml": "bin/json2yaml", +        "yaml2json": "bin/yaml2json" +      } +    } +  }, +  "dependencies": { +    "@types/body-parser": { +      "version": "1.19.2", +      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", +      "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", +      "dev": true, +      "requires": { +        "@types/connect": "*", +        "@types/node": "*" +      } +    }, +    "@types/connect": { +      "version": "3.4.35", +      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", +      "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", +      "dev": true, +      "requires": { +        "@types/node": "*" +      } +    }, +    "@types/express": { +      "version": "4.17.13", +      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", +      "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", +      "dev": true, +      "requires": { +        "@types/body-parser": "*", +        "@types/express-serve-static-core": "^4.17.18", +        "@types/qs": "*", +        "@types/serve-static": "*" +      } +    }, +    "@types/express-serve-static-core": { +      "version": "4.17.30", +      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", +      "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", +      "dev": true, +      "requires": { +        "@types/node": "*", +        "@types/qs": "*", +        "@types/range-parser": "*" +      } +    }, +    "@types/mime": { +      "version": "3.0.1", +      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", +      "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", +      "dev": true +    }, +    "@types/node": { +      "version": "18.7.16", +      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", +      "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", +      "dev": true +    }, +    "@types/pg": { +      "version": "8.6.5", +      "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.5.tgz", +      "integrity": "sha512-tOkGtAqRVkHa/PVZicq67zuujI4Oorfglsr2IbKofDwBSysnaqSx7W1mDqFqdkGE6Fbgh+PZAl0r/BWON/mozw==", +      "dev": true, +      "requires": { +        "@types/node": "*", +        "pg-protocol": "*", +        "pg-types": "^2.2.0" +      } +    }, +    "@types/qs": { +      "version": "6.9.7", +      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", +      "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", +      "dev": true +    }, +    "@types/range-parser": { +      "version": "1.2.4", +      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", +      "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", +      "dev": true +    }, +    "@types/serve-static": { +      "version": "1.15.0", +      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", +      "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", +      "dev": true, +      "requires": { +        "@types/mime": "*", +        "@types/node": "*" +      } +    }, +    "@types/swagger-ui-express": { +      "version": "4.1.3", +      "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz", +      "integrity": "sha512-jqCjGU/tGEaqIplPy3WyQg+Nrp6y80DCFnDEAvVKWkJyv0VivSSDCChkppHRHAablvInZe6pijDFMnavtN0vqA==", +      "dev": true, +      "requires": { +        "@types/express": "*", +        "@types/serve-static": "*" +      } +    }, +    "@types/yamljs": { +      "version": "0.2.31", +      "resolved": "https://registry.npmjs.org/@types/yamljs/-/yamljs-0.2.31.tgz", +      "integrity": "sha512-QcJ5ZczaXAqbVD3o8mw/mEBhRvO5UAdTtbvgwL/OgoWubvNBh6/MxLBAigtcgIFaq3shon9m3POIxQaLQt4fxQ==", +      "dev": true +    }, +    "abbrev": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", +      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" +    }, +    "accepts": { +      "version": "1.3.8", +      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", +      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", +      "requires": { +        "mime-types": "~2.1.34", +        "negotiator": "0.6.3" +      } +    }, +    "anymatch": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", +      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", +      "requires": { +        "normalize-path": "^3.0.0", +        "picomatch": "^2.0.4" +      } +    }, +    "argparse": { +      "version": "1.0.10", +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", +      "requires": { +        "sprintf-js": "~1.0.2" +      }, +      "dependencies": { +        "sprintf-js": { +          "version": "1.0.3", +          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", +          "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" +        } +      } +    }, +    "array-flatten": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", +      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" +    }, +    "balanced-match": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", +      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" +    }, +    "binary-extensions": { +      "version": "2.2.0", +      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", +      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" +    }, +    "body-parser": { +      "version": "1.20.0", +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", +      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", +      "requires": { +        "bytes": "3.1.2", +        "content-type": "~1.0.4", +        "debug": "2.6.9", +        "depd": "2.0.0", +        "destroy": "1.2.0", +        "http-errors": "2.0.0", +        "iconv-lite": "0.4.24", +        "on-finished": "2.4.1", +        "qs": "6.10.3", +        "raw-body": "2.5.1", +        "type-is": "~1.6.18", +        "unpipe": "1.0.0" +      } +    }, +    "brace-expansion": { +      "version": "1.1.11", +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", +      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", +      "requires": { +        "balanced-match": "^1.0.0", +        "concat-map": "0.0.1" +      } +    }, +    "braces": { +      "version": "3.0.2", +      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", +      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", +      "requires": { +        "fill-range": "^7.0.1" +      } +    }, +    "buffer-writer": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", +      "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" +    }, +    "bytes": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", +      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" +    }, +    "call-bind": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", +      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", +      "requires": { +        "function-bind": "^1.1.1", +        "get-intrinsic": "^1.0.2" +      } +    }, +    "chokidar": { +      "version": "3.5.3", +      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", +      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", +      "requires": { +        "anymatch": "~3.1.2", +        "braces": "~3.0.2", +        "fsevents": "~2.3.2", +        "glob-parent": "~5.1.2", +        "is-binary-path": "~2.1.0", +        "is-glob": "~4.0.1", +        "normalize-path": "~3.0.0", +        "readdirp": "~3.6.0" +      } +    }, +    "concat-map": { +      "version": "0.0.1", +      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", +      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" +    }, +    "content-disposition": { +      "version": "0.5.4", +      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", +      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", +      "requires": { +        "safe-buffer": "5.2.1" +      } +    }, +    "content-type": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", +      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" +    }, +    "cookie": { +      "version": "0.5.0", +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", +      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" +    }, +    "cookie-signature": { +      "version": "1.0.6", +      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", +      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" +    }, +    "debug": { +      "version": "2.6.9", +      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", +      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", +      "requires": { +        "ms": "2.0.0" +      } +    }, +    "depd": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", +      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" +    }, +    "destroy": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", +      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" +    }, +    "ee-first": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", +      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" +    }, +    "encodeurl": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", +      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" +    }, +    "escape-html": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", +      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" +    }, +    "etag": { +      "version": "1.8.1", +      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", +      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" +    }, +    "express": { +      "version": "4.18.1", +      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", +      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", +      "requires": { +        "accepts": "~1.3.8", +        "array-flatten": "1.1.1", +        "body-parser": "1.20.0", +        "content-disposition": "0.5.4", +        "content-type": "~1.0.4", +        "cookie": "0.5.0", +        "cookie-signature": "1.0.6", +        "debug": "2.6.9", +        "depd": "2.0.0", +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "etag": "~1.8.1", +        "finalhandler": "1.2.0", +        "fresh": "0.5.2", +        "http-errors": "2.0.0", +        "merge-descriptors": "1.0.1", +        "methods": "~1.1.2", +        "on-finished": "2.4.1", +        "parseurl": "~1.3.3", +        "path-to-regexp": "0.1.7", +        "proxy-addr": "~2.0.7", +        "qs": "6.10.3", +        "range-parser": "~1.2.1", +        "safe-buffer": "5.2.1", +        "send": "0.18.0", +        "serve-static": "1.15.0", +        "setprototypeof": "1.2.0", +        "statuses": "2.0.1", +        "type-is": "~1.6.18", +        "utils-merge": "1.0.1", +        "vary": "~1.1.2" +      } +    }, +    "fill-range": { +      "version": "7.0.1", +      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", +      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", +      "requires": { +        "to-regex-range": "^5.0.1" +      } +    }, +    "finalhandler": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", +      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", +      "requires": { +        "debug": "2.6.9", +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "on-finished": "2.4.1", +        "parseurl": "~1.3.3", +        "statuses": "2.0.1", +        "unpipe": "~1.0.0" +      } +    }, +    "forwarded": { +      "version": "0.2.0", +      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", +      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" +    }, +    "fresh": { +      "version": "0.5.2", +      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", +      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" +    }, +    "fs.realpath": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", +      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" +    }, +    "fsevents": { +      "version": "2.3.2", +      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", +      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", +      "optional": true +    }, +    "function-bind": { +      "version": "1.1.1", +      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", +      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" +    }, +    "get-intrinsic": { +      "version": "1.1.2", +      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", +      "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", +      "requires": { +        "function-bind": "^1.1.1", +        "has": "^1.0.3", +        "has-symbols": "^1.0.3" +      } +    }, +    "glob": { +      "version": "7.2.3", +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", +      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", +      "requires": { +        "fs.realpath": "^1.0.0", +        "inflight": "^1.0.4", +        "inherits": "2", +        "minimatch": "^3.1.1", +        "once": "^1.3.0", +        "path-is-absolute": "^1.0.0" +      } +    }, +    "glob-parent": { +      "version": "5.1.2", +      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", +      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", +      "requires": { +        "is-glob": "^4.0.1" +      } +    }, +    "has": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", +      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", +      "requires": { +        "function-bind": "^1.1.1" +      } +    }, +    "has-flag": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" +    }, +    "has-symbols": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", +      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" +    }, +    "http-errors": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", +      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", +      "requires": { +        "depd": "2.0.0", +        "inherits": "2.0.4", +        "setprototypeof": "1.2.0", +        "statuses": "2.0.1", +        "toidentifier": "1.0.1" +      } +    }, +    "iconv-lite": { +      "version": "0.4.24", +      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", +      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", +      "requires": { +        "safer-buffer": ">= 2.1.2 < 3" +      } +    }, +    "ignore-by-default": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", +      "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" +    }, +    "inflight": { +      "version": "1.0.6", +      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", +      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", +      "requires": { +        "once": "^1.3.0", +        "wrappy": "1" +      } +    }, +    "inherits": { +      "version": "2.0.4", +      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", +      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" +    }, +    "ipaddr.js": { +      "version": "1.9.1", +      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", +      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" +    }, +    "is-binary-path": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", +      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", +      "requires": { +        "binary-extensions": "^2.0.0" +      } +    }, +    "is-extglob": { +      "version": "2.1.1", +      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", +      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" +    }, +    "is-glob": { +      "version": "4.0.3", +      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", +      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", +      "requires": { +        "is-extglob": "^2.1.1" +      } +    }, +    "is-number": { +      "version": "7.0.0", +      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", +      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" +    }, +    "media-typer": { +      "version": "0.3.0", +      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", +      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" +    }, +    "merge-descriptors": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", +      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" +    }, +    "methods": { +      "version": "1.1.2", +      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", +      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" +    }, +    "mime": { +      "version": "1.6.0", +      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", +      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" +    }, +    "mime-db": { +      "version": "1.52.0", +      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", +      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" +    }, +    "mime-types": { +      "version": "2.1.35", +      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", +      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", +      "requires": { +        "mime-db": "1.52.0" +      } +    }, +    "minimatch": { +      "version": "3.1.2", +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", +      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", +      "requires": { +        "brace-expansion": "^1.1.7" +      } +    }, +    "ms": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" +    }, +    "negotiator": { +      "version": "0.6.3", +      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", +      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" +    }, +    "nodemon": { +      "version": "2.0.20", +      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", +      "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", +      "requires": { +        "chokidar": "^3.5.2", +        "debug": "^3.2.7", +        "ignore-by-default": "^1.0.1", +        "minimatch": "^3.1.2", +        "pstree.remy": "^1.1.8", +        "semver": "^5.7.1", +        "simple-update-notifier": "^1.0.7", +        "supports-color": "^5.5.0", +        "touch": "^3.1.0", +        "undefsafe": "^2.0.5" +      }, +      "dependencies": { +        "debug": { +          "version": "3.2.7", +          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +          "requires": { +            "ms": "^2.1.1" +          } +        }, +        "ms": { +          "version": "2.1.3", +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", +          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" +        } +      } +    }, +    "nopt": { +      "version": "1.0.10", +      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", +      "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", +      "requires": { +        "abbrev": "1" +      } +    }, +    "normalize-path": { +      "version": "3.0.0", +      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", +      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" +    }, +    "object-inspect": { +      "version": "1.12.2", +      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", +      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" +    }, +    "on-finished": { +      "version": "2.4.1", +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", +      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", +      "requires": { +        "ee-first": "1.1.1" +      } +    }, +    "once": { +      "version": "1.4.0", +      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", +      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", +      "requires": { +        "wrappy": "1" +      } +    }, +    "packet-reader": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", +      "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" +    }, +    "parseurl": { +      "version": "1.3.3", +      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", +      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" +    }, +    "path-is-absolute": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", +      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" +    }, +    "path-to-regexp": { +      "version": "0.1.7", +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", +      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" +    }, +    "pg": { +      "version": "8.8.0", +      "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", +      "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", +      "requires": { +        "buffer-writer": "2.0.0", +        "packet-reader": "1.0.0", +        "pg-connection-string": "^2.5.0", +        "pg-pool": "^3.5.2", +        "pg-protocol": "^1.5.0", +        "pg-types": "^2.1.0", +        "pgpass": "1.x" +      } +    }, +    "pg-connection-string": { +      "version": "2.5.0", +      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", +      "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" +    }, +    "pg-int8": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", +      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" +    }, +    "pg-pool": { +      "version": "3.5.2", +      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", +      "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", +      "requires": {} +    }, +    "pg-protocol": { +      "version": "1.5.0", +      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", +      "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" +    }, +    "pg-types": { +      "version": "2.2.0", +      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", +      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", +      "requires": { +        "pg-int8": "1.0.1", +        "postgres-array": "~2.0.0", +        "postgres-bytea": "~1.0.0", +        "postgres-date": "~1.0.4", +        "postgres-interval": "^1.1.0" +      } +    }, +    "pgpass": { +      "version": "1.0.5", +      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", +      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", +      "requires": { +        "split2": "^4.1.0" +      } +    }, +    "picomatch": { +      "version": "2.3.1", +      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", +      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" +    }, +    "postgres-array": { +      "version": "2.0.0", +      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", +      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" +    }, +    "postgres-bytea": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", +      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" +    }, +    "postgres-date": { +      "version": "1.0.7", +      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", +      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" +    }, +    "postgres-interval": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", +      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", +      "requires": { +        "xtend": "^4.0.0" +      } +    }, +    "proxy-addr": { +      "version": "2.0.7", +      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", +      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", +      "requires": { +        "forwarded": "0.2.0", +        "ipaddr.js": "1.9.1" +      } +    }, +    "pstree.remy": { +      "version": "1.1.8", +      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", +      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" +    }, +    "qs": { +      "version": "6.10.3", +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", +      "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", +      "requires": { +        "side-channel": "^1.0.4" +      } +    }, +    "range-parser": { +      "version": "1.2.1", +      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", +      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" +    }, +    "raw-body": { +      "version": "2.5.1", +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", +      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", +      "requires": { +        "bytes": "3.1.2", +        "http-errors": "2.0.0", +        "iconv-lite": "0.4.24", +        "unpipe": "1.0.0" +      } +    }, +    "readdirp": { +      "version": "3.6.0", +      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", +      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", +      "requires": { +        "picomatch": "^2.2.1" +      } +    }, +    "safe-buffer": { +      "version": "5.2.1", +      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", +      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" +    }, +    "safer-buffer": { +      "version": "2.1.2", +      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", +      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" +    }, +    "semver": { +      "version": "5.7.1", +      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", +      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" +    }, +    "send": { +      "version": "0.18.0", +      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", +      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", +      "requires": { +        "debug": "2.6.9", +        "depd": "2.0.0", +        "destroy": "1.2.0", +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "etag": "~1.8.1", +        "fresh": "0.5.2", +        "http-errors": "2.0.0", +        "mime": "1.6.0", +        "ms": "2.1.3", +        "on-finished": "2.4.1", +        "range-parser": "~1.2.1", +        "statuses": "2.0.1" +      }, +      "dependencies": { +        "ms": { +          "version": "2.1.3", +          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", +          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" +        } +      } +    }, +    "serve-static": { +      "version": "1.15.0", +      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", +      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", +      "requires": { +        "encodeurl": "~1.0.2", +        "escape-html": "~1.0.3", +        "parseurl": "~1.3.3", +        "send": "0.18.0" +      } +    }, +    "setprototypeof": { +      "version": "1.2.0", +      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", +      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" +    }, +    "side-channel": { +      "version": "1.0.4", +      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", +      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", +      "requires": { +        "call-bind": "^1.0.0", +        "get-intrinsic": "^1.0.2", +        "object-inspect": "^1.9.0" +      } +    }, +    "simple-update-notifier": { +      "version": "1.0.7", +      "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", +      "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", +      "requires": { +        "semver": "~7.0.0" +      }, +      "dependencies": { +        "semver": { +          "version": "7.0.0", +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", +          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" +        } +      } +    }, +    "split2": { +      "version": "4.1.0", +      "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", +      "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" +    }, +    "statuses": { +      "version": "2.0.1", +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", +      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" +    }, +    "supports-color": { +      "version": "5.5.0", +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", +      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", +      "requires": { +        "has-flag": "^3.0.0" +      } +    }, +    "swagger-ui-dist": { +      "version": "4.14.0", +      "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", +      "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" +    }, +    "swagger-ui-express": { +      "version": "4.5.0", +      "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz", +      "integrity": "sha512-DHk3zFvsxrkcnurGvQlAcLuTDacAVN1JHKDgcba/gr2NFRE4HGwP1YeHIXMiGznkWR4AeS7X5vEblNn4QljuNA==", +      "requires": { +        "swagger-ui-dist": ">=4.11.0" +      } +    }, +    "to-regex-range": { +      "version": "5.0.1", +      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", +      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", +      "requires": { +        "is-number": "^7.0.0" +      } +    }, +    "toidentifier": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", +      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" +    }, +    "touch": { +      "version": "3.1.0", +      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", +      "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", +      "requires": { +        "nopt": "~1.0.10" +      } +    }, +    "type-is": { +      "version": "1.6.18", +      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", +      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", +      "requires": { +        "media-typer": "0.3.0", +        "mime-types": "~2.1.24" +      } +    }, +    "typescript": { +      "version": "4.8.3", +      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", +      "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", +      "dev": true +    }, +    "undefsafe": { +      "version": "2.0.5", +      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", +      "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" +    }, +    "unpipe": { +      "version": "1.0.0", +      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", +      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" +    }, +    "utils-merge": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", +      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" +    }, +    "vary": { +      "version": "1.1.2", +      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", +      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" +    }, +    "wrappy": { +      "version": "1.0.2", +      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", +      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" +    }, +    "xtend": { +      "version": "4.0.2", +      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", +      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" +    }, +    "yamljs": { +      "version": "0.3.0", +      "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", +      "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", +      "requires": { +        "argparse": "^1.0.7", +        "glob": "^7.0.5" +      } +    } +  } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..330a682 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ +  "name": "scale-api-express", +  "version": "1.0.0", +  "description": "", +  "main": "dist/index.js", +  "scripts": { +    "test": "echo \"Error: no test specified\" && exit 1", +    "start": "dist && node dist/index.js", +    "dev": "tsc -w & nodemon dist/server.js" +  }, +  "author": "", +  "license": "ISC", +  "devDependencies": { +    "@types/express": "^4.17.13", +    "@types/pg": "^8.6.5", +    "@types/swagger-ui-express": "^4.1.3", +    "@types/yamljs": "^0.2.31", +    "typescript": "^4.8.2" +  }, +  "dependencies": { +    "express": "^4.18.1", +    "nodemon": "^2.0.20", +    "pg": "^8.8.0", +    "swagger-ui-express": "^4.5.0", +    "yamljs": "^0.3.0" +  } +} diff --git a/src/database/postgres.ts b/src/database/postgres.ts new file mode 100644 index 0000000..2ea19bd --- /dev/null +++ b/src/database/postgres.ts @@ -0,0 +1,74 @@ +import { Client } from 'pg'; +var connectionString = "postgres://scale:secret@db/scale?sslmode=disable"; +let client: Client; + +export function InitPostgres() { +    client = new Client(connectionString); +    client.connect(); +} + +export function ClosePostgres() { +    client.end(); +} + +export function CustomQuery(query: string, callback: (r: { status: number, data: any }) => void) { +    client.query(query, (err, res) => { +        let r: { status: number, data: any } = { status: 500, data: undefined }; +        if (err) { +            r.data = err.message; +        } else { +            r.status = 200; r.data = res.rows; +        } +        callback(r); +    }); +} + +export function GetBoards(callback: (r: { status: number, data: any }) => void) { +    let query = ` +select s.nspname as board +from pg_catalog.pg_namespace s +where nspname != 'pg_toast' and nspname != 'pg_catalog' +and nspname != 'public' and nspname != 'information_schema';`; // to remove the default schemas + +    client.query(query, (err, res) => { +        let r: { status: number, data: any } = { status: 500, data: undefined }; +        if (err) { +            r.status = 404; r.data = err.message; +        } else { +            r.status = 200; r.data = []; +            for(let board of res.rows) +                r.data.push(board.board); +        } +        callback(r); +    }); +} + +export function CreateBoard(name: string, callback: (r: { status: number, data: any }) => void) { +    let query = ` +create schema ${name}; +create table ${name}.threads( +  id serial primary key, +  timestamp bigint, +  title text, +  content text, +  image text, +  imagetype text +); +create table ${name}.comments( +  id serial primary key, +  timestamp bigint, +  content text, +  image text, +  imagetype text +);`; + +    client.query(query, (err, res) => { +        let r: { status: number, data: any } = { status: 500, data: undefined }; +        if (err) { +            r.data = err.message; +        } else { +            r.status = 200; +        } +        callback(r); +    }); +} diff --git a/src/files/SwaggerUI.yaml b/src/files/SwaggerUI.yaml new file mode 100644 index 0000000..019ca5e --- /dev/null +++ b/src/files/SwaggerUI.yaml @@ -0,0 +1,206 @@ +openapi: 3.0.0 +info: +  title: Converted from Thread.yaml with typeconv +  version: '1' +  x-id: Thread.yaml +  x-comment: >- +    Generated from src/models/Thread.ts by core-types-json-schema +    (https://github.com/grantila/core-types-json-schema) on behalf of typeconv +    (https://github.com/grantila/typeconv) +paths: +  /custom: +    post: +      summary: Run a custom sql query +      responses: +        '200': +          description: Success +        '500': +          description: Failed +      requestBody: +        descripton: The command to run +        content: +          text/plain: +            schema: +              title: Command +              type: string +  /boards: +    get: +      summary: Get boards +      responses: +        '200': +          description: Success +          content: +            application/json: +              schema: +                type: array +                items: +                  type: string +        '404': +          description: Not Found +  /boards/{board}: +    post: +      summary: Creat a new board +      parameters: +        - name: board +          in: path +          required: true +          schema: +            type: string +      responses: +        '200': +          description: Success +        '500': +          description: Failed +  /board/{board}: +    get: +      summary: Get threads in board +      parameters: +        - name: board +          in: path +          required: true +          schema: +            type: string +      responses: +        '200': +          description: Success +          content: +            application/json: +              schema: +                type: array +                items: +                  $ref: '#/components/schemas/Thread' +        '404': +          description: Not Found +    post: +      summary: Post a thread +      parameters: +        - name: board +          in: path +          required: true +          schema: +            type: string +      requestBody: +        description: Thread to post +        content: +          application/json: +            schema: +              $ref: '#/components/schemas/Thread' +      responses: +        '200': +          description: Success +        '500': +          description: Failed + +  /board/{board}/{tid}: +    get: +      summary: Get a thread +      parameters: +        - name: board +          in: path +          required: true +          schema: +            type: string +        - name: tid +          in: path +          required: true +          schema: +            type: string +      responses: +        '200': +          description: Success +          content: +            application/json: +              schema: +                $ref: '#/components/schemas/Thread' +        '404': +            description: Not Found +    post: +      summary: Post a comment +      parameters: +        - name: board +          in: path +          required: true +          schema: +            type: string +        - name: tid +          in: path +          required: true +          schema: +            type: string +      requestBody: +        descriptors: The comment to post +        content: +          application/json: +            schema: +              $ref: '#components/schemas/Comment' +      responses: +        '200': +          description: Success +        '500': +          description: Failed + +components: +  schemas: +    Comment: +      properties: +        id: +          title: Comment.id +          type: string +        timestamp: +          title: Comment.timestamp +          type: number +        content: +          title: Comment.content +          type: string +        image: +          title: Comment.image +          type: string +        imagetype: +          title: Comment.imagetype +          type: string +      required: +        - id +        - timestamp +        - content +        - image +        - imagetype +      additionalProperties: false +      title: Comment +      type: object +    Thread: +      properties: +        id: +          title: Thread.id +          type: string +        timestamp: +          title: Thread.timestamp +          type: number +        title: +          title: Thread.title +          type: string +        content: +          title: Thread.content +          type: string +        comments: +          items: +            $ref: '#/components/schemas/Comment' +            title: Thread.comments.[] +          title: Thread.comments +          type: array +        image: +          title: Thread.image +          type: string +        imagetype: +          title: Thread.imagetype +          type: string +      required: +        - id +        - title +        - contnet +        - comments +        - timestamp +        - image +        - imageType +      additionalProperties: false +      title: Thread +      type: object diff --git a/src/models/Thread.ts b/src/models/Thread.ts new file mode 100644 index 0000000..5960e11 --- /dev/null +++ b/src/models/Thread.ts @@ -0,0 +1,17 @@ +export type Comment = { +    id: string; +    timestamp: number; +    content: string; +    image: string; +    imagetype: string //image or video +}; + +export type Thread = { +    id: string; +    timestamp: number; +    title: string; +    content: string; +    comments: Comment[]; +    image: string; +    imagetype: string; //image or video +}; diff --git a/src/routes/board.ts b/src/routes/board.ts new file mode 100644 index 0000000..caa2d53 --- /dev/null +++ b/src/routes/board.ts @@ -0,0 +1,44 @@ +import express from 'express'; +import type { Thread, Comment }  from '../models/Thread'; +import { CreateBoard, CustomQuery, GetBoards } from '../database/postgres' + +const router = express.Router(); + +router.post('/custom', (req, res) => { +    CustomQuery(req.body, (r) => { +        res.status(r.status).send(r.data); +    }); +}); + +router.get('/boards', (req, res) => { +    GetBoards((r) => { +        res.status(r.status).send(r.data); +    }); +}); + +router.post('/boards/:board', (req, res) => { +    CreateBoard(req.params.board, (r) => { +        res.status(r.status).send(r.data); +    }); +}); + +router.get('/board/:board', (req, res) => { +    res.status(404).send(req.params.board); +}); + +router.post('/board/:board', (req, res) => { +    let t: Thread = req.body; +    console.log(t); +    res.status(403).send({board: req.params.board, thread: t}); +}); + +router.get('/board/:board/:tid', (req, res) => { +    res.status(404).send([req.params.board, req.params.tid]); +}); + +router.post('/board/:board/:tid', (req, res) => { +    let c: Comment = req.body; +    res.status(404).send({params: [req.params.board, req.params.tid], body: c}); +}); + +export default router; diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..0368f99 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,26 @@ +import express from 'express'; +import boardRouter from './routes/board'; + +import swaggerUI from 'swagger-ui-express'; +import YAML from 'yamljs'; +const doc = YAML.load('src/files/SwaggerUI.yaml'); + +import { InitPostgres, ClosePostgres } from './database/postgres'; +InitPostgres(); + +const app = express(); + +app.use(express.json()); +app.use(express.text()); + +app.use('/swagger', swaggerUI.serve, swaggerUI.setup(doc)); + +app.use('/', boardRouter); + +app.get('*', (req, res) => { +    res.send("haha i ate your request"); +}); + +app.listen(6969); + +// ClosePostgres(); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..82536da --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,103 @@ +{ +  "compilerOptions": { +    /* Visit https://aka.ms/tsconfig to read more about this file */ + +    /* Projects */ +    // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ +    // "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */ +    // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path to .tsbuildinfo incremental compilation file. */ +    // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */ +    // "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */ +    // "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */ + +    /* Language and Environment */ +    "target": "es2016",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ +    // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */ +    // "jsx": "preserve",                                /* Specify what JSX code is generated. */ +    // "experimentalDecorators": true,                   /* Enable experimental support for TC39 stage 2 draft decorators. */ +    // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */ +    // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ +    // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ +    // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ +    // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ +    // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */ +    // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */ +    // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */ + +    /* Modules */ +    "module": "commonjs",                                /* Specify what module code is generated. */ +    "rootDir": "./src",                                  /* Specify the root folder within your source files. */ +    // "moduleResolution": "node",                       /* Specify how TypeScript looks up a file from a given module specifier. */ +    // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */ +    // "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */ +    // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */ +    // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */ +    // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */ +    // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */ +    // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */ +    // "resolveJsonModule": true,                        /* Enable importing .json files. */ +    // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */ + +    /* JavaScript Support */ +    // "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ +    // "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */ +    // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + +    /* Emit */ +    // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ +    // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */ +    // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */ +    // "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */ +    // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ +    "outDir": "./dist",                                  /* Specify an output folder for all emitted files. */ +    // "removeComments": true,                           /* Disable emitting comments. */ +    // "noEmit": true,                                   /* Disable emitting files from a compilation. */ +    // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ +    // "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types. */ +    // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ +    // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */ +    // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */ +    // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */ +    // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */ +    // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ +    // "newLine": "crlf",                                /* Set the newline character for emitting files. */ +    // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ +    // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */ +    // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */ +    // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */ +    // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */ +    // "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + +    /* Interop Constraints */ +    // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */ +    // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */ +    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ +    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ +    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */ + +    /* Type Checking */ +    "strict": true,                                      /* Enable all strict type-checking options. */ +    // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */ +    // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */ +    // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ +    // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ +    // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */ +    // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */ +    // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */ +    // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */ +    // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */ +    // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */ +    // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */ +    // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */ +    // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */ +    // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */ +    // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */ +    // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */ +    // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */ +    // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */ + +    /* Completeness */ +    // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */ +    "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */ +  } +} | 
