├── data └── avatar.png ├── src ├── rooms │ ├── room.ts │ └── streamroom.ts ├── config.ts ├── puppetFactory.ts ├── commands │ ├── hello.ts │ └── handler.ts ├── zammad │ └── ZammadClient.ts └── index.ts ├── tsconfig.json ├── config └── default.yaml ├── package.json ├── .gitignore ├── README.md ├── tslint.json ├── LICENSE └── yarn.lock /data/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Half-Shot/matrix-zammad/HEAD/data/avatar.png -------------------------------------------------------------------------------- /src/rooms/room.ts: -------------------------------------------------------------------------------- 1 | export interface IRoomConfig { 2 | type: "stream", 3 | pollInterval: number, 4 | groupId: number, 5 | } 6 | 7 | export interface ZammadRoom { 8 | load: () => Promise; 9 | reconfigure: (config: IRoomConfig, initial?: boolean) => void; 10 | onReaction: (sender: string, key: string, eventId: string) => void; 11 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "experimentalDecorators": true, 4 | "emitDecoratorMetadata": true, 5 | "module": "commonjs", 6 | "moduleResolution": "node", 7 | "target": "ES2019", 8 | "noImplicitAny": false, 9 | "sourceMap": true, 10 | "incremental": true, 11 | "outDir": "./lib", 12 | "types": [ 13 | "node" 14 | ] 15 | }, 16 | "include": [ 17 | "./src/**/*" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import * as config from "config"; 2 | 3 | interface IConfig { 4 | homeserverUrl: string; 5 | accessToken: string; 6 | autoJoin: boolean; 7 | dataPath: string; 8 | profile: { 9 | displayname: string; 10 | avatar?: boolean; 11 | } 12 | zammad: { 13 | url: string; 14 | accessToken: string; 15 | } 16 | sender_tokens: { 17 | [userId: string]: string; 18 | } 19 | rooms: string[]; 20 | } 21 | 22 | export default config; 23 | -------------------------------------------------------------------------------- /config/default.yaml: -------------------------------------------------------------------------------- 1 | # Where the homeserver's Client-Server API is located. Typically this 2 | # is where clients would be connecting to in order to send messages. 3 | homeserverUrl: "https://matrix.org" 4 | 5 | # An access token for the bot to use. Learn how to get an access token 6 | # at https://t2bot.io/docs/access_tokens 7 | accessToken: "YOUR_TOKEN_HERE" 8 | 9 | # Whether or not to autojoin rooms when invited. 10 | autoJoin: false 11 | 12 | # Location on disk for where to store various bot information. 13 | dataPath: "storage" 14 | 15 | profile: 16 | displayname: "Zammad Bot" 17 | avatar: true -------------------------------------------------------------------------------- /src/puppetFactory.ts: -------------------------------------------------------------------------------- 1 | import { ZammadClient } from "./zammad/ZammadClient"; 2 | import config from "./config"; 3 | 4 | export class PuppetFactory { 5 | private puppets: Map = new Map(); 6 | 7 | public getPuppet(userId: string) { 8 | if (this.puppets.has(userId)) { 9 | return this.puppets.get(userId); 10 | } 11 | if (!config.sender_tokens) { 12 | console.log("No sender_tokens setup."); 13 | return null; 14 | } 15 | const token = config.sender_tokens[userId]; 16 | if (!token) { 17 | console.log("No token found for user."); 18 | return null; 19 | } 20 | const puppet = new ZammadClient(config.zammad.url, token); 21 | this.puppets.set(userId, puppet); 22 | return puppet; 23 | } 24 | } -------------------------------------------------------------------------------- /src/commands/hello.ts: -------------------------------------------------------------------------------- 1 | import { MatrixClient, MentionPill, MessageEvent, MessageEventContent } from "matrix-bot-sdk"; 2 | import * as htmlEscape from "escape-html"; 3 | 4 | export async function runHelloCommand(roomId: string, event: MessageEvent, args: string[], client: MatrixClient) { 5 | // The first argument is always going to be us, so get the second argument instead. 6 | let sayHelloTo = args[1]; 7 | if (!sayHelloTo) sayHelloTo = event.sender; 8 | 9 | let text = `Hello ${sayHelloTo}!`; 10 | let html = `Hello ${htmlEscape(sayHelloTo)}!`; 11 | 12 | if (sayHelloTo.startsWith("@")) { 13 | // Awesome! The user supplied an ID so we can create a proper mention instead 14 | const mention = await MentionPill.forUser(sayHelloTo, roomId, client); 15 | text = `Hello ${mention.text}!`; 16 | html = `Hello ${mention.html}!`; 17 | } 18 | 19 | // Now send that message as a notice 20 | return client.sendMessage(roomId, { 21 | body: text, 22 | msgtype: "m.notice", 23 | format: "org.matrix.custom.html", 24 | formatted_body: html, 25 | }); 26 | } 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "matrix-zammad", 3 | "version": "0.0.1", 4 | "author": "Half-Shot ", 5 | "license": "Apache-2.0", 6 | "description": "A bot to interface Zammad with Matrix", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/Half-Shot/matrix-zammad.git" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/Half-Shot/matrix-zammad/issues" 13 | }, 14 | "homepage": "https://github.com/Half-Shot/matrix-zammad#readme", 15 | "keywords": [ 16 | "matrix", 17 | "bot", 18 | "zammad" 19 | ], 20 | "main": "lib/index.js", 21 | "scripts": { 22 | "build": "tsc", 23 | "lint": "tslint --project ./tsconfig.json -t stylish", 24 | "start:dev": "npm run build && node lib/index.js", 25 | "start": "NODE_ENV=production node lib/index.js" 26 | }, 27 | "dependencies": { 28 | "config": "^3.2.4", 29 | "escape-html": "^1.0.3", 30 | "js-yaml": "^3.13.1", 31 | "request": "^2.88.0", 32 | "request-promise-native": "^1.0.8" 33 | }, 34 | "devDependencies": { 35 | "@types/node": "^10.17.5", 36 | "@types/request-promise-native": "^1.0.17", 37 | "matrix-bot-sdk": "^0.4.0-beta.19", 38 | "tslint": "^5.20.1", 39 | "typescript": "^3.7.2" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | config/* 2 | !config/default.yaml 3 | lib/ 4 | storage/ 5 | 6 | /.idea 7 | 8 | /db 9 | 10 | # Logs 11 | logs 12 | *.log 13 | npm-debug.log* 14 | yarn-debug.log* 15 | yarn-error.log* 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | 29 | # nyc test coverage 30 | .nyc_output 31 | 32 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 33 | .grunt 34 | 35 | # Bower dependency directory (https://bower.io/) 36 | bower_components 37 | 38 | # node-waf configuration 39 | .lock-wscript 40 | 41 | # Compiled binary addons (https://nodejs.org/api/addons.html) 42 | build/Release 43 | 44 | # Dependency directories 45 | node_modules/ 46 | jspm_packages/ 47 | 48 | # TypeScript v1 declaration files 49 | typings/ 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional REPL history 58 | .node_repl_history 59 | 60 | # Output of 'npm pack' 61 | *.tgz 62 | 63 | # Yarn Integrity file 64 | .yarn-integrity 65 | 66 | # dotenv environment variables file 67 | .env 68 | 69 | # next.js build output 70 | .next 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `matrix-zammad` 2 | 3 | A bot for forwarding Zammad ticket notifications into Matrix. 4 | 5 | ## What is Zammad? 6 | 7 | > [Zammad](https://zammad.org/) is a web-based, open source user support/ticketing solution. 8 | 9 | - https://zammad.org/ 10 | 11 | ## Features 12 | 13 | - Notifies on new ticket creation in a given group 14 | 15 | ## Running / Building 16 | 17 | ``` 18 | git clone https://github.com/Half-Shot/matrix-zammad.git 19 | ``` 20 | 21 | Copy the `config/default.yaml` to `config/production.yaml` and edit as appropriate. 22 | 23 | ``` 24 | yarn 25 | yarn build 26 | yarn start 27 | ``` 28 | 29 | ## Configuration 30 | 31 | Beyond configuring the bot in `config/production.yaml`, you need to also configure the rooms. 32 | 33 | The bot uses Matrix room state for configuration. To setup a room (in Riot): 34 | 35 | - Open the room that you wish to connect the bot to. 36 | - Invite the bot. 37 | - Add a new state event `uk.half-shot.matrix-zammad.roominfo` with the content: 38 | 39 | ```js 40 | { 41 | "type": "stream", 42 | "pollInterval": 10000 // ms to wait between fetches for tickets. 43 | "groupId": 2 // The group_id you wish to fetch the tickets of. See https://docs.zammad.org/en/latest/api-group.html#list to find your group. 44 | } 45 | ``` 46 | 47 | - Start the bot (ensuring you've added the room's roomId to the `rooms` list in the config) 48 | - New tickets should start to be reported in the room. 49 | 50 | ## Help! 51 | 52 | There is no help for you yet, traveller. -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "class-name": false, 4 | "comment-format": [ 5 | true 6 | ], 7 | "curly": false, 8 | "eofline": false, 9 | "forin": false, 10 | "indent": [ 11 | true, 12 | "spaces" 13 | ], 14 | "label-position": true, 15 | "max-line-length": false, 16 | "member-access": false, 17 | "member-ordering": [ 18 | true, 19 | "static-after-instance", 20 | "variables-before-functions" 21 | ], 22 | "no-arg": true, 23 | "no-bitwise": false, 24 | "no-console": false, 25 | "no-construct": true, 26 | "no-debugger": true, 27 | "no-duplicate-variable": true, 28 | "no-empty": false, 29 | "no-eval": true, 30 | "no-inferrable-types": true, 31 | "no-shadowed-variable": true, 32 | "no-string-literal": false, 33 | "no-switch-case-fall-through": true, 34 | "no-trailing-whitespace": true, 35 | "no-unused-expression": true, 36 | "no-use-before-declare": false, 37 | "no-var-keyword": true, 38 | "object-literal-sort-keys": false, 39 | "one-line": [ 40 | true, 41 | "check-open-brace", 42 | "check-catch", 43 | "check-else", 44 | "check-whitespace" 45 | ], 46 | "quotemark": false, 47 | "radix": true, 48 | "semicolon": [ 49 | "always" 50 | ], 51 | "triple-equals": [], 52 | "typedef-whitespace": [ 53 | true, 54 | { 55 | "call-signature": "nospace", 56 | "index-signature": "nospace", 57 | "parameter": "nospace", 58 | "property-declaration": "nospace", 59 | "variable-declaration": "nospace" 60 | } 61 | ], 62 | "variable-name": false, 63 | "whitespace": [ 64 | true, 65 | "check-branch", 66 | "check-decl", 67 | "check-operator", 68 | "check-separator", 69 | "check-type" 70 | ] 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/zammad/ZammadClient.ts: -------------------------------------------------------------------------------- 1 | import * as request from "request-promise-native"; 2 | 3 | export interface IZammadTicket { 4 | id: number, 5 | title: string, 6 | group_id: number, 7 | state_id: number, 8 | customer_id: number, 9 | customer: string; 10 | note: string, 11 | updated_at: number, 12 | created_at: number, 13 | number: string, 14 | } 15 | 16 | export interface IZammadUser { 17 | id: number; 18 | firstname: string; 19 | lastname: string; 20 | email: string; 21 | } 22 | 23 | export class ZammadClient { 24 | constructor(public readonly url: string, private readonly accessToken: string) { 25 | while (this.url.endsWith("/")) { 26 | this.url = this.url.substr(0, this.url.length - 1); 27 | } 28 | } 29 | 30 | public async getTickets(groupId: number): Promise { 31 | const uri = `${this.url}/api/v1/tickets/search?query=group_id:${groupId}&limit=20&expand=true&order_by=desc&sort_by=number`; 32 | const result = await request.get(uri, { 33 | headers: { 34 | "Authorization": `Token token=${this.accessToken}`, 35 | }, 36 | json: true, 37 | }); 38 | return result.map((t) => { 39 | return { 40 | ...t, 41 | updated_at: Date.parse(t.updated_at), 42 | created_at: Date.parse(t.created_at), 43 | } 44 | }); 45 | } 46 | 47 | public async getTicket(id: number): Promise { 48 | const uri = `${this.url}/api/v1/tickets/${id}`; 49 | return request.get(uri, { 50 | headers: { 51 | "Authorization": `Token token=${this.accessToken}`, 52 | }, 53 | json: true 54 | }); 55 | } 56 | 57 | public async closeTicket(id: number) { 58 | const ticket = await this.getTicket(id); 59 | // XXX: Hardcoded state 60 | ticket.state_id = 4; 61 | const uri = `${this.url}/api/v1/tickets/${id}`; 62 | const result = await request.put(uri, { 63 | headers: { 64 | "Authorization": `Token token=${this.accessToken}`, 65 | }, 66 | json: ticket, 67 | }); 68 | return result; 69 | } 70 | 71 | public async getUser(userId: number): Promise { 72 | const uri = `${this.url}/api/v1/users/${userId}`; 73 | return request.get(uri, { 74 | headers: { 75 | "Authorization": `Token token=${this.accessToken}`, 76 | }, 77 | json: true, 78 | }); 79 | } 80 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | LogLevel, 3 | LogService, 4 | MatrixClient, 5 | RichConsoleLogger, 6 | SimpleFsStorageProvider 7 | } from "matrix-bot-sdk"; 8 | import * as path from "path"; 9 | import config from "./config"; 10 | import {promises as fs} from "fs"; 11 | import { ZammadRoom } from "./rooms/room"; 12 | import { StreamRoom } from "./rooms/streamroom"; 13 | import { ZammadClient } from "./zammad/ZammadClient"; 14 | import { PuppetFactory } from "./puppetFactory"; 15 | 16 | LogService.setLogger(new RichConsoleLogger()); 17 | LogService.setLevel(LogLevel.INFO); 18 | LogService.info("index", "Bot starting..."); 19 | 20 | (async function () { 21 | const storage = new SimpleFsStorageProvider(path.join(config.dataPath, "bot.json")); 22 | const client = new MatrixClient(config.homeserverUrl, config.accessToken, storage); 23 | const puppetFactory = new PuppetFactory(); 24 | const myUserId = await client.getUserId(); 25 | const profile = await client.getUserProfile(myUserId); 26 | 27 | if (!profile || profile.displayname !== config.profile.displayname) { 28 | LogService.info("Main", "Displayname not equal to configured displayname. Setting.."); 29 | await client.setDisplayName(config.profile.displayname); 30 | LogService.info("Main", "Displayname set"); 31 | } 32 | 33 | if (profile && config.profile.avatar && !profile.avatar_url) { 34 | LogService.info("Main", "Avatar not set on profile. Setting.."); 35 | const avatarData = await fs.readFile("./data/avatar.png"); 36 | const mxc = await client.uploadContent(avatarData, "image/png", "avatar.png"); 37 | await client.setAvatarUrl(mxc); 38 | LogService.info("Main", "Avatar set"); 39 | } 40 | 41 | let rooms: {[roomId: string]: ZammadRoom} = {}; 42 | const zammadClient = new ZammadClient(config.zammad.url, config.zammad.accessToken); 43 | for (const roomId of config.rooms) { 44 | LogService.info("Main", `Loading ${roomId}`); 45 | const room = new StreamRoom(roomId, client, zammadClient, puppetFactory); 46 | await room.load(); 47 | await room.listenForTickets(); 48 | rooms[roomId] = room; 49 | } 50 | 51 | client.on("room.event", (roomId, event) => { 52 | if (event.type === StreamRoom.STATE_TYPE && rooms[roomId]) { 53 | rooms[roomId].reconfigure(event.content); 54 | } 55 | const relates = event.content["m.relates_to"]; 56 | if (event.type === "m.reaction" && rooms[roomId] && relates && relates.rel_type === "m.annotation") { 57 | rooms[roomId].onReaction(event.sender, relates.key, relates.event_id); 58 | } 59 | }); 60 | 61 | LogService.info("Main", "Starting sync..."); 62 | await client.start(); 63 | })().catch((ex) => { 64 | LogService.error("Main", "Error occured:", ex); 65 | }); 66 | -------------------------------------------------------------------------------- /src/commands/handler.ts: -------------------------------------------------------------------------------- 1 | import { LogService, MatrixClient, MessageEvent, RichReply, UserID } from "matrix-bot-sdk"; 2 | import { runHelloCommand } from "./hello"; 3 | import * as htmlEscape from "escape-html"; 4 | 5 | // The prefix required to trigger the bot. The bot will also respond 6 | // to being pinged directly. 7 | export const COMMAND_PREFIX = "!bot"; 8 | 9 | // This is where all of our commands will be handled 10 | export default class CommandHandler { 11 | 12 | // Just some variables so we can cache the bot's display name and ID 13 | // for command matching later. 14 | private displayName: string; 15 | private userId: string; 16 | private localpart: string; 17 | 18 | constructor(private client: MatrixClient) { 19 | } 20 | 21 | public async start() { 22 | // Populate the variables above (async) 23 | await this.prepareProfile(); 24 | 25 | // Set up the event handler 26 | this.client.on("room.message", this.onMessage.bind(this)); 27 | } 28 | 29 | private async prepareProfile() { 30 | this.userId = await this.client.getUserId(); 31 | this.localpart = new UserID(this.userId).localpart; 32 | 33 | try { 34 | const profile = await this.client.getUserProfile(this.userId); 35 | if (profile && profile['displayname']) this.displayName = profile['displayname']; 36 | } catch (e) { 37 | // Non-fatal error - we'll just log it and move on. 38 | LogService.warn("CommandHandler", e); 39 | } 40 | } 41 | 42 | private async onMessage(roomId: string, ev: any) { 43 | const event = new MessageEvent(ev); 44 | if (event.isRedacted) return; // Ignore redacted events that come through 45 | if (event.sender === this.userId) return; // Ignore ourselves 46 | if (event.messageType !== "m.text") return; // Ignore non-text messages 47 | 48 | // Ensure that the event is a command before going on. We allow people to ping 49 | // the bot as well as using our COMMAND_PREFIX. 50 | const prefixes = [COMMAND_PREFIX, `${this.localpart}:`, `${this.displayName}:`, `${this.userId}:`]; 51 | const prefixUsed = prefixes.find(p => event.textBody.startsWith(p)); 52 | if (!prefixUsed) return; // Not a command (as far as we're concerned) 53 | 54 | // Check to see what the arguments were to the command 55 | const args = event.textBody.substring(prefixUsed.length).trim().split(' '); 56 | 57 | // Try and figure out what command the user ran, defaulting to help 58 | try { 59 | if (args[0] === "hello") { 60 | return runHelloCommand(roomId, event, args, this.client); 61 | } else { 62 | const help = "" + 63 | "!bot hello [user] - Say hello to a user.\n" + 64 | "!bot help - This menu\n"; 65 | 66 | const text = `Help menu:\n${help}`; 67 | const html = `Help menu:
${htmlEscape(help)}
`; 68 | const reply = RichReply.createFor(roomId, ev, text, html); // Note that we're using the raw event, not the parsed one! 69 | reply["msgtype"] = "m.notice"; // Bots should always use notices 70 | return this.client.sendMessage(roomId, reply); 71 | } 72 | } catch (e) { 73 | // Log the error 74 | LogService.error("CommandHandler", e); 75 | 76 | // Tell the user there was a problem 77 | const message = "There was an error processing your command"; 78 | const reply = RichReply.createFor(roomId, ev, message, message); // We don't need to escape the HTML because we know it is safe 79 | reply["msgtype"] = "m.notice"; 80 | return this.client.sendMessage(roomId, reply); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/rooms/streamroom.ts: -------------------------------------------------------------------------------- 1 | import { ZammadRoom, IRoomConfig } from "./room"; 2 | import { MatrixClient, LogService } from "matrix-bot-sdk"; 3 | import { ZammadClient, IZammadTicket } from "../zammad/ZammadClient"; 4 | import { PuppetFactory } from "../puppetFactory"; 5 | 6 | 7 | const MIN_POLL_INTERVAL = 10000; 8 | const DEFAULT_POLL_INTERVAL = 30000; 9 | 10 | export class StreamRoom implements ZammadRoom { 11 | public static STATE_TYPE = "uk.half-shot.matrix-zammad.roominfo"; 12 | public static STATE_HEAD_TYPE = "uk.half-shot.matrix-zammad.sync_head"; 13 | 14 | private config: IRoomConfig; 15 | private lastNewTicketId = 0; 16 | constructor(public readonly roomId: string, private readonly client: MatrixClient, 17 | private readonly zammad: ZammadClient, private readonly puppetFactory: PuppetFactory) { 18 | 19 | } 20 | 21 | public async load() { 22 | await this.client.joinRoom(this.roomId); // Ensure joined. 23 | try { 24 | const config = await this.client.getRoomStateEvent(this.roomId, StreamRoom.STATE_TYPE, ""); 25 | this.reconfigure(config, true); 26 | } catch (ex) { 27 | if (ex.body.errcode === "M_NOT_FOUND") { 28 | throw Error("No config state found"); 29 | } 30 | throw ex; 31 | } 32 | try { 33 | const data = await this.client.getRoomAccountData(this.roomId, StreamRoom.STATE_HEAD_TYPE); 34 | this.lastNewTicketId = data.lastNewTicketId; 35 | LogService.info("StreamRoom", `Setting sync head to ${this.lastNewTicketId} for ${this.roomId}`); 36 | } catch (ex) { 37 | if (ex.body.errcode === "M_NOT_FOUND") { 38 | return; 39 | } 40 | throw ex; 41 | } 42 | } 43 | 44 | public reconfigure(config: IRoomConfig, initial = false) { 45 | LogService.info("StreamRoom", `Configuring ${this.roomId}`); 46 | config.pollInterval = Math.max(MIN_POLL_INTERVAL, config.pollInterval || DEFAULT_POLL_INTERVAL); 47 | this.config = config; 48 | } 49 | 50 | public async listenForTickets() { 51 | await this.ticketPoll(true); 52 | setInterval(() => { 53 | this.ticketPoll().catch((ex) => { 54 | LogService.warn("StreamRoom", `Failed to poll for tickets: ${ex}`); 55 | }) 56 | }, this.config.pollInterval); 57 | } 58 | 59 | public async onReaction(sender: string, key: string, eventId: string) { 60 | const puppet = this.puppetFactory.getPuppet(sender); 61 | if (!puppet) { 62 | return; 63 | } 64 | const actionAliases = { 65 | "close": ["❌", "🚮"] 66 | } 67 | const action = Object.keys(actionAliases).find((act) => actionAliases[act].includes(key)); 68 | 69 | if (!action) { 70 | LogService.info("StreamRoom", `Did not understand reaction key ${key}`); 71 | return; 72 | } 73 | 74 | try { 75 | const event = await this.client.getEvent(this.roomId, eventId); 76 | const ticket = event.content["uk.half-shot.zammad.ticket"]; 77 | if (!ticket || ticket.id === undefined) { 78 | LogService.info("StreamRoom", `Reaction was not made against a ticket`); 79 | return; 80 | } 81 | if (action === "close") { 82 | try { 83 | LogService.info("StreamRoom", `Attempting to close ticket ${ticket.id}`); 84 | await puppet.closeTicket(ticket.id); 85 | await this.client.sendNotice(this.roomId, `Closed #${ticket.number}`); 86 | } catch (ex) { 87 | await this.client.sendNotice(this.roomId, `Failed to close ticket ${ticket.number}: ${ex}`); 88 | } 89 | } 90 | } catch (ex) { 91 | LogService.warn("StreamRoom", `Could not get referenced event: ${eventId}`); 92 | return; 93 | } 94 | } 95 | 96 | private async ticketPoll(initial = false) { 97 | LogService.info("StreamRoom", `Polling for tickets`); 98 | const tickets = await this.zammad.getTickets(this.config.groupId); 99 | for (const ticket of tickets.sort((a, b) => a.id - b.id)) { 100 | if (ticket.id > this.lastNewTicketId) { 101 | LogService.info("StreamRoom", `Found new ticket ${ticket.id}`); 102 | this.lastNewTicketId = ticket.id; 103 | if (initial) { 104 | continue; 105 | } 106 | await this.handleNewTicket(ticket); 107 | await this.updateSyncHead(); 108 | } 109 | } 110 | LogService.info("StreamRoom", `Finished polling`); 111 | } 112 | 113 | private async handleNewTicket(ticket: IZammadTicket) { 114 | return this.client.sendMessage(this.roomId, { 115 | "uk.half-shot.zammad.ticket": { 116 | number: ticket.number, 117 | id: ticket.id, 118 | }, 119 | msgtype: "m.notice", 120 | body: `New Ticket #${ticket.number}: ${ticket.title}`, 121 | format: "org.matrix.custom.html", 122 | formatted_body: `New Ticket #${ticket.number}:

${ticket.title}

`, 123 | }); 124 | } 125 | 126 | private async updateSyncHead() { 127 | LogService.info("StreamRoom", `Setting sync head to ${this.lastNewTicketId} for ${this.roomId}`); 128 | return this.client.setRoomAccountData(StreamRoom.STATE_HEAD_TYPE, this.roomId, { 129 | "ticket_id": this.lastNewTicketId, 130 | }); 131 | } 132 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.5.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" 8 | integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.5.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" 15 | integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@types/body-parser@*": 22 | version "1.17.1" 23 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.1.tgz#18fcf61768fb5c30ccc508c21d6fd2e8b3bf7897" 24 | integrity sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w== 25 | dependencies: 26 | "@types/connect" "*" 27 | "@types/node" "*" 28 | 29 | "@types/caseless@*": 30 | version "0.12.2" 31 | resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" 32 | integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== 33 | 34 | "@types/color-name@^1.1.1": 35 | version "1.1.1" 36 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 37 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 38 | 39 | "@types/connect@*": 40 | version "3.4.32" 41 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 42 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 43 | dependencies: 44 | "@types/node" "*" 45 | 46 | "@types/express-serve-static-core@*": 47 | version "4.17.0" 48 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz#e80c25903df5800e926402b7e8267a675c54a281" 49 | integrity sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g== 50 | dependencies: 51 | "@types/node" "*" 52 | "@types/range-parser" "*" 53 | 54 | "@types/express@^4.17.2": 55 | version "4.17.2" 56 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.2.tgz#a0fb7a23d8855bac31bc01d5a58cadd9b2173e6c" 57 | integrity sha512-5mHFNyavtLoJmnusB8OKJ5bshSzw+qkMIBAobLrIM48HJvunFva9mOa6aBwh64lBFyNwBbs0xiEFuj4eU/NjCA== 58 | dependencies: 59 | "@types/body-parser" "*" 60 | "@types/express-serve-static-core" "*" 61 | "@types/serve-static" "*" 62 | 63 | "@types/mime@*": 64 | version "2.0.1" 65 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" 66 | integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 67 | 68 | "@types/node@*": 69 | version "12.12.17" 70 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" 71 | integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== 72 | 73 | "@types/node@^10.17.5": 74 | version "10.17.9" 75 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.9.tgz#4f251a1ed77ac7ef09d456247d67fc8173f6b9da" 76 | integrity sha512-+6VygF9LbG7Gaqeog2G7u1+RUcmo0q1rI+2ZxdIg2fAUngk5Vz9fOCHXdloNUOHEPd1EuuOpL5O0CdgN9Fx5UQ== 77 | 78 | "@types/range-parser@*": 79 | version "1.2.3" 80 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" 81 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 82 | 83 | "@types/request-promise-native@^1.0.17": 84 | version "1.0.17" 85 | resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.17.tgz#74a2d7269aebf18b9bdf35f01459cf0a7bfc7fab" 86 | integrity sha512-05/d0WbmuwjtGMYEdHIBZ0tqMJJQ2AD9LG2F6rKNBGX1SSFR27XveajH//2N/XYtual8T9Axwl+4v7oBtPUZqg== 87 | dependencies: 88 | "@types/request" "*" 89 | 90 | "@types/request@*": 91 | version "2.48.3" 92 | resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.3.tgz#970b8ed2317568c390361d29c555a95e74bd6135" 93 | integrity sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w== 94 | dependencies: 95 | "@types/caseless" "*" 96 | "@types/node" "*" 97 | "@types/tough-cookie" "*" 98 | form-data "^2.5.0" 99 | 100 | "@types/serve-static@*": 101 | version "1.13.3" 102 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.3.tgz#eb7e1c41c4468272557e897e9171ded5e2ded9d1" 103 | integrity sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g== 104 | dependencies: 105 | "@types/express-serve-static-core" "*" 106 | "@types/mime" "*" 107 | 108 | "@types/tough-cookie@*": 109 | version "2.3.6" 110 | resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.6.tgz#c880579e087d7a0db13777ff8af689f4ffc7b0d5" 111 | integrity sha512-wHNBMnkoEBiRAd3s8KTKwIuO9biFtTf0LehITzBhSco+HQI0xkXZbLOD55SW3Aqw3oUkHstkm5SPv58yaAdFPQ== 112 | 113 | accepts@~1.3.7: 114 | version "1.3.7" 115 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 116 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 117 | dependencies: 118 | mime-types "~2.1.24" 119 | negotiator "0.6.2" 120 | 121 | ajv@^6.5.5: 122 | version "6.10.2" 123 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" 124 | integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== 125 | dependencies: 126 | fast-deep-equal "^2.0.1" 127 | fast-json-stable-stringify "^2.0.0" 128 | json-schema-traverse "^0.4.1" 129 | uri-js "^4.2.2" 130 | 131 | ansi-styles@^3.2.1: 132 | version "3.2.1" 133 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 134 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 135 | dependencies: 136 | color-convert "^1.9.0" 137 | 138 | ansi-styles@^4.1.0: 139 | version "4.2.0" 140 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172" 141 | integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg== 142 | dependencies: 143 | "@types/color-name" "^1.1.1" 144 | color-convert "^2.0.1" 145 | 146 | argparse@^1.0.7: 147 | version "1.0.10" 148 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 149 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 150 | dependencies: 151 | sprintf-js "~1.0.2" 152 | 153 | array-flatten@1.1.1: 154 | version "1.1.1" 155 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 156 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 157 | 158 | array-uniq@^1.0.2: 159 | version "1.0.3" 160 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 161 | integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= 162 | 163 | asn1@~0.2.3: 164 | version "0.2.4" 165 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 166 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 167 | dependencies: 168 | safer-buffer "~2.1.0" 169 | 170 | assert-plus@1.0.0, assert-plus@^1.0.0: 171 | version "1.0.0" 172 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 173 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 174 | 175 | asynckit@^0.4.0: 176 | version "0.4.0" 177 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 178 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 179 | 180 | aws-sign2@~0.7.0: 181 | version "0.7.0" 182 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 183 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 184 | 185 | aws4@^1.8.0: 186 | version "1.9.0" 187 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" 188 | integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== 189 | 190 | balanced-match@^1.0.0: 191 | version "1.0.0" 192 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 193 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 194 | 195 | basic-auth@~2.0.0: 196 | version "2.0.1" 197 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 198 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 199 | dependencies: 200 | safe-buffer "5.1.2" 201 | 202 | bcrypt-pbkdf@^1.0.0: 203 | version "1.0.2" 204 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 205 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 206 | dependencies: 207 | tweetnacl "^0.14.3" 208 | 209 | bluebird@^3.5.0, bluebird@^3.7.1: 210 | version "3.7.2" 211 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 212 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 213 | 214 | body-parser@1.19.0: 215 | version "1.19.0" 216 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 217 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 218 | dependencies: 219 | bytes "3.1.0" 220 | content-type "~1.0.4" 221 | debug "2.6.9" 222 | depd "~1.1.2" 223 | http-errors "1.7.2" 224 | iconv-lite "0.4.24" 225 | on-finished "~2.3.0" 226 | qs "6.7.0" 227 | raw-body "2.4.0" 228 | type-is "~1.6.17" 229 | 230 | brace-expansion@^1.1.7: 231 | version "1.1.11" 232 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 233 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 234 | dependencies: 235 | balanced-match "^1.0.0" 236 | concat-map "0.0.1" 237 | 238 | builtin-modules@^1.1.1: 239 | version "1.1.1" 240 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 241 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 242 | 243 | bytes@3.1.0: 244 | version "3.1.0" 245 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 246 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 247 | 248 | caseless@~0.12.0: 249 | version "0.12.0" 250 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 251 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 252 | 253 | chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: 254 | version "2.4.2" 255 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 256 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 257 | dependencies: 258 | ansi-styles "^3.2.1" 259 | escape-string-regexp "^1.0.5" 260 | supports-color "^5.3.0" 261 | 262 | chalk@^3.0.0: 263 | version "3.0.0" 264 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 265 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 266 | dependencies: 267 | ansi-styles "^4.1.0" 268 | supports-color "^7.1.0" 269 | 270 | color-convert@^1.9.0: 271 | version "1.9.3" 272 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 273 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 274 | dependencies: 275 | color-name "1.1.3" 276 | 277 | color-convert@^2.0.1: 278 | version "2.0.1" 279 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 280 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 281 | dependencies: 282 | color-name "~1.1.4" 283 | 284 | color-name@1.1.3: 285 | version "1.1.3" 286 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 287 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 288 | 289 | color-name@~1.1.4: 290 | version "1.1.4" 291 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 292 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 293 | 294 | combined-stream@^1.0.6, combined-stream@~1.0.6: 295 | version "1.0.8" 296 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 297 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 298 | dependencies: 299 | delayed-stream "~1.0.0" 300 | 301 | commander@^2.12.1: 302 | version "2.20.3" 303 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 304 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 305 | 306 | concat-map@0.0.1: 307 | version "0.0.1" 308 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 309 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 310 | 311 | config@^3.2.4: 312 | version "3.2.4" 313 | resolved "https://registry.yarnpkg.com/config/-/config-3.2.4.tgz#e60a908582991e800852f9cb60fcf424f3274a6c" 314 | integrity sha512-H1XIGfnU1EAkfjSLn9ZvYDRx9lOezDViuzLDgiJ/lMeqjYe3q6iQfpcLt2NInckJgpAeekbNhQkmnnbdEDs9rw== 315 | dependencies: 316 | json5 "^1.0.1" 317 | 318 | content-disposition@0.5.3: 319 | version "0.5.3" 320 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 321 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 322 | dependencies: 323 | safe-buffer "5.1.2" 324 | 325 | content-type@~1.0.4: 326 | version "1.0.4" 327 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 328 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 329 | 330 | cookie-signature@1.0.6: 331 | version "1.0.6" 332 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 333 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 334 | 335 | cookie@0.4.0: 336 | version "0.4.0" 337 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 338 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 339 | 340 | core-util-is@1.0.2: 341 | version "1.0.2" 342 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 343 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 344 | 345 | dashdash@^1.12.0: 346 | version "1.14.1" 347 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 348 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 349 | dependencies: 350 | assert-plus "^1.0.0" 351 | 352 | debug@2.6.9: 353 | version "2.6.9" 354 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 355 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 356 | dependencies: 357 | ms "2.0.0" 358 | 359 | delayed-stream@~1.0.0: 360 | version "1.0.0" 361 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 362 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 363 | 364 | depd@~1.1.2: 365 | version "1.1.2" 366 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 367 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 368 | 369 | destroy@~1.0.4: 370 | version "1.0.4" 371 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 372 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 373 | 374 | diff@^4.0.1: 375 | version "4.0.1" 376 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" 377 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 378 | 379 | dom-serializer@0: 380 | version "0.2.2" 381 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" 382 | integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== 383 | dependencies: 384 | domelementtype "^2.0.1" 385 | entities "^2.0.0" 386 | 387 | domelementtype@1, domelementtype@^1.3.1: 388 | version "1.3.1" 389 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" 390 | integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== 391 | 392 | domelementtype@^2.0.1: 393 | version "2.0.1" 394 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" 395 | integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== 396 | 397 | domhandler@^2.3.0: 398 | version "2.4.2" 399 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" 400 | integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== 401 | dependencies: 402 | domelementtype "1" 403 | 404 | domutils@^1.5.1: 405 | version "1.7.0" 406 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" 407 | integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== 408 | dependencies: 409 | dom-serializer "0" 410 | domelementtype "1" 411 | 412 | ecc-jsbn@~0.1.1: 413 | version "0.1.2" 414 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 415 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 416 | dependencies: 417 | jsbn "~0.1.0" 418 | safer-buffer "^2.1.0" 419 | 420 | ee-first@1.1.1: 421 | version "1.1.1" 422 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 423 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 424 | 425 | encodeurl@~1.0.2: 426 | version "1.0.2" 427 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 428 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 429 | 430 | entities@^1.1.1: 431 | version "1.1.2" 432 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" 433 | integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== 434 | 435 | entities@^2.0.0: 436 | version "2.0.0" 437 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" 438 | integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== 439 | 440 | escape-html@^1.0.3, escape-html@~1.0.3: 441 | version "1.0.3" 442 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 443 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 444 | 445 | escape-string-regexp@^1.0.5: 446 | version "1.0.5" 447 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 448 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 449 | 450 | esprima@^4.0.0: 451 | version "4.0.1" 452 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 453 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 454 | 455 | esutils@^2.0.2: 456 | version "2.0.3" 457 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 458 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 459 | 460 | etag@~1.8.1: 461 | version "1.8.1" 462 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 463 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 464 | 465 | express@^4.17.1: 466 | version "4.17.1" 467 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 468 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 469 | dependencies: 470 | accepts "~1.3.7" 471 | array-flatten "1.1.1" 472 | body-parser "1.19.0" 473 | content-disposition "0.5.3" 474 | content-type "~1.0.4" 475 | cookie "0.4.0" 476 | cookie-signature "1.0.6" 477 | debug "2.6.9" 478 | depd "~1.1.2" 479 | encodeurl "~1.0.2" 480 | escape-html "~1.0.3" 481 | etag "~1.8.1" 482 | finalhandler "~1.1.2" 483 | fresh "0.5.2" 484 | merge-descriptors "1.0.1" 485 | methods "~1.1.2" 486 | on-finished "~2.3.0" 487 | parseurl "~1.3.3" 488 | path-to-regexp "0.1.7" 489 | proxy-addr "~2.0.5" 490 | qs "6.7.0" 491 | range-parser "~1.2.1" 492 | safe-buffer "5.1.2" 493 | send "0.17.1" 494 | serve-static "1.14.1" 495 | setprototypeof "1.1.1" 496 | statuses "~1.5.0" 497 | type-is "~1.6.18" 498 | utils-merge "1.0.1" 499 | vary "~1.1.2" 500 | 501 | extend@~3.0.2: 502 | version "3.0.2" 503 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 504 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 505 | 506 | extsprintf@1.3.0: 507 | version "1.3.0" 508 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 509 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 510 | 511 | extsprintf@^1.2.0: 512 | version "1.4.0" 513 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 514 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 515 | 516 | fast-deep-equal@^2.0.1: 517 | version "2.0.1" 518 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 519 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 520 | 521 | fast-json-stable-stringify@^2.0.0: 522 | version "2.1.0" 523 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 524 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 525 | 526 | finalhandler@~1.1.2: 527 | version "1.1.2" 528 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 529 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 530 | dependencies: 531 | debug "2.6.9" 532 | encodeurl "~1.0.2" 533 | escape-html "~1.0.3" 534 | on-finished "~2.3.0" 535 | parseurl "~1.3.3" 536 | statuses "~1.5.0" 537 | unpipe "~1.0.0" 538 | 539 | forever-agent@~0.6.1: 540 | version "0.6.1" 541 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 542 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 543 | 544 | form-data@^2.5.0: 545 | version "2.5.1" 546 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" 547 | integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== 548 | dependencies: 549 | asynckit "^0.4.0" 550 | combined-stream "^1.0.6" 551 | mime-types "^2.1.12" 552 | 553 | form-data@~2.3.2: 554 | version "2.3.3" 555 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 556 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 557 | dependencies: 558 | asynckit "^0.4.0" 559 | combined-stream "^1.0.6" 560 | mime-types "^2.1.12" 561 | 562 | forwarded@~0.1.2: 563 | version "0.1.2" 564 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 565 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 566 | 567 | fresh@0.5.2: 568 | version "0.5.2" 569 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 570 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 571 | 572 | fs.realpath@^1.0.0: 573 | version "1.0.0" 574 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 575 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 576 | 577 | getpass@^0.1.1: 578 | version "0.1.7" 579 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 580 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 581 | dependencies: 582 | assert-plus "^1.0.0" 583 | 584 | glob-to-regexp@^0.4.1: 585 | version "0.4.1" 586 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 587 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 588 | 589 | glob@^7.1.1: 590 | version "7.1.6" 591 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 592 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 593 | dependencies: 594 | fs.realpath "^1.0.0" 595 | inflight "^1.0.4" 596 | inherits "2" 597 | minimatch "^3.0.4" 598 | once "^1.3.0" 599 | path-is-absolute "^1.0.0" 600 | 601 | graceful-fs@^4.1.3: 602 | version "4.2.3" 603 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 604 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 605 | 606 | har-schema@^2.0.0: 607 | version "2.0.0" 608 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 609 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 610 | 611 | har-validator@~5.1.0: 612 | version "5.1.3" 613 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 614 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 615 | dependencies: 616 | ajv "^6.5.5" 617 | har-schema "^2.0.0" 618 | 619 | has-flag@^3.0.0: 620 | version "3.0.0" 621 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 622 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 623 | 624 | has-flag@^4.0.0: 625 | version "4.0.0" 626 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 627 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 628 | 629 | hash.js@^1.1.7: 630 | version "1.1.7" 631 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 632 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 633 | dependencies: 634 | inherits "^2.0.3" 635 | minimalistic-assert "^1.0.1" 636 | 637 | htmlencode@^0.0.4: 638 | version "0.0.4" 639 | resolved "https://registry.yarnpkg.com/htmlencode/-/htmlencode-0.0.4.tgz#f7e2d6afbe18a87a78e63ba3308e753766740e3f" 640 | integrity sha1-9+LWr74YqHp45jujMI51N2Z0Dj8= 641 | 642 | htmlparser2@^3.10.0: 643 | version "3.10.1" 644 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" 645 | integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== 646 | dependencies: 647 | domelementtype "^1.3.1" 648 | domhandler "^2.3.0" 649 | domutils "^1.5.1" 650 | entities "^1.1.1" 651 | inherits "^2.0.1" 652 | readable-stream "^3.1.1" 653 | 654 | http-errors@1.7.2: 655 | version "1.7.2" 656 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 657 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 658 | dependencies: 659 | depd "~1.1.2" 660 | inherits "2.0.3" 661 | setprototypeof "1.1.1" 662 | statuses ">= 1.5.0 < 2" 663 | toidentifier "1.0.0" 664 | 665 | http-errors@~1.7.2: 666 | version "1.7.3" 667 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 668 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 669 | dependencies: 670 | depd "~1.1.2" 671 | inherits "2.0.4" 672 | setprototypeof "1.1.1" 673 | statuses ">= 1.5.0 < 2" 674 | toidentifier "1.0.0" 675 | 676 | http-signature@~1.2.0: 677 | version "1.2.0" 678 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 679 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 680 | dependencies: 681 | assert-plus "^1.0.0" 682 | jsprim "^1.2.2" 683 | sshpk "^1.7.0" 684 | 685 | iconv-lite@0.4.24: 686 | version "0.4.24" 687 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 688 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 689 | dependencies: 690 | safer-buffer ">= 2.1.2 < 3" 691 | 692 | inflight@^1.0.4: 693 | version "1.0.6" 694 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 695 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 696 | dependencies: 697 | once "^1.3.0" 698 | wrappy "1" 699 | 700 | inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3: 701 | version "2.0.4" 702 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 703 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 704 | 705 | inherits@2.0.3: 706 | version "2.0.3" 707 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 708 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 709 | 710 | ipaddr.js@1.9.0: 711 | version "1.9.0" 712 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" 713 | integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== 714 | 715 | is-promise@^2.1.0: 716 | version "2.1.0" 717 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 718 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 719 | 720 | is-typedarray@~1.0.0: 721 | version "1.0.0" 722 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 723 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 724 | 725 | isstream@~0.1.2: 726 | version "0.1.2" 727 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 728 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 729 | 730 | js-tokens@^4.0.0: 731 | version "4.0.0" 732 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 733 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 734 | 735 | js-yaml@^3.13.1: 736 | version "3.13.1" 737 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 738 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 739 | dependencies: 740 | argparse "^1.0.7" 741 | esprima "^4.0.0" 742 | 743 | jsbn@~0.1.0: 744 | version "0.1.1" 745 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 746 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 747 | 748 | json-schema-traverse@^0.4.1: 749 | version "0.4.1" 750 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 751 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 752 | 753 | json-schema@0.2.3: 754 | version "0.2.3" 755 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 756 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 757 | 758 | json-stringify-safe@~5.0.1: 759 | version "5.0.1" 760 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 761 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 762 | 763 | json5@^1.0.1: 764 | version "1.0.1" 765 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 766 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 767 | dependencies: 768 | minimist "^1.2.0" 769 | 770 | jsprim@^1.2.2: 771 | version "1.4.1" 772 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 773 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 774 | dependencies: 775 | assert-plus "1.0.0" 776 | extsprintf "1.3.0" 777 | json-schema "0.2.3" 778 | verror "1.10.0" 779 | 780 | lodash.clonedeep@^4.5.0: 781 | version "4.5.0" 782 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 783 | integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= 784 | 785 | lodash.escaperegexp@^4.1.2: 786 | version "4.1.2" 787 | resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" 788 | integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= 789 | 790 | lodash.isplainobject@^4.0.6: 791 | version "4.0.6" 792 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 793 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 794 | 795 | lodash.isstring@^4.0.1: 796 | version "4.0.1" 797 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 798 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 799 | 800 | lodash.mergewith@^4.6.1: 801 | version "4.6.2" 802 | resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" 803 | integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== 804 | 805 | lodash@4, lodash@^4.17.15: 806 | version "4.17.15" 807 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 808 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 809 | 810 | lowdb@^1.0.0: 811 | version "1.0.0" 812 | resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" 813 | integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== 814 | dependencies: 815 | graceful-fs "^4.1.3" 816 | is-promise "^2.1.0" 817 | lodash "4" 818 | pify "^3.0.0" 819 | steno "^0.4.1" 820 | 821 | lru-cache@^5.1.1: 822 | version "5.1.1" 823 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 824 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 825 | dependencies: 826 | yallist "^3.0.2" 827 | 828 | matrix-bot-sdk@^0.4.0-beta.19: 829 | version "0.4.0" 830 | resolved "https://registry.yarnpkg.com/matrix-bot-sdk/-/matrix-bot-sdk-0.4.0.tgz#a2189e9cdb01d34b2a9c56003167eb33b1a12752" 831 | integrity sha512-ZIICFEYDsSX3emPnVRTV1FIV22zkt7KiJbTYN4rHQ3Z/rk66RB7Y+TMHxrkJCqPs3xVdaGmGkh5m+hNi4fibRg== 832 | dependencies: 833 | "@types/express" "^4.17.2" 834 | bluebird "^3.7.1" 835 | chalk "^3.0.0" 836 | express "^4.17.1" 837 | glob-to-regexp "^0.4.1" 838 | hash.js "^1.1.7" 839 | htmlencode "^0.0.4" 840 | lowdb "^1.0.0" 841 | lru-cache "^5.1.1" 842 | mkdirp "^0.5.1" 843 | morgan "^1.9.1" 844 | request "^2.88.0" 845 | request-promise "^4.2.5" 846 | sanitize-html "^1.20.1" 847 | 848 | media-typer@0.3.0: 849 | version "0.3.0" 850 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 851 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 852 | 853 | merge-descriptors@1.0.1: 854 | version "1.0.1" 855 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 856 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 857 | 858 | methods@~1.1.2: 859 | version "1.1.2" 860 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 861 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 862 | 863 | mime-db@1.42.0: 864 | version "1.42.0" 865 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" 866 | integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== 867 | 868 | mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: 869 | version "2.1.25" 870 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" 871 | integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== 872 | dependencies: 873 | mime-db "1.42.0" 874 | 875 | mime@1.6.0: 876 | version "1.6.0" 877 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 878 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 879 | 880 | minimalistic-assert@^1.0.1: 881 | version "1.0.1" 882 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 883 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 884 | 885 | minimatch@^3.0.4: 886 | version "3.0.4" 887 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 888 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 889 | dependencies: 890 | brace-expansion "^1.1.7" 891 | 892 | minimist@0.0.8: 893 | version "0.0.8" 894 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 895 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 896 | 897 | minimist@^1.2.0: 898 | version "1.2.0" 899 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 900 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 901 | 902 | mkdirp@^0.5.1: 903 | version "0.5.1" 904 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 905 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 906 | dependencies: 907 | minimist "0.0.8" 908 | 909 | morgan@^1.9.1: 910 | version "1.9.1" 911 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" 912 | integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== 913 | dependencies: 914 | basic-auth "~2.0.0" 915 | debug "2.6.9" 916 | depd "~1.1.2" 917 | on-finished "~2.3.0" 918 | on-headers "~1.0.1" 919 | 920 | ms@2.0.0: 921 | version "2.0.0" 922 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 923 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 924 | 925 | ms@2.1.1: 926 | version "2.1.1" 927 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 928 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 929 | 930 | negotiator@0.6.2: 931 | version "0.6.2" 932 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 933 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 934 | 935 | number-is-nan@^1.0.0: 936 | version "1.0.1" 937 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 938 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 939 | 940 | oauth-sign@~0.9.0: 941 | version "0.9.0" 942 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 943 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 944 | 945 | on-finished@~2.3.0: 946 | version "2.3.0" 947 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 948 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 949 | dependencies: 950 | ee-first "1.1.1" 951 | 952 | on-headers@~1.0.1: 953 | version "1.0.2" 954 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 955 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 956 | 957 | once@^1.3.0: 958 | version "1.4.0" 959 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 960 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 961 | dependencies: 962 | wrappy "1" 963 | 964 | parseurl@~1.3.3: 965 | version "1.3.3" 966 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 967 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 968 | 969 | path-is-absolute@^1.0.0: 970 | version "1.0.1" 971 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 972 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 973 | 974 | path-parse@^1.0.6: 975 | version "1.0.6" 976 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 977 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 978 | 979 | path-to-regexp@0.1.7: 980 | version "0.1.7" 981 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 982 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 983 | 984 | performance-now@^2.1.0: 985 | version "2.1.0" 986 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 987 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 988 | 989 | pify@^3.0.0: 990 | version "3.0.0" 991 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 992 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 993 | 994 | postcss@^7.0.5: 995 | version "7.0.24" 996 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.24.tgz#972c3c5be431b32e40caefe6c81b5a19117704c2" 997 | integrity sha512-Xl0XvdNWg+CblAXzNvbSOUvgJXwSjmbAKORqyw9V2AlHrm1js2gFw9y3jibBAhpKZi8b5JzJCVh/FyzPsTtgTA== 998 | dependencies: 999 | chalk "^2.4.2" 1000 | source-map "^0.6.1" 1001 | supports-color "^6.1.0" 1002 | 1003 | proxy-addr@~2.0.5: 1004 | version "2.0.5" 1005 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" 1006 | integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== 1007 | dependencies: 1008 | forwarded "~0.1.2" 1009 | ipaddr.js "1.9.0" 1010 | 1011 | psl@^1.1.24, psl@^1.1.28: 1012 | version "1.6.0" 1013 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" 1014 | integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== 1015 | 1016 | punycode@^1.4.1: 1017 | version "1.4.1" 1018 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1019 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1020 | 1021 | punycode@^2.1.0, punycode@^2.1.1: 1022 | version "2.1.1" 1023 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1024 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1025 | 1026 | qs@6.7.0: 1027 | version "6.7.0" 1028 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1029 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1030 | 1031 | qs@~6.5.2: 1032 | version "6.5.2" 1033 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1034 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1035 | 1036 | range-parser@~1.2.1: 1037 | version "1.2.1" 1038 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1039 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1040 | 1041 | raw-body@2.4.0: 1042 | version "2.4.0" 1043 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1044 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1045 | dependencies: 1046 | bytes "3.1.0" 1047 | http-errors "1.7.2" 1048 | iconv-lite "0.4.24" 1049 | unpipe "1.0.0" 1050 | 1051 | readable-stream@^3.1.1: 1052 | version "3.4.0" 1053 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" 1054 | integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== 1055 | dependencies: 1056 | inherits "^2.0.3" 1057 | string_decoder "^1.1.1" 1058 | util-deprecate "^1.0.1" 1059 | 1060 | request-promise-core@1.1.3: 1061 | version "1.1.3" 1062 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" 1063 | integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== 1064 | dependencies: 1065 | lodash "^4.17.15" 1066 | 1067 | request-promise-native@^1.0.8: 1068 | version "1.0.8" 1069 | resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" 1070 | integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== 1071 | dependencies: 1072 | request-promise-core "1.1.3" 1073 | stealthy-require "^1.1.1" 1074 | tough-cookie "^2.3.3" 1075 | 1076 | request-promise@^4.2.5: 1077 | version "4.2.5" 1078 | resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.5.tgz#186222c59ae512f3497dfe4d75a9c8461bd0053c" 1079 | integrity sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg== 1080 | dependencies: 1081 | bluebird "^3.5.0" 1082 | request-promise-core "1.1.3" 1083 | stealthy-require "^1.1.1" 1084 | tough-cookie "^2.3.3" 1085 | 1086 | request@^2.88.0: 1087 | version "2.88.0" 1088 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" 1089 | integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== 1090 | dependencies: 1091 | aws-sign2 "~0.7.0" 1092 | aws4 "^1.8.0" 1093 | caseless "~0.12.0" 1094 | combined-stream "~1.0.6" 1095 | extend "~3.0.2" 1096 | forever-agent "~0.6.1" 1097 | form-data "~2.3.2" 1098 | har-validator "~5.1.0" 1099 | http-signature "~1.2.0" 1100 | is-typedarray "~1.0.0" 1101 | isstream "~0.1.2" 1102 | json-stringify-safe "~5.0.1" 1103 | mime-types "~2.1.19" 1104 | oauth-sign "~0.9.0" 1105 | performance-now "^2.1.0" 1106 | qs "~6.5.2" 1107 | safe-buffer "^5.1.2" 1108 | tough-cookie "~2.4.3" 1109 | tunnel-agent "^0.6.0" 1110 | uuid "^3.3.2" 1111 | 1112 | resolve@^1.3.2: 1113 | version "1.13.1" 1114 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" 1115 | integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== 1116 | dependencies: 1117 | path-parse "^1.0.6" 1118 | 1119 | safe-buffer@5.1.2: 1120 | version "5.1.2" 1121 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1122 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1123 | 1124 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: 1125 | version "5.2.0" 1126 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1127 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1128 | 1129 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1130 | version "2.1.2" 1131 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1132 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1133 | 1134 | sanitize-html@^1.20.1: 1135 | version "1.20.1" 1136 | resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.20.1.tgz#f6effdf55dd398807171215a62bfc21811bacf85" 1137 | integrity sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA== 1138 | dependencies: 1139 | chalk "^2.4.1" 1140 | htmlparser2 "^3.10.0" 1141 | lodash.clonedeep "^4.5.0" 1142 | lodash.escaperegexp "^4.1.2" 1143 | lodash.isplainobject "^4.0.6" 1144 | lodash.isstring "^4.0.1" 1145 | lodash.mergewith "^4.6.1" 1146 | postcss "^7.0.5" 1147 | srcset "^1.0.0" 1148 | xtend "^4.0.1" 1149 | 1150 | semver@^5.3.0: 1151 | version "5.7.1" 1152 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1153 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1154 | 1155 | send@0.17.1: 1156 | version "0.17.1" 1157 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1158 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1159 | dependencies: 1160 | debug "2.6.9" 1161 | depd "~1.1.2" 1162 | destroy "~1.0.4" 1163 | encodeurl "~1.0.2" 1164 | escape-html "~1.0.3" 1165 | etag "~1.8.1" 1166 | fresh "0.5.2" 1167 | http-errors "~1.7.2" 1168 | mime "1.6.0" 1169 | ms "2.1.1" 1170 | on-finished "~2.3.0" 1171 | range-parser "~1.2.1" 1172 | statuses "~1.5.0" 1173 | 1174 | serve-static@1.14.1: 1175 | version "1.14.1" 1176 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1177 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1178 | dependencies: 1179 | encodeurl "~1.0.2" 1180 | escape-html "~1.0.3" 1181 | parseurl "~1.3.3" 1182 | send "0.17.1" 1183 | 1184 | setprototypeof@1.1.1: 1185 | version "1.1.1" 1186 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1187 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1188 | 1189 | source-map@^0.6.1: 1190 | version "0.6.1" 1191 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1192 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1193 | 1194 | sprintf-js@~1.0.2: 1195 | version "1.0.3" 1196 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1197 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1198 | 1199 | srcset@^1.0.0: 1200 | version "1.0.0" 1201 | resolved "https://registry.yarnpkg.com/srcset/-/srcset-1.0.0.tgz#a5669de12b42f3b1d5e83ed03c71046fc48f41ef" 1202 | integrity sha1-pWad4StC87HV6D7QPHEEb8SPQe8= 1203 | dependencies: 1204 | array-uniq "^1.0.2" 1205 | number-is-nan "^1.0.0" 1206 | 1207 | sshpk@^1.7.0: 1208 | version "1.16.1" 1209 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 1210 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 1211 | dependencies: 1212 | asn1 "~0.2.3" 1213 | assert-plus "^1.0.0" 1214 | bcrypt-pbkdf "^1.0.0" 1215 | dashdash "^1.12.0" 1216 | ecc-jsbn "~0.1.1" 1217 | getpass "^0.1.1" 1218 | jsbn "~0.1.0" 1219 | safer-buffer "^2.0.2" 1220 | tweetnacl "~0.14.0" 1221 | 1222 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1223 | version "1.5.0" 1224 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1225 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1226 | 1227 | stealthy-require@^1.1.1: 1228 | version "1.1.1" 1229 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 1230 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 1231 | 1232 | steno@^0.4.1: 1233 | version "0.4.4" 1234 | resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" 1235 | integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs= 1236 | dependencies: 1237 | graceful-fs "^4.1.3" 1238 | 1239 | string_decoder@^1.1.1: 1240 | version "1.3.0" 1241 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1242 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1243 | dependencies: 1244 | safe-buffer "~5.2.0" 1245 | 1246 | supports-color@^5.3.0: 1247 | version "5.5.0" 1248 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1249 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1250 | dependencies: 1251 | has-flag "^3.0.0" 1252 | 1253 | supports-color@^6.1.0: 1254 | version "6.1.0" 1255 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 1256 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 1257 | dependencies: 1258 | has-flag "^3.0.0" 1259 | 1260 | supports-color@^7.1.0: 1261 | version "7.1.0" 1262 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1263 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1264 | dependencies: 1265 | has-flag "^4.0.0" 1266 | 1267 | toidentifier@1.0.0: 1268 | version "1.0.0" 1269 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1270 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1271 | 1272 | tough-cookie@^2.3.3: 1273 | version "2.5.0" 1274 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 1275 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 1276 | dependencies: 1277 | psl "^1.1.28" 1278 | punycode "^2.1.1" 1279 | 1280 | tough-cookie@~2.4.3: 1281 | version "2.4.3" 1282 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" 1283 | integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== 1284 | dependencies: 1285 | psl "^1.1.24" 1286 | punycode "^1.4.1" 1287 | 1288 | tslib@^1.8.0, tslib@^1.8.1: 1289 | version "1.10.0" 1290 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1291 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1292 | 1293 | tslint@^5.20.1: 1294 | version "5.20.1" 1295 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" 1296 | integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== 1297 | dependencies: 1298 | "@babel/code-frame" "^7.0.0" 1299 | builtin-modules "^1.1.1" 1300 | chalk "^2.3.0" 1301 | commander "^2.12.1" 1302 | diff "^4.0.1" 1303 | glob "^7.1.1" 1304 | js-yaml "^3.13.1" 1305 | minimatch "^3.0.4" 1306 | mkdirp "^0.5.1" 1307 | resolve "^1.3.2" 1308 | semver "^5.3.0" 1309 | tslib "^1.8.0" 1310 | tsutils "^2.29.0" 1311 | 1312 | tsutils@^2.29.0: 1313 | version "2.29.0" 1314 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 1315 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 1316 | dependencies: 1317 | tslib "^1.8.1" 1318 | 1319 | tunnel-agent@^0.6.0: 1320 | version "0.6.0" 1321 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1322 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 1323 | dependencies: 1324 | safe-buffer "^5.0.1" 1325 | 1326 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1327 | version "0.14.5" 1328 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1329 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 1330 | 1331 | type-is@~1.6.17, type-is@~1.6.18: 1332 | version "1.6.18" 1333 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1334 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1335 | dependencies: 1336 | media-typer "0.3.0" 1337 | mime-types "~2.1.24" 1338 | 1339 | typescript@^3.7.2: 1340 | version "3.7.3" 1341 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" 1342 | integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== 1343 | 1344 | unpipe@1.0.0, unpipe@~1.0.0: 1345 | version "1.0.0" 1346 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1347 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1348 | 1349 | uri-js@^4.2.2: 1350 | version "4.2.2" 1351 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1352 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1353 | dependencies: 1354 | punycode "^2.1.0" 1355 | 1356 | util-deprecate@^1.0.1: 1357 | version "1.0.2" 1358 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1359 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1360 | 1361 | utils-merge@1.0.1: 1362 | version "1.0.1" 1363 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1364 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1365 | 1366 | uuid@^3.3.2: 1367 | version "3.3.3" 1368 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" 1369 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== 1370 | 1371 | vary@~1.1.2: 1372 | version "1.1.2" 1373 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1374 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1375 | 1376 | verror@1.10.0: 1377 | version "1.10.0" 1378 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1379 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 1380 | dependencies: 1381 | assert-plus "^1.0.0" 1382 | core-util-is "1.0.2" 1383 | extsprintf "^1.2.0" 1384 | 1385 | wrappy@1: 1386 | version "1.0.2" 1387 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1388 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1389 | 1390 | xtend@^4.0.1: 1391 | version "4.0.2" 1392 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1393 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1394 | 1395 | yallist@^3.0.2: 1396 | version "3.1.1" 1397 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1398 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1399 | --------------------------------------------------------------------------------