신기성

README conflict 수정

1 +//Site
2 +var http = require('http');
3 +var fs = require('fs');
4 +var jsdom = require('jsdom');
5 +//var $ = require('jquery');
6 +var path=require('path');
7 +//Site end
8 +var express=require('express');
9 +var app=express();
10 +var router=require('./router/main')(app);
11 +var bodyParser=require('body-parser');
12 +var querystring=require('querystring');
13 +app.use(bodyParser.urlencoded({extended: false}));
14 +app.use(bodyParser.json());
15 +
16 +//Site
17 +app.use(express.static('public'));
18 +app.use('/node_modules', express.static(path.join(__dirname,'/node_modules')));
19 +
20 +app.get('/', function(req,res){
21 + fs.readFile('index.ejs',function(err,data){
22 + res.writeHead(200,{'Content-Type':'text/html'});
23 + res.end(data);
24 + });
25 +});
26 +
27 +app.get('/recommend', function(req,res,next){
28 + fs.readFile('index.ejs',function(err,data){
29 + res.writeHead(200,{'Content-Type':'text/html'});
30 + res.end(data);
31 + });
32 +});
33 +
34 +app.get('/imgs',function(req,res){
35 + fs.readFile('logoIMG.jpg',function(err,data){
36 + res.writeHead(200,{'Content-Type':'text/html'});
37 + res.end(data);
38 + });
39 +});
40 +//Site end
41 +
42 +app.set('views', __dirname + '/views');
43 +app.set('view engine', 'ejs');
44 +app.engine('html', require('ejs').renderFile);
45 +
46 +var server=app.listen(3000,function(){
47 + console.log("Express server has started on port 3000");
48 +
49 + });//app listen 꿑
50 +
51 +//
52 +/*
53 +var readline=require('readline');//입력받기 위한 모듈
54 +var r=readline.createInterface({input:process.stdin,output:process.stdout});//키보드 입출력 정의
55 +var rtfw1="http://www.rankedftw.com/search/?name=";//rtfw에서 기본 검색 url
56 +var rtfw2="http://www.rankedftw.com/player/"//rtfw 번호 기반 특정 플레이어 검색 url
57 +var league='silver_2';
58 +var region='KR';
59 +//
60 +var cheerio=require('cheerio');//cheerio모듈 사용
61 +var request=require('request');//request모듈 사용
62 +var fs=require('fs');//파일시스템 사용
63 +//
64 +//request 1 variable
65 +var username='';//username문자열 선언
66 +var userleague='';//userleague 문자열 선언
67 +var userregion='';//userregion 문자열 선언
68 +var usernumber='';//usernumber 문자열 선언
69 +//
70 +//request 2 variable
71 +
72 +//
73 +//request 3-1 variable
74 +
75 +//
76 +//request 3-2 variable
77 +
78 +//
79 +//request 3-3 variable
80 +
81 +//
82 +//system message
83 +
84 +//
85 +//delivering variable
86 +var momentum;//기세
87 +var terran_proficiency;//테란 숙련도
88 +var zerg_proficiency;//저그 숙련도
89 +var protoss_proficiency;//프로토스 숙련도
90 +var primary_race;//주 종족
91 +var win_rate;//시즌 전체 승률
92 +
93 +var myrace;//내 종족
94 +var enemyrace;//상대 종족
95 +var recommend;//추천빌드(운영/타이밍/올인)
96 +//
97 +
98 +r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성
99 + //question은 에러 제어 만들면 안된다.
100 + console.log("r.question processing");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다.
101 + rtfw1=rtfw1+answer;//검색 url 구성
102 + console.log(rtfw1);//테스트용 : 검색 url 확인
103 +//
104 +request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1
105 + if(error){throw error};//에러처리
106 + console.log("request 1 processing");
107 + let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색
108 + $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다.
109 + username=$(this).find('.name').text().trim();//name클래스를 찾아 공백빼고 텍스트화
110 + userleague=$(this).find('.league').text().trim();//league클래스를 찾아 공백빼고 텍스트화
111 + userregion=$(this).find('.region').text().trim();//region클래스를 찾아 공백빼고 텍스트화
112 + if((username===answer)&&(userregion===region)){//아직 리그 구현 안함-리그는 그림으로 비교
113 + console.log(`${username}`);//테스트용 : 유저네임 출력
114 + console.log(`${userregion}`);//테스트용 : 유저리전 출력
115 + var usernumber=$(this).toString().slice(29,43);//rtfw에서 사용하는 사용자번호를 문자열로 넉넉히 자름
116 + var localindex1=usernumber.search('/');//첫번째 슬레시 발견하는 인덱스 검출
117 + usernumber=usernumber.slice(localindex1+1);//앞부분 슬래시 자른다.
118 + var localindex2=usernumber.search('/')-localindex1+1;//두번째 슬레시 발견하는 인덱스 검출
119 + usernumber=usernumber.slice(0,localindex2);//뒷부분 슬래시 자른다.
120 + console.log(`${usernumber}`);//테스트용 : 유저넘버 출력
121 + if(rtfw2.length>33){//하나라도 붙어있으면
122 + rtfw2=rtfw2;//아무것도 안한다.
123 + }else{//그렇지않고 아무것도 안붙어있으면
124 + rtfw2=rtfw2+usernumber+'/';//rtfw2 url갱신
125 + }
126 + console.log(rtfw2);//테스트용 : rtfw2 출력
127 + }//이름서버리그비교if종료
128 + });//ul a find문 종료
129 +
130 + var profileID='';
131 + request(rtfw2,(error,response,body)=>{//rtfw2 url 불러오기 request 2
132 + if(error){throw error};//에러처리
133 + console.log('request2 processing');//테스트용 : request2 실행여부 출력
134 + let $ = cheerio.load(body);//rtfw2가 body이다. $로 jquery방식으로 html탐색
135 + $('.content').find('.bnet-link').each(function(index,elem){//content 클래스 안의 bnet-link클래스를 포함하는 요소를 찾는다.
136 + profileID=$(this).toString().slice(62,72);//얻고자 하는 profileID를 포함하여 앞뒤로 적당히 자른다.
137 + var localindex3=profileID.search('/');//첫번째 슬레시 발견하는 인덱스 검출
138 + profileID=profileID.slice(localindex3+1);//앞부분 슬래시 자른다.
139 + var localindex4=profileID.search('/')-localindex3;//두번째 슬레시 발견하는 인덱스 검출
140 + profileID=profileID.slice(0,localindex4);//뒷부분 슬래시 자른다.
141 + console.log(`${profileID}`);//테스트용 : profileID 출력
142 + //profileID=encodeURI(encodeURIComponent(profileID));//한글처리부
143 + });//a bnetlink 종료
144 +//console.log(`${profileID}`);//테스트용 : profileID 출력
145 +
146 +var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매치히스토리 url 앞부분
147 +var match_history_2="/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"//매치히스토리 url 뒷부분
148 +var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성
149 +console.log(match_history_url);//테스트용 : 매치히스토리 url 출력
150 +
151 +request(match_history_url,(error,response,body)=>{//match history request request 3
152 + if(error){throw error};//에러처리
153 + console.log('request3 processing');//테스트용 : request 작동여부 출력
154 +
155 +var obj1=JSON.parse(body);//request 결과를 JSON object로 변환
156 +//console.log(obj.matches [0].map);//테스트용 : 하나에 접근
157 +$(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 match들과 인덱스 사용
158 + if(match.type=='1v1'){//경기타입이 1대1인 경우에만 관심있다.
159 + console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시
160 +};//if 1v1 종료
161 +});//each function 종료
162 +
163 +var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"
164 +var ladder_2="/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi";
165 +var ladder_url=ladder_1+profileID+ladder_2;
166 +console.log(ladder_url);
167 +request(ladder_url,(error,response,body)=>{//ladder request request 4
168 + if(error){throw error};
169 + console.log('request4 processing');
170 + var obj2=JSON.parse(body);//request 결과를 JSON object로 변환
171 +// console.log(obj2.currentSeason [2].ladder[0].wins);//테스트용 : 하나에 접근
172 + var wins=obj2.currentSeason[2].ladder[0].wins;
173 + var losses=obj2.currentSeason[2].ladder[0].losses;
174 +win_rate=wins/(wins+losses);
175 + //console.log(wins);
176 + //console.log(losses);
177 + //console.log(win_rate);
178 +
179 +var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/";
180 +var profile_2="?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi";
181 +var profile_url=profile_1+profileID+profile_2;
182 +console.log(profile_url);
183 +request(profile_url,(error,response,body)=>{//profile request request 5
184 + if(error){throw error};
185 + console.log('request5 processing');
186 + var obj3=JSON.parse(body);//request 결과를 JSON object로 변환
187 + //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근
188 +primary_race=obj3.career.primaryRace;
189 + //console.log(primary_race);
190 + var terran_level=obj3.swarmLevels.terran.level;
191 + var zerg_level=obj3.swarmLevels.zerg.level;
192 + var protoss_level=obj3.swarmLevels.protoss.level;
193 +
194 + //console.log(terran_level);
195 + //console.log(zerg_level);
196 + //console.log(protoss_level);
197 +
198 +//build recommend algorithm
199 +var matchresults=[];//매치결과 담을 배열 선언
200 +var momentum_win=0;//최근 10경기 중 승수 초기화
201 +for (var i=0;i<25;i++){//매치히스토리는 최대 25개
202 + if(obj1.matches[i].type=='1v1'){//1v1에만 관심있다.
203 + matchresults.push(obj1.matches[i].decision);//배열 끝에 결과 삽입
204 + if((matchresults.length<11)&&(obj1.matches[i].decision=='Win')){//최근 10경기에서 승리한 경우
205 + momentum_win=momentum_win+1;//그 승수를 카운트한다.
206 + }//if length11 종료
207 +}//obj1 1v1 종료
208 +}//for i 25 종료
209 +//console.log(matchresults);//테스트용 : matchresults 출력
210 +//console.log(momentum_win);//테스트용 : momentum_win 출력
211 +if(momentum_win>=7){//7승 이상이면 상승세
212 +momentum='상승세';
213 +}
214 +if((momentum_win<7)&&(momentum_win>=4)){//4승이상 7승미만이면 정체
215 +momentum='정체중';
216 +}
217 +if(momentum_win<4){//4승 미만이면 하락세
218 +momentum='하락세';
219 +}
220 +//console.log(momentum);//테스트용 : 기세 출력
221 +
222 +if(terran_level<50){//테란 레벨 50 안되면
223 + terran_proficiency='비숙련자'//테란 비숙련자
224 +} else{
225 + terran_proficiency='숙련자'
226 +}
227 +if(zerg_level<50){//저그 레벨 50 안되면
228 + zerg_proficiency='비숙련자'//저그 비숙련자
229 +} else{
230 + zerg_proficiency='숙련자'
231 +}
232 +if(protoss_level<50){//프로토스 레벨 50 안되면
233 + protoss_proficiency='비숙련자'//프로토스 비숙련자
234 +} else{
235 + protoss_proficiency='숙련자'
236 +}
237 +//
238 +//system message part
239 +console.log("최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다.");
240 +console.log("상대는 테란 '"+terran_proficiency+"'입니다.");
241 +console.log("상대는 저그 '"+zerg_proficiency+"'입니다.");
242 +console.log("상대는 프로토스 '"+protoss_proficiency+"'입니다.");
243 +console.log("상대의 주 종족은 '"+primary_race+"'입니다.");
244 +console.log("상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다.");
245 +//
246 +//build recommend command
247 +
248 +//
249 +
250 +console.log('request5 done');
251 +});//request5종료
252 +console.log('request4 done');
253 +});//request4종료
254 +console.log('request3 done');
255 +});//request3종료
256 +console.log('request2 done');
257 +});//request2종료
258 +console.log('request1 done');
259 +});//request1 종료
260 +
261 +console.log('r.question done');
262 +//console.log(terran_level);
263 +r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에.
264 +});//r.question 끝
265 +*/

