From eb847d899c5f33582179328b3b149f980d463ef1 Mon Sep 17 00:00:00 2001 From: Jianguo-Genius Date: Sat, 14 Sep 2024 12:39:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95):=20ha?= =?UTF-8?q?r=E6=96=87=E4=BB=B6=E8=BF=87=E6=BB=A4css=E5=92=8Cjs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1046387 --user=宋天阳 【接口测试】定义-导入HAR文件失败 https://www.tapd.cn/55049933/s/1578799 --- .../parser/api/HarParserApiDefinition.java | 14 +- ...HttpApiDefinitionImportAbstractParser.java | 7 +- .../ApiDefinitionImportService.java | 9 +- .../ApiDefinitionControllerTests.java | 11 + .../file/import/har/testjsandcss.har | 102807 +++++++++++++++ 5 files changed, 102837 insertions(+), 11 deletions(-) create mode 100644 backend/services/api-test/src/test/resources/file/import/har/testjsandcss.har diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HarParserApiDefinition.java b/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HarParserApiDefinition.java index 8b80bdc6bc..5236b48418 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HarParserApiDefinition.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HarParserApiDefinition.java @@ -20,6 +20,7 @@ import io.metersphere.api.parser.api.har.model.*; import io.metersphere.api.utils.ApiDataUtils; import io.metersphere.api.utils.JSONUtil; import io.metersphere.plugin.api.spi.AbstractMsTestElement; +import io.metersphere.sdk.constants.HttpMethodConstants; import io.metersphere.sdk.exception.MSException; import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.CommonBeanFactory; @@ -240,6 +241,10 @@ public class HarParserApiDefinition extends HttpApiDefinitionImportAbstractParse for (HarEntry entry : harEntryList) { HarRequest harRequest = entry.request; if (harRequest != null) { + // css 、 js 略过 + if (StringUtils.equalsIgnoreCase(harRequest.method, HttpMethodConstants.GET.name()) && StringUtils.endsWithAny(harRequest.url, ".css", ".js")) { + continue; + } String url = harRequest.url; if (url == null) { continue; @@ -358,7 +363,7 @@ public class HarParserApiDefinition extends HttpApiDefinitionImportAbstractParse if (StringUtils.equalsIgnoreCase("GET", requestBody.method) || requestBody.postData == null) { return; } - String bodyType = content.mimeType; + String bodyType = Body.BodyType.NONE.name(); if (StringUtils.isEmpty(bodyType)) { body.setRawBody(new RawBody() {{ this.setValue(content.text); @@ -427,12 +432,9 @@ public class HarParserApiDefinition extends HttpApiDefinitionImportAbstractParse }}); } else if (bodyType.startsWith(org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE)) { bodyType = Body.BodyType.BINARY.name(); - List postParams = content.params; - // for (HarPostParam postParam : postParams) { - // KeyValue kv = new KeyValue(postParam.name, postParam.value); - // body.getFormDataBody().add(kv); - // } + body.setBinaryBody(new BinaryBody()); } else { + bodyType = Body.BodyType.RAW.name(); body.setRawBody(new RawBody() {{ this.setValue(content.text); }}); diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HttpApiDefinitionImportAbstractParser.java b/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HttpApiDefinitionImportAbstractParser.java index 518c874c8f..69fdeff224 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HttpApiDefinitionImportAbstractParser.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/parser/api/HttpApiDefinitionImportAbstractParser.java @@ -79,7 +79,12 @@ public abstract class HttpApiDefinitionImportAbstractParser implements ApiDef protected ApiDefinitionDetail buildApiDefinition(String name, String path, String method, String modulePath, ImportRequest importRequest) { ApiDefinitionDetail apiDefinition = new ApiDefinitionDetail(); apiDefinition.setId(IDGenerator.nextStr()); - apiDefinition.setName(StringUtils.trim(name)); + if (name != null) { + apiDefinition.setName(StringUtils.trim(name)); + if (apiDefinition.getName().length() > 255) { + apiDefinition.setName(apiDefinition.getName().substring(0, 250) + "..."); + } + } apiDefinition.setPath(formatPath(StringUtils.trim(path))); apiDefinition.setProtocol(StringUtils.trim(importRequest.getProtocol())); apiDefinition.setMethod(StringUtils.trim(method)); diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportService.java b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportService.java index 1d9a84fb08..61ce967fac 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportService.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportService.java @@ -52,6 +52,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -319,7 +320,7 @@ public class ApiDefinitionImportService { } private void insertApiDefinition(ImportRequest request, List insertApiData, ApiDefinitionMapper apiMapper, ApiDefinitionBlobMapper apiBlobMapper, SqlSession sqlSession) { - insertApiData.forEach(t -> { + for (ApiDefinitionDetail t : insertApiData) { ApiDefinition apiDefinition = new ApiDefinition(); BeanUtils.copyBean(apiDefinition, t); if (StringUtils.isEmpty(apiDefinition.getId())) { @@ -342,10 +343,10 @@ public class ApiDefinitionImportService { //插入blob数据 ApiDefinitionBlob apiDefinitionBlob = new ApiDefinitionBlob(); apiDefinitionBlob.setId(apiDefinition.getId()); - apiDefinitionBlob.setRequest(JSON.toJSONBytes(t.getRequest())); - apiDefinitionBlob.setResponse(JSON.toJSONBytes(t.getResponse())); + apiDefinitionBlob.setRequest(ApiDataUtils.toJSONString(t.getRequest()).getBytes(StandardCharsets.UTF_8)); + apiDefinitionBlob.setResponse(ApiDataUtils.toJSONString(t.getResponse()).getBytes(StandardCharsets.UTF_8)); apiBlobMapper.insertSelective(apiDefinitionBlob); - }); + } sqlSession.flushStatements(); } diff --git a/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiDefinitionControllerTests.java b/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiDefinitionControllerTests.java index f18a4f618a..edb7c7e7f2 100644 --- a/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiDefinitionControllerTests.java +++ b/backend/services/api-test/src/test/java/io/metersphere/api/controller/ApiDefinitionControllerTests.java @@ -2045,6 +2045,17 @@ public class ApiDefinitionControllerTests extends BaseTest { //去重处理 List apiDefinitionIdList = newApiTestCaseList.stream().map(ApiTestCase::getApiDefinitionId).distinct().collect(Collectors.toList()); Assertions.assertEquals(2, apiDefinitionIdList.size()); + + // 导入额外的har文件 + inputStream = new FileInputStream(new File(Objects.requireNonNull(this.getClass().getClassLoader().getResource("file/import/har/testjsandcss.har")).getPath())); + file = new MockMultipartFile("file", "post-page.har", MediaType.APPLICATION_OCTET_STREAM_VALUE, inputStream); + request.setPlatform("har"); + paramMap = new LinkedMultiValueMap<>(); + paramMap.add("request", JSON.toJSONString(request)); + paramMap.add("file", file); + this.requestMultipartWithOkAndReturn(IMPORT, paramMap); + apiDefinitionBlobs = apiDefinitionImportTestService.selectBlobByProjectId(importProject.getId()); + Assertions.assertTrue(apiDefinitionBlobs.size() > 2); } @Resource diff --git a/backend/services/api-test/src/test/resources/file/import/har/testjsandcss.har b/backend/services/api-test/src/test/resources/file/import/har/testjsandcss.har new file mode 100644 index 0000000000..2f27bd06a9 --- /dev/null +++ b/backend/services/api-test/src/test/resources/file/import/har/testjsandcss.har @@ -0,0 +1,102807 @@ +{ + "log": { + "version": "1.2", + "creator": { + "name": "WebInspector", + "version": "537.36" + }, + "pages": [ + { + "startedDateTime": "2024-09-14T01:23:59.788Z", + "id": "page_1", + "title": "https://www.tapd.cn/tapd_fe/55049933/bug/list", + "pageTimings": { + "onContentLoad": 965.234999981476, + "onLoad": 1466.8669999809936 + } + } + ], + "entries": [ + { + "_initiator": { + "type": "other" + }, + "_priority": "VeryHigh", + "_resourceType": "document", + "cache": {}, + "connection": "706058", + "pageref": "page_1", + "request": { + "method": "GET", + "url": "https://www.tapd.cn/tapd_fe/55049933/bug/list", + "httpVersion": "HTTP/1.1", + "headers": [ + { + "name": "Accept", + "value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Accept-Language", + "value": "en,zh-CN;q=0.9,zh;q=0.8" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Cookie", + "value": "_qddaz=QD.938469203885200; __root_domain_v=.tapd.cn; tapdsession=1709860638f7ce847a284f14be289a184d78a204d24b2ec36deed6b54dadb134882178cbe9; t_u=3fd132428c6db4ebd6bb19c555d5714ad92ad97915463cb387e04bc990d7ac9a0f626b6aa608ec613918c076922b87fb0efdb13335471c5b22cc16b515f29c072c3be9ce5e5f6606%7C1; new_worktable=search_filter; dsc-token=KCdTnKqjh0Bfoei3; locale=en; _t_uid=297555231; _t_crop=60155946; tapd_div=101_2885; cloud_current_workspaceId=55049933; _wt=eyJ1aWQiOiIyOTc1NTUyMzEiLCJjb21wYW55X2lkIjoiNjAxNTU5NDYiLCJleHAiOjE3MjYyNzcwODN9.df0ff1ef37032b5817244a10910435e204c70bae53282319b931e2181e4e0fd7" + }, + { + "name": "Host", + "value": "www.tapd.cn" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Referer", + "value": "https://www.tapd.cn/55049933/bugtrace/bugreports/stat_general/general/customreport-1155049933001000025" + }, + { + "name": "Sec-Fetch-Dest", + "value": "document" + }, + { + "name": "Sec-Fetch-Mode", + "value": "navigate" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Sec-Fetch-User", + "value": "?1" + }, + { + "name": "Upgrade-Insecure-Requests", + "value": "1" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" + }, + { + "name": "sec-ch-ua", + "value": "\"Chromium\";v=\"128\", \"Not;A=Brand\";v=\"24\", \"Google Chrome\";v=\"128\"" + }, + { + "name": "sec-ch-ua-mobile", + "value": "?0" + }, + { + "name": "sec-ch-ua-platform", + "value": "\"macOS\"" + } + ], + "queryString": [], + "cookies": [ + { + "name": "_qddaz", + "value": "QD.938469203885200", + "path": "/", + "domain": ".tapd.cn", + "expires": "2025-08-27T09:48:45.000Z", + "httpOnly": false, + "secure": true + }, + { + "name": "__root_domain_v", + "value": ".tapd.cn", + "path": "/", + "domain": ".tapd.cn", + "expires": "2025-02-01T09:50:51.000Z", + "httpOnly": false, + "secure": true + }, + { + "name": "tapdsession", + "value": "1709860638f7ce847a284f14be289a184d78a204d24b2ec36deed6b54dadb134882178cbe9", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-21T01:20:08.049Z", + "httpOnly": true, + "secure": false + }, + { + "name": "t_u", + "value": "3fd132428c6db4ebd6bb19c555d5714ad92ad97915463cb387e04bc990d7ac9a0f626b6aa608ec613918c076922b87fb0efdb13335471c5b22cc16b515f29c072c3be9ce5e5f6606%7C1", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T16:00:00.482Z", + "httpOnly": true, + "secure": false + }, + { + "name": "new_worktable", + "value": "search_filter", + "path": "/", + "domain": "www.tapd.cn", + "expires": "2025-10-19T01:20:06.862Z", + "httpOnly": false, + "secure": false + }, + { + "name": "dsc-token", + "value": "KCdTnKqjh0Bfoei3", + "path": "/", + "domain": "www.tapd.cn", + "expires": "1969-12-31T23:59:59.000Z", + "httpOnly": false, + "secure": false + }, + { + "name": "locale", + "value": "en", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-14T01:55:21.343Z", + "httpOnly": false, + "secure": false + }, + { + "name": "_t_uid", + "value": "297555231", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T01:54:51.343Z", + "httpOnly": true, + "secure": false + }, + { + "name": "_t_crop", + "value": "60155946", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T02:03:14.400Z", + "httpOnly": true, + "secure": false + }, + { + "name": "tapd_div", + "value": "101_2885", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T02:03:14.400Z", + "httpOnly": true, + "secure": false + }, + { + "name": "cloud_current_workspaceId", + "value": "55049933", + "path": "/", + "domain": "www.tapd.cn", + "expires": "1969-12-31T23:59:59.000Z", + "httpOnly": false, + "secure": false + }, + { + "name": "_wt", + "value": "eyJ1aWQiOiIyOTc1NTUyMzEiLCJjb21wYW55X2lkIjoiNjAxNTU5NDYiLCJleHAiOjE3MjYyNzcwODN9.df0ff1ef37032b5817244a10910435e204c70bae53282319b931e2181e4e0fd7", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-14T01:24:43.449Z", + "httpOnly": true, + "secure": false + } + ], + "headersSize": 1473, + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "headers": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "name": "Cache-Control", + "value": "no-store, no-cache" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Type", + "value": "text/html" + }, + { + "name": "Date", + "value": "Sat, 14 Sep 2024 01:23:59 GMT" + }, + { + "name": "ETag", + "value": "W/\"66e2da15-81f4\"" + }, + { + "name": "Last-Modified", + "value": "Thu, 12 Sep 2024 12:09:57 GMT" + }, + { + "name": "Transfer-Encoding", + "value": "chunked" + } + ], + "cookies": [], + "content": { + "size": 33268, + "mimeType": "text/html", + "compression": 25521, + "text": "TAPD

