├── .gitignore
├── CommandNotes.md
├── Items.md
├── README.md
├── build.js
├── commands.json
├── config.js
├── control.js
├── graphics
└── index.html
├── icon
├── SourceTwitchIntegration.png
└── SourceTwitchIntegration.psd
├── index.js
├── items.json
├── lib
└── voting.js
├── package-lock.json
├── package.json
├── portal-hl2
└── Twitch.dll
├── setup
└── OBSScreenshot.png
├── titanfall2
└── TTF2SDK.dll
└── twitch-login.example.json
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | twitch-login.js
3 | twitch-login.json
4 | dist.zip
5 | TTI.zip
6 | dist
7 | dist/
8 | dist/*
9 | /dist
10 | /dist/*
11 | dist\
12 | \dist\
13 | \dist*
14 | \dist\*
15 | testing.json
16 | *.exe
17 |
--------------------------------------------------------------------------------
/CommandNotes.md:
--------------------------------------------------------------------------------
1 | # Command notes for specific games
2 |
3 | ## Titannfall 2
4 |
5 | **FOV SCALE**
6 |
7 | * 1.55 - 110
8 |
9 | * 1.42003 - 100
10 |
11 | * 1.28442 - 90
12 |
13 | * 1.13185 - 80
14 |
15 | * 1 - 70
16 |
--------------------------------------------------------------------------------
/Items.md:
--------------------------------------------------------------------------------
1 | # Items
2 |
3 | ## How to use
4 | With Bits:
5 | You can use bits to give the streamer items e.g ``PogChamp20 give tone``
6 |
7 | Without Bits:
8 | If you used !claim you can now use ``!give tone``
9 |
10 | ## Items
11 |
12 | |Command|Description|
13 | |---|---|
14 | |expedition|The gun loadout from Expedition|
15 | |tone|The gun loadout from Tone|
16 | |scorch|The gun loadout from Scorch|
17 | |brute|The gun loadout from Brute|
18 | |ion|The gun loadout from Ion|
19 | |ronin|The gun loadout from Ronin|
20 | |northstar|The gun loadout from Northstar|
21 | |legion|The gun loadout from Legion|
22 | |hover|The Hover ability from the Brute loadout|
23 | |dash|The Phase Dash ability from the Ronin loadout|
24 | |spicyBoys|Give the streamer some Spicy Boys|
25 | |eva|Give the streamer an EVA Shotgun|
26 | |kraber|Give the streamer a Kraber Sniper|
27 | |wingman|Give the streamer a Wingman Handgun|
28 | |r201|Give the streamer a R-201 Assault Rifle|
29 | |swarm|Creat a swarm of ticks wherever the player is looking|
30 | |nogun|Hide the gun|
31 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |

2 |
3 | # Source Twitch Integration
4 |
5 | Using Twitch chat and Icepick to dynamically change the gameplay in Titanfall 2
6 |
7 | ## Installation
8 |
9 | - Download Icepick [here](https://titanfallmods.com)
10 | - Download the latest release of Source Twitch Integration from [here](https://github.com/taskinoz/source-twitch-integration/releases/)
11 | - Add your username, oath key and channel name to the ``twitch-login.example.json`` and rename it to ``twitch-login.json``. **Get your OATH key [here](https://twitchapps.com/tmi/)**
12 | - Change the voting times in ``config.json`` if needed (Default is 30s for voting and 60s for playtime)
13 | - Patch Icepick by moving the DLL from ``\patch\TTF2SDK.dll`` (Thanks McSimp) into the Icepick folder, replacing the `TTF2SDK.dll` that was already there
14 | - Remove the mods from icepick in ``ICEPICKFOLDER\data\mods``
15 | - Launch Titanfall 2 from the newly patched Icepick launcher
16 | - Follow the **Setup** instructions and run ``TTI.exe``
17 |
18 | ## Setup
19 |
20 | - To use the Graphics pack in OBS add a new `Browser` in the `Sources` menu and set the URL to `http://localhost/` or `http://localhost:80/`
21 | - Set the Width and Heigh to the window size e.g width:1920 - height:1080
22 | - Remove the CSS unless you want to change some of the styles and colors.
23 | - Additionally you can check `Refresh browser when scene becomes active`
24 |
25 | 
26 |
27 | ## Bugs & Issues
28 |
29 | The mod isn't perfect and will crash when playing Beacon Chapter 2 just before getting the tool gun from the Marvin
30 |
31 | If you are having issues showing the graphics in OBS:
32 | - try disabling the Browser source and Re-enabling it
33 | - click the `Refresh cache of current page` button in the Browser source properties
34 | - make sure the local server is running. This [link](http://localhost/) will open it
35 |
36 | ## Development
37 |
38 | - Clone the repository
39 | - Run `npm install`
40 | - Configure the twith-login.json (See Installation)
41 | - Start the twitch integration `npm start`
42 |
--------------------------------------------------------------------------------
/build.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taskinoz/source-twitch-integration/bae157962018ca3299be938a702742c6cc1c1092/build.js
--------------------------------------------------------------------------------
/commands.json:
--------------------------------------------------------------------------------
1 | {
2 | "tfall2": {
3 | "lowGravity": ["sv_gravity 300", "Low Gravity"],
4 | "highGravity": ["sv_gravity 2000", "High Gravity"],
5 | "inverted": ["m_invert_pitch 1", "Inverted Camera"],
6 | "lowFOV": ["cl_fovScale 1", "Change FOV"],
7 | "difficultyRegular": ["sp_difficulty 1", "Regular Difficulty"],
8 | "difficultyHard": ["sp_difficulty 2", "Hard Difficulty"],
9 | "difficultyMaster": ["sp_difficulty 3", "Master Difficulty"],
10 | "lastCheckpoint": ["load savegame", "Load Last Checkpoint"],
11 | "killPlayer": ["ent_fire player sethealth 0", "Kill Player"],
12 | "slowmoSpeed": ["host_timescale 0.5", "Slowmo"],
13 | "doubleSpeed": ["host_timescale 2", "Fast Forward"],
14 | "turboSpeed": ["host_timescale 5", "Turbo Speed"],
15 | "thirdPerson": ["thirdperson; thirdperson_screenspace 1", "Third Person Camera"],
16 | "wallrunningOff": ["wallrun_enable 0", "Disable Wallrunning"],
17 | "blurScreen": ["dof_overrideParams 1;dof_nearDepthStart 1;dof_nearDepthEnd 3000;dof_farDepthStart 1","Blur Screen"],
18 | "reset": "firstperson;thirdperson_mayamode 0;thirdperson_screenspace 0;host_timescale 1;sp_difficulty 0;m_invert_pitch 0;sv_gravity 750;cl_fovScale 1.42003;wallrun_enable 1;dof_overrideParams 0;dof_nearDepthStart 7.5;dof_nearDepthEnd 7.7;dof_farDepthStart 2000;dof_farDepthEnd 30000"
19 | },
20 | "pt":{
21 | "lowGravity": ["sv_gravity 100", "Low Gravity"],
22 | "highGravity": ["sv_gravity 2000", "High Gravity"],
23 | "killPlayer": ["kill", "Kill Player"],
24 | "slowmoSpeed": ["host_timescale 0.5", "Slowmo"],
25 | "doubleSpeed": ["host_timescale 2", "Fast Forward"],
26 | "turboSpeed": ["host_timescale 5", "Turbo Speed"],
27 | "dodgeBall": ["fire_energy_ball;wait 2000;fire_energy_ball;wait 2000;fire_energy_ball;", "Dodgeball"],
28 | "thirdPerson": ["thirdperson", "Third Person Camera"],
29 | "blindMode": ["r_farz 1;gl_clear 1;wait 2000;r_farz -1;wait 2000;r_farz 1;wait 2000;r_farz -1;wait 2000;r_farz 1;wait 2000;r_farz -1;r_farz 1;", "Blind Mode"],
30 | "wallHax": ["r_drawworld 0;gl_clear 1", "Wall Hax"],
31 | "noCrosshair": ["crosshair 0", "No Crosshair"],
32 | "hairball": ["CreateHairball", "Hairball"],
33 | "portalsAnywhere": ["sv_portal_placement_never_fail 1", "Portals Anywhere"],
34 | "ignitePlayer": ["ent_fire !self ignite;ent_fire !self ignitelifetime 30", "Ignite Player"],
35 | "createAirboat":["impulse 83","Create Airboat"],
36 | "reset": "sv_gravity 600;host_timescale 1;firstperson;sv_portal_placement_never_fail 0;r_drawworld 1;gl_clear 0;r_farz -1;crosshair 1;ent_fire !self ignitelifetime 0;"
37 | },
38 | "hl2":{
39 | "lowGravity": ["sv_gravity 300", "Low Gravity"],
40 | "highGravity": ["sv_gravity 2000", "High Gravity"],
41 | "killPlayer": ["kill", "Kill Player"],
42 | "slowmoSpeed": ["host_timescale 0.5", "Slowmo"],
43 | "doubleSpeed": ["host_timescale 2", "Fast Forward"],
44 | "turboSpeed": ["host_timescale 5", "Turbo Speed"],
45 | "reset": "sv_gravity 700;host_timescale 1;"
46 | },
47 | "bm":{
48 | "lowGravity": ["sv_gravity 300", "Low Gravity"],
49 | "highGravity": ["sv_gravity 2000", "High Gravity"],
50 | "killPlayer": ["kill", "Kill Player"],
51 | "slowmoSpeed": ["host_timescale 0.5", "Slowmo"],
52 | "doubleSpeed": ["host_timescale 2", "Fast Forward"],
53 | "turboSpeed": ["host_timescale 5", "Turbo Speed"],
54 | "reset": "sv_gravity 700;host_timescale 1;"
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | game: "tfall2",
3 | votingTime: "30",
4 | playTime: "60",
5 | enableItems: true,
6 | bitItemsAmount: 10,
7 | freeBitItemsInterval: "120s"
8 | }
9 |
10 |
11 | // Games List
12 | /*
13 | TITANFALL 2 = tfall2
14 | Portal = pt
15 | Half Life 2 = hl2
16 | Black Mesa = bm
17 | */
18 |
--------------------------------------------------------------------------------
/control.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const pipe = '\\\\.\\pipe\\TTF2SDK';
3 | setTimeout(() => {
4 | fs.writeFileSync(pipe, 'CGetLocalClientPlayer().ClientCommand("+offhand0")')
5 | setTimeout(() => fs.writeFileSync(pipe, 'CGetLocalClientPlayer().ClientCommand("-offhand0")'), 500)
6 | }, 1000)
7 |
8 |
9 | setTimeout(() => {
10 | const f = fs.openSync(pipe, 'w');
11 | fs.writeSync(f, 'CGetLocalClientPlayer().ClientCommand("+offhand0")');
12 | setTimeout(() => fs.writeSync(f, 'CGetLocalClientPlayer().ClientCommand("-offhand0")'), 500)
13 | }, 1000)
14 |
--------------------------------------------------------------------------------
/graphics/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Voting Graphs
8 |
91 |
95 |
137 |
138 |
139 |
140 |
141 |
142 |
loading...
143 |
0
144 |
145 |
146 |
loading...
147 |
0
148 |
149 |
150 |
loading...
151 |
0
152 |
153 |
154 |
Winner
155 |
loading...
156 |
157 |
158 |
161 |
162 |
163 |
164 |
--------------------------------------------------------------------------------
/icon/SourceTwitchIntegration.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taskinoz/source-twitch-integration/bae157962018ca3299be938a702742c6cc1c1092/icon/SourceTwitchIntegration.png
--------------------------------------------------------------------------------
/icon/SourceTwitchIntegration.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taskinoz/source-twitch-integration/bae157962018ca3299be938a702742c6cc1c1092/icon/SourceTwitchIntegration.psd
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | // LIBRARY IMPORTS
2 | // ------------------------------------------------------
3 | const TwitchBot = require('twitch-bot'); // https://github.com/kritzware/twitch-bot
4 | var fs = require('fs');
5 | var http = require('http');
6 | var url = require('url');
7 | const Login = JSON.parse(fs.readFileSync('twitch-login.json', 'utf8'));
8 | const Config = require('./config.js');
9 | // Pipe Config
10 | if (Config.game == "tfall2") {
11 | var pipe = '\\\\.\\pipe\\TTF2SDK'; // Titanfall Pipe
12 | }
13 | else {
14 | var pipe = '\\\\.\\pipe\\SourceCommands'; // Source Games Pipe
15 | }
16 | // ------------------------------------------------------
17 |
18 | //TWITCH CONFIG
19 | // ------------------------------------------------------
20 | //Login Info
21 | const Bot = new TwitchBot({
22 | username: Login.username,
23 | oauth: Login.oauth,
24 | channels: [Login.channels]
25 | })
26 | // ------------------------------------------------------
27 |
28 | // GAME COMMANDS
29 | // ------------------------------------------------------
30 | // Find the commands in the commands.json
31 | const CommandFile = JSON.parse(fs.readFileSync('commands.json', 'utf8'));
32 | const Commands = CommandFile[Config.game];
33 | //console.log(Commands);
34 |
35 | // ------------------------------------------------------
36 |
37 | // FLAGS AND VARIABLES
38 | // ------------------------------------------------------
39 | var voting = false;
40 | var votes1 = 0, votes2 = 0, votes3 = 0; // Vote counts
41 | var voteStor = []; // Current vote storage
42 | var winning;
43 | var temp = [];
44 | var foo = 0;
45 | var tempCounting = [];
46 | const keys = Object.keys(Commands);
47 | var x;
48 | // ------------------------------------------------------
49 |
50 | // FUNCTIONS
51 | // ------------------------------------------------------
52 | // Item function
53 | // Get Items Config
54 | if (Config.enableItems && Config.game=="tfall2") {
55 | var Items = JSON.parse(fs.readFileSync('items.json', 'utf8'));
56 | var freeItem = "";
57 |
58 | setInterval(function() {
59 | //freeItem="";
60 | setTimeout(function () {
61 | Bot.say("Find out how to give the streamer items - https://github.com/taskinoz/source-twitch-integration/blob/master/Items.md");
62 | },Math.floor(Math.random()*Math.floor(100))*1000);
63 | if (freeItem!="") {
64 | Bot.say("Find out how to give the streamer items - https://github.com/taskinoz/source-twitch-integration/blob/master/Items.md");
65 | }
66 | else {
67 | Bot.say("Free item command !claim");
68 | }
69 | },(Config.freeBitItemsInterval).split("s")[0]*1000);
70 | }
71 |
72 | // Runs through the Commands object and picks 3 random ones
73 | function generateCommands() {
74 | for (let i = 0; i < 3; i++) {
75 | x=Math.floor(Math.random() * (keys.length-1));
76 | do {
77 | x=Math.floor(Math.random() * (keys.length-1));
78 | }
79 | while (temp.includes(x));
80 | temp.push(x);
81 | // Make 2D array for the commands
82 | voteStor.push([Commands[keys[temp[i]]][0]]);
83 | voteStor[i].push(Commands[keys[temp[i]]][1]);
84 | }
85 | }
86 |
87 | // Say the currently chosen commands in twitch chat
88 | function sayCommands() {
89 | Bot.say("Use ! to choose an Command");
90 | Bot.say("!1 - "+voteStor[0][1]);
91 | Bot.say("!2 - "+voteStor[1][1]);
92 | Bot.say("!3 - "+voteStor[2][1]);
93 | }
94 |
95 | // Write commands to Source games
96 | function sourceCmd(a) {
97 | fs.writeFileSync(pipe, a);
98 | }
99 |
100 | // Run a command in Titanfall
101 | function generalCmd(a) {
102 | fs.writeFileSync(pipe, 'CGetLocalClientPlayer().ClientCommand("'+a+'")');
103 | }
104 |
105 | // The same as generalCmd but adds a + and a - to
106 | // start and stop a movement command
107 | function movementCmd(a) {
108 | fs.writeFileSync(pipe, 'CGetLocalClientPlayer().ClientCommand("+'+a+'")');
109 | setTimeout(function () {
110 | fs.writeFileSync(pipe, 'CGetLocalClientPlayer().ClientCommand("-'+a+'")');
111 | }, 1000)
112 | }
113 |
114 | function compareVotes(x,y,z) {
115 | tempCounting=[x,y,z];
116 | for (let i = 0; i < tempCounting.length; i++) {
117 | if (tempCounting[i]==Math.max(x,y,z)){
118 | // Futureproofing for using movement commands like +jump
119 | if ((voteStor[i][0]).includes("+") || (voteStor[i][0]).includes("-")){
120 | if (Config.game=="tfall2") {
121 | movementCmd(Commands[keys[temp[i]]][0]);
122 | }
123 | winning = voteStor[i][1];
124 | return voteStor[i][1];
125 | }
126 | else {
127 | if (Config.game=="tfall2") {
128 | generalCmd(Commands[keys[temp[i]]][0]);
129 | }
130 | else {
131 | sourceCmd(Commands[keys[temp[i]]][0]);
132 | }
133 | winning = voteStor[i][1];
134 | return voteStor[i][1];
135 | }
136 | }
137 | }
138 | }
139 |
140 | function pingPongReset() {
141 | if (voting && foo<3) {
142 | if (Config.game=="tfall2") {
143 | generalCmd(Commands["reset"]);
144 | }
145 | else {
146 | sourceCmd(Commands["reset"]);
147 | }
148 | setTimeout(function(){
149 | pongPingReset()
150 | },3000);
151 | foo++;
152 | }
153 | }
154 |
155 | function pongPingReset() {
156 | if (voting && foo<3) {
157 | if (Config.game=="tfall2") {
158 | generalCmd(Commands["reset"]);
159 | }
160 | else {
161 | sourceCmd(Commands["reset"]);
162 | }
163 | setTimeout(function(){
164 | pingPongReset()
165 | },3000);
166 | foo++;
167 | }
168 | }
169 |
170 | // Reset all the variables
171 | function reset() {
172 | temp=[];
173 | winning="";
174 | voteStor=[];
175 | tempCounting = [];
176 | votes1 = 0, votes2 = 0, votes3 = 0; // Vote counts
177 | foo=0;
178 | setTimeout(function(){
179 | pingPongReset()
180 | },1000);
181 | }
182 |
183 | function startVoting() {
184 | voting = true;
185 | console.log("Voting starts now");
186 | generateCommands();
187 | sayCommands();
188 | setTimeout(function () {
189 | endVoting();
190 | },Config.votingTime*1000);
191 | }
192 |
193 | function endVoting() {
194 | voting = false;
195 | compareVotes(votes1,votes2,votes3);
196 | Bot.say(winning+" won with "+Math.max(votes1,votes2,votes3)+" votes");
197 | setTimeout(function(){
198 | reset();
199 | startVoting();
200 | },Config.playTime*1000);
201 | }
202 | // ------------------------------------------------------
203 |
204 | // HTTP SERVER
205 | // ------------------------------------------------------
206 | // https://stackoverflow.com/questions/6011984/basic-ajax-send-receive-with-node-js
207 | // https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
208 |
209 | http.createServer(function(request, response){
210 | var path = url.parse(request.url).pathname;
211 | if(path=="/getstring"){
212 | if (voting){
213 | var obsGraphics = {
214 | vote1: [voteStor[0][1],votes1],
215 | vote2: [voteStor[1][1],votes2],
216 | vote3: [voteStor[2][1],votes3],
217 | winning: winning,
218 | time: Config.votingTime
219 | };
220 | }
221 | else if (voting==false && winning) {
222 | var obsGraphics = {
223 | winning: winning,
224 | time: Config.votingTime
225 | };
226 | }
227 | else {
228 | var obsGraphics = {
229 | // Dummy Variables
230 | vote1: ['loading...','0'],
231 | vote2: ['loading...','0'],
232 | vote3: ['loading...','0'],
233 | winning: '',
234 | time: Config.votingTime
235 | };
236 | }
237 | var obsGraphicsJson = JSON.stringify(obsGraphics);
238 | response.writeHead(200, {'content-type':'application/json','Content-Length' : Buffer.byteLength(obsGraphicsJson, 'utf8')});
239 | response.end(obsGraphicsJson);
240 | }
241 | else{
242 | // Write the HTML file to the server
243 | fs.readFile('graphics/index.html', function(err, file) {
244 | if(err) {
245 | // write an error response or nothing here
246 | return;
247 | }
248 | response.writeHead(200, { 'Content-Type': 'text/html' });
249 | response.end(file, "utf-8");
250 | });
251 | }
252 | }).listen(80); // ;)
253 | console.log("OBS Graphics Server Initialized: localhost:80");
254 | // ------------------------------------------------------
255 |
256 |
257 | Bot.on('join', () => {
258 | startVoting();
259 | Bot.on('message', chatter => {
260 | // Developer Commands
261 | if (chatter.username=="taskinoz" &&
262 | (chatter.message).split(" ")[0]=="!cmd" &&
263 | freeItem!="taskinoz") {
264 | generalCmd((chatter.message).slice(1));
265 | }
266 | // Look for a command
267 | if ((chatter.message).includes("!") && voting) {
268 | switch (chatter.message) {
269 | case '!1':
270 | //Bot.say("You have chosen 1");
271 | votes1++;
272 | break;
273 | case '!2':
274 | //Bot.say("You have chosen 2");
275 | votes2++;
276 | break;
277 | case '!3':
278 | //Bot.say("You have chosen 3");
279 | votes3++;
280 | break;
281 | }
282 | }
283 | if (Config.enableItems) {
284 | if (chatter.bits==Config.bitItemsAmount) {
285 | let x = (chatter.message).split("give ")[1];
286 | generalCmd(Items[x]);
287 | }
288 | if ((chatter.message).includes("!give") && chatter.username==freeItem) {
289 | let x = (chatter.message).split("give ")[1];
290 | generalCmd(Items[x]);
291 | freeItem="";
292 | }
293 | if ((chatter.message).includes("!claim") && freeItem=="") {
294 | freeItem=chatter.username;
295 | Bot.say(`${freeItem} use !give to give the streamer an item. Look at the items list https://github.com/taskinoz/source-twitch-integration/blob/master/Items.md`);
296 | }
297 | }
298 |
299 | })
300 | })
301 |
302 | Bot.on('error', err => {
303 | console.log(err)
304 | })
305 |
--------------------------------------------------------------------------------
/items.json:
--------------------------------------------------------------------------------
1 | {
2 | "expedition":"give mp_titanweapon_xo16_shorty",
3 | "tone":"give mp_titanweapon_sticky_40mm",
4 | "scorch":"give mp_titanweapon_meteor",
5 | "brute":"give mp_titanweapon_rocketeer_rocketstream",
6 | "ion":"give mp_titanweapon_particle_accelerator",
7 | "ronin":"give mp_titanweapon_leadwall",
8 | "northstar":"give mp_titanweapon_sniper",
9 | "legion":"give mp_titanweapon_predator_cannon",
10 | "hover":"give mp_titanability_hover",
11 | "dash":"give mp_titanability_phase_dash",
12 | "spicyBoys":"give mp_weapon_frag_drone",
13 | "eva":"give mp_weapon_shotgun",
14 | "kraber":"give mp_weapon_sniper",
15 | "wingman":"give mp_weapon_wingman",
16 | "r201":"give mp_weapon_rspn101",
17 | "swarm":"ent_create npc_frag_drone;ent_create npc_frag_drone;ent_create npc_frag_drone;ent_create npc_frag_drone;ent_create npc_frag_drone;",
18 | "nogun":"impulse 200"
19 | }
20 |
--------------------------------------------------------------------------------
/lib/voting.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taskinoz/source-twitch-integration/bae157962018ca3299be938a702742c6cc1c1092/lib/voting.js
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "titanfall-twitch-integration",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/parser": {
8 | "version": "7.10.5",
9 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz",
10 | "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ=="
11 | },
12 | "@babel/runtime": {
13 | "version": "7.10.5",
14 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz",
15 | "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==",
16 | "requires": {
17 | "regenerator-runtime": "^0.13.4"
18 | }
19 | },
20 | "@nodelib/fs.scandir": {
21 | "version": "2.1.3",
22 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
23 | "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
24 | "requires": {
25 | "@nodelib/fs.stat": "2.0.3",
26 | "run-parallel": "^1.1.9"
27 | }
28 | },
29 | "@nodelib/fs.stat": {
30 | "version": "2.0.3",
31 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
32 | "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
33 | },
34 | "@nodelib/fs.walk": {
35 | "version": "1.2.4",
36 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
37 | "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
38 | "requires": {
39 | "@nodelib/fs.scandir": "2.1.3",
40 | "fastq": "^1.6.0"
41 | }
42 | },
43 | "@types/color-name": {
44 | "version": "1.1.1",
45 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
46 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
47 | },
48 | "ajv": {
49 | "version": "6.12.3",
50 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
51 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
52 | "requires": {
53 | "fast-deep-equal": "^3.1.1",
54 | "fast-json-stable-stringify": "^2.0.0",
55 | "json-schema-traverse": "^0.4.1",
56 | "uri-js": "^4.2.2"
57 | }
58 | },
59 | "ansi-styles": {
60 | "version": "4.2.1",
61 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
62 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
63 | "requires": {
64 | "@types/color-name": "^1.1.1",
65 | "color-convert": "^2.0.1"
66 | }
67 | },
68 | "array-union": {
69 | "version": "2.1.0",
70 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
71 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
72 | },
73 | "asn1": {
74 | "version": "0.2.4",
75 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
76 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
77 | "requires": {
78 | "safer-buffer": "~2.1.0"
79 | }
80 | },
81 | "assert-plus": {
82 | "version": "1.0.0",
83 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
84 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
85 | },
86 | "asynckit": {
87 | "version": "0.4.0",
88 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
89 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
90 | },
91 | "aws-sign2": {
92 | "version": "0.7.0",
93 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
94 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
95 | },
96 | "aws4": {
97 | "version": "1.10.0",
98 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
99 | "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
100 | },
101 | "bcrypt-pbkdf": {
102 | "version": "1.0.2",
103 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
104 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
105 | "requires": {
106 | "tweetnacl": "^0.14.3"
107 | }
108 | },
109 | "braces": {
110 | "version": "3.0.2",
111 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
112 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
113 | "requires": {
114 | "fill-range": "^7.0.1"
115 | }
116 | },
117 | "byline": {
118 | "version": "5.0.0",
119 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
120 | "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE="
121 | },
122 | "caseless": {
123 | "version": "0.12.0",
124 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
125 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
126 | },
127 | "chalk": {
128 | "version": "3.0.0",
129 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
130 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
131 | "requires": {
132 | "ansi-styles": "^4.1.0",
133 | "supports-color": "^7.1.0"
134 | }
135 | },
136 | "color-convert": {
137 | "version": "2.0.1",
138 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
139 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
140 | "requires": {
141 | "color-name": "~1.1.4"
142 | }
143 | },
144 | "color-name": {
145 | "version": "1.1.4",
146 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
147 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
148 | },
149 | "combined-stream": {
150 | "version": "1.0.8",
151 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
152 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
153 | "requires": {
154 | "delayed-stream": "~1.0.0"
155 | }
156 | },
157 | "core-util-is": {
158 | "version": "1.0.2",
159 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
160 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
161 | },
162 | "dashdash": {
163 | "version": "1.14.1",
164 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
165 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
166 | "requires": {
167 | "assert-plus": "^1.0.0"
168 | }
169 | },
170 | "deep-is": {
171 | "version": "0.1.3",
172 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
173 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
174 | },
175 | "delayed-stream": {
176 | "version": "1.0.0",
177 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
178 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
179 | },
180 | "dir-glob": {
181 | "version": "3.0.1",
182 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
183 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
184 | "requires": {
185 | "path-type": "^4.0.0"
186 | }
187 | },
188 | "ecc-jsbn": {
189 | "version": "0.1.2",
190 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
191 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
192 | "requires": {
193 | "jsbn": "~0.1.0",
194 | "safer-buffer": "^2.1.0"
195 | }
196 | },
197 | "escodegen": {
198 | "version": "1.14.3",
199 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
200 | "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
201 | "requires": {
202 | "esprima": "^4.0.1",
203 | "estraverse": "^4.2.0",
204 | "esutils": "^2.0.2",
205 | "optionator": "^0.8.1",
206 | "source-map": "~0.6.1"
207 | }
208 | },
209 | "esprima": {
210 | "version": "4.0.1",
211 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
212 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
213 | },
214 | "estraverse": {
215 | "version": "4.3.0",
216 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
217 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
218 | },
219 | "esutils": {
220 | "version": "2.0.3",
221 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
222 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
223 | },
224 | "expand-template": {
225 | "version": "2.0.3",
226 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
227 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="
228 | },
229 | "extend": {
230 | "version": "3.0.2",
231 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
232 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
233 | },
234 | "extsprintf": {
235 | "version": "1.3.0",
236 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
237 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
238 | },
239 | "fast-deep-equal": {
240 | "version": "3.1.3",
241 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
242 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
243 | },
244 | "fast-glob": {
245 | "version": "3.2.4",
246 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
247 | "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
248 | "requires": {
249 | "@nodelib/fs.stat": "^2.0.2",
250 | "@nodelib/fs.walk": "^1.2.3",
251 | "glob-parent": "^5.1.0",
252 | "merge2": "^1.3.0",
253 | "micromatch": "^4.0.2",
254 | "picomatch": "^2.2.1"
255 | }
256 | },
257 | "fast-json-stable-stringify": {
258 | "version": "2.1.0",
259 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
260 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
261 | },
262 | "fast-levenshtein": {
263 | "version": "2.0.6",
264 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
265 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
266 | },
267 | "fastq": {
268 | "version": "1.8.0",
269 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
270 | "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
271 | "requires": {
272 | "reusify": "^1.0.4"
273 | }
274 | },
275 | "fill-range": {
276 | "version": "7.0.1",
277 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
278 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
279 | "requires": {
280 | "to-regex-range": "^5.0.1"
281 | }
282 | },
283 | "forever-agent": {
284 | "version": "0.6.1",
285 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
286 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
287 | },
288 | "form-data": {
289 | "version": "2.3.3",
290 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
291 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
292 | "requires": {
293 | "asynckit": "^0.4.0",
294 | "combined-stream": "^1.0.6",
295 | "mime-types": "^2.1.12"
296 | }
297 | },
298 | "from2": {
299 | "version": "2.3.0",
300 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
301 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
302 | "requires": {
303 | "inherits": "^2.0.1",
304 | "readable-stream": "^2.0.0"
305 | }
306 | },
307 | "fs": {
308 | "version": "0.0.1-security",
309 | "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
310 | "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=",
311 | "dev": true
312 | },
313 | "fs-extra": {
314 | "version": "8.1.0",
315 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
316 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
317 | "requires": {
318 | "graceful-fs": "^4.2.0",
319 | "jsonfile": "^4.0.0",
320 | "universalify": "^0.1.0"
321 | }
322 | },
323 | "getpass": {
324 | "version": "0.1.7",
325 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
326 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
327 | "requires": {
328 | "assert-plus": "^1.0.0"
329 | }
330 | },
331 | "glob-parent": {
332 | "version": "5.1.2",
333 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
334 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
335 | "requires": {
336 | "is-glob": "^4.0.1"
337 | }
338 | },
339 | "globby": {
340 | "version": "11.0.1",
341 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
342 | "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
343 | "requires": {
344 | "array-union": "^2.1.0",
345 | "dir-glob": "^3.0.1",
346 | "fast-glob": "^3.1.1",
347 | "ignore": "^5.1.4",
348 | "merge2": "^1.3.0",
349 | "slash": "^3.0.0"
350 | }
351 | },
352 | "graceful-fs": {
353 | "version": "4.2.4",
354 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
355 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
356 | },
357 | "har-schema": {
358 | "version": "2.0.0",
359 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
360 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
361 | },
362 | "har-validator": {
363 | "version": "5.1.3",
364 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
365 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
366 | "requires": {
367 | "ajv": "^6.5.5",
368 | "har-schema": "^2.0.0"
369 | }
370 | },
371 | "has-flag": {
372 | "version": "4.0.0",
373 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
374 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
375 | },
376 | "http": {
377 | "version": "0.0.0",
378 | "resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz",
379 | "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I=",
380 | "dev": true
381 | },
382 | "http-signature": {
383 | "version": "1.2.0",
384 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
385 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
386 | "requires": {
387 | "assert-plus": "^1.0.0",
388 | "jsprim": "^1.2.2",
389 | "sshpk": "^1.7.0"
390 | }
391 | },
392 | "ignore": {
393 | "version": "5.1.8",
394 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
395 | "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
396 | },
397 | "inherits": {
398 | "version": "2.0.4",
399 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
400 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
401 | },
402 | "into-stream": {
403 | "version": "5.1.1",
404 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz",
405 | "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==",
406 | "requires": {
407 | "from2": "^2.3.0",
408 | "p-is-promise": "^3.0.0"
409 | }
410 | },
411 | "is-extglob": {
412 | "version": "2.1.1",
413 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
414 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
415 | },
416 | "is-glob": {
417 | "version": "4.0.1",
418 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
419 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
420 | "requires": {
421 | "is-extglob": "^2.1.1"
422 | }
423 | },
424 | "is-number": {
425 | "version": "7.0.0",
426 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
427 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
428 | },
429 | "is-typedarray": {
430 | "version": "1.0.0",
431 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
432 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
433 | },
434 | "isarray": {
435 | "version": "1.0.0",
436 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
437 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
438 | },
439 | "isstream": {
440 | "version": "0.1.2",
441 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
442 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
443 | },
444 | "jsbn": {
445 | "version": "0.1.1",
446 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
447 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
448 | },
449 | "json-schema": {
450 | "version": "0.2.3",
451 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
452 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
453 | },
454 | "json-schema-traverse": {
455 | "version": "0.4.1",
456 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
457 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
458 | },
459 | "json-stringify-safe": {
460 | "version": "5.0.1",
461 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
462 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
463 | },
464 | "jsonfile": {
465 | "version": "4.0.0",
466 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
467 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
468 | "requires": {
469 | "graceful-fs": "^4.1.6"
470 | }
471 | },
472 | "jsprim": {
473 | "version": "1.4.1",
474 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
475 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
476 | "requires": {
477 | "assert-plus": "1.0.0",
478 | "extsprintf": "1.3.0",
479 | "json-schema": "0.2.3",
480 | "verror": "1.10.0"
481 | }
482 | },
483 | "levn": {
484 | "version": "0.3.0",
485 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
486 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
487 | "requires": {
488 | "prelude-ls": "~1.1.2",
489 | "type-check": "~0.3.2"
490 | }
491 | },
492 | "lodash": {
493 | "version": "4.17.21",
494 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
495 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
496 | "dev": true
497 | },
498 | "merge2": {
499 | "version": "1.4.1",
500 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
501 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
502 | },
503 | "micromatch": {
504 | "version": "4.0.2",
505 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
506 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
507 | "requires": {
508 | "braces": "^3.0.1",
509 | "picomatch": "^2.0.5"
510 | }
511 | },
512 | "mime-db": {
513 | "version": "1.44.0",
514 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
515 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
516 | },
517 | "mime-types": {
518 | "version": "2.1.27",
519 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
520 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
521 | "requires": {
522 | "mime-db": "1.44.0"
523 | }
524 | },
525 | "minimist": {
526 | "version": "1.2.6",
527 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
528 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
529 | },
530 | "mkdirp": {
531 | "version": "0.5.5",
532 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
533 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
534 | "requires": {
535 | "minimist": "^1.2.5"
536 | }
537 | },
538 | "multistream": {
539 | "version": "2.1.1",
540 | "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz",
541 | "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==",
542 | "requires": {
543 | "inherits": "^2.0.1",
544 | "readable-stream": "^2.0.5"
545 | }
546 | },
547 | "oauth-sign": {
548 | "version": "0.9.0",
549 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
550 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
551 | },
552 | "optionator": {
553 | "version": "0.8.3",
554 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
555 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
556 | "requires": {
557 | "deep-is": "~0.1.3",
558 | "fast-levenshtein": "~2.0.6",
559 | "levn": "~0.3.0",
560 | "prelude-ls": "~1.1.2",
561 | "type-check": "~0.3.2",
562 | "word-wrap": "~1.2.3"
563 | }
564 | },
565 | "os-tmpdir": {
566 | "version": "1.0.2",
567 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
568 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
569 | },
570 | "p-is-promise": {
571 | "version": "3.0.0",
572 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
573 | "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ=="
574 | },
575 | "path-parse": {
576 | "version": "1.0.7",
577 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
578 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
579 | },
580 | "path-type": {
581 | "version": "4.0.0",
582 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
583 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
584 | },
585 | "performance-now": {
586 | "version": "2.1.0",
587 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
588 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
589 | },
590 | "picomatch": {
591 | "version": "2.2.2",
592 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
593 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
594 | },
595 | "pkg": {
596 | "version": "4.4.9",
597 | "resolved": "https://registry.npmjs.org/pkg/-/pkg-4.4.9.tgz",
598 | "integrity": "sha512-FK4GqHtcCY2PPPVaKViU0NyRzpo6gCS7tPKN5b7AkElqjAOCH1bsRKgohEnxThr6DWfTGByGqba2YHGR/BqbmA==",
599 | "requires": {
600 | "@babel/parser": "^7.9.4",
601 | "@babel/runtime": "^7.9.2",
602 | "chalk": "^3.0.0",
603 | "escodegen": "^1.14.1",
604 | "fs-extra": "^8.1.0",
605 | "globby": "^11.0.0",
606 | "into-stream": "^5.1.1",
607 | "minimist": "^1.2.5",
608 | "multistream": "^2.1.1",
609 | "pkg-fetch": "^2.6.9",
610 | "progress": "^2.0.3",
611 | "resolve": "^1.15.1",
612 | "stream-meter": "^1.0.4"
613 | }
614 | },
615 | "pkg-fetch": {
616 | "version": "2.6.9",
617 | "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-2.6.9.tgz",
618 | "integrity": "sha512-EnVR8LRILXBvaNP+wJOSY02c3+qDDfyEyR+aqAHLhcc9PBnbxFT9UZ1+If49goPQzQPn26TzF//fc6KXZ0aXEg==",
619 | "requires": {
620 | "@babel/runtime": "^7.9.2",
621 | "byline": "^5.0.0",
622 | "chalk": "^3.0.0",
623 | "expand-template": "^2.0.3",
624 | "fs-extra": "^8.1.0",
625 | "minimist": "^1.2.5",
626 | "progress": "^2.0.3",
627 | "request": "^2.88.0",
628 | "request-progress": "^3.0.0",
629 | "semver": "^6.3.0",
630 | "unique-temp-dir": "^1.0.0"
631 | }
632 | },
633 | "prelude-ls": {
634 | "version": "1.1.2",
635 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
636 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
637 | },
638 | "process-nextick-args": {
639 | "version": "2.0.1",
640 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
641 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
642 | },
643 | "progress": {
644 | "version": "2.0.3",
645 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
646 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
647 | },
648 | "psl": {
649 | "version": "1.8.0",
650 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
651 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
652 | },
653 | "punycode": {
654 | "version": "1.3.2",
655 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
656 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
657 | "dev": true
658 | },
659 | "qs": {
660 | "version": "6.5.3",
661 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
662 | "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
663 | },
664 | "querystring": {
665 | "version": "0.2.0",
666 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
667 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
668 | "dev": true
669 | },
670 | "readable-stream": {
671 | "version": "2.3.7",
672 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
673 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
674 | "requires": {
675 | "core-util-is": "~1.0.0",
676 | "inherits": "~2.0.3",
677 | "isarray": "~1.0.0",
678 | "process-nextick-args": "~2.0.0",
679 | "safe-buffer": "~5.1.1",
680 | "string_decoder": "~1.1.1",
681 | "util-deprecate": "~1.0.1"
682 | }
683 | },
684 | "regenerator-runtime": {
685 | "version": "0.13.5",
686 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
687 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
688 | },
689 | "request": {
690 | "version": "2.88.2",
691 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
692 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
693 | "requires": {
694 | "aws-sign2": "~0.7.0",
695 | "aws4": "^1.8.0",
696 | "caseless": "~0.12.0",
697 | "combined-stream": "~1.0.6",
698 | "extend": "~3.0.2",
699 | "forever-agent": "~0.6.1",
700 | "form-data": "~2.3.2",
701 | "har-validator": "~5.1.3",
702 | "http-signature": "~1.2.0",
703 | "is-typedarray": "~1.0.0",
704 | "isstream": "~0.1.2",
705 | "json-stringify-safe": "~5.0.1",
706 | "mime-types": "~2.1.19",
707 | "oauth-sign": "~0.9.0",
708 | "performance-now": "^2.1.0",
709 | "qs": "~6.5.2",
710 | "safe-buffer": "^5.1.2",
711 | "tough-cookie": "~2.5.0",
712 | "tunnel-agent": "^0.6.0",
713 | "uuid": "^3.3.2"
714 | }
715 | },
716 | "request-progress": {
717 | "version": "3.0.0",
718 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
719 | "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=",
720 | "requires": {
721 | "throttleit": "^1.0.0"
722 | }
723 | },
724 | "resolve": {
725 | "version": "1.17.0",
726 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
727 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
728 | "requires": {
729 | "path-parse": "^1.0.6"
730 | }
731 | },
732 | "reusify": {
733 | "version": "1.0.4",
734 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
735 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
736 | },
737 | "run-parallel": {
738 | "version": "1.1.9",
739 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
740 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
741 | },
742 | "safe-buffer": {
743 | "version": "5.1.2",
744 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
745 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
746 | },
747 | "safer-buffer": {
748 | "version": "2.1.2",
749 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
750 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
751 | },
752 | "semver": {
753 | "version": "6.3.0",
754 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
755 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
756 | },
757 | "slash": {
758 | "version": "3.0.0",
759 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
760 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
761 | },
762 | "source-map": {
763 | "version": "0.6.1",
764 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
765 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
766 | "optional": true
767 | },
768 | "sshpk": {
769 | "version": "1.16.1",
770 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
771 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
772 | "requires": {
773 | "asn1": "~0.2.3",
774 | "assert-plus": "^1.0.0",
775 | "bcrypt-pbkdf": "^1.0.0",
776 | "dashdash": "^1.12.0",
777 | "ecc-jsbn": "~0.1.1",
778 | "getpass": "^0.1.1",
779 | "jsbn": "~0.1.0",
780 | "safer-buffer": "^2.0.2",
781 | "tweetnacl": "~0.14.0"
782 | }
783 | },
784 | "stream-meter": {
785 | "version": "1.0.4",
786 | "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz",
787 | "integrity": "sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=",
788 | "requires": {
789 | "readable-stream": "^2.1.4"
790 | }
791 | },
792 | "string_decoder": {
793 | "version": "1.1.1",
794 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
795 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
796 | "requires": {
797 | "safe-buffer": "~5.1.0"
798 | }
799 | },
800 | "supports-color": {
801 | "version": "7.1.0",
802 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
803 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
804 | "requires": {
805 | "has-flag": "^4.0.0"
806 | }
807 | },
808 | "throttleit": {
809 | "version": "1.0.0",
810 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
811 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw="
812 | },
813 | "to-regex-range": {
814 | "version": "5.0.1",
815 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
816 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
817 | "requires": {
818 | "is-number": "^7.0.0"
819 | }
820 | },
821 | "tough-cookie": {
822 | "version": "2.5.0",
823 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
824 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
825 | "requires": {
826 | "psl": "^1.1.28",
827 | "punycode": "^2.1.1"
828 | },
829 | "dependencies": {
830 | "punycode": {
831 | "version": "2.1.1",
832 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
833 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
834 | }
835 | }
836 | },
837 | "tunnel-agent": {
838 | "version": "0.6.0",
839 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
840 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
841 | "requires": {
842 | "safe-buffer": "^5.0.1"
843 | }
844 | },
845 | "tweetnacl": {
846 | "version": "0.14.5",
847 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
848 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
849 | },
850 | "twitch-bot": {
851 | "version": "1.3.5",
852 | "resolved": "https://registry.npmjs.org/twitch-bot/-/twitch-bot-1.3.5.tgz",
853 | "integrity": "sha512-GcQUM+DjJqwTi4Q5wzVL7w1xdNjyiXJV2naF8o45nVdnxGc1WfgH5QP1Otpg7R0YgxEfigoPjNhxuwQ0vXrNgw==",
854 | "dev": true,
855 | "requires": {
856 | "lodash": "^4.17.4"
857 | }
858 | },
859 | "type-check": {
860 | "version": "0.3.2",
861 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
862 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
863 | "requires": {
864 | "prelude-ls": "~1.1.2"
865 | }
866 | },
867 | "uid2": {
868 | "version": "0.0.3",
869 | "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz",
870 | "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I="
871 | },
872 | "unique-temp-dir": {
873 | "version": "1.0.0",
874 | "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz",
875 | "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=",
876 | "requires": {
877 | "mkdirp": "^0.5.1",
878 | "os-tmpdir": "^1.0.1",
879 | "uid2": "0.0.3"
880 | }
881 | },
882 | "universalify": {
883 | "version": "0.1.2",
884 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
885 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
886 | },
887 | "uri-js": {
888 | "version": "4.2.2",
889 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
890 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
891 | "requires": {
892 | "punycode": "^2.1.0"
893 | },
894 | "dependencies": {
895 | "punycode": {
896 | "version": "2.1.1",
897 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
898 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
899 | }
900 | }
901 | },
902 | "url": {
903 | "version": "0.11.0",
904 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
905 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
906 | "dev": true,
907 | "requires": {
908 | "punycode": "1.3.2",
909 | "querystring": "0.2.0"
910 | }
911 | },
912 | "util-deprecate": {
913 | "version": "1.0.2",
914 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
915 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
916 | },
917 | "uuid": {
918 | "version": "3.4.0",
919 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
920 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
921 | },
922 | "verror": {
923 | "version": "1.10.0",
924 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
925 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
926 | "requires": {
927 | "assert-plus": "^1.0.0",
928 | "core-util-is": "1.0.2",
929 | "extsprintf": "^1.2.0"
930 | }
931 | },
932 | "word-wrap": {
933 | "version": "1.2.3",
934 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
935 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
936 | }
937 | }
938 | }
939 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "titanfall-twitch-integration",
3 | "version": "1.0.0",
4 | "description": "Using Twitch chat and Icepick to dynamically change the gameplay in Titanfall 2",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index.js",
8 | "build": "node build.js && pkg --targets node12-win-x64 package.json --output ./SourceTwitchIntegration.exe"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://gitlab.com/taskinoz/titanfall-twitch-integration.git"
13 | },
14 | "keywords": [
15 | "twitch",
16 | "titanfall",
17 | "gaming"
18 | ],
19 | "author": "taskinoz",
20 | "license": "MIT",
21 | "bugs": {
22 | "url": "https://gitlab.com/taskinoz/titanfall-twitch-integration/issues"
23 | },
24 | "homepage": "https://gitlab.com/taskinoz/titanfall-twitch-integration#readme",
25 | "devDependencies": {
26 | "fs": "0.0.1-security",
27 | "http": "0.0.0",
28 | "twitch-bot": "^1.3.5",
29 | "url": "^0.11.0"
30 | },
31 | "dependencies": {
32 | "pkg": "^4.4.8"
33 | },
34 | "bin": "./index.js",
35 | "pkg": {
36 | "scripts": "lib/*",
37 | "assets": "views/**/*"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/portal-hl2/Twitch.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taskinoz/source-twitch-integration/bae157962018ca3299be938a702742c6cc1c1092/portal-hl2/Twitch.dll
--------------------------------------------------------------------------------
/setup/OBSScreenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taskinoz/source-twitch-integration/bae157962018ca3299be938a702742c6cc1c1092/setup/OBSScreenshot.png
--------------------------------------------------------------------------------
/titanfall2/TTF2SDK.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/taskinoz/source-twitch-integration/bae157962018ca3299be938a702742c6cc1c1092/titanfall2/TTF2SDK.dll
--------------------------------------------------------------------------------
/twitch-login.example.json:
--------------------------------------------------------------------------------
1 | {
2 | "username": "YOUR USERNAME",
3 | "oauth": "YOUR OATH KEY",
4 | "channels": "YOUR CHANNEL NAME"
5 | }
6 |
--------------------------------------------------------------------------------