136 KB

1 +{
2 + "requires": true,
3 + "lockfileVersion": 1,
4 + "dependencies": {
5 + "@types/node": {
6 + "version": "10.12.12",
7 + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz",
8 + "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A=="
9 + },
10 + "abab": {
11 + "version": "2.0.0",
12 + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz",
13 + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w=="
14 + },
15 + "accepts": {
16 + "version": "1.3.5",
17 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
18 + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
19 + "requires": {
20 + "mime-types": "~2.1.18",
21 + "negotiator": "0.6.1"
22 + }
23 + },
24 + "acorn": {
25 + "version": "6.0.4",
26 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz",
27 + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg=="
28 + },
29 + "acorn-globals": {
30 + "version": "4.3.0",
31 + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz",
32 + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==",
33 + "requires": {
34 + "acorn": "^6.0.1",
35 + "acorn-walk": "^6.0.1"
36 + }
37 + },
38 + "acorn-walk": {
39 + "version": "6.1.1",
40 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
41 + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw=="
42 + },
43 + "ajv": {
44 + "version": "6.6.1",
45 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz",
46 + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==",
47 + "requires": {
48 + "fast-deep-equal": "^2.0.1",
49 + "fast-json-stable-stringify": "^2.0.0",
50 + "json-schema-traverse": "^0.4.1",
51 + "uri-js": "^4.2.2"
52 + }
53 + },
54 + "array-equal": {
55 + "version": "1.0.0",
56 + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
57 + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
58 + },
59 + "array-flatten": {
60 + "version": "1.1.1",
61 + "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
62 + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
63 + },
64 + "asn1": {
65 + "version": "0.2.4",
66 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
67 + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
68 + "requires": {
69 + "safer-buffer": "~2.1.0"
70 + }
71 + },
72 + "assert-plus": {
73 + "version": "1.0.0",
74 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
75 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
76 + },
77 + "async-limiter": {
78 + "version": "1.0.0",
79 + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
80 + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
81 + },
82 + "asynckit": {
83 + "version": "0.4.0",
84 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
85 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
86 + },
87 + "aws-sign2": {
88 + "version": "0.7.0",
89 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
90 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
91 + },
92 + "aws4": {
93 + "version": "1.8.0",
94 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
95 + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
96 + },
97 + "bcrypt-pbkdf": {
98 + "version": "1.0.2",
99 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
100 + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
101 + "requires": {
102 + "tweetnacl": "^0.14.3"
103 + }
104 + },
105 + "body-parser": {
106 + "version": "1.18.3",
107 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
108 + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
109 + "requires": {
110 + "bytes": "3.0.0",
111 + "content-type": "~1.0.4",
112 + "debug": "2.6.9",
113 + "depd": "~1.1.2",
114 + "http-errors": "~1.6.3",
115 + "iconv-lite": "0.4.23",
116 + "on-finished": "~2.3.0",
117 + "qs": "6.5.2",
118 + "raw-body": "2.3.3",
119 + "type-is": "~1.6.16"
120 + }
121 + },
122 + "boolbase": {
123 + "version": "1.0.0",
124 + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
125 + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
126 + },
127 + "browser-process-hrtime": {
128 + "version": "0.1.3",
129 + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz",
130 + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw=="
131 + },
132 + "bytes": {
133 + "version": "3.0.0",
134 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
135 + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
136 + },
137 + "caseless": {
138 + "version": "0.12.0",
139 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
140 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
141 + },
142 + "cheerio": {
143 + "version": "1.0.0-rc.2",
144 + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
145 + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
146 + "requires": {
147 + "css-select": "~1.2.0",
148 + "dom-serializer": "~0.1.0",
149 + "entities": "~1.1.1",
150 + "htmlparser2": "^3.9.1",
151 + "lodash": "^4.15.0",
152 + "parse5": "^3.0.1"
153 + }
154 + },
155 + "combined-stream": {
156 + "version": "1.0.7",
157 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
158 + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
159 + "requires": {
160 + "delayed-stream": "~1.0.0"
161 + }
162 + },
163 + "content-disposition": {
164 + "version": "0.5.2",
165 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
166 + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
167 + },
168 + "content-type": {
169 + "version": "1.0.4",
170 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
171 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
172 + },
173 + "cookie": {
174 + "version": "0.3.1",
175 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
176 + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
177 + },
178 + "cookie-signature": {
179 + "version": "1.0.6",
180 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
181 + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
182 + },
183 + "core-util-is": {
184 + "version": "1.0.2",
185 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
186 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
187 + },
188 + "css-select": {
189 + "version": "1.2.0",
190 + "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
191 + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
192 + "requires": {
193 + "boolbase": "~1.0.0",
194 + "css-what": "2.1",
195 + "domutils": "1.5.1",
196 + "nth-check": "~1.0.1"
197 + }
198 + },
199 + "css-what": {
200 + "version": "2.1.2",
201 + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz",
202 + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ=="
203 + },
204 + "cssom": {
205 + "version": "0.3.4",
206 + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
207 + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog=="
208 + },
209 + "cssstyle": {
210 + "version": "1.1.1",
211 + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz",
212 + "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==",
213 + "requires": {
214 + "cssom": "0.3.x"
215 + }
216 + },
217 + "dashdash": {
218 + "version": "1.14.1",
219 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
220 + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
221 + "requires": {
222 + "assert-plus": "^1.0.0"
223 + }
224 + },
225 + "data-urls": {
226 + "version": "1.1.0",
227 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
228 + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
229 + "requires": {
230 + "abab": "^2.0.0",
231 + "whatwg-mimetype": "^2.2.0",
232 + "whatwg-url": "^7.0.0"
233 + }
234 + },
235 + "debug": {
236 + "version": "2.6.9",
237 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
238 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
239 + "requires": {
240 + "ms": "2.0.0"
241 + }
242 + },
243 + "deep-is": {
244 + "version": "0.1.3",
245 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
246 + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
247 + },
248 + "delayed-stream": {
249 + "version": "1.0.0",
250 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
251 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
252 + },
253 + "depd": {
254 + "version": "1.1.2",
255 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
256 + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
257 + },
258 + "destroy": {
259 + "version": "1.0.4",
260 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
261 + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
262 + },
263 + "dom-serializer": {
264 + "version": "0.1.0",
265 + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
266 + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
267 + "requires": {
268 + "domelementtype": "~1.1.1",
269 + "entities": "~1.1.1"
270 + },
271 + "dependencies": {
272 + "domelementtype": {
273 + "version": "1.1.3",
274 + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
275 + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
276 + }
277 + }
278 + },
279 + "domelementtype": {
280 + "version": "1.3.1",
281 + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
282 + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
283 + },
284 + "domexception": {
285 + "version": "1.0.1",
286 + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
287 + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
288 + "requires": {
289 + "webidl-conversions": "^4.0.2"
290 + }
291 + },
292 + "domhandler": {
293 + "version": "2.4.2",
294 + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
295 + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
296 + "requires": {
297 + "domelementtype": "1"
298 + }
299 + },
300 + "domutils": {
301 + "version": "1.5.1",
302 + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
303 + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
304 + "requires": {
305 + "dom-serializer": "0",
306 + "domelementtype": "1"
307 + }
308 + },
309 + "ecc-jsbn": {
310 + "version": "0.1.2",
311 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
312 + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
313 + "requires": {
314 + "jsbn": "~0.1.0",
315 + "safer-buffer": "^2.1.0"
316 + }
317 + },
318 + "ee-first": {
319 + "version": "1.1.1",
320 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
321 + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
322 + },
323 + "ejs": {
324 + "version": "2.6.1",
325 + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
326 + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ=="
327 + },
328 + "encodeurl": {
329 + "version": "1.0.2",
330 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
331 + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
332 + },
333 + "entities": {
334 + "version": "1.1.2",
335 + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
336 + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
337 + },
338 + "escape-html": {
339 + "version": "1.0.3",
340 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
341 + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
342 + },
343 + "escodegen": {
344 + "version": "1.11.0",
345 + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
346 + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
347 + "requires": {
348 + "esprima": "^3.1.3",
349 + "estraverse": "^4.2.0",
350 + "esutils": "^2.0.2",
351 + "optionator": "^0.8.1",
352 + "source-map": "~0.6.1"
353 + }
354 + },
355 + "esprima": {
356 + "version": "3.1.3",
357 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
358 + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
359 + },
360 + "estraverse": {
361 + "version": "4.2.0",
362 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
363 + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
364 + },
365 + "esutils": {
366 + "version": "2.0.2",
367 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
368 + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
369 + },
370 + "etag": {
371 + "version": "1.8.1",
372 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
373 + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
374 + },
375 + "express": {
376 + "version": "4.16.4",
377 + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
378 + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
379 + "requires": {
380 + "accepts": "~1.3.5",
381 + "array-flatten": "1.1.1",
382 + "body-parser": "1.18.3",
383 + "content-disposition": "0.5.2",
384 + "content-type": "~1.0.4",
385 + "cookie": "0.3.1",
386 + "cookie-signature": "1.0.6",
387 + "debug": "2.6.9",
388 + "depd": "~1.1.2",
389 + "encodeurl": "~1.0.2",
390 + "escape-html": "~1.0.3",
391 + "etag": "~1.8.1",
392 + "finalhandler": "1.1.1",
393 + "fresh": "0.5.2",
394 + "merge-descriptors": "1.0.1",
395 + "methods": "~1.1.2",
396 + "on-finished": "~2.3.0",
397 + "parseurl": "~1.3.2",
398 + "path-to-regexp": "0.1.7",
399 + "proxy-addr": "~2.0.4",
400 + "qs": "6.5.2",
401 + "range-parser": "~1.2.0",
402 + "safe-buffer": "5.1.2",
403 + "send": "0.16.2",
404 + "serve-static": "1.13.2",
405 + "setprototypeof": "1.1.0",
406 + "statuses": "~1.4.0",
407 + "type-is": "~1.6.16",
408 + "utils-merge": "1.0.1",
409 + "vary": "~1.1.2"
410 + }
411 + },
412 + "extend": {
413 + "version": "3.0.2",
414 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
415 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
416 + },
417 + "extsprintf": {
418 + "version": "1.3.0",
419 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
420 + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
421 + },
422 + "fast-deep-equal": {
423 + "version": "2.0.1",
424 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
425 + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
426 + },
427 + "fast-json-stable-stringify": {
428 + "version": "2.0.0",
429 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
430 + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
431 + },
432 + "fast-levenshtein": {
433 + "version": "2.0.6",
434 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
435 + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
436 + },
437 + "finalhandler": {
438 + "version": "1.1.1",
439 + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
440 + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
441 + "requires": {
442 + "debug": "2.6.9",
443 + "encodeurl": "~1.0.2",
444 + "escape-html": "~1.0.3",
445 + "on-finished": "~2.3.0",
446 + "parseurl": "~1.3.2",
447 + "statuses": "~1.4.0",
448 + "unpipe": "~1.0.0"
449 + }
450 + },
451 + "forever-agent": {
452 + "version": "0.6.1",
453 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
454 + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
455 + },
456 + "form-data": {
457 + "version": "2.3.3",
458 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
459 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
460 + "requires": {
461 + "asynckit": "^0.4.0",
462 + "combined-stream": "^1.0.6",
463 + "mime-types": "^2.1.12"
464 + }
465 + },
466 + "forwarded": {
467 + "version": "0.1.2",
468 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
469 + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
470 + },
471 + "fresh": {
472 + "version": "0.5.2",
473 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
474 + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
475 + },
476 + "getpass": {
477 + "version": "0.1.7",
478 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
479 + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
480 + "requires": {
481 + "assert-plus": "^1.0.0"
482 + }
483 + },
484 + "har-schema": {
485 + "version": "2.0.0",
486 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
487 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
488 + },
489 + "har-validator": {
490 + "version": "5.1.3",
491 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
492 + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
493 + "requires": {
494 + "ajv": "^6.5.5",
495 + "har-schema": "^2.0.0"
496 + }
497 + },
498 + "html-encoding-sniffer": {
499 + "version": "1.0.2",
500 + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
501 + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
502 + "requires": {
503 + "whatwg-encoding": "^1.0.1"
504 + }
505 + },
506 + "htmlparser2": {
507 + "version": "3.10.0",
508 + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz",
509 + "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==",
510 + "requires": {
511 + "domelementtype": "^1.3.0",
512 + "domhandler": "^2.3.0",
513 + "domutils": "^1.5.1",
514 + "entities": "^1.1.1",
515 + "inherits": "^2.0.1",
516 + "readable-stream": "^3.0.6"
517 + }
518 + },
519 + "http-errors": {
520 + "version": "1.6.3",
521 + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
522 + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
523 + "requires": {
524 + "depd": "~1.1.2",
525 + "inherits": "2.0.3",
526 + "setprototypeof": "1.1.0",
527 + "statuses": ">= 1.4.0 < 2"
528 + }
529 + },
530 + "http-signature": {
531 + "version": "1.2.0",
532 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
533 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
534 + "requires": {
535 + "assert-plus": "^1.0.0",
536 + "jsprim": "^1.2.2",
537 + "sshpk": "^1.7.0"
538 + }
539 + },
540 + "iconv-lite": {
541 + "version": "0.4.23",
542 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
543 + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
544 + "requires": {
545 + "safer-buffer": ">= 2.1.2 < 3"
546 + }
547 + },
548 + "inherits": {
549 + "version": "2.0.3",
550 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
551 + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
552 + },
553 + "ipaddr.js": {
554 + "version": "1.8.0",
555 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
556 + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
557 + },
558 + "is-typedarray": {
559 + "version": "1.0.0",
560 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
561 + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
562 + },
563 + "isstream": {
564 + "version": "0.1.2",
565 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
566 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
567 + },
568 + "jquery": {
569 + "version": "3.3.1",
570 + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
571 + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg=="
572 + },
573 + "jsbn": {
574 + "version": "0.1.1",
575 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
576 + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
577 + },
578 + "jsdom": {
579 + "version": "13.0.0",
580 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.0.0.tgz",
581 + "integrity": "sha512-Kmq4ASMNkgpY+YufE322EnIKoiz0UWY2DRkKlU7d5YrIW4xiVRhWFrZV1fr6w/ZNxQ50wGAH5gGRzydgnmkkvw==",
582 + "requires": {
583 + "abab": "^2.0.0",
584 + "acorn": "^6.0.2",
585 + "acorn-globals": "^4.3.0",
586 + "array-equal": "^1.0.0",
587 + "cssom": "^0.3.4",
588 + "cssstyle": "^1.1.1",
589 + "data-urls": "^1.0.1",
590 + "domexception": "^1.0.1",
591 + "escodegen": "^1.11.0",
592 + "html-encoding-sniffer": "^1.0.2",
593 + "nwsapi": "^2.0.9",
594 + "parse5": "5.1.0",
595 + "pn": "^1.1.0",
596 + "request": "^2.88.0",
597 + "request-promise-native": "^1.0.5",
598 + "saxes": "^3.1.3",
599 + "symbol-tree": "^3.2.2",
600 + "tough-cookie": "^2.4.3",
601 + "w3c-hr-time": "^1.0.1",
602 + "w3c-xmlserializer": "^1.0.0",
603 + "webidl-conversions": "^4.0.2",
604 + "whatwg-encoding": "^1.0.5",
605 + "whatwg-mimetype": "^2.2.0",
606 + "whatwg-url": "^7.0.0",
607 + "ws": "^6.1.0",
608 + "xml-name-validator": "^3.0.0"
609 + },
610 + "dependencies": {
611 + "parse5": {
612 + "version": "5.1.0",
613 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
614 + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
615 + }
616 + }
617 + },
618 + "json-schema": {
619 + "version": "0.2.3",
620 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
621 + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
622 + },
623 + "json-schema-traverse": {
624 + "version": "0.4.1",
625 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
626 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
627 + },
628 + "json-stringify-safe": {
629 + "version": "5.0.1",
630 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
631 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
632 + },
633 + "jsprim": {
634 + "version": "1.4.1",
635 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
636 + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
637 + "requires": {
638 + "assert-plus": "1.0.0",
639 + "extsprintf": "1.3.0",
640 + "json-schema": "0.2.3",
641 + "verror": "1.10.0"
642 + }
643 + },
644 + "levn": {
645 + "version": "0.3.0",
646 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
647 + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
648 + "requires": {
649 + "prelude-ls": "~1.1.2",
650 + "type-check": "~0.3.2"
651 + }
652 + },
653 + "lodash": {
654 + "version": "4.17.11",
655 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
656 + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
657 + },
658 + "lodash.sortby": {
659 + "version": "4.7.0",
660 + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
661 + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
662 + },
663 + "media-typer": {
664 + "version": "0.3.0",
665 + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
666 + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
667 + },
668 + "merge-descriptors": {
669 + "version": "1.0.1",
670 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
671 + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
672 + },
673 + "methods": {
674 + "version": "1.1.2",
675 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
676 + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
677 + },
678 + "mime": {
679 + "version": "1.4.1",
680 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
681 + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
682 + },
683 + "mime-db": {
684 + "version": "1.37.0",
685 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
686 + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
687 + },
688 + "mime-types": {
689 + "version": "2.1.21",
690 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
691 + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
692 + "requires": {
693 + "mime-db": "~1.37.0"
694 + }
695 + },
696 + "ms": {
697 + "version": "2.0.0",
698 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
699 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
700 + },
701 + "negotiator": {
702 + "version": "0.6.1",
703 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
704 + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
705 + },
706 + "nth-check": {
707 + "version": "1.0.2",
708 + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
709 + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
710 + "requires": {
711 + "boolbase": "~1.0.0"
712 + }
713 + },
714 + "nwsapi": {
715 + "version": "2.0.9",
716 + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz",
717 + "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ=="
718 + },
719 + "oauth-sign": {
720 + "version": "0.9.0",
721 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
722 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
723 + },
724 + "on-finished": {
725 + "version": "2.3.0",
726 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
727 + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
728 + "requires": {
729 + "ee-first": "1.1.1"
730 + }
731 + },
732 + "optionator": {
733 + "version": "0.8.2",
734 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
735 + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
736 + "requires": {
737 + "deep-is": "~0.1.3",
738 + "fast-levenshtein": "~2.0.4",
739 + "levn": "~0.3.0",
740 + "prelude-ls": "~1.1.2",
741 + "type-check": "~0.3.2",
742 + "wordwrap": "~1.0.0"
743 + }
744 + },
745 + "parse5": {
746 + "version": "3.0.3",
747 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
748 + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
749 + "requires": {
750 + "@types/node": "*"
751 + }
752 + },
753 + "parseurl": {
754 + "version": "1.3.2",
755 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
756 + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
757 + },
758 + "path-to-regexp": {
759 + "version": "0.1.7",
760 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
761 + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
762 + },
763 + "performance-now": {
764 + "version": "2.1.0",
765 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
766 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
767 + },
768 + "pn": {
769 + "version": "1.1.0",
770 + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
771 + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
772 + },
773 + "prelude-ls": {
774 + "version": "1.1.2",
775 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
776 + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
777 + },
778 + "proxy-addr": {
779 + "version": "2.0.4",
780 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
781 + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
782 + "requires": {
783 + "forwarded": "~0.1.2",
784 + "ipaddr.js": "1.8.0"
785 + }
786 + },
787 + "psl": {
788 + "version": "1.1.31",
789 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
790 + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
791 + },
792 + "punycode": {
793 + "version": "2.1.1",
794 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
795 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
796 + },
797 + "qs": {
798 + "version": "6.5.2",
799 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
800 + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
801 + },
802 + "range-parser": {
803 + "version": "1.2.0",
804 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
805 + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
806 + },
807 + "raw-body": {
808 + "version": "2.3.3",
809 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
810 + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
811 + "requires": {
812 + "bytes": "3.0.0",
813 + "http-errors": "1.6.3",
814 + "iconv-lite": "0.4.23",
815 + "unpipe": "1.0.0"
816 + }
817 + },
818 + "readable-stream": {
819 + "version": "3.0.6",
820 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz",
821 + "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==",
822 + "requires": {
823 + "inherits": "^2.0.3",
824 + "string_decoder": "^1.1.1",
825 + "util-deprecate": "^1.0.1"
826 + }
827 + },
828 + "request": {
829 + "version": "2.88.0",
830 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
831 + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
832 + "requires": {
833 + "aws-sign2": "~0.7.0",
834 + "aws4": "^1.8.0",
835 + "caseless": "~0.12.0",
836 + "combined-stream": "~1.0.6",
837 + "extend": "~3.0.2",
838 + "forever-agent": "~0.6.1",
839 + "form-data": "~2.3.2",
840 + "har-validator": "~5.1.0",
841 + "http-signature": "~1.2.0",
842 + "is-typedarray": "~1.0.0",
843 + "isstream": "~0.1.2",
844 + "json-stringify-safe": "~5.0.1",
845 + "mime-types": "~2.1.19",
846 + "oauth-sign": "~0.9.0",
847 + "performance-now": "^2.1.0",
848 + "qs": "~6.5.2",
849 + "safe-buffer": "^5.1.2",
850 + "tough-cookie": "~2.4.3",
851 + "tunnel-agent": "^0.6.0",
852 + "uuid": "^3.3.2"
853 + }
854 + },
855 + "request-promise-core": {
856 + "version": "1.1.1",
857 + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
858 + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
859 + "requires": {
860 + "lodash": "^4.13.1"
861 + }
862 + },
863 + "request-promise-native": {
864 + "version": "1.0.5",
865 + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
866 + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
867 + "requires": {
868 + "request-promise-core": "1.1.1",
869 + "stealthy-require": "^1.1.0",
870 + "tough-cookie": ">=2.3.3"
871 + }
872 + },
873 + "safe-buffer": {
874 + "version": "5.1.2",
875 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
876 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
877 + },
878 + "safer-buffer": {
879 + "version": "2.1.2",
880 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
881 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
882 + },
883 + "saxes": {
884 + "version": "3.1.4",
885 + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.4.tgz",
886 + "integrity": "sha512-GVZmLJnkS4Vl8Pe9o4nc5ALZ615VOVxCmea8Cs0l+8GZw3RQ5XGOSUomIUfuZuk4Todo44v4y+HY1EATkDDiZg==",
887 + "requires": {
888 + "xmlchars": "^1.3.1"
889 + }
890 + },
891 + "send": {
892 + "version": "0.16.2",
893 + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
894 + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
895 + "requires": {
896 + "debug": "2.6.9",
897 + "depd": "~1.1.2",
898 + "destroy": "~1.0.4",
899 + "encodeurl": "~1.0.2",
900 + "escape-html": "~1.0.3",
901 + "etag": "~1.8.1",
902 + "fresh": "0.5.2",
903 + "http-errors": "~1.6.2",
904 + "mime": "1.4.1",
905 + "ms": "2.0.0",
906 + "on-finished": "~2.3.0",
907 + "range-parser": "~1.2.0",
908 + "statuses": "~1.4.0"
909 + }
910 + },
911 + "serve-static": {
912 + "version": "1.13.2",
913 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
914 + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
915 + "requires": {
916 + "encodeurl": "~1.0.2",
917 + "escape-html": "~1.0.3",
918 + "parseurl": "~1.3.2",
919 + "send": "0.16.2"
920 + }
921 + },
922 + "setprototypeof": {
923 + "version": "1.1.0",
924 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
925 + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
926 + },
927 + "source-map": {
928 + "version": "0.6.1",
929 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
930 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
931 + },
932 + "sshpk": {
933 + "version": "1.15.2",
934 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
935 + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
936 + "requires": {
937 + "asn1": "~0.2.3",
938 + "assert-plus": "^1.0.0",
939 + "bcrypt-pbkdf": "^1.0.0",
940 + "dashdash": "^1.12.0",
941 + "ecc-jsbn": "~0.1.1",
942 + "getpass": "^0.1.1",
943 + "jsbn": "~0.1.0",
944 + "safer-buffer": "^2.0.2",
945 + "tweetnacl": "~0.14.0"
946 + }
947 + },
948 + "statuses": {
949 + "version": "1.4.0",
950 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
951 + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
952 + },
953 + "stealthy-require": {
954 + "version": "1.1.1",
955 + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
956 + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
957 + },
958 + "string_decoder": {
959 + "version": "1.2.0",
960 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
961 + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
962 + "requires": {
963 + "safe-buffer": "~5.1.0"
964 + }
965 + },
966 + "symbol-tree": {
967 + "version": "3.2.2",
968 + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
969 + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
970 + },
971 + "tough-cookie": {
972 + "version": "2.4.3",
973 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
974 + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
975 + "requires": {
976 + "psl": "^1.1.24",
977 + "punycode": "^1.4.1"
978 + },
979 + "dependencies": {
980 + "punycode": {
981 + "version": "1.4.1",
982 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
983 + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
984 + }
985 + }
986 + },
987 + "tr46": {
988 + "version": "1.0.1",
989 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
990 + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
991 + "requires": {
992 + "punycode": "^2.1.0"
993 + }
994 + },
995 + "tunnel-agent": {
996 + "version": "0.6.0",
997 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
998 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
999 + "requires": {
1000 + "safe-buffer": "^5.0.1"
1001 + }
1002 + },
1003 + "tweetnacl": {
1004 + "version": "0.14.5",
1005 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1006 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1007 + },
1008 + "type-check": {
1009 + "version": "0.3.2",
1010 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1011 + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1012 + "requires": {
1013 + "prelude-ls": "~1.1.2"
1014 + }
1015 + },
1016 + "type-is": {
1017 + "version": "1.6.16",
1018 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
1019 + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
1020 + "requires": {
1021 + "media-typer": "0.3.0",
1022 + "mime-types": "~2.1.18"
1023 + }
1024 + },
1025 + "unpipe": {
1026 + "version": "1.0.0",
1027 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1028 + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1029 + },
1030 + "uri-js": {
1031 + "version": "4.2.2",
1032 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1033 + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1034 + "requires": {
1035 + "punycode": "^2.1.0"
1036 + }
1037 + },
1038 + "util-deprecate": {
1039 + "version": "1.0.2",
1040 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1041 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1042 + },
1043 + "utils-merge": {
1044 + "version": "1.0.1",
1045 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1046 + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1047 + },
1048 + "uuid": {
1049 + "version": "3.3.2",
1050 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1051 + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
1052 + },
1053 + "vary": {
1054 + "version": "1.1.2",
1055 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1056 + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1057 + },
1058 + "verror": {
1059 + "version": "1.10.0",
1060 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1061 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1062 + "requires": {
1063 + "assert-plus": "^1.0.0",
1064 + "core-util-is": "1.0.2",
1065 + "extsprintf": "^1.2.0"
1066 + }
1067 + },
1068 + "w3c-hr-time": {
1069 + "version": "1.0.1",
1070 + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
1071 + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
1072 + "requires": {
1073 + "browser-process-hrtime": "^0.1.2"
1074 + }
1075 + },
1076 + "w3c-xmlserializer": {
1077 + "version": "1.0.1",
1078 + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz",
1079 + "integrity": "sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg==",
1080 + "requires": {
1081 + "domexception": "^1.0.1",
1082 + "webidl-conversions": "^4.0.2",
1083 + "xml-name-validator": "^3.0.0"
1084 + }
1085 + },
1086 + "webidl-conversions": {
1087 + "version": "4.0.2",
1088 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
1089 + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
1090 + },
1091 + "whatwg-encoding": {
1092 + "version": "1.0.5",
1093 + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
1094 + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
1095 + "requires": {
1096 + "iconv-lite": "0.4.24"
1097 + },
1098 + "dependencies": {
1099 + "iconv-lite": {
1100 + "version": "0.4.24",
1101 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1102 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1103 + "requires": {
1104 + "safer-buffer": ">= 2.1.2 < 3"
1105 + }
1106 + }
1107 + }
1108 + },
1109 + "whatwg-mimetype": {
1110 + "version": "2.3.0",
1111 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
1112 + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
1113 + },
1114 + "whatwg-url": {
1115 + "version": "7.0.0",
1116 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
1117 + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
1118 + "requires": {
1119 + "lodash.sortby": "^4.7.0",
1120 + "tr46": "^1.0.1",
1121 + "webidl-conversions": "^4.0.2"
1122 + }
1123 + },
1124 + "wordwrap": {
1125 + "version": "1.0.0",
1126 + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1127 + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
1128 + },
1129 + "ws": {
1130 + "version": "6.1.2",
1131 + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz",
1132 + "integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==",
1133 + "requires": {
1134 + "async-limiter": "~1.0.0"
1135 + }
1136 + },
1137 + "xml-name-validator": {
1138 + "version": "3.0.0",
1139 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
1140 + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
1141 + },
1142 + "xmlchars": {
1143 + "version": "1.3.1",
1144 + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz",
1145 + "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw=="
1146 + }
1147 + }
1148 +}
1 +module.exports = function(app,fs)
2 +{
3 + app.get('/',function(req,res){
4 +res.render('index',{top: '상대 정보를 입력해 주세요.',
5 +ejs_momentum: ' ',
6 +ejs_terran_proficiency: ' ',
7 +ejs_zerg_proficiency: ' ',
8 +ejs_protoss_proficiency: ' ',
9 +ejs_primary_race: ' ',
10 +ejs_win_rate: ' '});
11 +});
12 +
13 +app.get('/recommend',function(req,res,next){
14 +
15 +
16 + var readline=require('readline');//입력받기 위한 모듈
17 + var r=readline.createInterface({input:process.stdin,output:process.stdout});//키보드 입출력 정의
18 + var rtfw1="http://www.rankedftw.com/search/?name=";//rtfw에서 기본 검색 url
19 + var rtfw2="http://www.rankedftw.com/player/"//rtfw 번호 기반 특정 플레이어 검색 url
20 +
21 + //
22 + var cheerio=require('cheerio');//cheerio모듈 사용
23 + var request=require('request');//request모듈 사용
24 + var fs=require('fs');//파일시스템 사용
25 + //
26 + //request 1 variable
27 + var username='';//username문자열 선언
28 + var userleague='';//userleague 문자열 선언
29 + var userregion='';//userregion 문자열 선언
30 + var usernumber='';//usernumber 문자열 선언
31 + //
32 + //request 2 variable
33 +
34 + //
35 + //request 3-1 variable
36 +
37 + //
38 + //request 3-2 variable
39 +
40 + //
41 + //request 3-3 variable
42 +
43 + //
44 + //system message
45 +
46 + //
47 + //delivering variable
48 + var momentum;//기세
49 + var terran_proficiency;//테란 숙련도
50 + var zerg_proficiency;//저그 숙련도
51 + var protoss_proficiency;//프로토스 숙련도
52 + var primary_race;//주 종족
53 + var win_rate;//시즌 전체 승률
54 +
55 + var region;//서버
56 + var league;//리그
57 + var myrace;//내 종족
58 + var enemyrace;//상대 종족
59 + var enemyname;//상대 이름
60 +
61 + var recommend;//추천빌드(운영/타이밍/올인)
62 + //
63 +//var answer=req.getParameter("name");
64 +region=req.query.region;
65 +league=req.query.league;
66 +myrace=req.query.myRace;
67 +enemyrace=req.query.enemyRace;
68 +enemyname=req.query.enemyName;
69 +
70 +console.log("query"+enemyname);
71 +
72 +
73 +// r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성
74 + //question은 에러 제어 만들면 안된다.
75 + console.log("r.question processing");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다.
76 + rtfw1=rtfw1+enemyname;//검색 url 구성
77 + console.log(rtfw1);//테스트용 : 검색 url 확인
78 + //
79 + request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1
80 + if(error){throw error};//에러처리
81 + console.log("request 1 processing");
82 + console.log(body);
83 + let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색
84 + $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다.
85 + username=$(this).find('.name').text().trim();//name클래스를 찾아 공백빼고 텍스트화
86 + userleague=$(this).find('.league').text().trim();//league클래스를 찾아 공백빼고 텍스트화
87 + userregion=$(this).find('.region').text().trim();//region클래스를 찾아 공백빼고 텍스트화
88 + if((username===enemyname)&&(userregion===region)){//아직 리그 구현 안함-리그는 그림으로 비교
89 + console.log(`${username}`);//테스트용 : 유저네임 출력
90 + console.log(`${userregion}`);//테스트용 : 유저리전 출력
91 + var usernumber=$(this).toString().slice(29,43);//rtfw에서 사용하는 사용자번호를 문자열로 넉넉히 자름
92 + var localindex1=usernumber.search('/');//첫번째 슬레시 발견하는 인덱스 검출
93 + usernumber=usernumber.slice(localindex1+1);//앞부분 슬래시 자른다.
94 + var localindex2=usernumber.search('/')-localindex1+1;//두번째 슬레시 발견하는 인덱스 검출
95 + usernumber=usernumber.slice(0,localindex2);//뒷부분 슬래시 자른다.
96 + console.log(`${usernumber}`);//테스트용 : 유저넘버 출력
97 + if(rtfw2.length>33){//하나라도 붙어있으면
98 + rtfw2=rtfw2;//아무것도 안한다.
99 + }else{//그렇지않고 아무것도 안붙어있으면
100 + rtfw2=rtfw2+usernumber+'/';//rtfw2 url갱신
101 + }
102 + console.log(rtfw2);//테스트용 : rtfw2 출력
103 + }//이름서버리그비교if종료
104 + });//ul a find문 종료
105 +
106 + var profileID='';
107 + request(rtfw2,(error,response,body)=>{//rtfw2 url 불러오기 request 2
108 + if(error){throw error};//에러처리
109 + console.log('request2 processing');//테스트용 : request2 실행여부 출력
110 + let $ = cheerio.load(body);//rtfw2가 body이다. $로 jquery방식으로 html탐색
111 + $('.content').find('.bnet-link').each(function(index,elem){//content 클래스 안의 bnet-link클래스를 포함하는 요소를 찾는다.
112 + profileID=$(this).toString().slice(62,72);//얻고자 하는 profileID를 포함하여 앞뒤로 적당히 자른다.
113 + var localindex3=profileID.search('/');//첫번째 슬레시 발견하는 인덱스 검출
114 + profileID=profileID.slice(localindex3+1);//앞부분 슬래시 자른다.
115 + var localindex4=profileID.search('/')-localindex3;//두번째 슬레시 발견하는 인덱스 검출
116 + profileID=profileID.slice(0,localindex4);//뒷부분 슬래시 자른다.
117 + console.log(`${profileID}`);//테스트용 : profileID 출력
118 + //profileID=encodeURI(encodeURIComponent(profileID));//한글처리부
119 + });//a bnetlink 종료
120 + //console.log(`${profileID}`);//테스트용 : profileID 출력
121 +
122 + var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매치히스토리 url 앞부분
123 + var match_history_2="/matches?access_token=US115TlhyMaYe3d3v4t6j17Umw1CfsvCIV"//매치히스토리 url 뒷부분
124 + var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성
125 + console.log(match_history_url);//테스트용 : 매치히스토리 url 출력
126 +
127 + request(match_history_url,(error,response,body)=>{//match history request request 3
128 + if(error){throw error};//에러처리
129 + console.log('request3 processing');//테스트용 : request 작동여부 출력
130 +
131 + var obj1=JSON.parse(body);//request 결과를 JSON objerct로 변환
132 + //console.log(obj.matches [0].map);//테스트용 : 하나에 접근
133 + $(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 match들과 인덱스 사용
134 + if(match.type=='1v1'){//경기타입이 1대1인 경우에만 관심있다.
135 + console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시
136 + };//if 1v1 종료
137 + });//each function 종료
138 +
139 + var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"
140 + var ladder_2="/ladders?access_token=US115TlhyMaYe3d3v4t6j17Umw1CfsvCIV";
141 + var ladder_url=ladder_1+profileID+ladder_2;
142 + console.log(ladder_url);
143 + request(ladder_url,(error,response,body)=>{//ladder request request 4
144 + if(error){throw error};
145 + console.log('request4 processing');
146 + var obj2=JSON.parse(body);//request 결과를 JSON object로 변환
147 + //console.log(body);
148 + // console.log(obj2.currentSeason [2].ladder[0].wins);//테스트용 : 하나에 접근
149 + var wins=obj2.currentSeason[3].ladder[0].wins;
150 + var losses=obj2.currentSeason[3].ladder[0].losses;
151 + win_rate=wins/(wins+losses);
152 + //console.log(wins);
153 + //console.log(losses);
154 + //console.log(win_rate);
155 +
156 + var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/";
157 + var profile_2="?access_token=US115TlhyMaYe3d3v4t6j17Umw1CfsvCIV";
158 + var profile_url=profile_1+profileID+profile_2;
159 + console.log(profile_url);
160 + request(profile_url,(error,response,body)=>{//profile request request 5
161 + if(error){throw error};
162 + console.log('request5 processing');
163 + //console.log(body);
164 + var obj3=JSON.parse(body);//request 결과를 JSON object로 변환
165 + //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근
166 + primary_race=obj3.career.primaryRace;
167 + //console.log(primary_race);
168 + var terran_level=obj3.swarmLevels.terran.level;
169 + var zerg_level=obj3.swarmLevels.zerg.level;
170 + var protoss_level=obj3.swarmLevels.protoss.level;
171 +
172 + //console.log(terran_level);
173 + //console.log(zerg_level);
174 + //console.log(protoss_level);
175 +
176 + //build recommend algorithm
177 + var matchresults=[];//매치결과 담을 배열 선언
178 + var momentum_win=0;//최근 10경기 중 승수 초기화
179 + for (var i=0;i<25;i++){//매치히스토리는 최대 25개
180 + if(obj1.matches[i].type=='1v1'){//1v1에만 관심있다.
181 + matchresults.push(obj1.matches[i].decision);//배열 끝에 결과 삽입
182 + if((matchresults.length<11)&&(obj1.matches[i].decision=='Win')){//최근 10경기에서 승리한 경우
183 + momentum_win=momentum_win+1;//그 승수를 카운트한다.
184 + }//if length11 종료
185 + }//obj1 1v1 종료
186 + }//for i 25 종료
187 + //console.log(matchresults);//테스트용 : matchresults 출력
188 + //console.log(momentum_win);//테스트용 : momentum_win 출력
189 + if(momentum_win>=7){//7승 이상이면 상승세
190 + momentum='상승세';
191 + }
192 + if((momentum_win<7)&&(momentum_win>=4)){//4승이상 7승미만이면 정체
193 + momentum='정체중';
194 + }
195 + if(momentum_win<4){//4승 미만이면 하락세
196 + momentum='하락세';
197 + }
198 + //console.log(momentum);//테스트용 : 기세 출력
199 +
200 + if(terran_level<50){//테란 레벨 50 안되면
201 + terran_proficiency='비숙련자'//테란 비숙련자
202 + } else{
203 + terran_proficiency='숙련자'
204 + }
205 + if(zerg_level<50){//저그 레벨 50 안되면
206 + zerg_proficiency='비숙련자'//저그 비숙련자
207 + } else{
208 + zerg_proficiency='숙련자'
209 + }
210 + if(protoss_level<50){//프로토스 레벨 50 안되면
211 + protoss_proficiency='비숙련자'//프로토스 비숙련자
212 + } else{
213 + protoss_proficiency='숙련자'
214 + }
215 + //
216 + //system message part
217 + var system_message_momentum="최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다.";
218 + var system_message_terran_proficiency="상대는 테란 '"+terran_proficiency+"'입니다.";
219 + var system_message_zerg_proficiency="상대는 저그 '"+zerg_proficiency+"'입니다.";
220 + var system_message_protoss_proficiency="상대는 프로토스 '"+protoss_proficiency+"'입니다.";
221 + var system_message_primary_race="상대의 주 종족은 '"+primary_race+"'입니다.";
222 + var system_message_win_rate="상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다.";
223 +
224 + //var system_message=system_message_momentum+system_message_terran_proficiency+system_message_zerg_proficiency+system_message_protoss_proficiency+system_message_primary_race+system_message_win_rate;
225 +
226 + console.log("최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다.");
227 + console.log("상대는 테란 '"+terran_proficiency+"'입니다.");
228 + console.log("상대는 저그 '"+zerg_proficiency+"'입니다.");
229 + console.log("상대는 프로토스 '"+protoss_proficiency+"'입니다.");
230 + console.log("상대의 주 종족은 '"+primary_race+"'입니다.");
231 + console.log("상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다.");
232 + //
233 +js_momentum="최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다.";
234 +js_terran_proficiency="상대는 테란 '"+terran_proficiency+"'입니다.";
235 +js_zerg_proficiency="상대는 저그 '"+zerg_proficiency+"'입니다.";
236 +js_protoss_proficiency="상대는 프로토스 '"+protoss_proficiency+"'입니다.";
237 +js_primary_race="상대의 주 종족은 '"+primary_race+"'입니다.";
238 +js_win_rate="상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다.";
239 +
240 +
241 +res.render('index',{top: '분석 결과',
242 +ejs_momentum: js_momentum,
243 +ejs_terran_proficiency: js_terran_proficiency,
244 +ejs_zerg_proficiency: js_zerg_proficiency,
245 +ejs_protoss_proficiency: js_protoss_proficiency,
246 +ejs_primary_race: js_primary_race,
247 +ejs_win_rate: js_win_rate});
248 + //build recommend command
249 +
250 + //
251 +
252 + console.log('request5 done');
253 + });//request5종료
254 + console.log('request4 done');
255 + });//request4종료
256 + console.log('request3 done');
257 + });//request3종료
258 + console.log('request2 done');
259 + });//request2종료
260 + console.log('request1 done');
261 + });//request1 종료
262 +
263 + console.log('r.question done');
264 + //console.log(terran_level);
265 +// r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에.
266 +// });//r.question 끝
267 +
268 +
269 +
270 +
271 +
272 + });
273 +
274 +
275 +}
1 +<!DOCTYPE html>
2 +<html lang="ko-kr">
3 +<head>
4 + <meta charset="utf-8">
5 + <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen">
6 + <link href="/static/core/style.css" rel="stylesheet" media="screen">
7 + <script type="text/javascript" src="node_modules/jquery/dist/jquery.js"></script>
8 +
9 + <script async="" src="//www.google-analytics.com/analytics.js"></script>
10 + <script type="text/javascript" async="" src="//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"></script>
11 + <title>StarCraft 2 Build Recommendation Project</title>
12 +
13 +<body>
14 +
15 +
16 +
17 +
18 +<p stype="fond-family:verdana;">StarCraft 2 Build Recommendation Project</p>
19 +
20 +<img src="/imgs" alt="StarCraft2 LOGO image">
21 +<div class="col-md-3">
22 + <form action="/recommend" id="searchform" action method="get">
23 +
24 + <div id="div_id_server" class="form-group">
25 + <label for="id_server" class="control-label ">
26 + 서버
27 + </label>
28 + <div class="controls">
29 + <select class="select form-control" id="id_server" name="region">
30 + <option value="KR">한국/대만</option>
31 + <option value="AM">미국</option>
32 + <option value="CN">중국</option>
33 + <option value="EU">유럽</option>
34 + </select>
35 + </div>
36 + </div>
37 +
38 +
39 +
40 + <div id="div_id_myRace" class="form-group">
41 + <label for="id_myRace" class="control-label ">
42 + 내 종족
43 + </label>
44 + <div class="controls">
45 + <select class="select form-control" id="id_myRace" name="myRace">
46 + <option value="terran">테란</option>
47 + <option value="zerg">저그</option>
48 + <option value="protoss">프로토스</option>
49 + </select>
50 + </div>
51 + </div>
52 +
53 + <div id="div_id_race" class="form-group">
54 + <label for="id_race" class="control-label ">
55 + 상대 종족
56 + </label>
57 + <div class="controls">
58 + <select class="select form-control" id="id_race" name="race">
59 + <option value="terran">테란</option>
60 + <option value="zerg">저그</option>
61 + <option value="protoss">프로토스</option>
62 + </select>
63 + </div>
64 + </div>
65 +
66 + <div id="div_id_name" class="form-group">
67 + <label for="id_name" class="control-label ">
68 + 상대 아이디
69 + </label>
70 + <div class="controls">
71 + <input class="textinput textInput form-control" id="id_name" maxlength="20" name="name" type="text">
72 + </div>
73 + </div>
74 +
75 +
76 +
77 +<input value="빌드 추천!" type="submit"/>
78 +</form>
79 +
80 +<%= top%>
81 +<br>
82 +<%=ejs_momentum%>
83 +<%=ejs_terran_proficiency%>
84 +<%=ejs_zerg_proficiency%>
85 +<%=ejs_protoss_proficiency%>
86 +<%=ejs_primary_race%>
87 +<%=ejs_win_rate%>
88 +<br>
89 +<br>
90 +<a href="https://starcraft2.com/ko-kr/game">Official Site</a>
91 +
92 +</body>
93 +</html>