" + }, + "redirectURL": "", + "headersSize": 295, + "bodySize": 7747, + "_transferSize": 8042, + "_error": null, + "_fetchedViaServiceWorker": false + }, + "serverIPAddress": "127.0.0.1", + "startedDateTime": "2024-09-14T01:23:59.773Z", + "time": 197.12199998321012, + "timings": { + "blocked": 17.678000007927416, + "dns": -1, + "ssl": 96.952, + "connect": 98.274, + "send": 0.17399999999999238, + "wait": 80.4230000068564, + "receive": 0.5729999684263021, + "_blocked_queueing": 15.412000007927418, + "_workerStart": -1, + "_workerReady": -1, + "_workerFetchStart": -1, + "_workerRespondWithSettled": -1 + } + }, + { + "_initiator": { + "type": "parser", + "url": "https://www.tapd.cn/tapd_fe/55049933/bug/list", + "lineNumber": 358 + }, + "_priority": "High", + "_resourceType": "script", + "cache": {}, + "connection": "706129", + "pageref": "page_1", + "request": { + "method": "GET", + "url": "https://static-fe.tapd.cn/js/vendor.dll.608ae94ab7155540d173.js", + "httpVersion": "HTTP/1.1", + "headers": [ + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Accept-Language", + "value": "en,zh-CN;q=0.9,zh;q=0.8" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Cookie", + "value": "_qddaz=QD.938469203885200; __root_domain_v=.tapd.cn; tapdsession=1709860638f7ce847a284f14be289a184d78a204d24b2ec36deed6b54dadb134882178cbe9; t_u=3fd132428c6db4ebd6bb19c555d5714ad92ad97915463cb387e04bc990d7ac9a0f626b6aa608ec613918c076922b87fb0efdb13335471c5b22cc16b515f29c072c3be9ce5e5f6606%7C1; locale=en; _t_uid=297555231; _t_crop=60155946; tapd_div=101_2885; _wt=eyJ1aWQiOiIyOTc1NTUyMzEiLCJjb21wYW55X2lkIjoiNjAxNTU5NDYiLCJleHAiOjE3MjYyNzcwODN9.df0ff1ef37032b5817244a10910435e204c70bae53282319b931e2181e4e0fd7" + }, + { + "name": "Host", + "value": "static-fe.tapd.cn" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Referer", + "value": "https://www.tapd.cn/" + }, + { + "name": "Sec-Fetch-Dest", + "value": "script" + }, + { + "name": "Sec-Fetch-Mode", + "value": "no-cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-site" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36" + }, + { + "name": "sec-ch-ua", + "value": "\"Chromium\";v=\"128\", \"Not;A=Brand\";v=\"24\", \"Google Chrome\";v=\"128\"" + }, + { + "name": "sec-ch-ua-mobile", + "value": "?0" + }, + { + "name": "sec-ch-ua-platform", + "value": "\"macOS\"" + } + ], + "queryString": [], + "cookies": [ + { + "name": "_qddaz", + "value": "QD.938469203885200", + "path": "/", + "domain": ".tapd.cn", + "expires": "2025-08-27T09:48:45.000Z", + "httpOnly": false, + "secure": true + }, + { + "name": "__root_domain_v", + "value": ".tapd.cn", + "path": "/", + "domain": ".tapd.cn", + "expires": "2025-02-01T09:50:51.000Z", + "httpOnly": false, + "secure": true + }, + { + "name": "tapdsession", + "value": "1709860638f7ce847a284f14be289a184d78a204d24b2ec36deed6b54dadb134882178cbe9", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-21T01:20:08.049Z", + "httpOnly": true, + "secure": false + }, + { + "name": "t_u", + "value": "3fd132428c6db4ebd6bb19c555d5714ad92ad97915463cb387e04bc990d7ac9a0f626b6aa608ec613918c076922b87fb0efdb13335471c5b22cc16b515f29c072c3be9ce5e5f6606%7C1", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T16:00:00.482Z", + "httpOnly": true, + "secure": false + }, + { + "name": "locale", + "value": "en", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-14T01:55:21.343Z", + "httpOnly": false, + "secure": false + }, + { + "name": "_t_uid", + "value": "297555231", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T01:54:51.343Z", + "httpOnly": true, + "secure": false + }, + { + "name": "_t_crop", + "value": "60155946", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T02:03:14.400Z", + "httpOnly": true, + "secure": false + }, + { + "name": "tapd_div", + "value": "101_2885", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-20T02:03:14.400Z", + "httpOnly": true, + "secure": false + }, + { + "name": "_wt", + "value": "eyJ1aWQiOiIyOTc1NTUyMzEiLCJjb21wYW55X2lkIjoiNjAxNTU5NDYiLCJleHAiOjE3MjYyNzcwODN9.df0ff1ef37032b5817244a10910435e204c70bae53282319b931e2181e4e0fd7", + "path": "/", + "domain": ".tapd.cn", + "expires": "2024-09-14T01:24:43.449Z", + "httpOnly": true, + "secure": false + } + ], + "headersSize": 1129, + "bodySize": 0 + }, + "response": { + "status": 200, + "statusText": "OK", + "httpVersion": "HTTP/1.1", + "headers": [ + { + "name": "Accept-Ranges", + "value": "bytes" + }, + { + "name": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "name": "Cache-Control", + "value": "max-age=604800" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Content-Encoding", + "value": "gzip" + }, + { + "name": "Content-Length", + "value": "239020" + }, + { + "name": "Content-Type", + "value": "application/javascript" + }, + { + "name": "Date", + "value": "Fri, 16 Aug 2024 10:08:01 GMT" + }, + { + "name": "Etag", + "value": "\"66bde1b6-dc7f4\"" + }, + { + "name": "Last-Modified", + "value": "Thu, 15 Aug 2024 11:08:38 GMT" + }, + { + "name": "Server", + "value": "nginx/1.8.0" + }, + { + "name": "X-Cache-Lookup", + "value": "Cache Hit" + }, + { + "name": "X-NWS-LOG-UUID", + "value": "13466376661097437708" + } + ], + "cookies": [], + "content": { + "size": 903156, + "mimeType": "application/javascript", + "compression": 664136, + "text": "/*! For license information please see vendor.dll.608ae94ab7155540d173.js.LICENSE.txt */\nvar _vendor_library;!function(){var e={2631:function(e,t,n){\"use strict\";n.r(t),n.d(t,{default:function(){return $}});var i=n(8239),r=n(2444),o=/%[sdj%]/g;function s(){for(var e=arguments.length,t=Array(e),n=0;n=s)return e;switch(e){case\"%s\":return String(t[i++]);case\"%d\":return Number(t[i++]);case\"%j\":try{return JSON.stringify(t[i++])}catch(e){return\"[Circular]\"}break;default:return e}})),l=t[i];i()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,url:new RegExp(\"^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}(?:\\\\.(?:[0-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))|localhost)(?::\\\\d{2,5})?(?:(/|\\\\?|#)[^\\\\s]*)?$\",\"i\"),hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},p={integer:function(e){return p.number(e)&&parseInt(e,10)===e},float:function(e){return p.number(e)&&!p.integer(e)},array:function(e){return Array.isArray(e)},regexp:function(e){if(e instanceof RegExp)return!0;try{return!!new RegExp(e)}catch(e){return!1}},date:function(e){return\"function\"==typeof e.getTime&&\"function\"==typeof e.getMonth&&\"function\"==typeof e.getYear},number:function(e){return!isNaN(e)&&\"number\"==typeof e},object:function(e){return\"object\"===(void 0===e?\"undefined\":(0,r.Z)(e))&&!p.array(e)},method:function(e){return\"function\"==typeof e},email:function(e){return\"string\"==typeof e&&!!e.match(f.email)&&e.length<255},url:function(e){return\"string\"==typeof e&&!!e.match(f.url)},hex:function(e){return\"string\"==typeof e&&!!e.match(f.hex)}},m=\"enum\",v=h,g=function(e,t,n,i,r){(/^\\s+$/.test(t)||\"\"===t)&&i.push(s(r.messages.whitespace,e.fullField))},b=function(e,t,n,i,o){if(e.required&&void 0===t)h(e,t,n,i,o);else{var a=e.type;[\"integer\",\"float\",\"array\",\"regexp\",\"object\",\"method\",\"email\",\"number\",\"date\",\"url\",\"hex\"].indexOf(a)>-1?p[a](t)||i.push(s(o.messages.types[a],e.fullField,e.type)):a&&(void 0===t?\"undefined\":(0,r.Z)(t))!==e.type&&i.push(s(o.messages.types[a],e.fullField,e.type))}},y=function(e,t,n,i,r){var o=\"number\"==typeof e.len,a=\"number\"==typeof e.min,l=\"number\"==typeof e.max,c=t,u=null,d=\"number\"==typeof t,h=\"string\"==typeof t,f=Array.isArray(t);if(d?u=\"number\":h?u=\"string\":f&&(u=\"array\"),!u)return!1;f&&(c=t.length),h&&(c=t.replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\"_\").length),o?c!==e.len&&i.push(s(r.messages[u].len,e.fullField,e.len)):a&&!l&&ce.max?i.push(s(r.messages[u].max,e.fullField,e.max)):a&&l&&(ce.max)&&i.push(s(r.messages[u].range,e.fullField,e.min,e.max))},_=function(e,t,n,i,r){e[m]=Array.isArray(e[m])?e[m]:[],-1===e[m].indexOf(t)&&i.push(s(r.messages[m],e.fullField,e[m].join(\", \")))},x=function(e,t,n,i,r){e.pattern&&(e.pattern instanceof RegExp?(e.pattern.lastIndex=0,e.pattern.test(t)||i.push(s(r.messages.pattern.mismatch,e.fullField,t,e.pattern))):\"string\"==typeof e.pattern&&(new RegExp(e.pattern).test(t)||i.push(s(r.messages.pattern.mismatch,e.fullField,t,e.pattern))))},w=function(e,t,n,i,r){var o=e.type,s=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t,o)&&!e.required)return n();v(e,t,i,s,r,o),a(t,o)||b(e,t,i,s,r)}n(s)},C={string:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t,\"string\")&&!e.required)return n();v(e,t,i,o,r,\"string\"),a(t,\"string\")||(b(e,t,i,o,r),y(e,t,i,o,r),x(e,t,i,o,r),!0===e.whitespace&&g(e,t,i,o,r))}n(o)},method:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),void 0!==t&&b(e,t,i,o,r)}n(o)},number:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),void 0!==t&&(b(e,t,i,o,r),y(e,t,i,o,r))}n(o)},boolean:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),void 0!==t&&b(e,t,i,o,r)}n(o)},regexp:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),a(t)||b(e,t,i,o,r)}n(o)},integer:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),void 0!==t&&(b(e,t,i,o,r),y(e,t,i,o,r))}n(o)},float:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),void 0!==t&&(b(e,t,i,o,r),y(e,t,i,o,r))}n(o)},array:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t,\"array\")&&!e.required)return n();v(e,t,i,o,r,\"array\"),a(t,\"array\")||(b(e,t,i,o,r),y(e,t,i,o,r))}n(o)},object:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),void 0!==t&&b(e,t,i,o,r)}n(o)},enum:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();v(e,t,i,o,r),t&&_(e,t,i,o,r)}n(o)},pattern:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t,\"string\")&&!e.required)return n();v(e,t,i,o,r),a(t,\"string\")||x(e,t,i,o,r)}n(o)},date:function(e,t,n,i,r){var o=[];if(e.required||!e.required&&i.hasOwnProperty(e.field)){if(a(t)&&!e.required)return n();if(v(e,t,i,o,r),!a(t)){var s=void 0;s=\"number\"==typeof t?new Date(t):t,b(e,s,i,o,r),s&&y(e,s.getTime(),i,o,r)}}n(o)},url:w,hex:w,email:w,required:function(e,t,n,i,o){var s=[],a=Array.isArray(t)?\"array\":void 0===t?\"undefined\":(0,r.Z)(t);v(e,t,i,s,o,a),n(s)}};function k(){return{default:\"Validation error on field %s\",required:\"%s is required\",enum:\"%s must be one of %s\",whitespace:\"%s cannot be empty\",date:{format:\"%s date %s is invalid for format %s\",parse:\"%s date could not be parsed, %s is invalid \",invalid:\"%s date %s is invalid\"},types:{string:\"%s is not a %s\",method:\"%s is not a %s (function)\",array:\"%s is not an %s\",object:\"%s is not an %s\",number:\"%s is not a %s\",date:\"%s is not a %s\",boolean:\"%s is not a %s\",integer:\"%s is not an %s\",float:\"%s is not a %s\",regexp:\"%s is not a valid %s\",email:\"%s is not a valid %s\",url:\"%s is not a valid %s\",hex:\"%s is not a valid %s\"},string:{len:\"%s must be exactly %s characters\",min:\"%s must be at least %s characters\",max:\"%s cannot be longer than %s characters\",range:\"%s must be between %s and %s characters\"},number:{len:\"%s must equal %s\",min:\"%s cannot be less than %s\",max:\"%s cannot be greater than %s\",range:\"%s must be between %s and %s\"},array:{len:\"%s must be exactly %s in length\",min:\"%s cannot be less than %s in length\",max:\"%s cannot be greater than %s in length\",range:\"%s must be between %s and %s in length\"},pattern:{mismatch:\"%s value %s does not match pattern %s\"},clone:function(){var e=JSON.parse(JSON.stringify(this));return e.clone=this.clone,e}}}var S=k();function O(e){this.rules=null,this._messages=S,this.define(e)}O.prototype={messages:function(e){return e&&(this._messages=d(k(),e)),this._messages},define:function(e){if(!e)throw new Error(\"Cannot configure a schema with no rules\");if(\"object\"!==(void 0===e?\"undefined\":(0,r.Z)(e))||Array.isArray(e))throw new Error(\"Rules must be an object\");this.rules={};var t=void 0,n=void 0;for(t in e)e.hasOwnProperty(t)&&(n=e[t],this.rules[t]=Array.isArray(n)?n:[n])},validate:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments[2],a=e,l=n,h=o;if(\"function\"==typeof l&&(h=l,l={}),this.rules&&0!==Object.keys(this.rules).length){if(l.messages){var f=this.messages();f===S&&(f=k()),d(f,l.messages),l.messages=f}else l.messages=this.messages();var p=void 0,m=void 0,v={},g=l.keys||Object.keys(this.rules);g.forEach((function(n){p=t.rules[n],m=a[n],p.forEach((function(r){var o=r;\"function\"==typeof o.transform&&(a===e&&(a=(0,i.Z)({},a)),m=a[n]=o.transform(m)),(o=\"function\"==typeof o?{validator:o}:(0,i.Z)({},o)).validator=t.getValidationMethod(o),o.field=n,o.fullField=o.fullField||n,o.type=t.getType(o),o.validator&&(v[n]=v[n]||[],v[n].push({rule:o,value:m,source:a,field:n}))}))}));var b={};c(v,l,(function(e,t){var n=e.rule,o=!(\"object\"!==n.type&&\"array\"!==n.type||\"object\"!==(0,r.Z)(n.fields)&&\"object\"!==(0,r.Z)(n.defaultField));function a(e,t){return(0,i.Z)({},t,{fullField:n.fullField+\".\"+e})}function c(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],c=r;if(Array.isArray(c)||(c=[c]),c.length,c.length&&n.message&&(c=[].concat(n.message)),c=c.map(u(n)),l.first&&c.length)return b[n.field]=1,t(c);if(o){if(n.required&&!e.value)return c=n.message?[].concat(n.message).map(u(n)):l.error?[l.error(n,s(l.messages.required,n.field))]:[],t(c);var d={};if(n.defaultField)for(var h in e.value)e.value.hasOwnProperty(h)&&(d[h]=n.defaultField);for(var f in d=(0,i.Z)({},d,e.rule.fields))if(d.hasOwnProperty(f)){var p=Array.isArray(d[f])?d[f]:[d[f]];d[f]=p.map(a.bind(null,f))}var m=new O(d);m.messages(l.messages),e.rule.options&&(e.rule.options.messages=l.messages,e.rule.options.error=l.error),m.validate(e.value,e.rule.options||l,(function(e){t(e&&e.length?c.concat(e):e)}))}else t(c)}o=o&&(n.required||!n.required&&e.value),n.field=e.field;var d=n.validator(n,e.value,c,e.source,l);d&&d.then&&d.then((function(){return c()}),(function(e){return c(e)}))}),(function(e){y(e)}))}else h&&h();function y(e){var t,n=void 0,i=void 0,r=[],o={};for(n=0;nu;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}}},4499:function(e){var t={}.toString;e.exports=function(e){return t.call(e).slice(8,-1)}},4731:function(e){var t=e.exports={version:\"2.6.12\"};\"number\"==typeof __e&&(__e=t)},1821:function(e,t,n){var i=n(1449);e.exports=function(e,t,n){if(i(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,i){return e.call(t,n,i)};case 3:return function(n,i,r){return e.call(t,n,i,r)}}return function(){return e.apply(t,arguments)}}},1605:function(e){e.exports=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e}},5810:function(e,t,n){e.exports=!n(3777)((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},2571:function(e,t,n){var i=n(9151),r=n(9362).document,o=i(r)&&i(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},5568:function(e){e.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},2052:function(e,t,n){var i=n(9656),r=n(2614),o=n(3416);e.exports=function(e){var t=i(e),n=r.f;if(n)for(var s,a=n(e),l=o.f,c=0;a.length>c;)l.call(e,s=a[c++])&&t.push(s);return t}},9901:function(e,t,n){var i=n(9362),r=n(4731),o=n(1821),s=n(6519),a=n(3571),l=\"prototype\",c=function(e,t,n){var u,d,h,f=e&c.F,p=e&c.G,m=e&c.S,v=e&c.P,g=e&c.B,b=e&c.W,y=p?r:r[t]||(r[t]={}),_=y[l],x=p?i:m?i[t]:(i[t]||{})[l];for(u in p&&(n=t),n)(d=!f&&x&&void 0!==x[u])&&a(y,u)||(h=d?x[u]:n[u],y[u]=p&&\"function\"!=typeof x[u]?n[u]:g&&d?o(h,i):b&&x[u]==h?function(e){var t=function(t,n,i){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,i)}return e.apply(this,arguments)};return t[l]=e[l],t}(h):v&&\"function\"==typeof h?o(Function.call,h):h,v&&((y.virtual||(y.virtual={}))[u]=h,e&c.R&&_&&!_[u]&&s(_,u,h)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},3777:function(e){e.exports=function(e){try{return!!e()}catch(e){return!0}}},9362:function(e){var t=e.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=t)},3571:function(e){var t={}.hasOwnProperty;e.exports=function(e,n){return t.call(e,n)}},6519:function(e,t,n){var i=n(1738),r=n(8051);e.exports=n(5810)?function(e,t,n){return i.f(e,t,r(1,n))}:function(e,t,n){return e[t]=n,e}},203:function(e,t,n){var i=n(9362).document;e.exports=i&&i.documentElement},3254:function(e,t,n){e.exports=!n(5810)&&!n(3777)((function(){return 7!=Object.defineProperty(n(2571)(\"div\"),\"a\",{get:function(){return 7}}).a}))},2312:function(e,t,n){var i=n(4499);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==i(e)?e.split(\"\"):Object(e)}},7539:function(e,t,n){var i=n(4499);e.exports=Array.isArray||function(e){return\"Array\"==i(e)}},9151:function(e){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},9163:function(e,t,n){\"use strict\";var i=n(4055),r=n(8051),o=n(420),s={};n(6519)(s,n(5346)(\"iterator\"),(function(){return this})),e.exports=function(e,t,n){e.prototype=i(s,{next:r(1,n)}),o(e,t+\" Iterator\")}},4346:function(e,t,n){\"use strict\";var i=n(7346),r=n(9901),o=n(1865),s=n(6519),a=n(3135),l=n(9163),c=n(420),u=n(1146),d=n(5346)(\"iterator\"),h=!([].keys&&\"next\"in[].keys()),f=\"keys\",p=\"values\",m=function(){return this};e.exports=function(e,t,n,v,g,b,y){l(n,t,v);var _,x,w,C=function(e){if(!h&&e in $)return $[e];switch(e){case f:case p:return function(){return new n(this,e)}}return function(){return new n(this,e)}},k=t+\" Iterator\",S=g==p,O=!1,$=e.prototype,E=$[d]||$[\"@@iterator\"]||g&&$[g],D=E||C(g),T=g?S?C(\"entries\"):D:void 0,P=\"Array\"==t&&$.entries||E;if(P&&(w=u(P.call(new e)))!==Object.prototype&&w.next&&(c(w,k,!0),i||\"function\"==typeof w[d]||s(w,d,m)),S&&E&&E.name!==p&&(O=!0,D=function(){return E.call(this)}),i&&!y||!h&&!O&&$[d]||s($,d,D),a[t]=D,a[k]=m,g)if(_={values:S?D:C(p),keys:b?D:C(f),entries:T},y)for(x in _)x in $||o($,x,_[x]);else r(r.P+r.F*(h||O),t,_);return _}},4098:function(e){e.exports=function(e,t){return{value:t,done:!!e}}},3135:function(e){e.exports={}},7346:function(e){e.exports=!0},5965:function(e,t,n){var i=n(3535)(\"meta\"),r=n(9151),o=n(3571),s=n(1738).f,a=0,l=Object.isExtensible||function(){return!0},c=!n(3777)((function(){return l(Object.preventExtensions({}))})),u=function(e){s(e,i,{value:{i:\"O\"+ ++a,w:{}}})},d=e.exports={KEY:i,NEED:!1,fastKey:function(e,t){if(!r(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!o(e,i)){if(!l(e))return\"F\";if(!t)return\"E\";u(e)}return e[i].i},getWeak:function(e,t){if(!o(e,i)){if(!l(e))return!0;if(!t)return!1;u(e)}return e[i].w},onFreeze:function(e){return c&&d.NEED&&l(e)&&!o(e,i)&&u(e),e}}},266:function(e,t,n){\"use strict\";var i=n(5810),r=n(9656),o=n(2614),s=n(3416),a=n(9411),l=n(2312),c=Object.assign;e.exports=!c||n(3777)((function(){var e={},t={},n=Symbol(),i=\"abcdefghijklmnopqrst\";return e[n]=7,i.split(\"\").forEach((function(e){t[e]=e})),7!=c({},e)[n]||Object.keys(c({},t)).join(\"\")!=i}))?function(e,t){for(var n=a(e),c=arguments.length,u=1,d=o.f,h=s.f;c>u;)for(var f,p=l(arguments[u++]),m=d?r(p).concat(d(p)):r(p),v=m.length,g=0;v>g;)f=m[g++],i&&!h.call(p,f)||(n[f]=p[f]);return n}:c},4055:function(e,t,n){var i=n(6504),r=n(121),o=n(5568),s=n(6210)(\"IE_PROTO\"),a=function(){},l=\"prototype\",c=function(){var e,t=n(2571)(\"iframe\"),i=o.length;for(t.style.display=\"none\",n(203).appendChild(t),t.src=\"javascript:\",(e=t.contentWindow.document).open(),e.write(\"