Commit 6aa710ea by 温丽香

init project

0 parents
Showing with 24360 additions and 0 deletions
src/client/*
\ No newline at end of file
module.exports = {
root: true,
parserOptions: {
parser: '@typescript-eslint/parser',
},
env: {
browser: true,
},
'extends': [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'@vue/standard',
'@vue/typescript',
],
// required to lint *.vue files
plugins: [
'vue',
],
// add your custom rules here
rules: {
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'max-len': [2, {
code: 300,
ignoreStrings: true,
ignoreTemplateLiterals: true,
ignoreComments: true,
ignoreRegExpLiterals: true,
ignoreUrls: true,
ignoreTrailingComments: true,
}],
'no-var': 2, // 不接受 var 声明变量
'prefer-const': 2, // const 优先
'one-var': [2, 'never'], // 不允许使用','连续声明变量
'object-curly-spacing': [2, 'always'], // 大括号内必须有空格
'eqeqeq': [2, 'smart'], // 尽量使用全等
'camelcase': [0, { properties: 'never' }], // 强制使用驼峰变量名,不检测大写变量名,对象中属性不做检测
'arrow-parens': [2, 'as-needed'], // 箭头函数需使用括号 (一个参数时可省略)
'no-useless-escape': 2, // 禁止不必要的 call/apply
'no-unneeded-ternary': 2, // 禁止不必要的嵌套
'no-nested-ternary': 2, // 禁用嵌套的三目运算符
'no-const-assign': 2, // 禁止修改 const 变量
'spaced-comment': [2, 'always'], // 注释需要有空格
'array-bracket-spacing': [2, 'never'], // 数组方括号内不可有空格 eg: [1, 3]可以; [1, 3 ]不可以
// 'dot-notation': 2, // 禁用不必要的方括号 eg: foo[bar] 如果bar不是变量,请用 foo.bar
'prefer-spread': 2, // 优先使用 展开运算 ...arg
'template-curly-spacing': [2, 'never'], // 模版字符串中不可以有空格 eg: `${ people.name }` 空格需要去掉
'comma-dangle': ['off'], // 当最后一个元素或属性与闭括号 ] 或 } 在 不同的行时,要求使用拖尾逗号
'no-eval': 2, // 不许使用 eval 函数
'no-duplicate-imports': 2, // 同一个文件中的方法引用,需要在一次写完
'no-fallthrough': 2, // switch 一定 要用break 中断
'no-unreachable': 2, // return throw continue break 后不可跟随 无法运行到的代码
'use-isnan': 2, // NaN只可使用 isNaN 函数判断
'space-before-function-paren': [2, 'never'], // 方法与括号间不允许出现空格
'generator-star-spacing': [2, 'both'], // generator函数 *号 两边需要空格
'import/no-webpack-loader-syntax': 'off',
},
globals: {
'_': true,
'Vue': true,
'moment': true,
'Toast': true,
'vm': true,
'echarts': true,
},
}
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# aiot
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Lints and fixes files
```
npm run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
"env": {
"development": {
"plugins": ["dynamic-import-node"]
}
}
}
This diff could not be displayed because it is too large.
{
"name": "aiot",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve --open",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"api": "npx openapi-generator generate -i http://218.94.122.141:8089/swagger/doc.json -g typescript-axios -o ./src/client --skip-validate-spec"
},
"dependencies": {
"@json-editor/json-editor": "^1.4.0-beta.0",
"ace-builds": "^1.4.12",
"axios": "^0.18.0",
"bin-code-editor": "^0.9.0",
"core-js": "^3.6.5",
"crypto-js": "^3.1.9-1",
"dompurify": "^2.0.7",
"element-ui": "^2.15.3",
"exif-js": "^2.3.0",
"jquery": "^3.3.1",
"lodash": "^4.17.20",
"moment": "^2.24.0",
"nprogress": "^0.2.0",
"popper.js": "^1.14.3",
"pug": "^3.0.2",
"pug-plain-loader": "^1.1.0",
"qrcodejs2": "0.0.2",
"svg.js": "^2.7.1",
"tippy.js": "^4.3.0",
"url-parse": "^1.4.6",
"vue": "^2.6.11",
"vue-class-component": "^7.2.6",
"vue-clipboard2": "^0.3.0",
"vue-codemirror": "^4.0.6",
"vue-i18n": "^8.24.4",
"vue-infinite-loading": "^2.4.4",
"vue-json-editor": "^1.4.3",
"vue-property-decorator": "^9.1.2",
"vue-router": "^3.1.3",
"vue-showdown": "^2.4.1",
"vuex": "^3.0.1",
"vuex-persistedstate": "^4.0.0-beta.3",
"xregexp": "^4.2.4",
"xterm": "^4.9.0",
"xterm-addon-fit": "^0.4.0"
},
"devDependencies": {
"@babel/core": "^7.11.6",
"@babel/preset-env": "^7.11.5",
"@fortawesome/fontawesome-free": "^5.11.2",
"@openapitools/openapi-generator-cli": "^1.0.12-4.3.0",
"@types/jquery": "^3.5.1",
"@types/lodash": "^4.14.123",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/eslint-config-standard": "^4.0.0",
"@vue/eslint-config-typescript": "^4.0.0",
"babel-eslint": "^10.1.0",
"babel-plugin-dynamic-import-node": "^2.3.3",
"echarts": "^4.8.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"imports-loader": "^1.1.0",
"lint-staged": "^8.2.1",
"node-sass": "^4.14.1",
"sass-loader": "^7.1.0",
"stylus": "^0.54.7",
"stylus-loader": "^3.0.2",
"ts-loader": "^7.0.0",
"typescript": "^3.8.3",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
window.g = {
baseURL: 'http://218.94.122.141:8089/api',
defaultLang: 'zh-CN', // 目前支持 zh-CN / ja-JP
}
\ No newline at end of file
No preview for this file type
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>SeetaAIoT</title>
</head>
<body>
<script type="text/javascript" src="./config.js"></script>
<script src="<%= BASE_URL %>webuploader/jquery.min.js"></script>
<script src="<%= BASE_URL %>webuploader/webuploader.min.js"></script>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
This diff could not be displayed because it is too large.
/* WebUploader 0.1.5 */!function(a,b){var c,d={},e=function(a,b){var c,d,e;if("string"==typeof a)return h(a);for(c=[],d=a.length,e=0;d>e;e++)c.push(h(a[e]));return b.apply(null,c)},f=function(a,b,c){2===arguments.length&&(c=b,b=null),e(b||[],function(){g(a,c,arguments)})},g=function(a,b,c){var f,g={exports:b};"function"==typeof b&&(c.length||(c=[e,g.exports,g]),f=b.apply(null,c),void 0!==f&&(g.exports=f)),d[a]=g.exports},h=function(b){var c=d[b]||a[b];if(!c)throw new Error("`"+b+"` is undefined");return c},i=function(a){var b,c,e,f,g,h;h=function(a){return a&&a.charAt(0).toUpperCase()+a.substr(1)};for(b in d)if(c=a,d.hasOwnProperty(b)){for(e=b.split("/"),g=h(e.pop());f=h(e.shift());)c[f]=c[f]||{},c=c[f];c[g]=d[b]}return a},j=function(c){return a.__dollar=c,i(b(a,f,e))};"object"==typeof module&&"object"==typeof module.exports?module.exports=j():"function"==typeof define&&define.amd?define(["jquery"],j):(c=a.WebUploader,a.WebUploader=j(),a.WebUploader.noConflict=function(){a.WebUploader=c})}(window,function(a,b,c){return b("dollar-third",[],function(){var b=a.__dollar||a.jQuery||a.Zepto;if(!b)throw new Error("jQuery or Zepto not found!");return b}),b("dollar",["dollar-third"],function(a){return a}),b("promise-third",["dollar"],function(a){return{Deferred:a.Deferred,when:a.when,isPromise:function(a){return a&&"function"==typeof a.then}}}),b("promise",["promise-third"],function(a){return a}),b("base",["dollar","promise"],function(b,c){function d(a){return function(){return h.apply(a,arguments)}}function e(a,b){return function(){return a.apply(b,arguments)}}function f(a){var b;return Object.create?Object.create(a):(b=function(){},b.prototype=a,new b)}var g=function(){},h=Function.call;return{version:"0.1.5",$:b,Deferred:c.Deferred,isPromise:c.isPromise,when:c.when,browser:function(a){var b={},c=a.match(/WebKit\/([\d.]+)/),d=a.match(/Chrome\/([\d.]+)/)||a.match(/CriOS\/([\d.]+)/),e=a.match(/MSIE\s([\d\.]+)/)||a.match(/(?:trident)(?:.*rv:([\w.]+))?/i),f=a.match(/Firefox\/([\d.]+)/),g=a.match(/Safari\/([\d.]+)/),h=a.match(/OPR\/([\d.]+)/);return c&&(b.webkit=parseFloat(c[1])),d&&(b.chrome=parseFloat(d[1])),e&&(b.ie=parseFloat(e[1])),f&&(b.firefox=parseFloat(f[1])),g&&(b.safari=parseFloat(g[1])),h&&(b.opera=parseFloat(h[1])),b}(navigator.userAgent),os:function(a){var b={},c=a.match(/(?:Android);?[\s\/]+([\d.]+)?/),d=a.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);return c&&(b.android=parseFloat(c[1])),d&&(b.ios=parseFloat(d[1].replace(/_/g,"."))),b}(navigator.userAgent),inherits:function(a,c,d){var e;return"function"==typeof c?(e=c,c=null):e=c&&c.hasOwnProperty("constructor")?c.constructor:function(){return a.apply(this,arguments)},b.extend(!0,e,a,d||{}),e.__super__=a.prototype,e.prototype=f(a.prototype),c&&b.extend(!0,e.prototype,c),e},noop:g,bindFn:e,log:function(){return a.console?e(console.log,console):g}(),nextTick:function(){return function(a){setTimeout(a,1)}}(),slice:d([].slice),guid:function(){var a=0;return function(b){for(var c=(+new Date).toString(32),d=0;5>d;d++)c+=Math.floor(65535*Math.random()).toString(32);return(b||"wu_")+c+(a++).toString(32)}}(),formatSize:function(a,b,c){var d;for(c=c||["B","K","M","G","TB"];(d=c.shift())&&a>1024;)a/=1024;return("B"===d?a:a.toFixed(b||2))+d}}}),b("mediator",["base"],function(a){function b(a,b,c,d){return f.grep(a,function(a){return!(!a||b&&a.e!==b||c&&a.cb!==c&&a.cb._cb!==c||d&&a.ctx!==d)})}function c(a,b,c){f.each((a||"").split(h),function(a,d){c(d,b)})}function d(a,b){for(var c,d=!1,e=-1,f=a.length;++e<f;)if(c=a[e],c.cb.apply(c.ctx2,b)===!1){d=!0;break}return!d}var e,f=a.$,g=[].slice,h=/\s+/;return e={on:function(a,b,d){var e,f=this;return b?(e=this._events||(this._events=[]),c(a,b,function(a,b){var c={e:a};c.cb=b,c.ctx=d,c.ctx2=d||f,c.id=e.length,e.push(c)}),this):this},once:function(a,b,d){var e=this;return b?(c(a,b,function(a,b){var c=function(){return e.off(a,c),b.apply(d||e,arguments)};c._cb=b,e.on(a,c,d)}),e):e},off:function(a,d,e){var g=this._events;return g?a||d||e?(c(a,d,function(a,c){f.each(b(g,a,c,e),function(){delete g[this.id]})}),this):(this._events=[],this):this},trigger:function(a){var c,e,f;return this._events&&a?(c=g.call(arguments,1),e=b(this._events,a),f=b(this._events,"all"),d(e,c)&&d(f,arguments)):this}},f.extend({installTo:function(a){return f.extend(a,e)}},e)}),b("uploader",["base","mediator"],function(a,b){function c(a){this.options=d.extend(!0,{},c.options,a),this._init(this.options)}var d=a.$;return c.options={},b.installTo(c.prototype),d.each({upload:"start-upload",stop:"stop-upload",getFile:"get-file",getFiles:"get-files",addFile:"add-file",addFiles:"add-file",sort:"sort-files",removeFile:"remove-file",cancelFile:"cancel-file",skipFile:"skip-file",retry:"retry",isInProgress:"is-in-progress",makeThumb:"make-thumb",md5File:"md5-file",getDimension:"get-dimension",addButton:"add-btn",predictRuntimeType:"predict-runtime-type",refresh:"refresh",disable:"disable",enable:"enable",reset:"reset"},function(a,b){c.prototype[a]=function(){return this.request(b,arguments)}}),d.extend(c.prototype,{state:"pending",_init:function(a){var b=this;b.request("init",a,function(){b.state="ready",b.trigger("ready")})},option:function(a,b){var c=this.options;return arguments.length>1?void(d.isPlainObject(b)&&d.isPlainObject(c[a])?d.extend(c[a],b):c[a]=b):a?c[a]:c},getStats:function(){var a=this.request("get-stats");return a?{successNum:a.numOfSuccess,progressNum:a.numOfProgress,cancelNum:a.numOfCancel,invalidNum:a.numOfInvalid,uploadFailNum:a.numOfUploadFailed,queueNum:a.numOfQueue,interruptNum:a.numofInterrupt}:{}},trigger:function(a){var c=[].slice.call(arguments,1),e=this.options,f="on"+a.substring(0,1).toUpperCase()+a.substring(1);return b.trigger.apply(this,arguments)===!1||d.isFunction(e[f])&&e[f].apply(this,c)===!1||d.isFunction(this[f])&&this[f].apply(this,c)===!1||b.trigger.apply(b,[this,a].concat(c))===!1?!1:!0},destroy:function(){this.request("destroy",arguments),this.off()},request:a.noop}),a.create=c.create=function(a){return new c(a)},a.Uploader=c,c}),b("runtime/runtime",["base","mediator"],function(a,b){function c(b){this.options=d.extend({container:document.body},b),this.uid=a.guid("rt_")}var d=a.$,e={},f=function(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null};return d.extend(c.prototype,{getContainer:function(){var a,b,c=this.options;return this._container?this._container:(a=d(c.container||document.body),b=d(document.createElement("div")),b.attr("id","rt_"+this.uid),b.css({position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),a.append(b),a.addClass("webuploader-container"),this._container=b,this._parent=a,b)},init:a.noop,exec:a.noop,destroy:function(){this._container&&this._container.remove(),this._parent&&this._parent.removeClass("webuploader-container"),this.off()}}),c.orders="html5,flash",c.addRuntime=function(a,b){e[a]=b},c.hasRuntime=function(a){return!!(a?e[a]:f(e))},c.create=function(a,b){var g,h;if(b=b||c.orders,d.each(b.split(/\s*,\s*/g),function(){return e[this]?(g=this,!1):void 0}),g=g||f(e),!g)throw new Error("Runtime Error");return h=new e[g](a)},b.installTo(c.prototype),c}),b("runtime/client",["base","mediator","runtime/runtime"],function(a,b,c){function d(b,d){var f,g=a.Deferred();this.uid=a.guid("client_"),this.runtimeReady=function(a){return g.done(a)},this.connectRuntime=function(b,h){if(f)throw new Error("already connected!");return g.done(h),"string"==typeof b&&e.get(b)&&(f=e.get(b)),f=f||e.get(null,d),f?(a.$.extend(f.options,b),f.__promise.then(g.resolve),f.__client++):(f=c.create(b,b.runtimeOrder),f.__promise=g.promise(),f.once("ready",g.resolve),f.init(),e.add(f),f.__client=1),d&&(f.__standalone=d),f},this.getRuntime=function(){return f},this.disconnectRuntime=function(){f&&(f.__client--,f.__client<=0&&(e.remove(f),delete f.__promise,f.destroy()),f=null)},this.exec=function(){if(f){var c=a.slice(arguments);return b&&c.unshift(b),f.exec.apply(this,c)}},this.getRuid=function(){return f&&f.uid},this.destroy=function(a){return function(){a&&a.apply(this,arguments),this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()}}(this.destroy)}var e;return e=function(){var a={};return{add:function(b){a[b.uid]=b},get:function(b,c){var d;if(b)return a[b];for(d in a)if(!c||!a[d].__standalone)return a[d];return null},remove:function(b){delete a[b.uid]}}}(),b.installTo(d.prototype),d}),b("lib/dnd",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},d.options,a),a.container=e(a.container),a.container.length&&c.call(this,"DragAndDrop")}var e=a.$;return d.options={accept:null,disableGlobalDnd:!1},a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/widget",["base","uploader"],function(a,b){function c(a){if(!a)return!1;var b=a.length,c=e.type(a);return 1===a.nodeType&&b?!0:"array"===c||"function"!==c&&"string"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){this.owner=a,this.options=a.options}var e=a.$,f=b.prototype._init,g=b.prototype.destroy,h={},i=[];return e.extend(d.prototype,{init:a.noop,invoke:function(a,b){var c=this.responseMap;return c&&a in c&&c[a]in this&&e.isFunction(this[c[a]])?this[c[a]].apply(this,b):h},request:function(){return this.owner.request.apply(this.owner,arguments)}}),e.extend(b.prototype,{_init:function(){var a=this,b=a._widgets=[],c=a.options.disableWidgets||"";return e.each(i,function(d,e){(!c||!~c.indexOf(e._name))&&b.push(new e(a))}),f.apply(a,arguments)},request:function(b,d,e){var f,g,i,j,k=0,l=this._widgets,m=l&&l.length,n=[],o=[];for(d=c(d)?d:[d];m>k;k++)f=l[k],g=f.invoke(b,d),g!==h&&(a.isPromise(g)?o.push(g):n.push(g));return e||o.length?(i=a.when.apply(a,o),j=i.pipe?"pipe":"then",i[j](function(){var b=a.Deferred(),c=arguments;return 1===c.length&&(c=c[0]),setTimeout(function(){b.resolve(c)},1),b.promise()})[e?j:"done"](e||a.noop)):n[0]},destroy:function(){g.apply(this,arguments),this._widgets=null}}),b.register=d.register=function(b,c){var f,g={init:"init",destroy:"destroy",name:"anonymous"};return 1===arguments.length?(c=b,e.each(c,function(a){return"_"===a[0]||"name"===a?void("name"===a&&(g.name=c.name)):void(g[a.replace(/[A-Z]/g,"-$&").toLowerCase()]=a)})):g=e.extend(g,b),c.responseMap=g,f=a.inherits(d,c),f._name=g.name,i.push(f),f},b.unRegister=d.unRegister=function(a){if(a&&"anonymous"!==a)for(var b=i.length;b--;)i[b]._name===a&&i.splice(b,1)},d}),b("widgets/filednd",["base","uploader","lib/dnd","widgets/widget"],function(a,b,c){var d=a.$;return b.options.dnd="",b.register({name:"dnd",init:function(b){if(b.dnd&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{disableGlobalDnd:b.disableGlobalDnd,container:b.dnd,accept:b.accept});return this.dnd=e=new c(h),e.once("ready",g.resolve),e.on("drop",function(a){f.request("add-file",[a])}),e.on("accept",function(a){return f.owner.trigger("dndAccept",a)}),e.init(),g.promise()}},destroy:function(){this.dnd&&this.dnd.destroy()}})}),b("lib/filepaste",["base","mediator","runtime/client"],function(a,b,c){function d(a){a=this.options=e.extend({},a),a.container=e(a.container||document.body),c.call(this,"FilePaste")}var e=a.$;return a.inherits(c,{constructor:d,init:function(){var a=this;a.connectRuntime(a.options,function(){a.exec("init"),a.trigger("ready")})}}),b.installTo(d.prototype),d}),b("widgets/filepaste",["base","uploader","lib/filepaste","widgets/widget"],function(a,b,c){var d=a.$;return b.register({name:"paste",init:function(b){if(b.paste&&"html5"===this.request("predict-runtime-type")){var e,f=this,g=a.Deferred(),h=d.extend({},{container:b.paste,accept:b.accept});return this.paste=e=new c(h),e.once("ready",g.resolve),e.on("paste",function(a){f.owner.request("add-file",[a])}),e.init(),g.promise()}},destroy:function(){this.paste&&this.paste.destroy()}})}),b("lib/blob",["base","runtime/client"],function(a,b){function c(a,c){var d=this;d.source=c,d.ruid=a,this.size=c.size||0,this.type=!c.type&&this.ext&&~"jpg,jpeg,png,gif,bmp".indexOf(this.ext)?"image/"+("jpg"===this.ext?"jpeg":this.ext):c.type||"application/octet-stream",b.call(d,"Blob"),this.uid=c.uid||this.uid,a&&d.connectRuntime(a)}return a.inherits(b,{constructor:c,slice:function(a,b){return this.exec("slice",a,b)},getSource:function(){return this.source}}),c}),b("lib/file",["base","lib/blob"],function(a,b){function c(a,c){var f;this.name=c.name||"untitled"+d++,f=e.exec(c.name)?RegExp.$1.toLowerCase():"",!f&&c.type&&(f=/\/(jpg|jpeg|png|gif|bmp)$/i.exec(c.type)?RegExp.$1.toLowerCase():"",this.name+="."+f),this.ext=f,this.lastModifiedDate=c.lastModifiedDate||(new Date).toLocaleString(),b.apply(this,arguments)}var d=1,e=/\.([^.]+)$/;return a.inherits(b,c)}),b("lib/filepicker",["base","runtime/client","lib/file"],function(b,c,d){function e(a){if(a=this.options=f.extend({},e.options,a),a.container=f(a.id),!a.container.length)throw new Error("按钮指定错误");a.innerHTML=a.innerHTML||a.label||a.container.html()||"",a.button=f(a.button||document.createElement("div")),a.button.html(a.innerHTML),a.container.html(a.button),c.call(this,"FilePicker",!0)}var f=b.$;return e.options={button:null,container:null,label:null,innerHTML:null,multiple:!0,accept:null,name:"file"},b.inherits(c,{constructor:e,init:function(){var c=this,e=c.options,g=e.button;g.addClass("webuploader-pick"),c.on("all",function(a){var b;switch(a){case"mouseenter":g.addClass("webuploader-pick-hover");break;case"mouseleave":g.removeClass("webuploader-pick-hover");break;case"change":b=c.exec("getFiles"),c.trigger("select",f.map(b,function(a){return a=new d(c.getRuid(),a),a._refer=e.container,a}),e.container)}}),c.connectRuntime(e,function(){c.refresh(),c.exec("init",e),c.trigger("ready")}),this._resizeHandler=b.bindFn(this.refresh,this),f(a).on("resize",this._resizeHandler)},refresh:function(){var a=this.getRuntime().getContainer(),b=this.options.button,c=b.outerWidth?b.outerWidth():b.width(),d=b.outerHeight?b.outerHeight():b.height(),e=b.offset();c&&d&&a.css({bottom:"auto",right:"auto",width:c+"px",height:d+"px"}).offset(e)},enable:function(){var a=this.options.button;a.removeClass("webuploader-pick-disable"),this.refresh()},disable:function(){var a=this.options.button;this.getRuntime().getContainer().css({top:"-99999px"}),a.addClass("webuploader-pick-disable")},destroy:function(){var b=this.options.button;f(a).off("resize",this._resizeHandler),b.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")}}),e}),b("widgets/filepicker",["base","uploader","lib/filepicker","widgets/widget"],function(a,b,c){var d=a.$;return d.extend(b.options,{pick:null,accept:null}),b.register({name:"picker",init:function(a){return this.pickers=[],a.pick&&this.addBtn(a.pick)},refresh:function(){d.each(this.pickers,function(){this.refresh()})},addBtn:function(b){var e=this,f=e.options,g=f.accept,h=[];if(b)return d.isPlainObject(b)||(b={id:b}),d(b.id).each(function(){var i,j,k;k=a.Deferred(),i=d.extend({},b,{accept:d.isPlainObject(g)?[g]:g,swf:f.swf,runtimeOrder:f.runtimeOrder,id:this}),j=new c(i),j.once("ready",k.resolve),j.on("select",function(a){e.owner.request("add-file",[a])}),j.init(),e.pickers.push(j),h.push(k.promise())}),a.when.apply(a,h)},disable:function(){d.each(this.pickers,function(){this.disable()})},enable:function(){d.each(this.pickers,function(){this.enable()})},destroy:function(){d.each(this.pickers,function(){this.destroy()}),this.pickers=null}})}),b("lib/image",["base","runtime/client","lib/blob"],function(a,b,c){function d(a){this.options=e.extend({},d.options,a),b.call(this,"Image"),this.on("load",function(){this._info=this.exec("info"),this._meta=this.exec("meta")})}var e=a.$;return d.options={quality:90,crop:!1,preserveHeaders:!1,allowMagnify:!1},a.inherits(b,{constructor:d,info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},loadFromBlob:function(a){var b=this,c=a.getRuid();this.connectRuntime(c,function(){b.exec("init",b.options),b.exec("loadFromBlob",a)})},resize:function(){var b=a.slice(arguments);return this.exec.apply(this,["resize"].concat(b))},crop:function(){var b=a.slice(arguments);return this.exec.apply(this,["crop"].concat(b))},getAsDataUrl:function(a){return this.exec("getAsDataUrl",a)},getAsBlob:function(a){var b=this.exec("getAsBlob",a);return new c(this.getRuid(),b)}}),d}),b("widgets/image",["base","uploader","lib/image","widgets/widget"],function(a,b,c){var d,e=a.$;return d=function(a){var b=0,c=[],d=function(){for(var d;c.length&&a>b;)d=c.shift(),b+=d[0],d[1]()};return function(a,e,f){c.push([e,f]),a.once("destroy",function(){b-=e,setTimeout(d,1)}),setTimeout(d,1)}}(5242880),e.extend(b.options,{thumb:{width:110,height:110,quality:70,allowMagnify:!0,crop:!0,preserveHeaders:!1,type:"image/jpeg"},compress:{width:1600,height:1600,quality:90,allowMagnify:!1,crop:!1,preserveHeaders:!0}}),b.register({name:"image",makeThumb:function(a,b,f,g){var h,i;return a=this.request("get-file",a),a.type.match(/^image/)?(h=e.extend({},this.options.thumb),e.isPlainObject(f)&&(h=e.extend(h,f),f=null),f=f||h.width,g=g||h.height,i=new c(h),i.once("load",function(){a._info=a._info||i.info(),a._meta=a._meta||i.meta(),1>=f&&f>0&&(f=a._info.width*f),1>=g&&g>0&&(g=a._info.height*g),i.resize(f,g)}),i.once("complete",function(){b(!1,i.getAsDataUrl(h.type)),i.destroy()}),i.once("error",function(a){b(a||!0),i.destroy()}),void d(i,a.source.size,function(){a._info&&i.info(a._info),a._meta&&i.meta(a._meta),i.loadFromBlob(a.source)})):void b(!0)},beforeSendFile:function(b){var d,f,g=this.options.compress||this.options.resize,h=g&&g.compressSize||0,i=g&&g.noCompressIfLarger||!1;return b=this.request("get-file",b),!g||!~"image/jpeg,image/jpg".indexOf(b.type)||b.size<h||b._compressed?void 0:(g=e.extend({},g),f=a.Deferred(),d=new c(g),f.always(function(){d.destroy(),d=null}),d.once("error",f.reject),d.once("load",function(){var a=g.width,c=g.height;b._info=b._info||d.info(),b._meta=b._meta||d.meta(),1>=a&&a>0&&(a=b._info.width*a),1>=c&&c>0&&(c=b._info.height*c),d.resize(a,c)}),d.once("complete",function(){var a,c;try{a=d.getAsBlob(g.type),c=b.size,(!i||a.size<c)&&(b.source=a,b.size=a.size,b.trigger("resize",a.size,c)),b._compressed=!0,f.resolve()}catch(e){f.resolve()}}),b._info&&d.info(b._info),b._meta&&d.meta(b._meta),d.loadFromBlob(b.source),f.promise())}})}),b("file",["base","mediator"],function(a,b){function c(){return f+g++}function d(a){this.name=a.name||"Untitled",this.size=a.size||0,this.type=a.type||"application/octet-stream",this.lastModifiedDate=a.lastModifiedDate||1*new Date,this.id=c(),this.ext=h.exec(this.name)?RegExp.$1:"",this.statusText="",i[this.id]=d.Status.INITED,this.source=a,this.loaded=0,this.on("error",function(a){this.setStatus(d.Status.ERROR,a)})}var e=a.$,f="WU_FILE_",g=0,h=/\.([^.]+)$/,i={};return e.extend(d.prototype,{setStatus:function(a,b){var c=i[this.id];"undefined"!=typeof b&&(this.statusText=b),a!==c&&(i[this.id]=a,this.trigger("statuschange",a,c))},getStatus:function(){return i[this.id]},getSource:function(){return this.source},destroy:function(){this.off(),delete i[this.id]}}),b.installTo(d.prototype),d.Status={INITED:"inited",QUEUED:"queued",PROGRESS:"progress",ERROR:"error",COMPLETE:"complete",CANCELLED:"cancelled",INTERRUPT:"interrupt",INVALID:"invalid"},d}),b("queue",["base","mediator","file"],function(a,b,c){function d(){this.stats={numOfQueue:0,numOfSuccess:0,numOfCancel:0,numOfProgress:0,numOfUploadFailed:0,numOfInvalid:0,numofDeleted:0,numofInterrupt:0},this._queue=[],this._map={}}var e=a.$,f=c.Status;return e.extend(d.prototype,{append:function(a){return this._queue.push(a),this._fileAdded(a),this},prepend:function(a){return this._queue.unshift(a),this._fileAdded(a),this},getFile:function(a){return"string"!=typeof a?a:this._map[a]},fetch:function(a){var b,c,d=this._queue.length;for(a=a||f.QUEUED,b=0;d>b;b++)if(c=this._queue[b],a===c.getStatus())return c;return null},sort:function(a){"function"==typeof a&&this._queue.sort(a)},getFiles:function(){for(var a,b=[].slice.call(arguments,0),c=[],d=0,f=this._queue.length;f>d;d++)a=this._queue[d],(!b.length||~e.inArray(a.getStatus(),b))&&c.push(a);return c},removeFile:function(a){var b=this._map[a.id];b&&(delete this._map[a.id],a.destroy(),this.stats.numofDeleted++)},_fileAdded:function(a){var b=this,c=this._map[a.id];c||(this._map[a.id]=a,a.on("statuschange",function(a,c){b._onFileStatusChange(a,c)}))},_onFileStatusChange:function(a,b){var c=this.stats;switch(b){case f.PROGRESS:c.numOfProgress--;break;case f.QUEUED:c.numOfQueue--;break;case f.ERROR:c.numOfUploadFailed--;break;case f.INVALID:c.numOfInvalid--;break;case f.INTERRUPT:c.numofInterrupt--}switch(a){case f.QUEUED:c.numOfQueue++;break;case f.PROGRESS:c.numOfProgress++;break;case f.ERROR:c.numOfUploadFailed++;break;case f.COMPLETE:c.numOfSuccess++;break;case f.CANCELLED:c.numOfCancel++;break;case f.INVALID:c.numOfInvalid++;break;case f.INTERRUPT:c.numofInterrupt++}}}),b.installTo(d.prototype),d}),b("widgets/queue",["base","uploader","queue","file","lib/file","runtime/client","widgets/widget"],function(a,b,c,d,e,f){var g=a.$,h=/\.\w+$/,i=d.Status;return b.register({name:"queue",init:function(b){var d,e,h,i,j,k,l,m=this;if(g.isPlainObject(b.accept)&&(b.accept=[b.accept]),b.accept){for(j=[],h=0,e=b.accept.length;e>h;h++)i=b.accept[h].extensions,i&&j.push(i);j.length&&(k="\\."+j.join(",").replace(/,/g,"$|\\.").replace(/\*/g,".*")+"$"),m.accept=new RegExp(k,"i")}return m.queue=new c,m.stats=m.queue.stats,"html5"===this.request("predict-runtime-type")?(d=a.Deferred(),this.placeholder=l=new f("Placeholder"),l.connectRuntime({runtimeOrder:"html5"},function(){m._ruid=l.getRuid(),d.resolve()}),d.promise()):void 0},_wrapFile:function(a){if(!(a instanceof d)){if(!(a instanceof e)){if(!this._ruid)throw new Error("Can't add external files.");a=new e(this._ruid,a)}a=new d(a)}return a},acceptFile:function(a){var b=!a||!a.size||this.accept&&h.exec(a.name)&&!this.accept.test(a.name);return!b},_addFile:function(a){var b=this;return a=b._wrapFile(a),b.owner.trigger("beforeFileQueued",a)?b.acceptFile(a)?(b.queue.append(a),b.owner.trigger("fileQueued",a),a):void b.owner.trigger("error","Q_TYPE_DENIED",a):void 0},getFile:function(a){return this.queue.getFile(a)},addFile:function(a){var b=this;a.length||(a=[a]),a=g.map(a,function(a){return b._addFile(a)}),b.owner.trigger("filesQueued",a),b.options.auto&&setTimeout(function(){b.request("start-upload")},20)},getStats:function(){return this.stats},removeFile:function(a,b){var c=this;a=a.id?a:c.queue.getFile(a),this.request("cancel-file",a),b&&this.queue.removeFile(a)},getFiles:function(){return this.queue.getFiles.apply(this.queue,arguments)},fetchFile:function(){return this.queue.fetch.apply(this.queue,arguments)},retry:function(a,b){var c,d,e,f=this;if(a)return a=a.id?a:f.queue.getFile(a),a.setStatus(i.QUEUED),void(b||f.request("start-upload"));for(c=f.queue.getFiles(i.ERROR),d=0,e=c.length;e>d;d++)a=c[d],a.setStatus(i.QUEUED);f.request("start-upload")},sortFiles:function(){return this.queue.sort.apply(this.queue,arguments)},reset:function(){this.owner.trigger("reset"),this.queue=new c,this.stats=this.queue.stats},destroy:function(){this.reset(),this.placeholder&&this.placeholder.destroy()}})}),b("widgets/runtime",["uploader","runtime/runtime","widgets/widget"],function(a,b){return a.support=function(){return b.hasRuntime.apply(b,arguments)},a.register({name:"runtime",init:function(){if(!this.predictRuntimeType())throw Error("Runtime Error")},predictRuntimeType:function(){var a,c,d=this.options.runtimeOrder||b.orders,e=this.type;if(!e)for(d=d.split(/\s*,\s*/g),a=0,c=d.length;c>a;a++)if(b.hasRuntime(d[a])){this.type=e=d[a];break}return e}})}),b("lib/transport",["base","runtime/client","mediator"],function(a,b,c){function d(a){var c=this;a=c.options=e.extend(!0,{},d.options,a||{}),b.call(this,"Transport"),this._blob=null,this._formData=a.formData||{},this._headers=a.headers||{},this.on("progress",this._timeout),this.on("load error",function(){c.trigger("progress",1),clearTimeout(c._timer)})}var e=a.$;return d.options={server:"",method:"POST",withCredentials:!1,fileVal:"file",timeout:12e4,formData:{},headers:{},sendAsBinary:!1},e.extend(d.prototype,{appendBlob:function(a,b,c){var d=this,e=d.options;d.getRuid()&&d.disconnectRuntime(),d.connectRuntime(b.ruid,function(){d.exec("init")}),d._blob=b,e.fileVal=a||e.fileVal,e.filename=c||e.filename},append:function(a,b){"object"==typeof a?e.extend(this._formData,a):this._formData[a]=b},setRequestHeader:function(a,b){"object"==typeof a?e.extend(this._headers,a):this._headers[a]=b},send:function(a){this.exec("send",a),this._timeout()},abort:function(){return clearTimeout(this._timer),this.exec("abort")},destroy:function(){this.trigger("destroy"),this.off(),this.exec("destroy"),this.disconnectRuntime()},getResponse:function(){return this.exec("getResponse")},getResponseAsJson:function(){return this.exec("getResponseAsJson")},getStatus:function(){return this.exec("getStatus")},_timeout:function(){var a=this,b=a.options.timeout;b&&(clearTimeout(a._timer),a._timer=setTimeout(function(){a.abort(),a.trigger("error","timeout")},b))}}),c.installTo(d.prototype),d}),b("widgets/upload",["base","uploader","file","lib/transport","widgets/widget"],function(a,b,c,d){function e(a,b){var c,d,e=[],f=a.source,g=f.size,h=b?Math.ceil(g/b):1,i=0,j=0;for(d={file:a,has:function(){return!!e.length},shift:function(){return e.shift()},unshift:function(a){e.unshift(a)}};h>j;)c=Math.min(b,g-i),e.push({file:a,start:i,end:b?i+c:g,total:g,chunks:h,chunk:j++,cuted:d}),i+=c;return a.blocks=e.concat(),a.remaning=e.length,d}var f=a.$,g=a.isPromise,h=c.Status;f.extend(b.options,{prepareNextFile:!1,chunked:!1,chunkSize:5242880,chunkRetry:2,threads:3,formData:{}}),b.register({name:"upload",init:function(){var b=this.owner,c=this;this.runing=!1,this.progress=!1,b.on("startUpload",function(){c.progress=!0}).on("uploadFinished",function(){c.progress=!1}),this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this.__tick=a.bindFn(this._tick,this),b.on("uploadComplete",function(a){a.blocks&&f.each(a.blocks,function(a,b){b.transport&&(b.transport.abort(),b.transport.destroy()),delete b.transport}),delete a.blocks,delete a.remaning})},reset:function(){this.request("stop-upload",!0),this.runing=!1,this.pool=[],this.stack=[],this.pending=[],this.remaning=0,this._trigged=!1,this._promise=null},startUpload:function(b){var c=this;if(f.each(c.request("get-files",h.INVALID),function(){c.request("remove-file",this)}),b)if(b=b.id?b:c.request("get-file",b),b.getStatus()===h.INTERRUPT)f.each(c.pool,function(a,c){c.file===b&&c.transport&&c.transport.send()}),b.setStatus(h.QUEUED);else{if(b.getStatus()===h.PROGRESS)return;b.setStatus(h.QUEUED)}else f.each(c.request("get-files",[h.INITED]),function(){this.setStatus(h.QUEUED)});if(!c.runing){c.runing=!0;var d=[];f.each(c.pool,function(a,b){var e=b.file;e.getStatus()===h.INTERRUPT&&(d.push(e),c._trigged=!1,b.transport&&b.transport.send())});for(var b;b=d.shift();)b.setStatus(h.PROGRESS);b||f.each(c.request("get-files",h.INTERRUPT),function(){this.setStatus(h.PROGRESS)}),c._trigged=!1,a.nextTick(c.__tick),c.owner.trigger("startUpload")}},stopUpload:function(b,c){var d=this;if(b===!0&&(c=b,b=null),d.runing!==!1){if(b){if(b=b.id?b:d.request("get-file",b),b.getStatus()!==h.PROGRESS&&b.getStatus()!==h.QUEUED)return;return b.setStatus(h.INTERRUPT),f.each(d.pool,function(a,c){c.file===b&&(c.transport&&c.transport.abort(),d._putback(c),d._popBlock(c))}),a.nextTick(d.__tick)}d.runing=!1,this._promise&&this._promise.file&&this._promise.file.setStatus(h.INTERRUPT),c&&f.each(d.pool,function(a,b){b.transport&&b.transport.abort(),b.file.setStatus(h.INTERRUPT)}),d.owner.trigger("stopUpload")}},cancelFile:function(a){a=a.id?a:this.request("get-file",a),a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),a.setStatus(h.CANCELLED),this.owner.trigger("fileDequeued",a)},isInProgress:function(){return!!this.progress},_getStats:function(){return this.request("get-stats")},skipFile:function(a,b){a=a.id?a:this.request("get-file",a),a.setStatus(b||h.COMPLETE),a.skipped=!0,a.blocks&&f.each(a.blocks,function(a,b){var c=b.transport;c&&(c.abort(),c.destroy(),delete b.transport)}),this.owner.trigger("uploadSkip",a)},_tick:function(){var b,c,d=this,e=d.options;return d._promise?d._promise.always(d.__tick):void(d.pool.length<e.threads&&(c=d._nextBlock())?(d._trigged=!1,b=function(b){d._promise=null,b&&b.file&&d._startSend(b),a.nextTick(d.__tick)},d._promise=g(c)?c.always(b):b(c)):d.remaning||d._getStats().numOfQueue||d._getStats().numofInterrupt||(d.runing=!1,d._trigged||a.nextTick(function(){d.owner.trigger("uploadFinished")}),d._trigged=!0))},_putback:function(a){var b;a.cuted.unshift(a),b=this.stack.indexOf(a.cuted),~b||this.stack.unshift(a.cuted)},_getStack:function(){for(var a,b=0;a=this.stack[b++];){if(a.has()&&a.file.getStatus()===h.PROGRESS)return a;(!a.has()||a.file.getStatus()!==h.PROGRESS&&a.file.getStatus()!==h.INTERRUPT)&&this.stack.splice(--b,1)}return null},_nextBlock:function(){var a,b,c,d,f=this,h=f.options;return(a=this._getStack())?(h.prepareNextFile&&!f.pending.length&&f._prepareNextFile(),a.shift()):f.runing?(!f.pending.length&&f._getStats().numOfQueue&&f._prepareNextFile(),b=f.pending.shift(),c=function(b){return b?(a=e(b,h.chunked?h.chunkSize:0),f.stack.push(a),a.shift()):null},g(b)?(d=b.file,b=b[b.pipe?"pipe":"then"](c),b.file=d,b):c(b)):void 0},_prepareNextFile:function(){var a,b=this,c=b.request("fetch-file"),d=b.pending;c&&(a=b.request("before-send-file",c,function(){return c.getStatus()===h.PROGRESS||c.getStatus()===h.INTERRUPT?c:b._finishFile(c)}),b.owner.trigger("uploadStart",c),c.setStatus(h.PROGRESS),a.file=c,a.done(function(){var b=f.inArray(a,d);~b&&d.splice(b,1,c)}),a.fail(function(a){c.setStatus(h.ERROR,a),b.owner.trigger("uploadError",c,a),b.owner.trigger("uploadComplete",c)}),d.push(a))},_popBlock:function(a){var b=f.inArray(a,this.pool);this.pool.splice(b,1),a.file.remaning--,this.remaning--},_startSend:function(b){var c,d=this,e=b.file;return e.getStatus()!==h.PROGRESS?void(e.getStatus()===h.INTERRUPT&&d._putback(b)):(d.pool.push(b),d.remaning++,b.blob=1===b.chunks?e.source:e.source.slice(b.start,b.end),c=d.request("before-send",b,function(){e.getStatus()===h.PROGRESS?d._doSend(b):(d._popBlock(b),a.nextTick(d.__tick))}),void c.fail(function(){1===e.remaning?d._finishFile(e).always(function(){b.percentage=1,d._popBlock(b),d.owner.trigger("uploadComplete",e),a.nextTick(d.__tick)}):(b.percentage=1,d.updateFileProgress(e),d._popBlock(b),a.nextTick(d.__tick))}))},_doSend:function(b){var c,e,g=this,i=g.owner,j=g.options,k=b.file,l=new d(j),m=f.extend({},j.formData),n=f.extend({},j.headers);b.transport=l,l.on("destroy",function(){delete b.transport,g._popBlock(b),a.nextTick(g.__tick)}),l.on("progress",function(a){b.percentage=a,g.updateFileProgress(k)}),c=function(a){var c;return e=l.getResponseAsJson()||{},e._raw=l.getResponse(),c=function(b){a=b},i.trigger("uploadAccept",b,e,c)||(a=a||"server"),a},l.on("error",function(a,d){b.retried=b.retried||0,b.chunks>1&&~"http,abort".indexOf(a)&&b.retried<j.chunkRetry?(b.retried++,l.send()):(d||"server"!==a||(a=c(a)),k.setStatus(h.ERROR,a),i.trigger("uploadError",k,a),i.trigger("uploadComplete",k))}),l.on("load",function(){var a;return(a=c())?void l.trigger("error",a,!0):void(1===k.remaning?g._finishFile(k,e):l.destroy())}),m=f.extend(m,{id:k.id,name:k.name,type:k.type,lastModifiedDate:k.lastModifiedDate,size:k.size}),b.chunks>1&&f.extend(m,{chunks:b.chunks,chunk:b.chunk}),i.trigger("uploadBeforeSend",b,m,n),l.appendBlob(j.fileVal,b.blob,k.name),l.append(m),l.setRequestHeader(n),l.send()},_finishFile:function(a,b,c){var d=this.owner;return d.request("after-send-file",arguments,function(){a.setStatus(h.COMPLETE),d.trigger("uploadSuccess",a,b,c)}).fail(function(b){a.getStatus()===h.PROGRESS&&a.setStatus(h.ERROR,b),d.trigger("uploadError",a,b)
}).always(function(){d.trigger("uploadComplete",a)})},updateFileProgress:function(a){var b=0,c=0;a.blocks&&(f.each(a.blocks,function(a,b){c+=(b.percentage||0)*(b.end-b.start)}),b=c/a.size,this.owner.trigger("uploadProgress",a,b||0))}})}),b("widgets/validator",["base","uploader","file","widgets/widget"],function(a,b,c){var d,e=a.$,f={};return d={addValidator:function(a,b){f[a]=b},removeValidator:function(a){delete f[a]}},b.register({name:"validator",init:function(){var b=this;a.nextTick(function(){e.each(f,function(){this.call(b.owner)})})}}),d.addValidator("fileNumLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileNumLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){return c>=d&&e&&(e=!1,this.trigger("error","Q_EXCEED_NUM_LIMIT",d,a),setTimeout(function(){e=!0},1)),c>=d?!1:!0}),a.on("fileQueued",function(){c++}),a.on("fileDequeued",function(){c--}),a.on("reset",function(){c=0}))}),d.addValidator("fileSizeLimit",function(){var a=this,b=a.options,c=0,d=parseInt(b.fileSizeLimit,10),e=!0;d&&(a.on("beforeFileQueued",function(a){var b=c+a.size>d;return b&&e&&(e=!1,this.trigger("error","Q_EXCEED_SIZE_LIMIT",d,a),setTimeout(function(){e=!0},1)),b?!1:!0}),a.on("fileQueued",function(a){c+=a.size}),a.on("fileDequeued",function(a){c-=a.size}),a.on("reset",function(){c=0}))}),d.addValidator("fileSingleSizeLimit",function(){var a=this,b=a.options,d=b.fileSingleSizeLimit;d&&a.on("beforeFileQueued",function(a){return a.size>d?(a.setStatus(c.Status.INVALID,"exceed_size"),this.trigger("error","F_EXCEED_SIZE",d,a),!1):void 0})}),d.addValidator("duplicate",function(){function a(a){for(var b,c=0,d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=b+(c<<6)+(c<<16)-c;return c}var b=this,c=b.options,d={};c.duplicate||(b.on("beforeFileQueued",function(b){var c=b.__hash||(b.__hash=a(b.name+b.size+b.lastModifiedDate));return d[c]?(this.trigger("error","F_DUPLICATE",b),!1):void 0}),b.on("fileQueued",function(a){var b=a.__hash;b&&(d[b]=!0)}),b.on("fileDequeued",function(a){var b=a.__hash;b&&delete d[b]}),b.on("reset",function(){d={}}))}),d}),b("lib/md5",["runtime/client","mediator"],function(a,b){function c(){a.call(this,"Md5")}return b.installTo(c.prototype),c.prototype.loadFromBlob=function(a){var b=this;b.getRuid()&&b.disconnectRuntime(),b.connectRuntime(a.ruid,function(){b.exec("init"),b.exec("loadFromBlob",a)})},c.prototype.getResult=function(){return this.exec("getResult")},c}),b("widgets/md5",["base","uploader","lib/md5","lib/blob","widgets/widget"],function(a,b,c,d){return b.register({name:"md5",md5File:function(b,e,f){var g=new c,h=a.Deferred(),i=b instanceof d?b:this.request("get-file",b).source;return g.on("progress load",function(a){a=a||{},h.notify(a.total?a.loaded/a.total:1)}),g.on("complete",function(){h.resolve(g.getResult())}),g.on("error",function(a){h.reject(a)}),arguments.length>1&&(e=e||0,f=f||0,0>e&&(e=i.size+e),0>f&&(f=i.size+f),f=Math.min(f,i.size),i=i.slice(e,f)),g.loadFromBlob(i),h.promise()}})}),b("runtime/compbase",[],function(){function a(a,b){this.owner=a,this.options=a.options,this.getRuntime=function(){return b},this.getRuid=function(){return b.uid},this.trigger=function(){return a.trigger.apply(a,arguments)}}return a}),b("runtime/html5/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a={},d=this,e=this.destroy;c.apply(d,arguments),d.type=f,d.exec=function(c,e){var f,h=this,i=h.uid,j=b.slice(arguments,2);return g[c]&&(f=a[i]=a[i]||new g[c](h,d),f[e])?f[e].apply(f,j):void 0},d.destroy=function(){return e&&e.apply(this,arguments)}}var f="html5",g={};return b.inherits(c,{constructor:e,init:function(){var a=this;setTimeout(function(){a.trigger("ready")},1)}}),e.register=function(a,c){var e=g[a]=b.inherits(d,c);return e},a.Blob&&a.FileReader&&a.DataView&&c.addRuntime(f,e),e}),b("runtime/html5/blob",["runtime/html5/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.owner.source,e=d.slice||d.webkitSlice||d.mozSlice;return d=e.call(d,a,c),new b(this.getRuid(),d)}})}),b("runtime/html5/dnd",["base","runtime/html5/runtime","lib/file"],function(a,b,c){var d=a.$,e="webuploader-dnd-";return b.register("DragAndDrop",{init:function(){var b=this.elem=this.options.container;this.dragEnterHandler=a.bindFn(this._dragEnterHandler,this),this.dragOverHandler=a.bindFn(this._dragOverHandler,this),this.dragLeaveHandler=a.bindFn(this._dragLeaveHandler,this),this.dropHandler=a.bindFn(this._dropHandler,this),this.dndOver=!1,b.on("dragenter",this.dragEnterHandler),b.on("dragover",this.dragOverHandler),b.on("dragleave",this.dragLeaveHandler),b.on("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).on("dragover",this.dragOverHandler),d(document).on("drop",this.dropHandler))},_dragEnterHandler:function(a){var b,c=this,d=c._denied||!1;return a=a.originalEvent||a,c.dndOver||(c.dndOver=!0,b=a.dataTransfer.items,b&&b.length&&(c._denied=d=!c.trigger("accept",b)),c.elem.addClass(e+"over"),c.elem[d?"addClass":"removeClass"](e+"denied")),a.dataTransfer.dropEffect=d?"none":"copy",!1},_dragOverHandler:function(a){var b=this.elem.parent().get(0);return b&&!d.contains(b,a.currentTarget)?!1:(clearTimeout(this._leaveTimer),this._dragEnterHandler.call(this,a),!1)},_dragLeaveHandler:function(){var a,b=this;return a=function(){b.dndOver=!1,b.elem.removeClass(e+"over "+e+"denied")},clearTimeout(b._leaveTimer),b._leaveTimer=setTimeout(a,100),!1},_dropHandler:function(a){var b,f,g=this,h=g.getRuid(),i=g.elem.parent().get(0);if(i&&!d.contains(i,a.currentTarget))return!1;a=a.originalEvent||a,b=a.dataTransfer;try{f=b.getData("text/html")}catch(j){}return f?void 0:(g._getTansferFiles(b,function(a){g.trigger("drop",d.map(a,function(a){return new c(h,a)}))}),g.dndOver=!1,g.elem.removeClass(e+"over"),!1)},_getTansferFiles:function(b,c){var d,e,f,g,h,i,j,k=[],l=[];for(d=b.items,e=b.files,j=!(!d||!d[0].webkitGetAsEntry),h=0,i=e.length;i>h;h++)f=e[h],g=d&&d[h],j&&g.webkitGetAsEntry().isDirectory?l.push(this._traverseDirectoryTree(g.webkitGetAsEntry(),k)):k.push(f);a.when.apply(a,l).done(function(){k.length&&c(k)})},_traverseDirectoryTree:function(b,c){var d=a.Deferred(),e=this;return b.isFile?b.file(function(a){c.push(a),d.resolve()}):b.isDirectory&&b.createReader().readEntries(function(b){var f,g=b.length,h=[],i=[];for(f=0;g>f;f++)h.push(e._traverseDirectoryTree(b[f],i));a.when.apply(a,h).then(function(){c.push.apply(c,i),d.resolve()},d.reject)}),d.promise()},destroy:function(){var a=this.elem;a&&(a.off("dragenter",this.dragEnterHandler),a.off("dragover",this.dragOverHandler),a.off("dragleave",this.dragLeaveHandler),a.off("drop",this.dropHandler),this.options.disableGlobalDnd&&(d(document).off("dragover",this.dragOverHandler),d(document).off("drop",this.dropHandler)))}})}),b("runtime/html5/filepaste",["base","runtime/html5/runtime","lib/file"],function(a,b,c){return b.register("FilePaste",{init:function(){var b,c,d,e,f=this.options,g=this.elem=f.container,h=".*";if(f.accept){for(b=[],c=0,d=f.accept.length;d>c;c++)e=f.accept[c].mimeTypes,e&&b.push(e);b.length&&(h=b.join(","),h=h.replace(/,/g,"|").replace(/\*/g,".*"))}this.accept=h=new RegExp(h,"i"),this.hander=a.bindFn(this._pasteHander,this),g.on("paste",this.hander)},_pasteHander:function(a){var b,d,e,f,g,h=[],i=this.getRuid();for(a=a.originalEvent||a,b=a.clipboardData.items,f=0,g=b.length;g>f;f++)d=b[f],"file"===d.kind&&(e=d.getAsFile())&&h.push(new c(i,e));h.length&&(a.preventDefault(),a.stopPropagation(),this.trigger("paste",h))},destroy:function(){this.elem.off("paste",this.hander)}})}),b("runtime/html5/filepicker",["base","runtime/html5/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(){var a,b,d,e,f=this.getRuntime().getContainer(),g=this,h=g.owner,i=g.options,j=this.label=c(document.createElement("label")),k=this.input=c(document.createElement("input"));if(k.attr("type","file"),k.attr("name",i.name),k.addClass("webuploader-element-invisible"),j.on("click",function(){k.trigger("click")}),j.css({opacity:0,width:"100%",height:"100%",display:"block",cursor:"pointer",background:"#ffffff"}),i.multiple&&k.attr("multiple","multiple"),i.accept&&i.accept.length>0){for(a=[],b=0,d=i.accept.length;d>b;b++)a.push(i.accept[b].mimeTypes);k.attr("accept",a.join(","))}f.append(k),f.append(j),e=function(a){h.trigger(a.type)},k.on("change",function(a){var b,d=arguments.callee;g.files=a.target.files,b=this.cloneNode(!0),b.value=null,this.parentNode.replaceChild(b,this),k.off(),k=c(b).on("change",d).on("mouseenter mouseleave",e),h.trigger("change")}),j.on("mouseenter mouseleave",e)},getFiles:function(){return this.files},destroy:function(){this.input.off(),this.label.off()}})}),b("runtime/html5/util",["base"],function(b){var c=a.createObjectURL&&a||a.URL&&URL.revokeObjectURL&&URL||a.webkitURL,d=b.noop,e=d;return c&&(d=function(){return c.createObjectURL.apply(c,arguments)},e=function(){return c.revokeObjectURL.apply(c,arguments)}),{createObjectURL:d,revokeObjectURL:e,dataURL2Blob:function(a){var b,c,d,e,f,g;for(g=a.split(","),b=~g[0].indexOf("base64")?atob(g[1]):decodeURIComponent(g[1]),d=new ArrayBuffer(b.length),c=new Uint8Array(d),e=0;e<b.length;e++)c[e]=b.charCodeAt(e);return f=g[0].split(":")[1].split(";")[0],this.arrayBufferToBlob(d,f)},dataURL2ArrayBuffer:function(a){var b,c,d,e;for(e=a.split(","),b=~e[0].indexOf("base64")?atob(e[1]):decodeURIComponent(e[1]),c=new Uint8Array(b.length),d=0;d<b.length;d++)c[d]=b.charCodeAt(d);return c.buffer},arrayBufferToBlob:function(b,c){var d,e=a.BlobBuilder||a.WebKitBlobBuilder;return e?(d=new e,d.append(b),d.getBlob(c)):new Blob([b],c?{type:c}:{})},canvasToDataUrl:function(a,b,c){return a.toDataURL(b,c/100)},parseMeta:function(a,b){b(!1,{})},updateImageHead:function(a){return a}}}),b("runtime/html5/imagemeta",["runtime/html5/util"],function(a){var b;return b={parsers:{65505:[]},maxMetaDataSize:262144,parse:function(a,b){var c=this,d=new FileReader;d.onload=function(){b(!1,c._parse(this.result)),d=d.onload=d.onerror=null},d.onerror=function(a){b(a.message),d=d.onload=d.onerror=null},a=a.slice(0,c.maxMetaDataSize),d.readAsArrayBuffer(a.getSource())},_parse:function(a,c){if(!(a.byteLength<6)){var d,e,f,g,h=new DataView(a),i=2,j=h.byteLength-4,k=i,l={};if(65496===h.getUint16(0)){for(;j>i&&(d=h.getUint16(i),d>=65504&&65519>=d||65534===d)&&(e=h.getUint16(i+2)+2,!(i+e>h.byteLength));){if(f=b.parsers[d],!c&&f)for(g=0;g<f.length;g+=1)f[g].call(b,h,i,e,l);i+=e,k=i}k>6&&(l.imageHead=a.slice?a.slice(2,k):new Uint8Array(a).subarray(2,k))}return l}},updateImageHead:function(a,b){var c,d,e,f=this._parse(a,!0);return e=2,f.imageHead&&(e=2+f.imageHead.byteLength),d=a.slice?a.slice(e):new Uint8Array(a).subarray(e),c=new Uint8Array(b.byteLength+2+d.byteLength),c[0]=255,c[1]=216,c.set(new Uint8Array(b),2),c.set(new Uint8Array(d),b.byteLength+2),c.buffer}},a.parseMeta=function(){return b.parse.apply(b,arguments)},a.updateImageHead=function(){return b.updateImageHead.apply(b,arguments)},b}),b("runtime/html5/imagemeta/exif",["base","runtime/html5/imagemeta"],function(a,b){var c={};return c.ExifMap=function(){return this},c.ExifMap.prototype.map={Orientation:274},c.ExifMap.prototype.get=function(a){return this[a]||this[this.map[a]]},c.exifTagTypes={1:{getValue:function(a,b){return a.getUint8(b)},size:1},2:{getValue:function(a,b){return String.fromCharCode(a.getUint8(b))},size:1,ascii:!0},3:{getValue:function(a,b,c){return a.getUint16(b,c)},size:2},4:{getValue:function(a,b,c){return a.getUint32(b,c)},size:4},5:{getValue:function(a,b,c){return a.getUint32(b,c)/a.getUint32(b+4,c)},size:8},9:{getValue:function(a,b,c){return a.getInt32(b,c)},size:4},10:{getValue:function(a,b,c){return a.getInt32(b,c)/a.getInt32(b+4,c)},size:8}},c.exifTagTypes[7]=c.exifTagTypes[1],c.getExifValue=function(b,d,e,f,g,h){var i,j,k,l,m,n,o=c.exifTagTypes[f];if(!o)return void a.log("Invalid Exif data: Invalid tag type.");if(i=o.size*g,j=i>4?d+b.getUint32(e+8,h):e+8,j+i>b.byteLength)return void a.log("Invalid Exif data: Invalid data offset.");if(1===g)return o.getValue(b,j,h);for(k=[],l=0;g>l;l+=1)k[l]=o.getValue(b,j+l*o.size,h);if(o.ascii){for(m="",l=0;l<k.length&&(n=k[l],"\x00"!==n);l+=1)m+=n;return m}return k},c.parseExifTag=function(a,b,d,e,f){var g=a.getUint16(d,e);f.exif[g]=c.getExifValue(a,b,d,a.getUint16(d+2,e),a.getUint32(d+4,e),e)},c.parseExifTags=function(b,c,d,e,f){var g,h,i;if(d+6>b.byteLength)return void a.log("Invalid Exif data: Invalid directory offset.");if(g=b.getUint16(d,e),h=d+2+12*g,h+4>b.byteLength)return void a.log("Invalid Exif data: Invalid directory size.");for(i=0;g>i;i+=1)this.parseExifTag(b,c,d+2+12*i,e,f);return b.getUint32(h,e)},c.parseExifData=function(b,d,e,f){var g,h,i=d+10;if(1165519206===b.getUint32(d+4)){if(i+8>b.byteLength)return void a.log("Invalid Exif data: Invalid segment size.");if(0!==b.getUint16(d+8))return void a.log("Invalid Exif data: Missing byte alignment offset.");switch(b.getUint16(i)){case 18761:g=!0;break;case 19789:g=!1;break;default:return void a.log("Invalid Exif data: Invalid byte alignment marker.")}if(42!==b.getUint16(i+2,g))return void a.log("Invalid Exif data: Missing TIFF marker.");h=b.getUint32(i+4,g),f.exif=new c.ExifMap,h=c.parseExifTags(b,i,i+h,g,f)}},b.parsers[65505].push(c.parseExifData),c}),b("runtime/html5/jpegencoder",[],function(){function a(a){function b(a){for(var b=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],c=0;64>c;c++){var d=y((b[c]*a+50)/100);1>d?d=1:d>255&&(d=255),z[P[c]]=d}for(var e=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],f=0;64>f;f++){var g=y((e[f]*a+50)/100);1>g?g=1:g>255&&(g=255),A[P[f]]=g}for(var h=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],i=0,j=0;8>j;j++)for(var k=0;8>k;k++)B[i]=1/(z[P[i]]*h[j]*h[k]*8),C[i]=1/(A[P[i]]*h[j]*h[k]*8),i++}function c(a,b){for(var c=0,d=0,e=new Array,f=1;16>=f;f++){for(var g=1;g<=a[f];g++)e[b[d]]=[],e[b[d]][0]=c,e[b[d]][1]=f,d++,c++;c*=2}return e}function d(){t=c(Q,R),u=c(U,V),v=c(S,T),w=c(W,X)}function e(){for(var a=1,b=2,c=1;15>=c;c++){for(var d=a;b>d;d++)E[32767+d]=c,D[32767+d]=[],D[32767+d][1]=c,D[32767+d][0]=d;for(var e=-(b-1);-a>=e;e++)E[32767+e]=c,D[32767+e]=[],D[32767+e][1]=c,D[32767+e][0]=b-1+e;a<<=1,b<<=1}}function f(){for(var a=0;256>a;a++)O[a]=19595*a,O[a+256>>0]=38470*a,O[a+512>>0]=7471*a+32768,O[a+768>>0]=-11059*a,O[a+1024>>0]=-21709*a,O[a+1280>>0]=32768*a+8421375,O[a+1536>>0]=-27439*a,O[a+1792>>0]=-5329*a}function g(a){for(var b=a[0],c=a[1]-1;c>=0;)b&1<<c&&(I|=1<<J),c--,J--,0>J&&(255==I?(h(255),h(0)):h(I),J=7,I=0)}function h(a){H.push(N[a])}function i(a){h(a>>8&255),h(255&a)}function j(a,b){var c,d,e,f,g,h,i,j,k,l=0,m=8,n=64;for(k=0;m>k;++k){c=a[l],d=a[l+1],e=a[l+2],f=a[l+3],g=a[l+4],h=a[l+5],i=a[l+6],j=a[l+7];var o=c+j,p=c-j,q=d+i,r=d-i,s=e+h,t=e-h,u=f+g,v=f-g,w=o+u,x=o-u,y=q+s,z=q-s;a[l]=w+y,a[l+4]=w-y;var A=.707106781*(z+x);a[l+2]=x+A,a[l+6]=x-A,w=v+t,y=t+r,z=r+p;var B=.382683433*(w-z),C=.5411961*w+B,D=1.306562965*z+B,E=.707106781*y,G=p+E,H=p-E;a[l+5]=H+C,a[l+3]=H-C,a[l+1]=G+D,a[l+7]=G-D,l+=8}for(l=0,k=0;m>k;++k){c=a[l],d=a[l+8],e=a[l+16],f=a[l+24],g=a[l+32],h=a[l+40],i=a[l+48],j=a[l+56];var I=c+j,J=c-j,K=d+i,L=d-i,M=e+h,N=e-h,O=f+g,P=f-g,Q=I+O,R=I-O,S=K+M,T=K-M;a[l]=Q+S,a[l+32]=Q-S;var U=.707106781*(T+R);a[l+16]=R+U,a[l+48]=R-U,Q=P+N,S=N+L,T=L+J;var V=.382683433*(Q-T),W=.5411961*Q+V,X=1.306562965*T+V,Y=.707106781*S,Z=J+Y,$=J-Y;a[l+40]=$+W,a[l+24]=$-W,a[l+8]=Z+X,a[l+56]=Z-X,l++}var _;for(k=0;n>k;++k)_=a[k]*b[k],F[k]=_>0?_+.5|0:_-.5|0;return F}function k(){i(65504),i(16),h(74),h(70),h(73),h(70),h(0),h(1),h(1),h(0),i(1),i(1),h(0),h(0)}function l(a,b){i(65472),i(17),h(8),i(b),i(a),h(3),h(1),h(17),h(0),h(2),h(17),h(1),h(3),h(17),h(1)}function m(){i(65499),i(132),h(0);for(var a=0;64>a;a++)h(z[a]);h(1);for(var b=0;64>b;b++)h(A[b])}function n(){i(65476),i(418),h(0);for(var a=0;16>a;a++)h(Q[a+1]);for(var b=0;11>=b;b++)h(R[b]);h(16);for(var c=0;16>c;c++)h(S[c+1]);for(var d=0;161>=d;d++)h(T[d]);h(1);for(var e=0;16>e;e++)h(U[e+1]);for(var f=0;11>=f;f++)h(V[f]);h(17);for(var g=0;16>g;g++)h(W[g+1]);for(var j=0;161>=j;j++)h(X[j])}function o(){i(65498),i(12),h(3),h(1),h(0),h(2),h(17),h(3),h(17),h(0),h(63),h(0)}function p(a,b,c,d,e){for(var f,h=e[0],i=e[240],k=16,l=63,m=64,n=j(a,b),o=0;m>o;++o)G[P[o]]=n[o];var p=G[0]-c;c=G[0],0==p?g(d[0]):(f=32767+p,g(d[E[f]]),g(D[f]));for(var q=63;q>0&&0==G[q];q--);if(0==q)return g(h),c;for(var r,s=1;q>=s;){for(var t=s;0==G[s]&&q>=s;++s);var u=s-t;if(u>=k){r=u>>4;for(var v=1;r>=v;++v)g(i);u=15&u}f=32767+G[s],g(e[(u<<4)+E[f]]),g(D[f]),s++}return q!=l&&g(h),c}function q(){for(var a=String.fromCharCode,b=0;256>b;b++)N[b]=a(b)}function r(a){if(0>=a&&(a=1),a>100&&(a=100),x!=a){var c=0;c=Math.floor(50>a?5e3/a:200-2*a),b(c),x=a}}function s(){a||(a=50),q(),d(),e(),f(),r(a)}var t,u,v,w,x,y=(Math.round,Math.floor),z=new Array(64),A=new Array(64),B=new Array(64),C=new Array(64),D=new Array(65535),E=new Array(65535),F=new Array(64),G=new Array(64),H=[],I=0,J=7,K=new Array(64),L=new Array(64),M=new Array(64),N=new Array(256),O=new Array(2048),P=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],Q=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],R=[0,1,2,3,4,5,6,7,8,9,10,11],S=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],T=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],U=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],V=[0,1,2,3,4,5,6,7,8,9,10,11],W=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],X=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];this.encode=function(a,b){b&&r(b),H=new Array,I=0,J=7,i(65496),k(),m(),l(a.width,a.height),n(),o();var c=0,d=0,e=0;I=0,J=7,this.encode.displayName="_encode_";for(var f,h,j,q,s,x,y,z,A,D=a.data,E=a.width,F=a.height,G=4*E,N=0;F>N;){for(f=0;G>f;){for(s=G*N+f,x=s,y=-1,z=0,A=0;64>A;A++)z=A>>3,y=4*(7&A),x=s+z*G+y,N+z>=F&&(x-=G*(N+1+z-F)),f+y>=G&&(x-=f+y-G+4),h=D[x++],j=D[x++],q=D[x++],K[A]=(O[h]+O[j+256>>0]+O[q+512>>0]>>16)-128,L[A]=(O[h+768>>0]+O[j+1024>>0]+O[q+1280>>0]>>16)-128,M[A]=(O[h+1280>>0]+O[j+1536>>0]+O[q+1792>>0]>>16)-128;c=p(K,B,c,t,v),d=p(L,C,d,u,w),e=p(M,C,e,u,w),f+=32}N+=8}if(J>=0){var P=[];P[1]=J+1,P[0]=(1<<J+1)-1,g(P)}i(65497);var Q="data:image/jpeg;base64,"+btoa(H.join(""));return H=[],Q},s()}return a.encode=function(b,c){var d=new a(c);return d.encode(b)},a}),b("runtime/html5/androidpatch",["runtime/html5/util","runtime/html5/jpegencoder","base"],function(a,b,c){var d,e=a.canvasToDataUrl;a.canvasToDataUrl=function(a,f,g){var h,i,j,k,l;return c.os.android?("image/jpeg"===f&&"undefined"==typeof d&&(k=e.apply(null,arguments),l=k.split(","),k=~l[0].indexOf("base64")?atob(l[1]):decodeURIComponent(l[1]),k=k.substring(0,2),d=255===k.charCodeAt(0)&&216===k.charCodeAt(1)),"image/jpeg"!==f||d?e.apply(null,arguments):(i=a.width,j=a.height,h=a.getContext("2d"),b.encode(h.getImageData(0,0,i,j),g))):e.apply(null,arguments)}}),b("runtime/html5/image",["base","runtime/html5/runtime","runtime/html5/util"],function(a,b,c){var d="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D";return b.register("Image",{modified:!1,init:function(){var a=this,b=new Image;b.onload=function(){a._info={type:a.type,width:this.width,height:this.height},a._metas||"image/jpeg"!==a.type?a.owner.trigger("load"):c.parseMeta(a._blob,function(b,c){a._metas=c,a.owner.trigger("load")})},b.onerror=function(){a.owner.trigger("error")},a._img=b},loadFromBlob:function(a){var b=this,d=b._img;b._blob=a,b.type=a.type,d.src=c.createObjectURL(a.getSource()),b.owner.once("load",function(){c.revokeObjectURL(d.src)})},resize:function(a,b){var c=this._canvas||(this._canvas=document.createElement("canvas"));this._resize(this._img,c,a,b),this._blob=null,this.modified=!0,this.owner.trigger("complete","resize")},crop:function(a,b,c,d,e){var f=this._canvas||(this._canvas=document.createElement("canvas")),g=this.options,h=this._img,i=h.naturalWidth,j=h.naturalHeight,k=this.getOrientation();e=e||1,f.width=c,f.height=d,g.preserveHeaders||this._rotate2Orientaion(f,k),this._renderImageToCanvas(f,h,-a,-b,i*e,j*e),this._blob=null,this.modified=!0,this.owner.trigger("complete","crop")},getAsBlob:function(a){var b,d=this._blob,e=this.options;if(a=a||this.type,this.modified||this.type!==a){if(b=this._canvas,"image/jpeg"===a){if(d=c.canvasToDataUrl(b,a,e.quality),e.preserveHeaders&&this._metas&&this._metas.imageHead)return d=c.dataURL2ArrayBuffer(d),d=c.updateImageHead(d,this._metas.imageHead),d=c.arrayBufferToBlob(d,a)}else d=c.canvasToDataUrl(b,a);d=c.dataURL2Blob(d)}return d},getAsDataUrl:function(a){var b=this.options;return a=a||this.type,"image/jpeg"===a?c.canvasToDataUrl(this._canvas,a,b.quality):this._canvas.toDataURL(a)},getOrientation:function(){return this._metas&&this._metas.exif&&this._metas.exif.get("Orientation")||1},info:function(a){return a?(this._info=a,this):this._info},meta:function(a){return a?(this._meta=a,this):this._meta},destroy:function(){var a=this._canvas;this._img.onload=null,a&&(a.getContext("2d").clearRect(0,0,a.width,a.height),a.width=a.height=0,this._canvas=null),this._img.src=d,this._img=this._blob=null},_resize:function(a,b,c,d){var e,f,g,h,i,j=this.options,k=a.width,l=a.height,m=this.getOrientation();~[5,6,7,8].indexOf(m)&&(c^=d,d^=c,c^=d),e=Math[j.crop?"max":"min"](c/k,d/l),j.allowMagnify||(e=Math.min(1,e)),f=k*e,g=l*e,j.crop?(b.width=c,b.height=d):(b.width=f,b.height=g),h=(b.width-f)/2,i=(b.height-g)/2,j.preserveHeaders||this._rotate2Orientaion(b,m),this._renderImageToCanvas(b,a,h,i,f,g)},_rotate2Orientaion:function(a,b){var c=a.width,d=a.height,e=a.getContext("2d");switch(b){case 5:case 6:case 7:case 8:a.width=d,a.height=c}switch(b){case 2:e.translate(c,0),e.scale(-1,1);break;case 3:e.translate(c,d),e.rotate(Math.PI);break;case 4:e.translate(0,d),e.scale(1,-1);break;case 5:e.rotate(.5*Math.PI),e.scale(1,-1);break;case 6:e.rotate(.5*Math.PI),e.translate(0,-d);break;case 7:e.rotate(.5*Math.PI),e.translate(c,-d),e.scale(-1,1);break;case 8:e.rotate(-.5*Math.PI),e.translate(-c,0)}},_renderImageToCanvas:function(){function b(a,b,c){var d,e,f,g=document.createElement("canvas"),h=g.getContext("2d"),i=0,j=c,k=c;for(g.width=1,g.height=c,h.drawImage(a,0,0),d=h.getImageData(0,0,1,c).data;k>i;)e=d[4*(k-1)+3],0===e?j=k:i=k,k=j+i>>1;return f=k/c,0===f?1:f}function c(a){var b,c,d=a.naturalWidth,e=a.naturalHeight;return d*e>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-d+1,0),0===c.getImageData(0,0,1,1).data[3]):!1}return a.os.ios?a.os.ios>=7?function(a,c,d,e,f,g){var h=c.naturalWidth,i=c.naturalHeight,j=b(c,h,i);return a.getContext("2d").drawImage(c,0,0,h*j,i*j,d,e,f,g)}:function(a,d,e,f,g,h){var i,j,k,l,m,n,o,p=d.naturalWidth,q=d.naturalHeight,r=a.getContext("2d"),s=c(d),t="image/jpeg"===this.type,u=1024,v=0,w=0;for(s&&(p/=2,q/=2),r.save(),i=document.createElement("canvas"),i.width=i.height=u,j=i.getContext("2d"),k=t?b(d,p,q):1,l=Math.ceil(u*g/p),m=Math.ceil(u*h/q/k);q>v;){for(n=0,o=0;p>n;)j.clearRect(0,0,u,u),j.drawImage(d,-n,-v),r.drawImage(i,0,0,u,u,e+o,f+w,l,m),n+=u,o+=l;v+=u,w+=m}r.restore(),i=j=null}:function(b){var c=a.slice(arguments,1),d=b.getContext("2d");d.drawImage.apply(d,c)}}()})}),b("runtime/html5/transport",["base","runtime/html5/runtime"],function(a,b){var c=a.noop,d=a.$;return b.register("Transport",{init:function(){this._status=0,this._response=null},send:function(){var b,c,e,f=this.owner,g=this.options,h=this._initAjax(),i=f._blob,j=g.server;g.sendAsBinary?(j+=(/\?/.test(j)?"&":"?")+d.param(f._formData),c=i.getSource()):(b=new FormData,d.each(f._formData,function(a,c){b.append(a,c)}),b.append(g.fileVal,i.getSource(),g.filename||f._formData.name||"")),g.withCredentials&&"withCredentials"in h?(h.open(g.method,j,!0),h.withCredentials=!0):h.open(g.method,j),this._setRequestHeader(h,g.headers),c?(h.overrideMimeType&&h.overrideMimeType("application/octet-stream"),a.os.android?(e=new FileReader,e.onload=function(){h.send(this.result),e=e.onload=null},e.readAsArrayBuffer(c)):h.send(c)):h.send(b)},getResponse:function(){return this._response},getResponseAsJson:function(){return this._parseJson(this._response)},getStatus:function(){return this._status},abort:function(){var a=this._xhr;a&&(a.upload.onprogress=c,a.onreadystatechange=c,a.abort(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var a=this,b=new XMLHttpRequest,d=this.options;return!d.withCredentials||"withCredentials"in b||"undefined"==typeof XDomainRequest||(b=new XDomainRequest),b.upload.onprogress=function(b){var c=0;return b.lengthComputable&&(c=b.loaded/b.total),a.trigger("progress",c)},b.onreadystatechange=function(){return 4===b.readyState?(b.upload.onprogress=c,b.onreadystatechange=c,a._xhr=null,a._status=b.status,b.status>=200&&b.status<300?(a._response=b.responseText,a.trigger("load")):b.status>=500&&b.status<600?(a._response=b.responseText,a.trigger("error","server")):a.trigger("error",a._status?"http":"abort")):void 0},a._xhr=b,b},_setRequestHeader:function(a,b){d.each(b,function(b,c){a.setRequestHeader(b,c)})},_parseJson:function(a){var b;try{b=JSON.parse(a)}catch(c){b={}}return b}})}),b("runtime/html5/md5",["runtime/html5/runtime"],function(a){var b=function(a,b){return a+b&4294967295},c=function(a,c,d,e,f,g){return c=b(b(c,a),b(e,g)),b(c<<f|c>>>32-f,d)},d=function(a,b,d,e,f,g,h){return c(b&d|~b&e,a,b,f,g,h)},e=function(a,b,d,e,f,g,h){return c(b&e|d&~e,a,b,f,g,h)},f=function(a,b,d,e,f,g,h){return c(b^d^e,a,b,f,g,h)},g=function(a,b,d,e,f,g,h){return c(d^(b|~e),a,b,f,g,h)},h=function(a,c){var h=a[0],i=a[1],j=a[2],k=a[3];h=d(h,i,j,k,c[0],7,-680876936),k=d(k,h,i,j,c[1],12,-389564586),j=d(j,k,h,i,c[2],17,606105819),i=d(i,j,k,h,c[3],22,-1044525330),h=d(h,i,j,k,c[4],7,-176418897),k=d(k,h,i,j,c[5],12,1200080426),j=d(j,k,h,i,c[6],17,-1473231341),i=d(i,j,k,h,c[7],22,-45705983),h=d(h,i,j,k,c[8],7,1770035416),k=d(k,h,i,j,c[9],12,-1958414417),j=d(j,k,h,i,c[10],17,-42063),i=d(i,j,k,h,c[11],22,-1990404162),h=d(h,i,j,k,c[12],7,1804603682),k=d(k,h,i,j,c[13],12,-40341101),j=d(j,k,h,i,c[14],17,-1502002290),i=d(i,j,k,h,c[15],22,1236535329),h=e(h,i,j,k,c[1],5,-165796510),k=e(k,h,i,j,c[6],9,-1069501632),j=e(j,k,h,i,c[11],14,643717713),i=e(i,j,k,h,c[0],20,-373897302),h=e(h,i,j,k,c[5],5,-701558691),k=e(k,h,i,j,c[10],9,38016083),j=e(j,k,h,i,c[15],14,-660478335),i=e(i,j,k,h,c[4],20,-405537848),h=e(h,i,j,k,c[9],5,568446438),k=e(k,h,i,j,c[14],9,-1019803690),j=e(j,k,h,i,c[3],14,-187363961),i=e(i,j,k,h,c[8],20,1163531501),h=e(h,i,j,k,c[13],5,-1444681467),k=e(k,h,i,j,c[2],9,-51403784),j=e(j,k,h,i,c[7],14,1735328473),i=e(i,j,k,h,c[12],20,-1926607734),h=f(h,i,j,k,c[5],4,-378558),k=f(k,h,i,j,c[8],11,-2022574463),j=f(j,k,h,i,c[11],16,1839030562),i=f(i,j,k,h,c[14],23,-35309556),h=f(h,i,j,k,c[1],4,-1530992060),k=f(k,h,i,j,c[4],11,1272893353),j=f(j,k,h,i,c[7],16,-155497632),i=f(i,j,k,h,c[10],23,-1094730640),h=f(h,i,j,k,c[13],4,681279174),k=f(k,h,i,j,c[0],11,-358537222),j=f(j,k,h,i,c[3],16,-722521979),i=f(i,j,k,h,c[6],23,76029189),h=f(h,i,j,k,c[9],4,-640364487),k=f(k,h,i,j,c[12],11,-421815835),j=f(j,k,h,i,c[15],16,530742520),i=f(i,j,k,h,c[2],23,-995338651),h=g(h,i,j,k,c[0],6,-198630844),k=g(k,h,i,j,c[7],10,1126891415),j=g(j,k,h,i,c[14],15,-1416354905),i=g(i,j,k,h,c[5],21,-57434055),h=g(h,i,j,k,c[12],6,1700485571),k=g(k,h,i,j,c[3],10,-1894986606),j=g(j,k,h,i,c[10],15,-1051523),i=g(i,j,k,h,c[1],21,-2054922799),h=g(h,i,j,k,c[8],6,1873313359),k=g(k,h,i,j,c[15],10,-30611744),j=g(j,k,h,i,c[6],15,-1560198380),i=g(i,j,k,h,c[13],21,1309151649),h=g(h,i,j,k,c[4],6,-145523070),k=g(k,h,i,j,c[11],10,-1120210379),j=g(j,k,h,i,c[2],15,718787259),i=g(i,j,k,h,c[9],21,-343485551),a[0]=b(h,a[0]),a[1]=b(i,a[1]),a[2]=b(j,a[2]),a[3]=b(k,a[3])},i=function(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a.charCodeAt(b)+(a.charCodeAt(b+1)<<8)+(a.charCodeAt(b+2)<<16)+(a.charCodeAt(b+3)<<24);return c},j=function(a){var b,c=[];for(b=0;64>b;b+=4)c[b>>2]=a[b]+(a[b+1]<<8)+(a[b+2]<<16)+(a[b+3]<<24);return c},k=function(a){var b,c,d,e,f,g,j=a.length,k=[1732584193,-271733879,-1732584194,271733878];for(b=64;j>=b;b+=64)h(k,i(a.substring(b-64,b)));for(a=a.substring(b-64),c=a.length,d=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],b=0;c>b;b+=1)d[b>>2]|=a.charCodeAt(b)<<(b%4<<3);if(d[b>>2]|=128<<(b%4<<3),b>55)for(h(k,d),b=0;16>b;b+=1)d[b]=0;return e=8*j,e=e.toString(16).match(/(.*?)(.{0,8})$/),f=parseInt(e[2],16),g=parseInt(e[1],16)||0,d[14]=f,d[15]=g,h(k,d),k},l=function(a){var b,c,d,e,f,g,i=a.length,k=[1732584193,-271733879,-1732584194,271733878];for(b=64;i>=b;b+=64)h(k,j(a.subarray(b-64,b)));for(a=i>b-64?a.subarray(b-64):new Uint8Array(0),c=a.length,d=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],b=0;c>b;b+=1)d[b>>2]|=a[b]<<(b%4<<3);if(d[b>>2]|=128<<(b%4<<3),b>55)for(h(k,d),b=0;16>b;b+=1)d[b]=0;return e=8*i,e=e.toString(16).match(/(.*?)(.{0,8})$/),f=parseInt(e[2],16),g=parseInt(e[1],16)||0,d[14]=f,d[15]=g,h(k,d),k},m=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],n=function(a){var b,c="";for(b=0;4>b;b+=1)c+=m[a>>8*b+4&15]+m[a>>8*b&15];return c},o=function(a){var b;for(b=0;b<a.length;b+=1)a[b]=n(a[b]);return a.join("")},p=function(a){return o(k(a))},q=function(){this.reset()};return"5d41402abc4b2a76b9719d911017c592"!==p("hello")&&(b=function(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c}),q.prototype.append=function(a){return/[\u0080-\uFFFF]/.test(a)&&(a=unescape(encodeURIComponent(a))),this.appendBinary(a),this},q.prototype.appendBinary=function(a){this._buff+=a,this._length+=a.length;var b,c=this._buff.length;for(b=64;c>=b;b+=64)h(this._state,i(this._buff.substring(b-64,b)));return this._buff=this._buff.substr(b-64),this},q.prototype.end=function(a){var b,c,d=this._buff,e=d.length,f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(b=0;e>b;b+=1)f[b>>2]|=d.charCodeAt(b)<<(b%4<<3);return this._finish(f,e),c=a?this._state:o(this._state),this.reset(),c},q.prototype._finish=function(a,b){var c,d,e,f=b;if(a[f>>2]|=128<<(f%4<<3),f>55)for(h(this._state,a),f=0;16>f;f+=1)a[f]=0;c=8*this._length,c=c.toString(16).match(/(.*?)(.{0,8})$/),d=parseInt(c[2],16),e=parseInt(c[1],16)||0,a[14]=d,a[15]=e,h(this._state,a)},q.prototype.reset=function(){return this._buff="",this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},q.prototype.destroy=function(){delete this._state,delete this._buff,delete this._length},q.hash=function(a,b){/[\u0080-\uFFFF]/.test(a)&&(a=unescape(encodeURIComponent(a)));var c=k(a);return b?c:o(c)},q.hashBinary=function(a,b){var c=k(a);return b?c:o(c)},q.ArrayBuffer=function(){this.reset()},q.ArrayBuffer.prototype.append=function(a){var b,c=this._concatArrayBuffer(this._buff,a),d=c.length;for(this._length+=a.byteLength,b=64;d>=b;b+=64)h(this._state,j(c.subarray(b-64,b)));return this._buff=d>b-64?c.subarray(b-64):new Uint8Array(0),this},q.ArrayBuffer.prototype.end=function(a){var b,c,d=this._buff,e=d.length,f=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for(b=0;e>b;b+=1)f[b>>2]|=d[b]<<(b%4<<3);return this._finish(f,e),c=a?this._state:o(this._state),this.reset(),c},q.ArrayBuffer.prototype._finish=q.prototype._finish,q.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._state=[1732584193,-271733879,-1732584194,271733878],this},q.ArrayBuffer.prototype.destroy=q.prototype.destroy,q.ArrayBuffer.prototype._concatArrayBuffer=function(a,b){var c=a.length,d=new Uint8Array(c+b.byteLength);return d.set(a),d.set(new Uint8Array(b),c),d},q.ArrayBuffer.hash=function(a,b){var c=l(new Uint8Array(a));return b?c:o(c)},a.register("Md5",{init:function(){},loadFromBlob:function(a){var b,c,d=a.getSource(),e=2097152,f=Math.ceil(d.size/e),g=0,h=this.owner,i=new q.ArrayBuffer,j=this,k=d.mozSlice||d.webkitSlice||d.slice;c=new FileReader,(b=function(){var l,m;l=g*e,m=Math.min(l+e,d.size),c.onload=function(b){i.append(b.target.result),h.trigger("progress",{total:a.size,loaded:m})},c.onloadend=function(){c.onloadend=c.onload=null,++g<f?setTimeout(b,1):setTimeout(function(){h.trigger("load"),j.result=i.end(),b=a=d=i=null,h.trigger("complete")},50)},c.readAsArrayBuffer(k.call(d,l,m))})()},getResult:function(){return this.result}})}),b("runtime/flash/runtime",["base","runtime/runtime","runtime/compbase"],function(b,c,d){function e(){var a;try{a=navigator.plugins["Shockwave Flash"],a=a.description}catch(b){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(c){a="0.0"}}return a=a.match(/\d+/g),parseFloat(a[0]+"."+a[1],10)}function f(){function d(a,b){var c,d,e=a.type||a;c=e.split("::"),d=c[0],e=c[1],"Ready"===e&&d===j.uid?j.trigger("ready"):f[d]&&f[d].trigger(e.toLowerCase(),a,b)}var e={},f={},g=this.destroy,j=this,k=b.guid("webuploader_");c.apply(j,arguments),j.type=h,j.exec=function(a,c){var d,g=this,h=g.uid,k=b.slice(arguments,2);return f[h]=g,i[a]&&(e[h]||(e[h]=new i[a](g,j)),d=e[h],d[c])?d[c].apply(d,k):j.flashExec.apply(g,arguments)},a[k]=function(){var a=arguments;setTimeout(function(){d.apply(null,a)},1)},this.jsreciver=k,this.destroy=function(){return g&&g.apply(this,arguments)},this.flashExec=function(a,c){var d=j.getFlash(),e=b.slice(arguments,2);return d.exec(this.uid,a,c,e)}}var g=b.$,h="flash",i={};return b.inherits(c,{constructor:f,init:function(){var a,c=this.getContainer(),d=this.options;c.css({position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),a='<object id="'+this.uid+'" type="application/x-shockwave-flash" data="'+d.swf+'" ',b.browser.ie&&(a+='classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '),a+='width="100%" height="100%" style="outline:0"><param name="movie" value="'+d.swf+'" /><param name="flashvars" value="uid='+this.uid+"&jsreciver="+this.jsreciver+'" /><param name="wmode" value="transparent" /><param name="allowscriptaccess" value="always" /></object>',c.html(a)},getFlash:function(){return this._flash?this._flash:(this._flash=g("#"+this.uid).get(0),this._flash)}}),f.register=function(a,c){return c=i[a]=b.inherits(d,g.extend({flashExec:function(){var a=this.owner,b=this.getRuntime();return b.flashExec.apply(a,arguments)}},c))},e()>=11.4&&c.addRuntime(h,f),f}),b("runtime/flash/filepicker",["base","runtime/flash/runtime"],function(a,b){var c=a.$;return b.register("FilePicker",{init:function(a){var b,d,e=c.extend({},a);for(b=e.accept&&e.accept.length,d=0;b>d;d++)e.accept[d].title||(e.accept[d].title="Files");delete e.button,delete e.id,delete e.container,this.flashExec("FilePicker","init",e)},destroy:function(){this.flashExec("FilePicker","destroy")}})}),b("runtime/flash/image",["runtime/flash/runtime"],function(a){return a.register("Image",{loadFromBlob:function(a){var b=this.owner;b.info()&&this.flashExec("Image","info",b.info()),b.meta()&&this.flashExec("Image","meta",b.meta()),this.flashExec("Image","loadFromBlob",a.uid)}})}),b("runtime/flash/transport",["base","runtime/flash/runtime","runtime/client"],function(b,c,d){var e=b.$;return c.register("Transport",{init:function(){this._status=0,this._response=null,this._responseJson=null},send:function(){var a,b=this.owner,c=this.options,d=this._initAjax(),f=b._blob,g=c.server;d.connectRuntime(f.ruid),c.sendAsBinary?(g+=(/\?/.test(g)?"&":"?")+e.param(b._formData),a=f.uid):(e.each(b._formData,function(a,b){d.exec("append",a,b)}),d.exec("appendBlob",c.fileVal,f.uid,c.filename||b._formData.name||"")),this._setRequestHeader(d,c.headers),d.exec("send",{method:c.method,url:g,forceURLStream:c.forceURLStream,mimeType:"application/octet-stream"},a)},getStatus:function(){return this._status},getResponse:function(){return this._response||""},getResponseAsJson:function(){return this._responseJson},abort:function(){var a=this._xhr;a&&(a.exec("abort"),a.destroy(),this._xhr=a=null)},destroy:function(){this.abort()},_initAjax:function(){var b=this,c=new d("XMLHttpRequest");return c.on("uploadprogress progress",function(a){var c=a.loaded/a.total;return c=Math.min(1,Math.max(0,c)),b.trigger("progress",c)}),c.on("load",function(){var d,e=c.exec("getStatus"),f=!1,g="";return c.off(),b._xhr=null,e>=200&&300>e?f=!0:e>=500&&600>e?(f=!0,g="server"):g="http",f&&(b._response=c.exec("getResponse"),b._response=decodeURIComponent(b._response),d=a.JSON&&a.JSON.parse||function(a){try{return new Function("return "+a).call()}catch(b){return{}}},b._responseJson=b._response?d(b._response):{}),c.destroy(),c=null,g?b.trigger("error",g):b.trigger("load")}),c.on("error",function(){c.off(),b._xhr=null,b.trigger("error","http")}),b._xhr=c,c},_setRequestHeader:function(a,b){e.each(b,function(b,c){a.exec("setRequestHeader",b,c)})}})}),b("runtime/flash/blob",["runtime/flash/runtime","lib/blob"],function(a,b){return a.register("Blob",{slice:function(a,c){var d=this.flashExec("Blob","slice",a,c);return new b(d.uid,d)}})}),b("runtime/flash/md5",["runtime/flash/runtime"],function(a){return a.register("Md5",{init:function(){},loadFromBlob:function(a){return this.flashExec("Md5","loadFromBlob",a.uid)}})}),b("preset/all",["base","widgets/filednd","widgets/filepaste","widgets/filepicker","widgets/image","widgets/queue","widgets/runtime","widgets/upload","widgets/validator","widgets/md5","runtime/html5/blob","runtime/html5/dnd","runtime/html5/filepaste","runtime/html5/filepicker","runtime/html5/imagemeta/exif","runtime/html5/androidpatch","runtime/html5/image","runtime/html5/transport","runtime/html5/md5","runtime/flash/filepicker","runtime/flash/image","runtime/flash/transport","runtime/flash/blob","runtime/flash/md5"],function(a){return a}),b("widgets/log",["base","uploader","widgets/widget"],function(a,b){function c(a){var b=e.extend({},d,a),c=f.replace(/^(.*)\?/,"$1"+e.param(b)),g=new Image;g.src=c}var d,e=a.$,f=" http://static.tieba.baidu.com/tb/pms/img/st.gif??",g=(location.hostname||location.host||"protected").toLowerCase(),h=g&&/baidu/i.exec(g);if(h)return d={dv:3,master:"webuploader",online:/test/.exec(g)?0:1,module:"",product:g,type:0},b.register({name:"log",init:function(){var a=this.owner,b=0,d=0;a.on("error",function(a){c({type:2,c_error_code:a})}).on("uploadError",function(a,b){c({type:2,c_error_code:"UPLOAD_ERROR",c_reason:""+b})}).on("uploadComplete",function(a){b++,d+=a.size}).on("uploadFinished",function(){c({c_count:b,c_size:d}),b=d=0}),c({c_usage:1})}})}),b("webuploader",["preset/all","widgets/log"],function(a){return a}),c("webuploader")});
\ No newline at end of file
import lodash from 'lodash'
import momentIns from 'moment'
import toast from '@/helpers/toast'
declare global {
const _: typeof lodash
const moment: typeof momentIns
const echarts: any
const vm: any
const routerRefresh: Function
const Toast: {
success,
danger,
warning,
info,
}
const DOMPurify: any
const WebUploader: any
interface Window {
Vue: any,
vm: any,
routerRefresh: Function,
XRegExp: any,
_: typeof lodash,
moment: typeof momentIns,
echarts: any,
Toast: {
success,
danger,
warning,
},
DOMPurify: any,
}
}
import Vue, { VNode } from 'vue'
declare global {
namespace JSX {
// tslint:disable no-empty-interface
interface Element extends VNode {}
// tslint:disable no-empty-interface
interface ElementClass extends Vue {}
interface IntrinsicElements {
[elem: string]: any
}
}
}
declare module '*.vue' {
import Vue from 'vue'
export default Vue
}
// 训练平台系统host信息
declare const productionHost: {
baseUrl,
rootUrl,
jupyterRootUrl,
baseWebSocket,
apiTestUrl,
adminUrl,
mockUrl,
}
// 推理平台系统host信息
declare const inferenceHost: {
baseUrl,
adminUrl,
baseWebSocket,
}
\ No newline at end of file
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
<script>
export default {
data() {
return {
formatData: [
{
label: 'test',
key: 'name',
type: 'input',
required: true,
validator: ['notEmpty', 'min2', 'max64', 'normName'],
placeholder: 'test',
},
],
}
},
}
</script>
<style>
#app {
font-family: PingFangSC-Regular, PingFang SC, Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
height: 100%;
width: 100%;
}
/* 自定义进度条颜色 */
#nprogress .bar {
background: #409EFF !important;
height: 5px !important;
}
</style>
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1598514256546" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="646" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><style type="text/css"></style></defs><path d="M621.714286 248.685714a373.028571 373.028571 0 0 1 15.798857 745.764572L621.714286 994.742857H146.285714a43.885714 43.885714 0 0 1-7.094857-87.186286L146.285714 906.971429h475.428572a285.257143 285.257143 0 0 0 14.628571-570.148572L621.714286 336.457143H146.285714a43.885714 43.885714 0 0 1-7.094857-87.186286L146.285714 248.685714h475.428572z" fill="#ABABAB" p-id="647"></path><path d="M323.584 54.637714a43.885714 43.885714 0 0 1 4.681143 56.612572l-4.681143 5.485714L147.748571 292.571429l175.835429 175.835428a43.885714 43.885714 0 0 1 4.681143 56.612572l-4.681143 5.485714a43.885714 43.885714 0 0 1-56.612571 4.608l-5.412572-4.608L54.637714 323.584a43.885714 43.885714 0 0 1-4.608-56.612571l4.608-5.412572L261.558857 54.637714a43.885714 43.885714 0 0 1 62.025143 0z" fill="#ABABAB" p-id="648"></path></svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="97px" height="22px" viewBox="0 0 97 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 50 (54983) - http://www.bohemiancoding.com/sketch -->
<title>Page 1</title>
<desc>Created with Sketch.</desc>
<defs>
<polygon id="path-1" points="0.4928 6.875 6.6198 6.875 6.6198 0.467775 0.4928 0.467775"></polygon>
</defs>
<g id="算法插件" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="算法插件_01" transform="translate(-42.000000, -14.000000)">
<g id="Page-1" transform="translate(42.000000, 14.000000)">
<path d="M33.44715,13.0042 L33.2299,12.6962 L31.9319,10.80145 L33.822525,9.777075 L35.230525,11.864325 L37.108775,10.66395 C33.1089,2.2462 23.3244,-1.794925 14.6564,1.615075 C11.630025,2.80445 9.1234,4.752825 7.260275,7.161825 C7.406025,7.09995 7.551775,7.03945 7.700275,6.9817 C16.126275,3.66795 25.60415,7.392825 29.802025,15.33345 L31.65415,14.15095 L33.0429,16.110325 L34.8139,15.0062 L33.443025,13.00695 L33.44715,13.0042 Z" id="Fill-1" fill="#FFFFFF"></path>
<path d="M25.8641625,15.7009875 C18.3814125,18.6434875 9.9375375,16.4077375 5.7767875,9.9452375 L4.0497875,10.8816125 L4.9201625,12.3996125 L3.1739125,13.4006125 L2.2815375,11.8427375 L0.0004125,13.0802375 C3.3856625,20.1312375 11.9422875,23.3831125 19.6422875,20.3553625 C22.3304125,19.2979875 24.5730375,17.6094875 26.2546625,15.5414875 C26.1254125,15.5964875 25.9961625,15.6487375 25.8641625,15.7009875" id="Fill-3" fill="#FFFFFF"></path>
<path d="M19.8180125,10.391975 C19.8565125,10.6601 19.8138875,10.94335 19.6763875,11.200475 C19.3326375,11.84535 18.5310125,12.088725 17.8875125,11.744975 C17.2426375,11.401225 16.9992625,10.5996 17.3430125,9.954725 C17.6867625,9.311225 18.4883875,9.066475 19.1332625,9.4116 C19.2157625,9.4556 19.2913875,9.506475 19.3601375,9.564225 C19.0920125,9.21635 18.7496375,8.9166 18.3371375,8.6966 C16.7847625,7.867475 14.8542625,8.4546 14.0265125,10.006975 C13.1973875,11.55935 13.7845125,13.48985 15.3368875,14.3176 C16.8892625,15.146725 18.8197625,14.5596 19.6475125,13.007225 C20.0957625,12.1671 20.1273875,11.21835 19.8180125,10.391975" id="Fill-5" fill="#FFFFFF"></path>
<polygon id="Fill-7" fill="#FFFFFF" points="3.6955875 10.76295 2.2710875 11.5852 1.4488375 10.1607 2.8733375 9.33845"></polygon>
<polygon id="Fill-9" fill="#FFFFFF" points="3.8270375 8.4643625 2.9429125 8.9744875 2.4327875 8.0903625 3.3169125 7.5802375"></polygon>
<polygon id="Fill-11" fill="#FFFFFF" points="2.0053 8.3348375 1.121175 8.8449625 0.61105 7.9608375 1.495175 7.4507125"></polygon>
<polygon id="Fill-13" fill="#FFFFFF" points="37.9262125 15.71625 36.2019625 16.770875 35.1473375 15.04525 36.8715875 13.992"></polygon>
<polygon id="Fill-15" fill="#FFFFFF" points="34.2216875 18.069425 32.4974375 19.12405 31.4428125 17.398425 33.1670625 16.345175"></polygon>
<polygon id="Fill-17" fill="#FFFFFF" points="36.399275 18.6186 35.293775 19.2951 34.617275 18.188225 35.722775 17.5131"></polygon>
<g id="Group-21" transform="translate(45.375000, 14.864437)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Clip-20"></g>
<path d="M5.9323,4.108775 C5.9323,4.2504 5.8168,4.367275 5.6738,4.367275 L3.98255,4.367275 L3.98255,2.711775 L5.6738,2.711775 C5.8168,2.711775 5.9323,2.827275 5.9323,2.9689 L5.9323,4.108775 Z M3.29505,4.367275 L1.4388,4.367275 C1.297175,4.367275 1.181675,4.2504 1.181675,4.108775 L1.181675,2.9689 C1.181675,2.827275 1.297175,2.711775 1.4388,2.711775 L3.29505,2.711775 L3.29505,4.367275 Z M5.6738,2.0229 L3.98255,2.0229 L3.98255,0.467775 L3.29505,0.467775 L3.29505,2.0229 L1.4388,2.0229 C0.917675,2.0229 0.4928,2.447775 0.4928,2.9689 L0.4928,4.108775 C0.4928,4.6299 0.917675,5.054775 1.4388,5.054775 L3.29505,5.054775 L3.29505,6.875275 L3.98255,6.875275 L3.98255,5.054775 L5.6738,5.054775 C6.1963,5.054775 6.6198,4.6299 6.6198,4.108775 L6.6198,2.9689 C6.6198,2.447775 6.1963,2.0229 5.6738,2.0229 Z" id="Fill-19" fill="#FFFFFF" mask="url(#mask-2)"></path>
</g>
<path d="M92.791875,15.7053875 L92.791875,16.3928875 L93.76675,16.3928875 L92.80975,18.8197625 C92.708,19.0755125 92.466,19.2405125 92.191,19.2405125 L92.104375,19.2405125 L92.104375,17.6400125 L92.8345,17.6400125 L92.8345,16.9525125 L92.104375,16.9525125 L92.104375,15.3190125 L91.4155,15.3190125 L91.4155,16.9525125 L90.69225,16.9525125 L90.69225,17.6400125 L91.4155,17.6400125 L91.4155,19.2405125 L90.690875,19.2405125 L90.690875,19.9280125 L91.4155,19.9280125 L91.4155,20.7640125 C91.4155,20.9070125 91.3,21.0225125 91.158375,21.0225125 L90.696375,21.0225125 L90.696375,21.7100125 L91.158375,21.7100125 C91.6795,21.7100125 92.104375,21.2865125 92.104375,20.7640125 L92.104375,19.9280125 L92.191,19.9280125 C92.74925,19.9280125 93.24425,19.5925125 93.449125,19.0727625 L94.5065,16.3928875 L96.877,16.3928875 L96.877,15.7053875 L92.791875,15.7053875 Z" id="Fill-22" fill="#FFFFFF"></path>
<path d="M96.152925,20.779 C96.152925,20.920625 96.037425,21.0375 95.894425,21.0375 L94.530425,21.0375 C94.3888,21.0375 94.2733,20.920625 94.2733,20.779 L94.2733,19.188125 C94.2733,19.0465 94.3888,18.929625 94.530425,18.929625 L95.894425,18.929625 C96.037425,18.929625 96.152925,19.0465 96.152925,19.188125 L96.152925,20.779 Z M95.894425,18.242125 L94.530425,18.242125 C94.0093,18.242125 93.5858,18.667 93.5858,19.188125 L93.5858,20.779 C93.5858,21.300125 94.0093,21.725 94.530425,21.725 L95.894425,21.725 C96.416925,21.725 96.840425,21.300125 96.840425,20.779 L96.840425,19.188125 C96.840425,18.667 96.416925,18.242125 95.894425,18.242125 Z" id="Fill-24" fill="#FFFFFF"></path>
<path d="M64.299125,16.966675 L62.8375,16.966675 L62.8375,16.389175 L63.460375,16.389175 C63.9815,16.389175 64.406375,15.965675 64.406375,15.443175 L64.406375,15.324925 L63.718875,15.324925 L63.718875,15.443175 C63.718875,15.586175 63.603375,15.701675 63.460375,15.701675 L60.7805,15.701675 L60.7805,16.389175 L62.148625,16.389175 L62.148625,16.966675 L60.787375,16.966675 L60.787375,17.654175 L62.148625,17.654175 L62.148625,21.710425 L62.8375,21.710425 L62.8375,17.654175 L64.299125,17.654175 L64.299125,16.966675 Z" id="Fill-26" fill="#FFFFFF"></path>
<path d="M66.5493125,19.226625 L66.5493125,15.318875 L65.8618125,15.318875 L65.8618125,19.226625 L64.5156875,19.226625 C64.2791875,19.226625 64.0798125,19.056125 64.0426875,18.822375 L63.9244375,18.066125 L63.2286875,18.066125 L63.3634375,18.929625 C63.4528125,19.50025 63.9381875,19.914125 64.5156875,19.914125 L65.8618125,19.914125 L65.8618125,21.718125 L66.5493125,21.718125 L66.5493125,19.914125 L66.9260625,19.914125 L66.9260625,19.226625 L66.5493125,19.226625 Z" id="Fill-28" fill="#FFFFFF"></path>
<polygon id="Fill-30" fill="#FFFFFF" points="65.5120125 16.9756125 65.3401375 16.0722375 64.5440125 16.0722375 64.7158875 16.9756125"></polygon>
<polygon id="Fill-32" fill="#FFFFFF" points="64.6036875 17.7012 64.7755625 18.604575 65.5716875 18.604575 65.3984375 17.7012"></polygon>
<polygon id="Fill-34" fill="#FFFFFF" points="60.7508 21.71785 61.442425 21.71785 61.8068 18.067225 61.11655 18.067225"></polygon>
<path d="M78.4381125,18.399975 L77.9376125,18.399975 C77.4962375,18.399975 77.1373625,18.75885 77.1373625,19.200225 L77.1373625,21.724725 L77.8248625,21.724725 L77.8248625,19.200225 C77.8248625,19.13835 77.8757375,19.087475 77.9376125,19.087475 L78.4381125,19.087475 L78.4381125,18.399975 Z" id="Fill-36" fill="#FFFFFF"></path>
<path d="M79.480775,16.27505 C79.480775,16.133425 79.596275,16.01655 79.739275,16.01655 L80.921775,16.01655 C81.0634,16.01655 81.1789,16.133425 81.1789,16.27505 L81.1789,19.10205 L81.867775,19.10205 L81.867775,16.27505 C81.867775,15.753925 81.4429,15.32905 80.921775,15.32905 L79.739275,15.32905 C79.216775,15.32905 78.793275,15.753925 78.793275,16.27505 L78.793275,19.0828 L79.480775,19.0828 L79.480775,16.27505 Z" id="Fill-38" fill="#FFFFFF"></path>
<path d="M81.4801625,21.0227875 C81.3385375,21.0227875 81.2216625,20.9072875 81.2216625,20.7642875 L81.2216625,19.7687875 L80.5341625,19.7687875 L80.5341625,20.7642875 C80.5341625,21.2867875 80.9590375,21.7102875 81.4801625,21.7102875 L81.8830375,21.7102875 L81.8830375,21.0227875 L81.4801625,21.0227875 Z" id="Fill-40" fill="#FFFFFF"></path>
<path d="M80.6738625,16.4291875 L79.9863625,16.4291875 L79.9863625,18.2813125 C79.9863625,18.7323125 79.8667375,19.1778125 79.6412375,19.5669375 L78.4037375,21.7105625 L79.1984875,21.7105625 L80.2366125,19.9120625 C80.5226125,19.4170625 80.6738625,18.8533125 80.6738625,18.2813125 L80.6738625,16.4291875 Z" id="Fill-42" fill="#FFFFFF"></path>
<path d="M78.0698875,16.0601375 C77.9145125,15.8016375 77.6436375,15.6476375 77.3425125,15.6476375 L77.2050125,15.6476375 L77.2050125,15.3038875 L76.5175125,15.3038875 L76.5175125,15.6476375 L75.7186375,15.6476375 L75.7186375,16.3365125 L77.3425125,16.3365125 C77.4208875,16.3365125 77.4621375,16.3846375 77.4800125,16.4135125 C77.4965125,16.4423875 77.5212625,16.5015125 77.4841375,16.5716375 L75.6911375,19.9211375 L76.4721375,19.9211375 L78.0905125,16.8961375 C78.2321375,16.6307625 78.2238875,16.3186375 78.0698875,16.0601375" id="Fill-44" fill="#FFFFFF"></path>
<path d="M54.192325,6.979225 L55.883575,6.979225 L55.883575,5.99885 C55.883575,5.6716 55.806575,5.42685 55.655325,5.263225 C55.5027,5.0996 55.29645,5.0171 55.03795,5.0171 C54.778075,5.0171 54.5732,5.0996 54.420575,5.263225 C54.26795,5.42685 54.192325,5.6716 54.192325,5.99885 L54.192325,6.979225 Z M54.192325,8.466975 L54.192325,9.498225 C54.192325,9.7691 54.26795,9.9781 54.420575,10.12385 C54.5732,10.270975 54.778075,10.34385 55.03795,10.34385 C55.3652,10.34385 55.581075,10.248975 55.688325,10.056475 C55.795575,9.86535 55.8602,9.674225 55.883575,9.481725 L57.607825,9.481725 C57.607825,9.84335 57.5487,10.180225 57.43045,10.496475 C57.3122,10.812725 57.140325,11.082225 56.914825,11.307725 C56.689325,11.544225 56.41845,11.731225 56.103575,11.865975 C55.787325,12.000725 55.432575,12.069475 55.03795,12.069475 C54.5072,12.069475 54.0507,11.956725 53.66845,11.731225 C53.284825,11.505725 52.99195,11.205975 52.78845,10.834725 C52.6647,10.609225 52.57945,10.350725 52.53545,10.056475 C52.490075,9.7636 52.468075,9.44185 52.468075,9.0926 L52.468075,6.26835 C52.468075,5.9191 52.490075,5.598725 52.53545,5.304475 C52.57945,5.0116 52.6647,4.7531 52.78845,4.5276 C52.99195,4.154975 53.284825,3.8566 53.66845,3.6311 C54.0507,3.4056 54.5072,3.29285 55.03795,3.29285 C55.432575,3.29285 55.790075,3.360225 56.111825,3.49635 C56.4322,3.6311 56.703075,3.819475 56.923075,4.06285 C57.143075,4.30485 57.3122,4.589475 57.43045,4.916725 C57.5487,5.243975 57.607825,5.59185 57.607825,5.964475 L57.607825,8.466975 L54.192325,8.466975 Z" id="Fill-46" fill="#FFFFFF"></path>
<path d="M81.5318625,6.979225 L83.2231125,6.979225 L83.2231125,5.99885 C83.2231125,5.6716 83.1461125,5.42685 82.9948625,5.263225 C82.8422375,5.0996 82.6359875,5.0171 82.3774875,5.0171 C82.1176125,5.0171 81.9127375,5.0996 81.7601125,5.263225 C81.6074875,5.42685 81.5318625,5.6716 81.5318625,5.99885 L81.5318625,6.979225 Z M81.5318625,8.466975 L81.5318625,9.498225 C81.5318625,9.7691 81.6074875,9.9781 81.7601125,10.12385 C81.9127375,10.270975 82.1176125,10.34385 82.3774875,10.34385 C82.7047375,10.34385 82.9206125,10.248975 83.0278625,10.056475 C83.1351125,9.86535 83.1997375,9.674225 83.2231125,9.481725 L84.9473625,9.481725 C84.9473625,9.84335 84.8882375,10.180225 84.7699875,10.496475 C84.6517375,10.812725 84.4798625,11.082225 84.2543625,11.307725 C84.0288625,11.544225 83.7579875,11.731225 83.4431125,11.865975 C83.1268625,12.000725 82.7721125,12.069475 82.3774875,12.069475 C81.8467375,12.069475 81.3902375,11.956725 81.0079875,11.731225 C80.6243625,11.505725 80.3314875,11.205975 80.1279875,10.834725 C80.0042375,10.609225 79.9189875,10.350725 79.8749875,10.056475 C79.8296125,9.7636 79.8076125,9.44185 79.8076125,9.0926 L79.8076125,6.26835 C79.8076125,5.9191 79.8296125,5.598725 79.8749875,5.304475 C79.9189875,5.0116 80.0042375,4.7531 80.1279875,4.5276 C80.3314875,4.154975 80.6243625,3.8566 81.0079875,3.6311 C81.3902375,3.4056 81.8467375,3.29285 82.3774875,3.29285 C82.7721125,3.29285 83.1296125,3.360225 83.4513625,3.49635 C83.7717375,3.6311 84.0426125,3.819475 84.2626125,4.06285 C84.4826125,4.30485 84.6517375,4.589475 84.7699875,4.916725 C84.8882375,5.243975 84.9473625,5.59185 84.9473625,5.964475 L84.9473625,8.466975 L81.5318625,8.466975 Z" id="Fill-48" fill="#FFFFFF"></path>
<path d="M60.118025,6.979225 L61.809275,6.979225 L61.809275,5.99885 C61.809275,5.6716 61.732275,5.42685 61.581025,5.263225 C61.4284,5.0996 61.22215,5.0171 60.96365,5.0171 C60.703775,5.0171 60.4989,5.0996 60.346275,5.263225 C60.19365,5.42685 60.118025,5.6716 60.118025,5.99885 L60.118025,6.979225 Z M60.118025,8.466975 L60.118025,9.498225 C60.118025,9.7691 60.19365,9.9781 60.346275,10.12385 C60.4989,10.270975 60.703775,10.34385 60.96365,10.34385 C61.2909,10.34385 61.506775,10.248975 61.614025,10.056475 C61.721275,9.86535 61.7859,9.674225 61.809275,9.481725 L63.533525,9.481725 C63.533525,9.84335 63.4744,10.180225 63.35615,10.496475 C63.2379,10.812725 63.066025,11.082225 62.840525,11.307725 C62.615025,11.544225 62.34415,11.731225 62.029275,11.865975 C61.713025,12.000725 61.358275,12.069475 60.96365,12.069475 C60.4329,12.069475 59.9764,11.956725 59.59415,11.731225 C59.210525,11.505725 58.91765,11.205975 58.71415,10.834725 C58.5904,10.609225 58.50515,10.350725 58.46115,10.056475 C58.415775,9.7636 58.393775,9.44185 58.393775,9.0926 L58.393775,6.26835 C58.393775,5.9191 58.415775,5.598725 58.46115,5.304475 C58.50515,5.0116 58.5904,4.7531 58.71415,4.5276 C58.91765,4.154975 59.210525,3.8566 59.59415,3.6311 C59.9764,3.4056 60.4329,3.29285 60.96365,3.29285 C61.358275,3.29285 61.715775,3.360225 62.037525,3.49635 C62.3579,3.6311 62.628775,3.819475 62.848775,4.06285 C63.068775,4.30485 63.2379,4.589475 63.35615,4.916725 C63.4744,5.243975 63.533525,5.59185 63.533525,5.964475 L63.533525,8.466975 L60.118025,8.466975 Z" id="Fill-50" fill="#FFFFFF"></path>
<path d="M67.925825,4.979425 L67.925825,3.519175 L67.923075,3.519175 L67.923075,3.4958 L66.85745,3.4958 L66.85745,0.89155 L65.1332,0.89155 L65.1332,3.4958 L64.2697,3.4958 L64.2697,3.519175 L64.22845,3.519175 L64.22845,4.979425 L65.1332,4.979425 L65.1332,10.0573 C65.1332,10.2828 65.16895,10.51655 65.2432,10.75855 C65.316075,11.00055 65.431575,11.2178 65.5897,11.408925 C65.74645,11.601425 65.9582,11.75955 66.223575,11.8833 C66.487575,12.00705 66.817575,12.068925 67.2122,12.068925 L67.923075,12.068925 L67.923075,10.44505 C67.730575,10.44505 67.56695,10.43955 67.4322,10.42855 C67.29745,10.41755 67.18745,10.383175 67.1022,10.3268 C67.018325,10.270425 66.95645,10.18655 66.916575,10.0738 C66.8767,9.96105 66.85745,9.802925 66.85745,9.6008 L66.85745,4.979425 L67.925825,4.979425 Z" id="Fill-52" fill="#FFFFFF"></path>
<path d="M88.4060375,12.068925 L88.0155375,12.068925 C86.7725375,12.068925 85.7619125,11.056925 85.7619125,9.813925 L85.7619125,5.72605 C85.7619125,4.48305 86.7725375,3.472425 88.0155375,3.472425 L88.4679125,3.472425 C89.6531625,3.472425 90.6184125,4.4363 90.6184125,5.62155 L90.6184125,6.0753 L88.9642875,6.0753 L88.9642875,5.62155 C88.9642875,5.347925 88.7415375,5.125175 88.4679125,5.125175 L88.0155375,5.125175 C87.6841625,5.125175 87.4146625,5.394675 87.4146625,5.72605 L87.4146625,9.813925 C87.4146625,10.1453 87.6841625,10.416175 88.0155375,10.416175 L88.4060375,10.416175 C88.6796625,10.416175 88.9024125,10.193425 88.9024125,9.9198 L88.9024125,9.5678 L90.5551625,9.5678 L90.5551625,9.9198 C90.5551625,11.10505 89.5912875,12.068925 88.4060375,12.068925" id="Fill-54" fill="#FFFFFF"></path>
<path d="M70.3769,9.9196625 L70.3769,9.0932875 C70.3769,8.8196625 70.59965,8.5969125 70.873275,8.5969125 L72.251025,8.5969125 L72.251025,10.4160375 L70.873275,10.4160375 C70.59965,10.4160375 70.3769,10.1932875 70.3769,9.9196625 Z M73.9739,6.0944125 C73.9739,5.6434125 73.90515,5.2487875 73.7704,4.9105375 C73.63565,4.5722875 73.4514,4.2904125 73.2204,4.0649125 C72.9894,3.8394125 72.715775,3.6702875 72.4009,3.5575375 C72.08465,3.4447875 71.7464,3.3884125 71.38615,3.3884125 C70.991525,3.3884125 70.636775,3.4530375 70.320525,3.5822875 C70.00565,3.7129125 69.734775,3.8902875 69.509275,4.1157875 C69.047275,4.5777875 68.7874,5.1979125 68.731025,5.9761625 L70.405775,5.9761625 C70.46215,5.6942875 70.58315,5.4797875 70.768775,5.3326625 C70.955775,5.1869125 71.16065,5.1126625 71.38615,5.1126625 C71.7134,5.1126625 71.9389,5.2089125 72.06265,5.4014125 C72.1864,5.5925375 72.248275,5.8345375 72.248275,6.1274125 L72.248275,6.6609125 L72.251025,6.6609125 L72.251025,6.9441625 L70.873275,6.9441625 C69.688025,6.9441625 68.72415,7.9080375 68.72415,9.0932875 L68.72415,9.9196625 C68.72415,11.1049125 69.688025,12.0687875 70.873275,12.0687875 L72.498525,12.0687875 L72.498525,12.0632875 L73.9739,12.0632875 L73.9739,6.0944125 Z" id="Fill-56" fill="#FFFFFF"></path>
<path d="M49.520075,12.068925 L48.00895,12.068925 C46.8237,12.068925 45.85845,11.081675 45.85845,9.86755 L45.85845,9.104425 L47.512575,9.104425 L47.512575,9.86755 C47.512575,10.146675 47.735325,10.374925 48.00895,10.374925 L49.520075,10.374925 C49.7937,10.374925 50.01645,10.146675 50.01645,9.86755 L50.01645,8.37705 C50.01645,7.957675 49.778575,7.569925 49.41145,7.38705 L47.628075,6.502925 C46.693075,6.03955 46.08945,5.0523 46.08945,3.989425 L46.08945,2.270675 C46.08945,1.049675 47.058825,0.05555 48.25095,0.05555 L49.54895,0.05555 C50.741075,0.05555 51.71045,1.049675 51.71045,2.270675 L51.71045,3.64155 L50.0577,3.64155 L50.0577,2.270675 C50.0577,1.9833 49.82945,1.74955 49.54895,1.74955 L48.25095,1.74955 C47.97045,1.74955 47.7422,1.9833 47.7422,2.270675 L47.7422,3.989425 C47.7422,4.407425 47.980075,4.79655 48.348575,4.97805 L50.13195,5.86355 C51.065575,6.326925 51.6692,7.3128 51.6692,8.37705 L51.6692,9.86755 C51.6692,11.081675 50.705325,12.068925 49.520075,12.068925" id="Fill-58" fill="#FFFFFF"></path>
<path d="M94.4557625,3.526875 L93.1880125,3.526875 L93.1880125,0 L91.4527625,0 L91.4527625,12.068375 L93.1880125,12.068375 L93.1880125,5.179625 L94.4557625,5.179625 C94.7293875,5.179625 94.9521375,5.402375 94.9521375,5.676 L94.9521375,12.040875 L96.6048875,12.040875 L96.6048875,5.676 C96.6048875,4.49075 95.6410125,3.526875 94.4557625,3.526875" id="Fill-60" fill="#FFFFFF"></path>
<polygon id="Fill-62" fill="#FFFFFF" points="79.789875 0.011275 73.953 0.011275 73.953 1.7314 76.011375 1.7314 76.011375 12.14565 77.7315 12.14565 77.7315 1.7314 79.789875 1.7314"></polygon>
</g>
</g>
</g>
</svg>
\ No newline at end of file
This diff could not be displayed because it is too large.
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" viewBox="0 0 912 467" preserveAspectRatio="none meet" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>frame2</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="frame2" fill-rule="nonzero">
<rect id="矩形备份-2" stroke="#A1A3A5" stroke-width="2" fill="#333333" opacity="0.5" x="1" y="1" width="910" height="465"></rect>
<g id="角备份-3" fill="#8E8E8E">
<g id="编组">
<g id="编组-5">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
<g id="编组-5备份" transform="translate(5.500000, 461.500000) rotate(-90.000000) translate(-5.500000, -461.500000) translate(0.000000, 456.000000)">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
</g>
<g id="编组备份" transform="translate(906.500000, 233.500000) rotate(-180.000000) translate(-906.500000, -233.500000) translate(901.000000, 0.000000)">
<g id="编组-5">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
<g id="编组-5备份" transform="translate(5.500000, 461.500000) rotate(-90.000000) translate(-5.500000, -461.500000) translate(0.000000, 456.000000)">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="100%" viewBox="0 0 912 478" preserveAspectRatio="none meet" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>frame1</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="frame1" fill-rule="nonzero">
<g id="编组-2" transform="translate(0.000000, 11.000000)">
<rect id="矩形" stroke="#A1A3A5" stroke-width="2" fill="#333333" opacity="0.5" x="1" y="1" width="910" height="465"></rect>
<g id="角备份" fill="#8E8E8E">
<g id="编组">
<g id="编组-5">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
<g id="编组-5备份" transform="translate(5.500000, 461.500000) rotate(-90.000000) translate(-5.500000, -461.500000) translate(0.000000, 456.000000)">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
</g>
<g id="编组备份" transform="translate(906.500000, 233.500000) rotate(-180.000000) translate(-906.500000, -233.500000) translate(901.000000, 0.000000)">
<g id="编组-5">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
<g id="编组-5备份" transform="translate(5.500000, 461.500000) rotate(-90.000000) translate(-5.500000, -461.500000) translate(0.000000, 456.000000)">
<rect id="矩形" x="0" y="0" width="11" height="3"></rect>
<rect id="矩形备份-4" transform="translate(1.500000, 5.500000) rotate(90.000000) translate(-1.500000, -5.500000) " x="-4" y="4" width="11" height="3"></rect>
</g>
</g>
</g>
</g>
<g id="_编组_" transform="translate(230.000000, 0.000000)" fill="#8E8E8E">
<polygon id="_路径_" points="249.28 29.33 202.93 29.33 137.48 29.33 109.04 0.89 0.68 0.89 0.68 1.94 108.61 1.94 137.05 30.38 202.93 30.38 249.28 30.38 311.29 30.38 339.74 1.94 451.53 1.94 451.53 0.89 339.3 0.89 310.86 29.33"></polygon>
<polygon id="_路径_2" points="309.54 20.55 230.23 20.55 221.98 20.55 142.66 20.55 122.65 0.54 121.9 1.28 142.23 21.6 221.98 21.6 230.23 21.6 309.98 21.6 329.82 1.77 329.07 1.02"></polygon>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="6px" height="12px" viewBox="0 0 6 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>short line3</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-1038.000000, -200.000000)" fill="#66B3FF" fill-rule="nonzero">
<g id="short-line3" transform="translate(1038.000000, 200.000000)">
<rect id="_矩形_23" x="0" y="0" width="6" height="2"></rect>
<rect id="_矩形_24" x="0" y="4" width="6" height="2"></rect>
<rect id="_矩形_25" x="0" y="7" width="6" height="2"></rect>
<rect id="_矩形_26" x="0" y="10" width="6" height="2"></rect>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="16px" viewBox="0 0 12 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>one</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-100.000000, -697.000000)">
<g id="编组-22" transform="translate(73.000000, 659.000000)">
<g id="one" transform="translate(25.000000, 38.000000)">
<rect id="矩形" fill="#000000" fill-rule="nonzero" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M4.971875,6.425 L7.996875,9.45 L13.6375,3.809375 C13.7578125,3.6890625 13.8234375,3.525 13.81875,3.3546875 L13.7640625,1.1984375 C13.7546875,0.8609375 13.4796875,0.5921875 13.1421875,0.5921875 L11.0578125,0.5953125 C10.89375,0.5953125 10.7359375,0.6609375 10.61875,0.778125 L4.971875,6.425 Z" id="路径" fill="#D32F2F" fill-rule="nonzero"></path>
<path d="M11.028125,6.4265625 L8.003125,9.4515625 L2.3625,3.8109375 C2.2421875,3.690625 2.1765625,3.5265625 2.18125,3.35625 L2.2359375,1.2 C2.2453125,0.8625 2.5203125,0.59375 2.8578125,0.59375 L4.9421875,0.596875 C5.10625,0.596875 5.2640625,0.6625 5.38125,0.7796875 L11.028125,6.4265625 L11.028125,6.4265625 Z" id="路径" fill="#F44336" fill-rule="nonzero"></path>
<path d="M2.8609375,10.2640625 C2.8609375,13.1048772 5.16387282,15.4078125 8.0046875,15.4078125 C10.8455022,15.4078125 13.1484375,13.1048772 13.1484375,10.2640625 C13.1484375,7.42324782 10.8455022,5.1203125 8.0046875,5.1203125 C5.16387282,5.1203125 2.8609375,7.42324782 2.8609375,10.2640625 Z" id="路径" fill="#FFDF34" fill-rule="nonzero"></path>
<path d="M10.0203125,8.4765625 L11.50625,10.465625 C11.509375,10.3984375 11.5125,10.33125 11.5125,10.2640625 C11.5125,8.3265625 9.9421875,6.75625 8.0046875,6.75625 C6.0671875,6.75625 4.496875,8.3265625 4.496875,10.2640625 C4.496875,11.9203125 5.6453125,13.3078125 7.1875,13.6765625 L5.709375,11.7 L10.0203125,8.4765625 Z" id="路径" fill="#E9B82E" fill-rule="nonzero"></path>
<path d="M11.50625,10.465625 C11.4015625,12.309375 9.8734375,13.7703125 8.0046875,13.7703125 C7.7234375,13.7703125 7.45,13.7375 7.1890625,13.675 L8.46875,15.3875 C10.4328125,15.2125 12.0796875,13.9328125 12.7828125,12.1734375 L11.50625,10.465625 Z" id="路径" fill="#FFDF34" fill-rule="nonzero"></path>
<path d="M11.50625,10.465625 L10.0203125,8.4765625 L5.7109375,11.6984375 L7.1890625,13.675 C7.4515625,13.7375 7.7234375,13.7703138 8.0046875,13.7703138 C9.875,13.771875 11.4015625,12.309375 11.50625,10.465625 L11.50625,10.465625 Z" id="路径" fill="#E9B82E" fill-rule="nonzero"></path>
<path d="M5.315625,10.2640625 C5.315625,11.224772 5.8281574,12.1125042 6.66015624,12.592859 C7.49215508,13.0732137 8.51721992,13.0732137 9.34921876,12.592859 C10.1812176,12.1125042 10.69375,11.224772 10.69375,10.2640625 C10.69375,8.77893429 9.48981571,7.575 8.0046875,7.575 C6.51955929,7.575 5.315625,8.77893429 5.315625,10.2640625 L5.315625,10.2640625 Z" id="路径" fill="#FFDF34" fill-rule="nonzero"></path>
<text id="1" font-family="Digital-7Mono, Digital-7 Mono" font-size="6" font-weight="normal" fill="#FFFFFF">
<tspan x="6" y="12.3">1</tspan>
</text>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="34px" height="35px" viewBox="0 0 34 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>编组 20</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="0%" y1="50%" x2="100%" y2="50%" id="linearGradient-1">
<stop stop-color="#FFD42E" offset="0%"></stop>
<stop stop-color="#FF4200" offset="100%"></stop>
</linearGradient>
<linearGradient x1="0%" y1="50%" x2="100%" y2="50%" id="linearGradient-2">
<stop stop-color="#FFD42E" offset="0%"></stop>
<stop stop-color="#FF4200" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-298.000000, -213.000000)" fill-rule="nonzero">
<g id="编组-20" transform="translate(298.182506, 213.288180)">
<circle id="椭圆形" fill="url(#linearGradient-1)" cx="27.8770686" cy="28.1917258" r="2.60047281"></circle>
<path d="M33.6501182,30.3397163 L33.7411348,33.9257683 L30.1550827,33.8347518 L25.7940898,27.9264775 C25.369561,27.353323 24.9018475,26.8134529 24.3950355,26.3115839 L-1.59872116e-13,-1.0658141e-14 L-1.59872116e-13,-1.0658141e-14 L26.0879433,24.6186761 C26.5926546,25.1222455 27.1351344,25.586483 27.7106383,26.0073286 L33.6501182,30.3397163 Z" id="路径" fill="url(#linearGradient-2)"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="110px" height="88px" viewBox="0 0 110 88" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>编组 16</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="-8.11677788e-15%" y1="50.0158178%" x2="100%" y2="50.0158178%" id="linearGradient-1">
<stop stop-color="#FFD42E" offset="0%"></stop>
<stop stop-color="#FF4200" offset="100%"></stop>
</linearGradient>
<linearGradient x1="5.55150901e-15%" y1="50.0078924%" x2="99.9881738%" y2="50.0078924%" id="linearGradient-2">
<stop stop-color="#FFD42E" offset="0%"></stop>
<stop stop-color="#FF4200" offset="100%"></stop>
</linearGradient>
<linearGradient x1="-1.32998172e-13%" y1="50%" x2="99.9766027%" y2="50%" id="linearGradient-3">
<stop stop-color="#FFD42E" offset="0%"></stop>
<stop stop-color="#FF4200" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-269.000000, -187.000000)" fill-rule="nonzero">
<g id="编组-16" transform="translate(269.000000, 187.247665)">
<path d="M8.45673759,84.3613183 C7.93664303,83.5447698 7.43995272,82.7048171 6.96666667,81.8622639 L17.1761229,76.1412237 C17.5479905,76.8043443 17.9406619,77.4674648 18.3489362,78.1097816 L8.45673759,84.3613183 Z" id="路径" fill="url(#linearGradient-1)"></path>
<path d="M104.749645,78.4426421 L94.165721,73.4523348 C94.8231953,72.0558716 95.405663,70.6253103 95.9106383,69.1667556 L106.970449,72.9894506 C106.329108,74.8459168 105.587756,76.6663098 104.749645,78.4426421 Z M3.80969267,75.2180558 C3.08839973,73.3918061 2.46598537,71.5280354 1.94515366,69.6348407 L13.2286052,66.5298762 C13.6370955,68.0175597 14.1258328,69.4820356 14.6926714,70.9168738 L3.80969267,75.2180558 Z M108.9,65.8927603 L97.4267139,63.5887414 C97.7315755,62.074501 97.9546724,60.544942 98.0950355,59.0067083 L109.739953,60.0833041 C109.564146,62.033427 109.283758,63.9727037 108.9,65.8927603 L108.9,65.8927603 Z M0.475886525,62.4237296 C0.213167432,60.4832421 0.0543121834,58.5301038 1.27897692e-13,56.5726658 L11.7021277,56.2450062 C11.7441994,57.7898934 11.8674585,59.3315006 12.0713948,60.8634459 L0.475886525,62.4237296 Z M98.2536643,53.2050535 C98.1887072,51.6608368 98.0437531,50.1210249 97.8193853,48.5918147 L109.39409,46.8755027 C109.680881,48.8147741 109.864905,50.7678565 109.94539,52.7265665 L98.2536643,53.2050535 Z M11.9179669,50.4615547 L0.278250591,49.2393324 C0.481639194,47.2911424 0.789808133,45.3553207 1.20141844,43.4402781 L12.6434988,45.8951244 C12.3196045,47.4030928 12.0774077,48.9274572 11.9179669,50.4615547 L11.9179669,50.4615547 Z M96.5763593,42.9591906 C96.1456399,41.4771222 95.636973,40.0188278 95.0524823,38.5903963 L105.878251,34.1487887 C106.622589,35.9644666 107.269296,37.8186508 107.815603,39.7033986 L96.5763593,42.9591906 Z M14.2323877,40.3197107 L3.22458629,36.3539897 C3.89163361,34.5081862 4.65638606,32.6991691 5.51560284,30.9346043 L16.0345154,36.0627367 C15.359225,37.4489865 14.7576767,38.86996 14.2323877,40.3197107 L14.2323877,40.3197107 Z M92.5066194,33.3920511 C91.733226,32.0560846 90.8885878,30.762651 89.9763593,29.5173466 L99.429078,22.6182923 C100.584203,24.2031094 101.6545,25.8480497 102.635461,27.5461882 L92.5066194,33.3920511 Z M18.9132388,31.0516256 L9.17446809,24.5504436 C10.2615184,22.9198315 11.4351467,21.348628 12.6903073,19.8435878 L21.6827423,27.330349 C20.6939467,28.5178478 19.769455,29.7574479 18.9132388,31.0438242 L18.9132388,31.0516256 Z M86.2654846,25.0887414 C85.1961923,23.9714878 84.0676972,22.9124385 82.88487,21.9161646 L90.4262411,12.9731386 C91.9240478,14.2374206 93.3537171,15.5802854 94.7092199,16.99607 L86.2654846,25.0887414 Z M25.6744681,23.1435878 L17.7534279,14.5230204 C19.1964286,13.1966932 20.7085471,11.9475895 22.2834515,10.78094 L29.2475177,20.1868502 C28.0049964,21.1057035 26.8122909,22.0900762 25.6744681,23.1357863 L25.6744681,23.1435878 Z M78.2248227,18.4757391 C76.9224768,17.6464421 75.5770042,16.886901 74.1940898,16.2003253 L79.3950355,5.71521897 C81.1515777,6.58917649 82.8607353,7.55529754 84.5153664,8.60954521 L78.2248227,18.4757391 Z M34.1156028,17.0610819 L28.4647754,6.81261849 C30.1842726,5.86788837 31.9524553,5.01461222 33.7619385,4.25635372 L38.2789598,15.0509164 C36.8562636,15.6461219 35.4664853,16.3171391 34.1156028,17.0610819 L34.1156028,17.0610819 Z M68.8501182,13.982122 C67.3885409,13.4884321 65.9015349,13.073494 64.3955083,12.739096 L66.9283688,1.31261849 C68.8449907,1.73776876 70.7373935,2.26555816 72.5973995,2.89370596 L68.8501182,13.982122 Z M43.7477541,13.1837769 L40.7208038,1.87952157 C42.617186,1.37343377 44.5390224,0.968059965 46.4782506,0.665100763 L48.2751773,12.2346043 C46.7501226,12.4696632 45.2388022,12.7865109 43.7477541,13.1837769 L43.7477541,13.1837769 Z M58.6770686,11.8835405 C57.1364624,11.7453084 55.5896089,11.6888856 54.043026,11.7145097 L53.7829787,0.0123820865 C55.741284,-0.0288169253 57.700402,0.0328123958 59.6522459,0.197015656 L58.6770686,11.8835405 Z" id="形状" fill="url(#linearGradient-2)"></path>
<path d="M99.4966903,87.3154554 L90.0309693,80.4372048 C90.4782506,79.8208927 90.91513,79.1863774 91.3312057,78.546661 L101.14539,84.9178194 C100.617494,85.729167 100.063593,86.5353135 99.4966903,87.3154554 Z" id="路径" fill="url(#linearGradient-3)"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="105px" height="20px" viewBox="0 0 105 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>short line1</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="730.856649%" y1="-1290.13499%" x2="-1077.71405%" y2="2269.73001%" id="linearGradient-1">
<stop stop-color="#27AAE1" offset="0%"></stop>
<stop stop-color="#44BBE9" offset="17%"></stop>
<stop stop-color="#69D0F2" offset="41%"></stop>
<stop stop-color="#83DFF9" offset="64%"></stop>
<stop stop-color="#93E9FE" offset="84%"></stop>
<stop stop-color="#99ECFF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="710.15599%" y1="-1249.37695%" x2="-1098.41471%" y2="2310.48806%" id="linearGradient-2">
<stop stop-color="#27AAE1" offset="0%"></stop>
<stop stop-color="#44BBE9" offset="17%"></stop>
<stop stop-color="#69D0F2" offset="41%"></stop>
<stop stop-color="#83DFF9" offset="64%"></stop>
<stop stop-color="#93E9FE" offset="84%"></stop>
<stop stop-color="#99ECFF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="689.45533%" y1="-1208.6189%" x2="-1119.11537%" y2="2351.24611%" id="linearGradient-3">
<stop stop-color="#27AAE1" offset="0%"></stop>
<stop stop-color="#44BBE9" offset="17%"></stop>
<stop stop-color="#69D0F2" offset="41%"></stop>
<stop stop-color="#83DFF9" offset="64%"></stop>
<stop stop-color="#93E9FE" offset="84%"></stop>
<stop stop-color="#99ECFF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="668.733697%" y1="-1167.91277%" x2="-1139.81603%" y2="2392.00415%" id="linearGradient-4">
<stop stop-color="#27AAE1" offset="0%"></stop>
<stop stop-color="#44BBE9" offset="17%"></stop>
<stop stop-color="#69D0F2" offset="41%"></stop>
<stop stop-color="#83DFF9" offset="64%"></stop>
<stop stop-color="#93E9FE" offset="84%"></stop>
<stop stop-color="#99ECFF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="648.033038%" y1="-1127.15472%" x2="-1160.51669%" y2="2432.7622%" id="linearGradient-5">
<stop stop-color="#27AAE1" offset="0%"></stop>
<stop stop-color="#44BBE9" offset="17%"></stop>
<stop stop-color="#69D0F2" offset="41%"></stop>
<stop stop-color="#83DFF9" offset="64%"></stop>
<stop stop-color="#93E9FE" offset="84%"></stop>
<stop stop-color="#99ECFF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="627.353351%" y1="-1086.39668%" x2="-1181.21735%" y2="2473.52025%" id="linearGradient-6">
<stop stop-color="#27AAE1" offset="0%"></stop>
<stop stop-color="#44BBE9" offset="17%"></stop>
<stop stop-color="#69D0F2" offset="41%"></stop>
<stop stop-color="#83DFF9" offset="64%"></stop>
<stop stop-color="#93E9FE" offset="84%"></stop>
<stop stop-color="#99ECFF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="606.631718%" y1="-1045.63863%" x2="-1201.93898%" y2="2514.22638%" id="linearGradient-7">
<stop stop-color="#27AAE1" offset="0%"></stop>
<stop stop-color="#44BBE9" offset="17%"></stop>
<stop stop-color="#69D0F2" offset="41%"></stop>
<stop stop-color="#83DFF9" offset="64%"></stop>
<stop stop-color="#93E9FE" offset="84%"></stop>
<stop stop-color="#99ECFF" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-39.000000, -65.000000)" fill-rule="nonzero">
<g id="short-line1" transform="translate(39.000000, 65.000000)">
<g id="_编组_12" transform="translate(96.000000, 0.000000)" fill="url(#linearGradient-1)">
<rect id="_矩形_8" transform="translate(4.560000, 9.630000) rotate(180.000000) translate(-4.560000, -9.630000) " x="0.67" y="1.24344979e-14" width="7.78" height="19.26"></rect>
</g>
<g id="_编组_13" transform="translate(80.000000, 0.000000)" fill="url(#linearGradient-2)">
<rect id="_矩形_9" transform="translate(4.460000, 9.630000) rotate(180.000000) translate(-4.460000, -9.630000) " x="0.57" y="1.0658141e-14" width="7.78" height="19.26"></rect>
</g>
<g id="_编组_14" transform="translate(64.000000, 0.000000)" fill="url(#linearGradient-3)">
<rect id="_矩形_10" transform="translate(4.340000, 9.630000) rotate(180.000000) translate(-4.340000, -9.630000) " x="0.45" y="8.8817842e-15" width="7.78" height="19.26"></rect>
</g>
<g id="_编组_15" transform="translate(48.000000, 0.000000)" fill="url(#linearGradient-4)">
<rect id="_矩形_11" transform="translate(4.230000, 9.630000) rotate(180.000000) translate(-4.230000, -9.630000) " x="0.34" y="7.10542736e-15" width="7.78" height="19.26"></rect>
</g>
<g id="_编组_16" opacity="0.35" transform="translate(32.000000, 0.000000)" fill="url(#linearGradient-5)">
<rect id="_矩形_12" transform="translate(4.110000, 9.630000) rotate(180.000000) translate(-4.110000, -9.630000) " x="0.22" y="3.55271368e-15" width="7.78" height="19.26"></rect>
</g>
<g id="_编组_17" opacity="0.35" transform="translate(16.000000, 0.000000)" fill="url(#linearGradient-6)">
<rect id="_矩形_13" transform="translate(4.000000, 9.630000) rotate(180.000000) translate(-4.000000, -9.630000) " x="0.11" y="1.77635684e-15" width="7.78" height="19.26"></rect>
</g>
<g id="_编组_18" opacity="0.35" fill="url(#linearGradient-7)">
<rect id="_矩形_14" transform="translate(3.890000, 9.630000) rotate(180.000000) translate(-3.890000, -9.630000) " x="-1.33226763e-15" y="0" width="7.78" height="19.26"></rect>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="16px" viewBox="0 0 12 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>two</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-100.000000, -723.000000)">
<g id="编组-22" transform="translate(73.000000, 659.000000)">
<g id="two" transform="translate(25.000000, 64.000000)">
<g id="奖牌" fill-rule="nonzero">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M4.971875,6.425 L7.996875,9.45 L13.6375,3.809375 C13.7578125,3.6890625 13.8234375,3.525 13.81875,3.3546875 L13.7640625,1.1984375 C13.7546875,0.8609375 13.4796875,0.5921875 13.1421875,0.5921875 L11.0578125,0.5953125 C10.89375,0.5953125 10.7359375,0.6609375 10.61875,0.778125 L4.971875,6.425 Z" id="路径" fill="#D32F2F"></path>
<path d="M11.028125,6.4265625 L8.003125,9.4515625 L2.3625,3.8109375 C2.2421875,3.690625 2.1765625,3.5265625 2.18125,3.35625 L2.2359375,1.2 C2.2453125,0.8625 2.5203125,0.59375 2.8578125,0.59375 L4.9421875,0.596875 C5.10625,0.596875 5.2640625,0.6625 5.38125,0.7796875 L11.028125,6.4265625 L11.028125,6.4265625 Z" id="路径" fill="#F44336"></path>
<path d="M2.8609375,10.2640625 C2.8609375,13.1048772 5.16387282,15.4078125 8.0046875,15.4078125 C10.8455022,15.4078125 13.1484375,13.1048772 13.1484375,10.2640625 C13.1484375,7.42324782 10.8455022,5.1203125 8.0046875,5.1203125 C5.16387282,5.1203125 2.8609375,7.42324782 2.8609375,10.2640625 Z" id="路径" fill="#CDCDCD"></path>
<path d="M10.0203125,8.4765625 L11.50625,10.465625 C11.509375,10.3984375 11.5125,10.33125 11.5125,10.2640625 C11.5125,8.3265625 9.9421875,6.75625 8.0046875,6.75625 C6.0671875,6.75625 4.496875,8.3265625 4.496875,10.2640625 C4.496875,11.9203125 5.6453125,13.3078125 7.1875,13.6765625 L5.709375,11.7 L10.0203125,8.4765625 Z" id="路径" fill="#8A8A8A"></path>
<path d="M11.50625,10.465625 C11.4015625,12.309375 9.8734375,13.7703125 8.0046875,13.7703125 C7.7234375,13.7703125 7.45,13.7375 7.1890625,13.675 L8.46875,15.3875 C10.4328125,15.2125 12.0796875,13.9328125 12.7828125,12.1734375 L11.50625,10.465625 Z" id="路径" fill="#CDCDCD"></path>
<path d="M11.50625,10.465625 L10.0203125,8.4765625 L5.7109375,11.6984375 L7.1890625,13.675 C7.4515625,13.7375 7.7234375,13.7703138 8.0046875,13.7703138 C9.875,13.771875 11.4015625,12.309375 11.50625,10.465625 L11.50625,10.465625 Z" id="路径" fill="#8A8A8A"></path>
<path d="M5.315625,10.2640625 C5.315625,11.224772 5.8281574,12.1125042 6.66015624,12.592859 C7.49215508,13.0732137 8.51721992,13.0732137 9.34921876,12.592859 C10.1812176,12.1125042 10.69375,11.224772 10.69375,10.2640625 C10.69375,8.77893429 9.48981571,7.575 8.0046875,7.575 C6.51955929,7.575 5.315625,8.77893429 5.315625,10.2640625 L5.315625,10.2640625 Z" id="路径" fill="#CDCDCD"></path>
</g>
<text id="2" font-family="Digital-7Mono, Digital-7 Mono" font-size="6" font-weight="normal" fill="#FFFFFF">
<tspan x="7" y="12">2</tspan>
</text>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>server</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="server" fill-rule="nonzero">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="18" height="18"></rect>
<path d="M16.4330859,1.08966797 C16.5397852,1.08966797 16.6310156,1.18107422 16.6310156,1.28759766 L16.6310156,4.93804688 C16.6310156,5.04474609 16.5396094,5.13597656 16.4330859,5.13597656 L1.60066406,5.13597656 C1.49396484,5.13597656 1.40273437,5.04457031 1.40273437,4.93804688 L1.40273437,1.28759766 C1.40273437,1.18089844 1.49414062,1.08966797 1.60066406,1.08966797 L16.4330859,1.08966797 M16.4330859,0.00193359375 L1.60066406,0.00193359375 C0.893671875,0.00193359375 0.315,0.580605469 0.315,1.28759766 L0.315,4.93804687 C0.315,5.64503906 0.893671875,6.22371094 1.60066406,6.22371094 L16.4330859,6.22371094 C17.1400781,6.22371094 17.71875,5.64503906 17.71875,4.93804687 L17.71875,1.28759766 C17.71875,0.580605469 17.1400781,0.00193359375 16.4330859,0.00193359375 Z" id="形状" fill="#66B3FF"></path>
<path d="M4.19818359,2.52984375 L2.89283203,2.52984375 L2.89283203,3.83519531 L4.19818359,3.83519531 L4.19818359,2.52984375 L4.19818359,2.52984375 Z M6.43886719,2.52984375 L5.13351563,2.52984375 L5.13351563,3.83519531 L6.43886719,3.83519531 L6.43886719,2.52984375 L6.43886719,2.52984375 Z M15.4126758,2.52984375 L10.7354883,2.52984375 L10.7354883,3.83519531 L15.4128516,3.83519531 L15.4128516,2.52984375 L15.4126758,2.52984375 Z M16.4330859,6.96339844 C16.5397852,6.96339844 16.6310156,7.05480469 16.6310156,7.16132813 L16.6310156,10.8117773 C16.6310156,10.9184766 16.5396094,11.009707 16.4330859,11.009707 L1.60066406,11.009707 C1.49396484,11.009707 1.40273437,10.9183008 1.40273437,10.8117773 L1.40273437,7.16150391 C1.40273437,7.05480469 1.49414062,6.96357422 1.60066406,6.96357422 L16.4330859,6.96357422 M16.4330859,5.87566406 L1.60066406,5.87566406 C0.893671875,5.87566406 0.315,6.45433594 0.315,7.16132813 L0.315,10.8117773 C0.315,11.5187695 0.893671875,12.0974414 1.60066406,12.0974414 L16.4330859,12.0974414 C17.1400781,12.0974414 17.71875,11.5187695 17.71875,10.8117773 L17.71875,7.16150391 C17.71875,6.45433594 17.1400781,5.87566406 16.4330859,5.87566406 Z" id="形状" fill="#66B3FF"></path>
<path d="M4.19818359,8.40357422 L2.89283203,8.40357422 L2.89283203,9.70892578 L4.19818359,9.70892578 L4.19818359,8.40357422 L4.19818359,8.40357422 Z M6.43886719,8.40357422 L5.13351563,8.40357422 L5.13351563,9.70892578 L6.43886719,9.70892578 L6.43886719,8.40357422 L6.43886719,8.40357422 Z M15.4126758,8.40357422 L10.7354883,8.40357422 L10.7354883,9.70892578 L15.4128516,9.70892578 L15.4128516,8.40357422 L15.4126758,8.40357422 Z M16.4330859,12.8373047 C16.5397852,12.8373047 16.6310156,12.9287109 16.6310156,13.0352344 L16.6310156,16.6856836 C16.6310156,16.7923828 16.5396094,16.8836133 16.4330859,16.8836133 L1.60066406,16.8836133 C1.49396484,16.8836133 1.40273437,16.792207 1.40273437,16.6856836 L1.40273437,13.0352344 C1.40273437,12.9285352 1.49414062,12.8373047 1.60066406,12.8373047 L16.4330859,12.8373047 M16.4330859,11.7495703 L1.60066406,11.7495703 C0.893671875,11.7495703 0.315,12.3282422 0.315,13.0352344 L0.315,16.6856836 C0.315,17.3926758 0.893671875,17.9713477 1.60066406,17.9713477 L16.4330859,17.9713477 C17.1400781,17.9713477 17.71875,17.3926758 17.71875,16.6856836 L17.71875,13.0352344 C17.71875,12.3282422 17.1400781,11.7495703 16.4330859,11.7495703 Z" id="形状" fill="#66B3FF"></path>
<path d="M4.19818359,14.2774805 L2.89283203,14.2774805 L2.89283203,16.0774805 L4.19818359,16.0774805 L4.19818359,14.2774805 L4.19818359,14.2774805 Z M6.43886719,14.2774805 L5.13351562,14.2774805 L5.13351562,16.0774805 L6.43886719,16.0774805 L6.43886719,14.2774805 Z M15.4126758,14.2774805 L10.7354883,14.2774805 L10.7354883,16.0774805 L15.4128516,16.0774805 L15.4128516,14.2774805 L15.4126758,14.2774805 Z" id="形状" fill="#66B3FF"></path>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100%" height="6px" viewBox="0 0 118 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>short line2</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-93.000000, -159.000000)" fill="#66B3FF" fill-rule="nonzero">
<g id="short-line2" transform="translate(93.000000, 159.000000)">
<g id="编组-32">
<rect id="_矩形_27" opacity="0.5" transform="translate(1.500000, 3.000000) rotate(-90.000000) translate(-1.500000, -3.000000) " x="0" y="2" width="3" height="2"></rect>
<rect id="_矩形_28" opacity="0.8" transform="translate(5.000000, 3.000000) rotate(-90.000000) translate(-5.000000, -3.000000) " x="3" y="2" width="4" height="2"></rect>
<rect id="_矩形_29" opacity="0.8" transform="translate(8.500000, 3.000000) rotate(-90.000000) translate(-8.500000, -3.000000) " x="6" y="2" width="5" height="2"></rect>
<rect id="_矩形_30" transform="translate(12.000000, 3.000000) rotate(-90.000000) translate(-12.000000, -3.000000) " x="9" y="2" width="6" height="2"></rect>
</g>
<g id="编组-32备份" transform="translate(111.500000, 3.000000) rotate(-180.000000) translate(-111.500000, -3.000000) translate(105.000000, 0.000000)">
<rect id="_矩形_27" opacity="0.5" transform="translate(1.500000, 3.000000) rotate(-90.000000) translate(-1.500000, -3.000000) " x="0" y="2" width="3" height="2"></rect>
<rect id="_矩形_28" opacity="0.8" transform="translate(5.000000, 3.000000) rotate(-90.000000) translate(-5.000000, -3.000000) " x="3" y="2" width="4" height="2"></rect>
<rect id="_矩形_29" opacity="0.8" transform="translate(8.500000, 3.000000) rotate(-90.000000) translate(-8.500000, -3.000000) " x="6" y="2" width="5" height="2"></rect>
<rect id="_矩形_30" transform="translate(12.000000, 3.000000) rotate(-90.000000) translate(-12.000000, -3.000000) " x="9" y="2" width="6" height="2"></rect>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="16px" viewBox="0 0 12 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>three</title>
<desc>Created with Sketch.</desc>
<g id="Seetass-大屏" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="SeeTaas大屏" transform="translate(-100.000000, -749.000000)">
<g id="编组-22" transform="translate(73.000000, 659.000000)">
<g id="three" transform="translate(25.000000, 90.000000)">
<g id="奖牌备份-2" fill-rule="nonzero">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="16" height="16"></rect>
<path d="M4.971875,6.425 L7.996875,9.45 L13.6375,3.809375 C13.7578125,3.6890625 13.8234375,3.525 13.81875,3.3546875 L13.7640625,1.1984375 C13.7546875,0.8609375 13.4796875,0.5921875 13.1421875,0.5921875 L11.0578125,0.5953125 C10.89375,0.5953125 10.7359375,0.6609375 10.61875,0.778125 L4.971875,6.425 Z" id="路径" fill="#D32F2F"></path>
<path d="M11.028125,6.4265625 L8.003125,9.4515625 L2.3625,3.8109375 C2.2421875,3.690625 2.1765625,3.5265625 2.18125,3.35625 L2.2359375,1.2 C2.2453125,0.8625 2.5203125,0.59375 2.8578125,0.59375 L4.9421875,0.596875 C5.10625,0.596875 5.2640625,0.6625 5.38125,0.7796875 L11.028125,6.4265625 L11.028125,6.4265625 Z" id="路径" fill="#F44336"></path>
<path d="M2.8609375,10.2640625 C2.8609375,13.1048772 5.16387282,15.4078125 8.0046875,15.4078125 C10.8455022,15.4078125 13.1484375,13.1048772 13.1484375,10.2640625 C13.1484375,7.42324782 10.8455022,5.1203125 8.0046875,5.1203125 C5.16387282,5.1203125 2.8609375,7.42324782 2.8609375,10.2640625 Z" id="路径" fill="#F5A74A"></path>
<path d="M10.0203125,8.4765625 L11.50625,10.465625 C11.509375,10.3984375 11.5125,10.33125 11.5125,10.2640625 C11.5125,8.3265625 9.9421875,6.75625 8.0046875,6.75625 C6.0671875,6.75625 4.496875,8.3265625 4.496875,10.2640625 C4.496875,11.9203125 5.6453125,13.3078125 7.1875,13.6765625 L5.709375,11.7 L10.0203125,8.4765625 Z" id="路径" fill="#E98952"></path>
<path d="M11.50625,10.465625 C11.4015625,12.309375 9.8734375,13.7703125 8.0046875,13.7703125 C7.7234375,13.7703125 7.45,13.7375 7.1890625,13.675 L8.46875,15.3875 C10.4328125,15.2125 12.0796875,13.9328125 12.7828125,12.1734375 L11.50625,10.465625 Z" id="路径" fill="#F5A74A"></path>
<path d="M11.50625,10.465625 L10.0203125,8.4765625 L5.7109375,11.6984375 L7.1890625,13.675 C7.4515625,13.7375 7.7234375,13.7703138 8.0046875,13.7703138 C9.875,13.771875 11.4015625,12.309375 11.50625,10.465625 L11.50625,10.465625 Z" id="路径" fill="#E98952"></path>
<path d="M5.315625,10.2640625 C5.315625,11.224772 5.8281574,12.1125042 6.66015624,12.592859 C7.49215508,13.0732137 8.51721992,13.0732137 9.34921876,12.592859 C10.1812176,12.1125042 10.69375,11.224772 10.69375,10.2640625 C10.69375,8.77893429 9.48981571,7.575 8.0046875,7.575 C6.51955929,7.575 5.315625,8.77893429 5.315625,10.2640625 L5.315625,10.2640625 Z" id="路径" fill="#F5A74A"></path>
</g>
<text id="3" font-family="Digital-7Mono, Digital-7 Mono" font-size="6" font-weight="normal" fill="#FFFFFF">
<tspan x="7" y="12">3</tspan>
</text>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="622px" height="353px" viewBox="0 0 622 353" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>编组 9</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="104" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-2">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-3" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<rect id="path-4" x="0" y="0" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-6" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-4"></use>
</mask>
<rect id="path-7" x="454" y="104" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-8">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-9" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-7"></use>
</mask>
<rect id="path-10" x="0" y="0" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-11">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-12" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-10"></use>
</mask>
</defs>
<g id="page2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="任务流-导航收起" transform="translate(-647.000000, -297.000000)">
<g id="编组-9" transform="translate(651.000000, 299.000000)">
<text id="请从左侧拖入元素开始运行" font-family="PingFangSC-Regular, PingFang SC" font-size="14" font-weight="normal" fill="#99A1A9">
<tspan x="223" y="349">请从左侧拖入元素开始运行</tspan>
</text>
<g id="编组-8">
<g id="矩形备份-41" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use stroke="#CCCCCC" mask="url(#mask-3)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
</g>
<text id="数据集名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#99A1A9">
<tspan x="12" y="126">数据集名称</tspan>
</text>
<g id="data备份-13" transform="translate(12.000000, 137.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M0.00398211327,2.32857083 L0.669189476,2.32857083 L0.669189476,10.3110592 L0.00398211327,10.3110592 L0.00398211327,2.32857083 Z M10.6472999,2.32857083 L11.3125073,2.32857083 L11.3125073,10.3110592 L10.6472999,10.3110592 L10.6472999,2.32857083 Z" id="形状"></path>
<path d="M10.6472999,10.3110592 L11.3125073,10.3110592 C11.3125073,11.596905 8.78072806,12.639285 5.6582447,12.639285 C2.53576134,12.639285 0.00398211327,11.596905 0.00398211327,10.3110592 L0.669189476,10.3110592 C0.669189476,11.0680652 2.86903023,11.9740776 5.6582447,11.9740776 C8.44745917,11.9740776 10.6472999,11.0680652 10.6472999,10.3110592 Z M10.6472999,10.3110592 L11.3125073,10.3110592 C11.3125073,11.596905 8.78072806,12.639285 5.6582447,12.639285 C2.53576134,12.639285 0.00398211327,11.596905 0.00398211327,10.3110592 L0.669189476,10.3110592 C0.669189476,11.0680652 2.86903023,11.9740776 5.6582447,11.9740776 C8.44745917,11.9740776 10.6472999,11.0680652 10.6472999,10.3110592 Z M10.6472999,7.65022974 L11.3125073,7.65022974 C11.3125073,8.93607557 8.78072806,9.9784555 5.6582447,9.9784555 C2.53576134,9.9784555 0.00398211327,8.93607557 0.00398211327,7.65022974 L0.669189476,7.65022974 C0.669189476,8.40723571 2.86903023,9.31324814 5.6582447,9.31324814 C8.44745917,9.31324814 10.6472999,8.40723571 10.6472999,7.65022974 Z M10.6472999,7.65022974 L11.3125073,7.65022974 C11.3125073,8.93607557 8.78072806,9.9784555 5.6582447,9.9784555 C2.53576134,9.9784555 0.00398211327,8.93607557 0.00398211327,7.65022974 L0.669189476,7.65022974 C0.669189476,8.40723571 2.86903023,9.31324814 5.6582447,9.31324814 C8.44745917,9.31324814 10.6472999,8.40723571 10.6472999,7.65022974 Z M10.6472999,4.98940028 L11.3125073,4.98940028 C11.3125073,6.27524612 8.78072806,7.31762605 5.6582447,7.31762605 C2.53576134,7.31762605 0.00398211327,6.27524612 0.00398211327,4.98940028 L0.669189476,4.98940028 C0.669189476,5.74640626 2.86903023,6.65241869 5.6582447,6.65241869 C8.44745917,6.65241869 10.6472999,5.74640626 10.6472999,4.98940028 L10.6472999,4.98940028 Z M10.6472999,4.98940028 L11.3125073,4.98940028 C11.3125073,6.27524612 8.78072806,7.31762605 5.6582447,7.31762605 C2.53576134,7.31762605 0.00398211327,6.27524612 0.00398211327,4.98940028 L0.669189476,4.98940028 C0.669189476,5.74640626 2.86903023,6.65241869 5.6582447,6.65241869 C8.44745917,6.65241869 10.6472999,5.74640626 10.6472999,4.98940028 L10.6472999,4.98940028 Z M5.6582447,3.99158924 C8.44745917,3.99158924 10.6472999,3.08557681 10.6472999,2.32857083 C10.6472999,1.57156485 8.44745917,0.665552426 5.6582447,0.665552426 C2.86903022,0.665552426 0.669189476,1.57156485 0.669189476,2.32857083 C0.669189476,3.08557681 2.86903023,3.99158924 5.6582447,3.99158924 L5.6582447,3.99158924 Z M5.6582447,4.6567966 C2.53576134,4.6567966 0.00398211327,3.61441667 0.00398211327,2.32857083 C0.00398211327,1.042725 2.53576134,0.000345063332 5.6582447,0.000345063332 C8.78072806,0.000345063332 11.3125073,1.042725 11.3125073,2.32857083 C11.3125073,3.61441667 8.78072806,4.6567966 5.6582447,4.6567966 L5.6582447,4.6567966 Z M9.15058335,4.6567966 C9.42612126,4.6567966 9.64948887,4.88016421 9.64948887,5.15570212 C9.64948887,5.43124004 9.42612126,5.65460765 9.15058335,5.65460765 C8.87504544,5.65460765 8.65167783,5.43124004 8.65167783,5.15570212 C8.65167783,4.88016421 8.87504544,4.6567966 9.15058335,4.6567966 Z M9.15058335,7.31762605 C9.42612126,7.31762605 9.64948887,7.54099366 9.64948887,7.81653158 C9.64948887,8.09206949 9.42612126,8.3154371 9.15058335,8.3154371 C8.87504544,8.3154371 8.65167783,8.09206949 8.65167783,7.81653158 C8.65167783,7.54099366 8.87504544,7.31762605 9.15058335,7.31762605 L9.15058335,7.31762605 Z M9.15058335,9.9784555 C9.42612126,9.9784555 9.64948887,10.2018231 9.64948887,10.477361 C9.64948887,10.7528989 9.42612126,10.9762665 9.15058335,10.9762665 C8.87504544,10.9762665 8.65167783,10.7528989 8.65167783,10.477361 C8.65167783,10.2018231 8.87504544,9.9784555 9.15058335,9.9784555 L9.15058335,9.9784555 Z" id="形状"></path>
</g>
<text id="数据集备份-15" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="28" y="148">数据集</tspan>
</text>
<g id="编组-10备份" transform="translate(217.000000, 0.000000)">
<g id="矩形备份-43" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-5)" xlink:href="#path-4"></use>
<use stroke="#CCCCCC" mask="url(#mask-6)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-4"></use>
</g>
<text id="算法名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#99A1A9">
<tspan x="12" y="22">算法名称</tspan>
</text>
<g id="形状-2备份-9" transform="translate(12.000000, 34.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M0.666666666,3.33333333 L0.666666666,2.66666667 L11.3333333,2.66666667 L11.3333333,0.666666667 L0.666666666,0.666666667 L0.666666666,10 L11.3333333,10 L11.3333333,3.33333333 L0.666666666,3.33333333 Z M0.666666666,1.51212376e-13 L11.3333333,1.51212376e-13 C11.5101443,1.51212376e-13 11.6797136,0.0702378937 11.8047379,0.195262146 C11.9297621,0.320286398 12,0.489855674 12,0.666666667 L12,10 C12,10.176811 11.9297621,10.3463803 11.8047379,10.4714045 C11.6797136,10.5964288 11.5101443,10.6666667 11.3333333,10.6666667 L0.666666666,10.6666667 C0.489855673,10.6666667 0.320286398,10.5964288 0.195262146,10.4714045 C0.0702378933,10.3463803 0,10.176811 0,10 L0,0.666666667 C0,0.489855674 0.0702378933,0.320286398 0.195262146,0.195262146 C0.320286398,0.0702378937 0.489855673,1.51212376e-13 0.666666666,1.51212376e-13 Z M4.236,7.512 C4.3661551,7.6423392 4.36600585,7.85351156 4.23566666,7.98366666 C4.10532746,8.11382176 3.89415511,8.11367253 3.764,7.98333333 L2.35066667,6.56933333 C2.2879722,6.50679716 2.25273748,6.42188484 2.25273748,6.33333333 C2.25273748,6.24478183 2.2879722,6.15986951 2.35066667,6.09733333 L3.764,4.684 C3.84757067,4.59723764 3.97145193,4.56231662 4.08803308,4.59265798 C4.20461424,4.62299934 4.29575399,4.71388163 4.32642501,4.83037649 C4.35709604,4.94687135 4.32252561,5.0708509 4.236,5.15466667 L3.05733333,6.33333333 L4.236,7.512 Z M7.764,5.15466667 C7.63384489,5.02432747 7.63399413,4.81315511 7.76433333,4.683 C7.89467253,4.55284489 8.10584489,4.55299413 8.236,4.68333333 L9.64933333,6.09733333 C9.7120278,6.15986951 9.74726252,6.24478183 9.74726252,6.33333333 C9.74726252,6.42188484 9.7120278,6.50679716 9.64933333,6.56933333 L8.236,7.98266667 C8.15242933,8.06942903 8.02854807,8.10435004 7.91196692,8.07400868 C7.79538577,8.04366732 7.70424602,7.95278503 7.67357499,7.83629018 C7.64290396,7.71979532 7.67747439,7.59581577 7.764,7.512 L8.94266667,6.33333333 L7.764,5.15466667 Z M6.95533333,5.34533333 L5.622,7.65466667 C5.52933142,7.81273789 5.32645098,7.86637624 5.16776855,7.77475821 C5.00908612,7.68314017 4.95410321,7.48061999 5.04466667,7.32133333 L6.378,5.012 C6.47005013,4.85257728 6.67390656,4.79795689 6.83333333,4.89 C6.99275605,4.98205013 7.04737645,5.18590656 6.95533333,5.34533333 Z" id="形状"></path>
</g>
<text id="算法" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="28" y="44">算法</tspan>
</text>
</g>
<path d="M381,132 C405.15395,139.328407 417.230926,154.31833 417.230926,176.969769 C417.230926,210.946928 435.876404,234.431141 447,232.932149" id="Path-5-Copy-3复制备份-2" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4" transform="translate(414.000000, 182.500000) scale(1, -1) translate(-414.000000, -182.500000) "></path>
<path d="M381,28 C405.15395,35.4735238 417.230926,50.7602771 417.230926,73.8602598 C417.230926,108.510234 435.876404,132.459481 447,130.930805" id="Path-5-Copy-2复制备份-3" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4"></path>
<polyline id="Path-Copy-2复制备份-3" fill="#D3D8DE" fill-rule="nonzero" transform="translate(444.535534, 131.535534) rotate(-225.000000) translate(-444.535534, -131.535534) " points="442.035534 134.035534 442.035534 129.035534 447.035534 129.035534"></polyline>
<circle id="Oval-Copy复制-2备份-3" stroke="#C5CCD2" fill="#FFFFFF" cx="377" cy="28" r="5"></circle>
<path d="M164,133 C180.102634,140.328407 188.15395,155.31833 188.15395,177.969769 C188.15395,211.946928 200.58427,235.431141 208,233.932149" id="Path-5复制" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4"></path>
<polyline id="Path-Copy复制" fill="#D3D8DE" fill-rule="nonzero" transform="translate(207.035534, 234.035534) rotate(-225.000000) translate(-207.035534, -234.035534) " points="204.535534 236.535534 204.535534 231.535534 209.535534 231.535534"></polyline>
<path d="M164,29 C180.468603,36.4785133 188.702904,51.7754724 188.702904,74.8908771 C188.702904,109.563984 193.899941,132.068765 209,132" id="Path-5-Copy复制" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4" transform="translate(186.500000, 80.500000) scale(1, -1) translate(-186.500000, -80.500000) "></path>
<polyline id="Path复制" fill="#D3D8DE" fill-rule="nonzero" transform="translate(207.535534, 28.535534) rotate(-225.000000) translate(-207.535534, -28.535534) " points="205.035534 31.0355339 205.035534 26.0355339 210.035534 26.0355339"></polyline>
<circle id="Oval-Copy-2复制备份-6" stroke="#C5CCD2" fill="#FFFFFF" cx="217" cy="28" r="5"></circle>
<circle id="Oval-Copy-2复制备份-16" stroke="#C5CCD2" fill="#FFFFFF" cx="160" cy="133" r="5"></circle>
<g id="矩形备份-45" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
<use stroke="#CCCCCC" mask="url(#mask-9)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-7"></use>
</g>
<text id="算法名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#ACACAC">
<tspan x="466" y="126">算法名称</tspan>
</text>
<g id="形状-2备份-11" transform="translate(466.000000, 137.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M0.666666666,3.33333333 L0.666666666,2.66666667 L11.3333333,2.66666667 L11.3333333,0.666666667 L0.666666666,0.666666667 L0.666666666,10 L11.3333333,10 L11.3333333,3.33333333 L0.666666666,3.33333333 Z M0.666666666,1.51212376e-13 L11.3333333,1.51212376e-13 C11.5101443,1.51212376e-13 11.6797136,0.0702378937 11.8047379,0.195262146 C11.9297621,0.320286398 12,0.489855674 12,0.666666667 L12,10 C12,10.176811 11.9297621,10.3463803 11.8047379,10.4714045 C11.6797136,10.5964288 11.5101443,10.6666667 11.3333333,10.6666667 L0.666666666,10.6666667 C0.489855673,10.6666667 0.320286398,10.5964288 0.195262146,10.4714045 C0.0702378933,10.3463803 0,10.176811 0,10 L0,0.666666667 C0,0.489855674 0.0702378933,0.320286398 0.195262146,0.195262146 C0.320286398,0.0702378937 0.489855673,1.51212376e-13 0.666666666,1.51212376e-13 Z M4.236,7.512 C4.3661551,7.6423392 4.36600585,7.85351156 4.23566666,7.98366666 C4.10532746,8.11382176 3.89415511,8.11367253 3.764,7.98333333 L2.35066667,6.56933333 C2.2879722,6.50679716 2.25273748,6.42188484 2.25273748,6.33333333 C2.25273748,6.24478183 2.2879722,6.15986951 2.35066667,6.09733333 L3.764,4.684 C3.84757067,4.59723764 3.97145193,4.56231662 4.08803308,4.59265798 C4.20461424,4.62299934 4.29575399,4.71388163 4.32642501,4.83037649 C4.35709604,4.94687135 4.32252561,5.0708509 4.236,5.15466667 L3.05733333,6.33333333 L4.236,7.512 Z M7.764,5.15466667 C7.63384489,5.02432747 7.63399413,4.81315511 7.76433333,4.683 C7.89467253,4.55284489 8.10584489,4.55299413 8.236,4.68333333 L9.64933333,6.09733333 C9.7120278,6.15986951 9.74726252,6.24478183 9.74726252,6.33333333 C9.74726252,6.42188484 9.7120278,6.50679716 9.64933333,6.56933333 L8.236,7.98266667 C8.15242933,8.06942903 8.02854807,8.10435004 7.91196692,8.07400868 C7.79538577,8.04366732 7.70424602,7.95278503 7.67357499,7.83629018 C7.64290396,7.71979532 7.67747439,7.59581577 7.764,7.512 L8.94266667,6.33333333 L7.764,5.15466667 Z M6.95533333,5.34533333 L5.622,7.65466667 C5.52933142,7.81273789 5.32645098,7.86637624 5.16776855,7.77475821 C5.00908612,7.68314017 4.95410321,7.48061999 5.04466667,7.32133333 L6.378,5.012 C6.47005013,4.85257728 6.67390656,4.79795689 6.83333333,4.89 C6.99275605,4.98205013 7.04737645,5.18590656 6.95533333,5.34533333 Z" id="形状"></path>
</g>
<text id="算法" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="482" y="147">算法</tspan>
</text>
<circle id="Oval-Copy-2复制备份-14" stroke="#C5CCD2" fill="#FFFFFF" cx="454" cy="132" r="5"></circle>
<g id="编组-8备份-5" transform="translate(217.000000, 207.000000)">
<g id="矩形备份-41" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-11)" xlink:href="#path-10"></use>
<use stroke="#CCCCCC" mask="url(#mask-12)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-10"></use>
</g>
<text id="处理器名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#99A1A9">
<tspan x="12" y="22">处理器名称</tspan>
</text>
<text id="处理器" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="28" y="44">处理器</tspan>
</text>
<g id="model备份-3" transform="translate(12.000000, 34.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M9.46072694,3.04458019 C8.61458317,3.69559646 6.94594746,4.13906804 5.02601119,4.13906804 C3.10607491,4.13906804 1.4374392,3.69559646 0.591295434,3.04458019 L0.591295434,4.43471575 C0.591295434,5.08041037 2.39297262,5.84850313 4.73036347,5.90940656 L4.73036347,6.500702 C2.93578183,6.45812873 1.39368334,6.02766565 0.591295434,5.40976192 L0.591295434,6.79989749 C0.591295434,7.4455921 2.39297262,8.21368487 4.73036347,8.2745883 L4.73036347,8.86588373 C2.93578183,8.82331046 1.39368334,8.39284738 0.591295434,7.77494366 L0.591295434,9.16507922 C0.591295434,9.81077383 2.39297262,10.5788666 4.73036347,10.63977 L4.73036347,11.2310655 C2.09200324,11.1677969 4.0602442e-15,10.2672539 4.0602442e-15,9.16507922 L4.0602442e-15,2.06953402 C4.0602442e-15,0.926559945 2.25047042,0 5.02601119,0 C7.80155195,0 10.0520224,0.926559944 10.0520224,2.06953402 L10.0520224,4.73036347 L9.46072694,4.73036347 L9.46072694,3.04458019 Z M5.02601119,3.5477726 C7.50531294,3.5477726 9.46072694,2.74242822 9.46072694,2.06953402 C9.46072694,1.39663981 7.50531294,0.591295434 5.02601119,0.591295434 C2.54670943,0.591295434 0.591295434,1.39663981 0.591295434,2.06953402 C0.591295434,2.74242822 2.54670943,3.5477726 5.02601119,3.5477726 Z M8.57378379,11.530261 C6.94096653,11.530261 5.61730662,10.206601 5.61730662,8.57378379 C5.61730662,6.94096653 6.94096653,5.61730662 8.57378379,5.61730662 C10.206601,5.61730662 11.5302609,6.94096656 11.5302609,8.57378379 C11.5302609,10.206601 10.206601,11.530261 8.57378379,11.530261 L8.57378379,11.530261 Z M8.57378379,10.9389655 C9.41878812,10.9389655 10.1996083,10.4881759 10.6221132,9.75638227 C11.0446181,9.02458862 11.0446181,8.12297895 10.6221132,7.39118531 C10.1996083,6.65939166 9.41878812,6.20860205 8.57378379,6.20860205 C7.26754028,6.20860205 6.20862842,7.26754028 6.20862842,8.57378379 C6.20862842,9.88002729 7.26754028,10.9389655 8.57378379,10.9389655 L8.57378379,10.9389655 Z M8.8694315,8.8694315 L10.0520224,8.8694315 L10.0520224,9.46072694 L8.27813607,9.46072694 L8.27813607,7.0955452 L8.8694315,7.0955452 L8.8694315,8.8694315 Z" id="形状"></path>
</g>
</g>
<circle id="Oval-Copy-3复制备份-2" stroke="#C5CCD2" fill="#FFFFFF" cx="377" cy="235" r="5"></circle>
<circle id="Oval-Copy-2复制备份-20" stroke="#C5CCD2" fill="#FFFFFF" cx="217" cy="235" r="5"></circle>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="622px" height="353px" viewBox="0 0 622 353" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 64 (93537) - https://sketch.com -->
<title>编组 9</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="104" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-2">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-3" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<rect id="path-4" x="0" y="0" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-5">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-6" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-4"></use>
</mask>
<rect id="path-7" x="454" y="104" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-8">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-9" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-7"></use>
</mask>
<rect id="path-10" x="0" y="0" width="160" height="56" rx="3"></rect>
<filter x="-4.4%" y="-8.9%" width="108.8%" height="125.0%" filterUnits="objectBoundingBox" id="filter-11">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.2 0 0 0 0 0.262745098 0 0 0 0 0.345098039 0 0 0 0.04 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
<mask id="mask-12" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="160" height="56" fill="white">
<use xlink:href="#path-10"></use>
</mask>
</defs>
<g id="page2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="任务流-导航收起" transform="translate(-647.000000, -297.000000)">
<g id="编组-9" transform="translate(651.000000, 299.000000)">
<text id="请从左侧拖入元素开始运行" font-family="PingFangSC-Regular, PingFang SC" font-size="14" font-weight="normal" fill="#99A1A9">
<tspan x="223" y="349">左側のモジュールをドラッグアンドドロップしてください</tspan>
</text>
<g id="编组-8">
<g id="矩形备份-41" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use stroke="#CCCCCC" mask="url(#mask-3)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
</g>
<text id="数据集名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#99A1A9">
<tspan x="12" y="126">データセット名</tspan>
</text>
<g id="data备份-13" transform="translate(12.000000, 137.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M0.00398211327,2.32857083 L0.669189476,2.32857083 L0.669189476,10.3110592 L0.00398211327,10.3110592 L0.00398211327,2.32857083 Z M10.6472999,2.32857083 L11.3125073,2.32857083 L11.3125073,10.3110592 L10.6472999,10.3110592 L10.6472999,2.32857083 Z" id="形状"></path>
<path d="M10.6472999,10.3110592 L11.3125073,10.3110592 C11.3125073,11.596905 8.78072806,12.639285 5.6582447,12.639285 C2.53576134,12.639285 0.00398211327,11.596905 0.00398211327,10.3110592 L0.669189476,10.3110592 C0.669189476,11.0680652 2.86903023,11.9740776 5.6582447,11.9740776 C8.44745917,11.9740776 10.6472999,11.0680652 10.6472999,10.3110592 Z M10.6472999,10.3110592 L11.3125073,10.3110592 C11.3125073,11.596905 8.78072806,12.639285 5.6582447,12.639285 C2.53576134,12.639285 0.00398211327,11.596905 0.00398211327,10.3110592 L0.669189476,10.3110592 C0.669189476,11.0680652 2.86903023,11.9740776 5.6582447,11.9740776 C8.44745917,11.9740776 10.6472999,11.0680652 10.6472999,10.3110592 Z M10.6472999,7.65022974 L11.3125073,7.65022974 C11.3125073,8.93607557 8.78072806,9.9784555 5.6582447,9.9784555 C2.53576134,9.9784555 0.00398211327,8.93607557 0.00398211327,7.65022974 L0.669189476,7.65022974 C0.669189476,8.40723571 2.86903023,9.31324814 5.6582447,9.31324814 C8.44745917,9.31324814 10.6472999,8.40723571 10.6472999,7.65022974 Z M10.6472999,7.65022974 L11.3125073,7.65022974 C11.3125073,8.93607557 8.78072806,9.9784555 5.6582447,9.9784555 C2.53576134,9.9784555 0.00398211327,8.93607557 0.00398211327,7.65022974 L0.669189476,7.65022974 C0.669189476,8.40723571 2.86903023,9.31324814 5.6582447,9.31324814 C8.44745917,9.31324814 10.6472999,8.40723571 10.6472999,7.65022974 Z M10.6472999,4.98940028 L11.3125073,4.98940028 C11.3125073,6.27524612 8.78072806,7.31762605 5.6582447,7.31762605 C2.53576134,7.31762605 0.00398211327,6.27524612 0.00398211327,4.98940028 L0.669189476,4.98940028 C0.669189476,5.74640626 2.86903023,6.65241869 5.6582447,6.65241869 C8.44745917,6.65241869 10.6472999,5.74640626 10.6472999,4.98940028 L10.6472999,4.98940028 Z M10.6472999,4.98940028 L11.3125073,4.98940028 C11.3125073,6.27524612 8.78072806,7.31762605 5.6582447,7.31762605 C2.53576134,7.31762605 0.00398211327,6.27524612 0.00398211327,4.98940028 L0.669189476,4.98940028 C0.669189476,5.74640626 2.86903023,6.65241869 5.6582447,6.65241869 C8.44745917,6.65241869 10.6472999,5.74640626 10.6472999,4.98940028 L10.6472999,4.98940028 Z M5.6582447,3.99158924 C8.44745917,3.99158924 10.6472999,3.08557681 10.6472999,2.32857083 C10.6472999,1.57156485 8.44745917,0.665552426 5.6582447,0.665552426 C2.86903022,0.665552426 0.669189476,1.57156485 0.669189476,2.32857083 C0.669189476,3.08557681 2.86903023,3.99158924 5.6582447,3.99158924 L5.6582447,3.99158924 Z M5.6582447,4.6567966 C2.53576134,4.6567966 0.00398211327,3.61441667 0.00398211327,2.32857083 C0.00398211327,1.042725 2.53576134,0.000345063332 5.6582447,0.000345063332 C8.78072806,0.000345063332 11.3125073,1.042725 11.3125073,2.32857083 C11.3125073,3.61441667 8.78072806,4.6567966 5.6582447,4.6567966 L5.6582447,4.6567966 Z M9.15058335,4.6567966 C9.42612126,4.6567966 9.64948887,4.88016421 9.64948887,5.15570212 C9.64948887,5.43124004 9.42612126,5.65460765 9.15058335,5.65460765 C8.87504544,5.65460765 8.65167783,5.43124004 8.65167783,5.15570212 C8.65167783,4.88016421 8.87504544,4.6567966 9.15058335,4.6567966 Z M9.15058335,7.31762605 C9.42612126,7.31762605 9.64948887,7.54099366 9.64948887,7.81653158 C9.64948887,8.09206949 9.42612126,8.3154371 9.15058335,8.3154371 C8.87504544,8.3154371 8.65167783,8.09206949 8.65167783,7.81653158 C8.65167783,7.54099366 8.87504544,7.31762605 9.15058335,7.31762605 L9.15058335,7.31762605 Z M9.15058335,9.9784555 C9.42612126,9.9784555 9.64948887,10.2018231 9.64948887,10.477361 C9.64948887,10.7528989 9.42612126,10.9762665 9.15058335,10.9762665 C8.87504544,10.9762665 8.65167783,10.7528989 8.65167783,10.477361 C8.65167783,10.2018231 8.87504544,9.9784555 9.15058335,9.9784555 L9.15058335,9.9784555 Z" id="形状"></path>
</g>
<text id="数据集备份-15" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="28" y="148">データセット</tspan>
</text>
<g id="编组-10备份" transform="translate(217.000000, 0.000000)">
<g id="矩形备份-43" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-5)" xlink:href="#path-4"></use>
<use stroke="#CCCCCC" mask="url(#mask-6)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-4"></use>
</g>
<text id="算法名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#99A1A9">
<tspan x="12" y="22">アルゴリズム名</tspan>
</text>
<g id="形状-2备份-9" transform="translate(12.000000, 34.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M0.666666666,3.33333333 L0.666666666,2.66666667 L11.3333333,2.66666667 L11.3333333,0.666666667 L0.666666666,0.666666667 L0.666666666,10 L11.3333333,10 L11.3333333,3.33333333 L0.666666666,3.33333333 Z M0.666666666,1.51212376e-13 L11.3333333,1.51212376e-13 C11.5101443,1.51212376e-13 11.6797136,0.0702378937 11.8047379,0.195262146 C11.9297621,0.320286398 12,0.489855674 12,0.666666667 L12,10 C12,10.176811 11.9297621,10.3463803 11.8047379,10.4714045 C11.6797136,10.5964288 11.5101443,10.6666667 11.3333333,10.6666667 L0.666666666,10.6666667 C0.489855673,10.6666667 0.320286398,10.5964288 0.195262146,10.4714045 C0.0702378933,10.3463803 0,10.176811 0,10 L0,0.666666667 C0,0.489855674 0.0702378933,0.320286398 0.195262146,0.195262146 C0.320286398,0.0702378937 0.489855673,1.51212376e-13 0.666666666,1.51212376e-13 Z M4.236,7.512 C4.3661551,7.6423392 4.36600585,7.85351156 4.23566666,7.98366666 C4.10532746,8.11382176 3.89415511,8.11367253 3.764,7.98333333 L2.35066667,6.56933333 C2.2879722,6.50679716 2.25273748,6.42188484 2.25273748,6.33333333 C2.25273748,6.24478183 2.2879722,6.15986951 2.35066667,6.09733333 L3.764,4.684 C3.84757067,4.59723764 3.97145193,4.56231662 4.08803308,4.59265798 C4.20461424,4.62299934 4.29575399,4.71388163 4.32642501,4.83037649 C4.35709604,4.94687135 4.32252561,5.0708509 4.236,5.15466667 L3.05733333,6.33333333 L4.236,7.512 Z M7.764,5.15466667 C7.63384489,5.02432747 7.63399413,4.81315511 7.76433333,4.683 C7.89467253,4.55284489 8.10584489,4.55299413 8.236,4.68333333 L9.64933333,6.09733333 C9.7120278,6.15986951 9.74726252,6.24478183 9.74726252,6.33333333 C9.74726252,6.42188484 9.7120278,6.50679716 9.64933333,6.56933333 L8.236,7.98266667 C8.15242933,8.06942903 8.02854807,8.10435004 7.91196692,8.07400868 C7.79538577,8.04366732 7.70424602,7.95278503 7.67357499,7.83629018 C7.64290396,7.71979532 7.67747439,7.59581577 7.764,7.512 L8.94266667,6.33333333 L7.764,5.15466667 Z M6.95533333,5.34533333 L5.622,7.65466667 C5.52933142,7.81273789 5.32645098,7.86637624 5.16776855,7.77475821 C5.00908612,7.68314017 4.95410321,7.48061999 5.04466667,7.32133333 L6.378,5.012 C6.47005013,4.85257728 6.67390656,4.79795689 6.83333333,4.89 C6.99275605,4.98205013 7.04737645,5.18590656 6.95533333,5.34533333 Z" id="形状"></path>
</g>
<text id="算法" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="28" y="44">アルゴリズム</tspan>
</text>
</g>
<path d="M381,132 C405.15395,139.328407 417.230926,154.31833 417.230926,176.969769 C417.230926,210.946928 435.876404,234.431141 447,232.932149" id="Path-5-Copy-3复制备份-2" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4" transform="translate(414.000000, 182.500000) scale(1, -1) translate(-414.000000, -182.500000) "></path>
<path d="M381,28 C405.15395,35.4735238 417.230926,50.7602771 417.230926,73.8602598 C417.230926,108.510234 435.876404,132.459481 447,130.930805" id="Path-5-Copy-2复制备份-3" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4"></path>
<polyline id="Path-Copy-2复制备份-3" fill="#D3D8DE" fill-rule="nonzero" transform="translate(444.535534, 131.535534) rotate(-225.000000) translate(-444.535534, -131.535534) " points="442.035534 134.035534 442.035534 129.035534 447.035534 129.035534"></polyline>
<circle id="Oval-Copy复制-2备份-3" stroke="#C5CCD2" fill="#FFFFFF" cx="377" cy="28" r="5"></circle>
<path d="M164,133 C180.102634,140.328407 188.15395,155.31833 188.15395,177.969769 C188.15395,211.946928 200.58427,235.431141 208,233.932149" id="Path-5复制" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4"></path>
<polyline id="Path-Copy复制" fill="#D3D8DE" fill-rule="nonzero" transform="translate(207.035534, 234.035534) rotate(-225.000000) translate(-207.035534, -234.035534) " points="204.535534 236.535534 204.535534 231.535534 209.535534 231.535534"></polyline>
<path d="M164,29 C180.468603,36.4785133 188.702904,51.7754724 188.702904,74.8908771 C188.702904,109.563984 193.899941,132.068765 209,132" id="Path-5-Copy复制" stroke="#D3D8DE" stroke-width="1.5" stroke-dasharray="4" transform="translate(186.500000, 80.500000) scale(1, -1) translate(-186.500000, -80.500000) "></path>
<polyline id="Path复制" fill="#D3D8DE" fill-rule="nonzero" transform="translate(207.535534, 28.535534) rotate(-225.000000) translate(-207.535534, -28.535534) " points="205.035534 31.0355339 205.035534 26.0355339 210.035534 26.0355339"></polyline>
<circle id="Oval-Copy-2复制备份-6" stroke="#C5CCD2" fill="#FFFFFF" cx="217" cy="28" r="5"></circle>
<circle id="Oval-Copy-2复制备份-16" stroke="#C5CCD2" fill="#FFFFFF" cx="160" cy="133" r="5"></circle>
<g id="矩形备份-45" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
<use stroke="#CCCCCC" mask="url(#mask-9)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-7"></use>
</g>
<text id="算法名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#ACACAC">
<tspan x="466" y="126">アルゴリズム名</tspan>
</text>
<g id="形状-2备份-11" transform="translate(466.000000, 137.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M0.666666666,3.33333333 L0.666666666,2.66666667 L11.3333333,2.66666667 L11.3333333,0.666666667 L0.666666666,0.666666667 L0.666666666,10 L11.3333333,10 L11.3333333,3.33333333 L0.666666666,3.33333333 Z M0.666666666,1.51212376e-13 L11.3333333,1.51212376e-13 C11.5101443,1.51212376e-13 11.6797136,0.0702378937 11.8047379,0.195262146 C11.9297621,0.320286398 12,0.489855674 12,0.666666667 L12,10 C12,10.176811 11.9297621,10.3463803 11.8047379,10.4714045 C11.6797136,10.5964288 11.5101443,10.6666667 11.3333333,10.6666667 L0.666666666,10.6666667 C0.489855673,10.6666667 0.320286398,10.5964288 0.195262146,10.4714045 C0.0702378933,10.3463803 0,10.176811 0,10 L0,0.666666667 C0,0.489855674 0.0702378933,0.320286398 0.195262146,0.195262146 C0.320286398,0.0702378937 0.489855673,1.51212376e-13 0.666666666,1.51212376e-13 Z M4.236,7.512 C4.3661551,7.6423392 4.36600585,7.85351156 4.23566666,7.98366666 C4.10532746,8.11382176 3.89415511,8.11367253 3.764,7.98333333 L2.35066667,6.56933333 C2.2879722,6.50679716 2.25273748,6.42188484 2.25273748,6.33333333 C2.25273748,6.24478183 2.2879722,6.15986951 2.35066667,6.09733333 L3.764,4.684 C3.84757067,4.59723764 3.97145193,4.56231662 4.08803308,4.59265798 C4.20461424,4.62299934 4.29575399,4.71388163 4.32642501,4.83037649 C4.35709604,4.94687135 4.32252561,5.0708509 4.236,5.15466667 L3.05733333,6.33333333 L4.236,7.512 Z M7.764,5.15466667 C7.63384489,5.02432747 7.63399413,4.81315511 7.76433333,4.683 C7.89467253,4.55284489 8.10584489,4.55299413 8.236,4.68333333 L9.64933333,6.09733333 C9.7120278,6.15986951 9.74726252,6.24478183 9.74726252,6.33333333 C9.74726252,6.42188484 9.7120278,6.50679716 9.64933333,6.56933333 L8.236,7.98266667 C8.15242933,8.06942903 8.02854807,8.10435004 7.91196692,8.07400868 C7.79538577,8.04366732 7.70424602,7.95278503 7.67357499,7.83629018 C7.64290396,7.71979532 7.67747439,7.59581577 7.764,7.512 L8.94266667,6.33333333 L7.764,5.15466667 Z M6.95533333,5.34533333 L5.622,7.65466667 C5.52933142,7.81273789 5.32645098,7.86637624 5.16776855,7.77475821 C5.00908612,7.68314017 4.95410321,7.48061999 5.04466667,7.32133333 L6.378,5.012 C6.47005013,4.85257728 6.67390656,4.79795689 6.83333333,4.89 C6.99275605,4.98205013 7.04737645,5.18590656 6.95533333,5.34533333 Z" id="形状"></path>
</g>
<text id="算法" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="482" y="147">アルゴリズム</tspan>
</text>
<circle id="Oval-Copy-2复制备份-14" stroke="#C5CCD2" fill="#FFFFFF" cx="454" cy="132" r="5"></circle>
<g id="编组-8备份-5" transform="translate(217.000000, 207.000000)">
<g id="矩形备份-41" stroke-dasharray="5">
<use fill="black" fill-opacity="1" filter="url(#filter-11)" xlink:href="#path-10"></use>
<use stroke="#CCCCCC" mask="url(#mask-12)" stroke-width="3" fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-10"></use>
</g>
<text id="处理器名称" font-family="PingFang-SC-Bold, PingFang SC" font-size="13" font-weight="bold" fill="#99A1A9">
<tspan x="12" y="22">プロセッサ名</tspan>
</text>
<text id="处理器" font-family="PingFangSC-Regular, PingFang SC" font-size="12" font-weight="normal" fill="#99A1A9">
<tspan x="28" y="44">プロセッサ</tspan>
</text>
<g id="model备份-3" transform="translate(12.000000, 34.000000)" fill="#ACACAC" fill-rule="nonzero">
<path d="M9.46072694,3.04458019 C8.61458317,3.69559646 6.94594746,4.13906804 5.02601119,4.13906804 C3.10607491,4.13906804 1.4374392,3.69559646 0.591295434,3.04458019 L0.591295434,4.43471575 C0.591295434,5.08041037 2.39297262,5.84850313 4.73036347,5.90940656 L4.73036347,6.500702 C2.93578183,6.45812873 1.39368334,6.02766565 0.591295434,5.40976192 L0.591295434,6.79989749 C0.591295434,7.4455921 2.39297262,8.21368487 4.73036347,8.2745883 L4.73036347,8.86588373 C2.93578183,8.82331046 1.39368334,8.39284738 0.591295434,7.77494366 L0.591295434,9.16507922 C0.591295434,9.81077383 2.39297262,10.5788666 4.73036347,10.63977 L4.73036347,11.2310655 C2.09200324,11.1677969 4.0602442e-15,10.2672539 4.0602442e-15,9.16507922 L4.0602442e-15,2.06953402 C4.0602442e-15,0.926559945 2.25047042,0 5.02601119,0 C7.80155195,0 10.0520224,0.926559944 10.0520224,2.06953402 L10.0520224,4.73036347 L9.46072694,4.73036347 L9.46072694,3.04458019 Z M5.02601119,3.5477726 C7.50531294,3.5477726 9.46072694,2.74242822 9.46072694,2.06953402 C9.46072694,1.39663981 7.50531294,0.591295434 5.02601119,0.591295434 C2.54670943,0.591295434 0.591295434,1.39663981 0.591295434,2.06953402 C0.591295434,2.74242822 2.54670943,3.5477726 5.02601119,3.5477726 Z M8.57378379,11.530261 C6.94096653,11.530261 5.61730662,10.206601 5.61730662,8.57378379 C5.61730662,6.94096653 6.94096653,5.61730662 8.57378379,5.61730662 C10.206601,5.61730662 11.5302609,6.94096656 11.5302609,8.57378379 C11.5302609,10.206601 10.206601,11.530261 8.57378379,11.530261 L8.57378379,11.530261 Z M8.57378379,10.9389655 C9.41878812,10.9389655 10.1996083,10.4881759 10.6221132,9.75638227 C11.0446181,9.02458862 11.0446181,8.12297895 10.6221132,7.39118531 C10.1996083,6.65939166 9.41878812,6.20860205 8.57378379,6.20860205 C7.26754028,6.20860205 6.20862842,7.26754028 6.20862842,8.57378379 C6.20862842,9.88002729 7.26754028,10.9389655 8.57378379,10.9389655 L8.57378379,10.9389655 Z M8.8694315,8.8694315 L10.0520224,8.8694315 L10.0520224,9.46072694 L8.27813607,9.46072694 L8.27813607,7.0955452 L8.8694315,7.0955452 L8.8694315,8.8694315 Z" id="形状"></path>
</g>
</g>
<circle id="Oval-Copy-3复制备份-2" stroke="#C5CCD2" fill="#FFFFFF" cx="377" cy="235" r="5"></circle>
<circle id="Oval-Copy-2复制备份-20" stroke="#C5CCD2" fill="#FFFFFF" cx="217" cy="235" r="5"></circle>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<template>
<!-- 滑块验证组件 -->
<div ref='wrapper' class='wrapper' :style='styleObject'>
<!--<div class='refresh' @click='refreshPuzzle'>-->
<!--<span class='iconfont icon-refresh'></span>-->
<!--</div>-->
<div class='puzzle-wrapper' :width='width' :height='height'>
<img class='source' :src='bgImg' width='100%' :height='height' />
<img
id='puzzle-img'
class='dest'
:src='puzzleImg'
:width='sideLength'
:height='sideLength'
/>
</div>
<div class='button' :class='buttonClass' :style="'width:' + width">
<div
v-show='currentMatch !== 1'
class='slide'
:style="'left:' + this.left + 'px'"
@mousedown='startDrag'
>
<i class='el-icon-d-arrow-right'></i>
</div>
<div
v-if='/iPad|iPhone|Android/.test(oS)'
v-show='currentMatch !== 1'
class='slide'
:style="'left:' + this.left + 'px'"
@touchstart='readyMove'
>
<i class='el-icon-d-arrow-right'></i>
</div>
<div
v-else
v-show='currentMatch !== 1'
class='slide'
:style="'left:' + this.left + 'px'"
@mousedown='startDrag'
>
<i class='el-icon-d-arrow-right'></i>
</div>
<span class='text' v-if='this.currentMatch === 0'
>向右滑动滑块填充拼图</span
>
<span class='text' v-if='this.currentMatch === 1'>验证通过</span>
<span class='text' v-if='this.currentMatch === 2'
>向右滑动滑块填充拼图</span
>
</div>
<hr class='wrapper-footer-hr' />
<div class='wrapper-footer'>
<i class='el-icon-close' @click='close'></i>
<i class='el-icon-refresh' @click='refreshPuzzle'></i>
<!--<div title='刷新验证'>
<svg
style='cursor: pointer'
@click='refreshPuzzle'
class='iconCode'
aria-hidden='true'
>
<use xlink:href='#icon-shuaxin'></use>
</svg>
</div>
<div title='关闭验证'>
<svg
style='cursor: pointer'
@click='close'
class='iconCode'
aria-hidden='true'
>
<use xlink:href='#icon-xianshi_quxiao'></use>
</svg>
</div>-->
</div>
</div>
</template>
<script>
// import { captchaY } from '@/api//api/common.js'
import { baseUrl } from '../config'
export default {
name: 'puzzle-validator',
props: {
width: {
type: Number,
default: 380
},
height: {
type: Number,
default: 190
},
isMatch: {
type: Number
}
},
watch: {
isMatch: function(val) {
this.index = val
},
currentMatch: function(val) {
if (val === 0) {
this.buttonClass = 'info'
}
if (val === 1) {
this.buttonClass = 'success'
this.$emit('onlogin')
}
if (val === 2) {
// this.refreshPuzzle()
document.getElementById('puzzle-img') && (document.getElementById('puzzle-img').style.left = '0px')
// this.buttonClass = 'danger'
this.left = 0
}
}
},
computed: {
currentMatch: {
get() {
// 回调函数 当需要读取当前属性值是执行,根据相关数据计算并返回当前属性的值
return this.index
},
set(val) {
// 监视当前属性值的变化,当属性值发生变化时执行,更新相关的属性数据
this.index = val
}
}
},
mounted() {
this.refreshPuzzle()
// this.getCaptcha()
this.oS = this.detectOS()
},
data() {
return {
oS: '',
index: this.isMatch,
// 正方形左上角坐标
horizontal: 0,
vertical: 0,
left: '0px',
disX: 0,
isDrag: false,
buttonClass: 'info',
styleObject: {
height: this.height + 60 + 59 + 'px',
width: this.width + 'px'
},
codeTag: '',
bgImg: '',
puzzleImg: '',
sideLength: '76px'
}
},
methods: {
close() {
this.$emit('close')
},
detectOS() {
return navigator.userAgent
},
refreshPuzzle() {
this.buttonClass = 'info'
// this.currentMatch=0
this.index = 0
this.left = 0
document.getElementById('puzzle-img').style.left = '0px'
this.getCaptcha()
},
async getCaptcha() {
this.getCodeTag()
await this.getX()
await this.getBackgroundImg()
await this.getPuzzleImg()
},
getCodeTag() {
this.codeTag = new Date().getTime()
},
async getX() {
const data = {
code_tag: this.codeTag
}
// TODO 获取图形拖拽验证码
// const res = await captchaY(data)
// if (res) {
// this.vertical = res.y + '%'
// document.getElementById('puzzle-img').style.top = this.vertical
// document.getElementById('puzzle-img').style.marginTop = '-40px'
// }
},
async getBackgroundImg() {
this.bgImg = `${
baseUrl
}/backend/account/captcha_img/?code_tag=${this.codeTag}&type=${1}`
},
async getPuzzleImg() {
this.puzzleImg = `${
baseUrl
}/backend/account/captcha_img/?code_tag=${this.codeTag}&type=${2}`
},
readyMove(e) {
this.isDrag = true
const odiv = e.changedTouches[0].pageX
// 算出鼠标相对元素的位置
this.disX = odiv
document.ontouchmove = em => {
this.mobileMove(em)
}
document.ontouchend = () => {
this.endDrag()
}
},
mobileMove(e) {
if (this.isDrag) {
const ml = e.changedTouches[0].pageX - this.disX
if (ml < 0) {
this.left = 0
return
}
if (ml > 0) {
this.left = e.changedTouches[0].pageX - this.disX
document.getElementById('puzzle-img').style.left = this.left + 'px'
}
}
},
endDrag() {
document.ontouchend = null
document.ontouchmove = null
this.isDrag = false
const percent = (this.left + 40) / this.width
const obj = {
code_tag: this.codeTag,
x_percent: percent.toFixed(4) * 100
}
this.$emit('getMatchInfo', obj)
},
startDrag(e) {
this.isDrag = true
const odiv = e.target
// 算出鼠标相对元素的位置
this.disX = e.clientX - odiv.offsetLeft
document.onmousemove = em => {
this.move(em)
}
document.onmouseup = () => {
this.stopDrag()
}
},
move(e) {
if (this.isDrag) {
const ml = e.clientX - this.disX
if (ml < 0) {
this.left = 0
return
}
if (ml > this.width - 40) {
this.left = this.width - 40
return
}
this.left = e.clientX - this.disX
document.getElementById('puzzle-img').style.left = this.left + 'px'
}
},
stopDrag() {
document.onmouseup = null
document.onmousemove = null
this.isDrag = false
const percent = (this.left + 40) / this.width
const obj = {
code_tag: this.codeTag,
x_percent: percent.toFixed(4) * 100
}
this.$emit('getMatchInfo', obj)
}
}
}
</script>
<style scoped>
.wrapper {
position: relative
}
.wrapper-footer {
height: 35px;
line-height: 35px;
vertical-align: middle;
color: #aaa;
font-size: 20px;
font-weight: bold
}
.wrapper-footer i {
cursor: pointer
}
.wrapper-footer-hr {
border: none;
border-top: 1px solid #eee;
width: calc(100% + 20px);
margin-left: -10px
}
.refresh {
position: absolute;
top: 5px;
right: 5px
}
.puzzle-wrapper {
position: relative
}
.dest {
position: absolute;
top: 0;
left: 0
}
.text {
user-select: none
}
.button {
position: relative;
display: flex;
align-items: center;
justify-content: center;
height: 40px;
margin-top: 10px;
border: 1px solid rgb(228, 231, 235)
}
.info {
color: #949494;
background: #dfe1e2
}
.success {
color: #fff;
background: rgb(103, 194, 58)
}
.danger {
color: #fff;
background: rgb(245, 108, 108)
}
.slide {
position: absolute;
top: 0px;
left: 0px;
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
margin-right: 15px;
background: #ffffff;
box-sizing: border-box;
color: #949494;
border: 1px solid rgb(203, 205, 209);
margin-bottom: 20px
}
</style>
<!-- 日期组件
反给父及组件选中的日期 格式为 'YYYY-MM-DD'
抛出的方法为 this.$emit('update-date', this.currentChooseTime)
-->
<template lang="pug">
.calendar-area
.choose-box.flex.justify
dropdown.flex-1(
placement="bottom-start",
offset="-2,7",
:is-list="false",
style="display: block",
)
input(
type="text",
:placeholder="$t('container.pleaseChoose')",
v-model="currentChooseTime",
@focus="showCalendar = true",
@change="changeDate",
:is-list="false",
slot="dropdown-link",
)
.datepicker-popup(
v-if="showCalendar",
slot="dropdown-list",
)
.datepicker-popup-header.flex.justify.center
.iconfont.icon-triangle-left.pointer(
@click.stop="currentMonth = currentMonth - 1"
)
.current-date
span(style="margin-right: 10px") {{ currentYear }}
span {{ currentMonth }}
.iconfont.icon-triangle-right.pointer(
@click.stop="currentMonth = currentMonth + 1"
)
.weekday
span.day-tips(v-for="week in weeks") {{ week }}
.days
span.day.last-month(
v-for="day in days.lastMonthDays",
) {{ day }}
span.day(
:class="{active: currentDay === day,'current-month': judgeIsActiveDays(day)}"
v-for="day in days.totalDay",
@click="chooseDate(day)"
) {{ day}}
span.day.next-month(
v-for="day in days.nextMonthDay",
) {{ day }}
.iconfont.icon-calendar
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class calendar extends Vue {
@Prop({ type: Number, default: 0 }) startMonth
@Prop({ type: Number, default: 0 }) startDay
showCalendar: boolean = false
currentChooseTime: string = ''
weeks: Array<string> = ['一', '二', '三', '四', '五', '六', '日']
currentMonth: number = new Date().getMonth() + 1
currentYear: number = new Date().getFullYear()
currentDay: number = new Date().getDate()
// 计算当月的天数,以及空缺位置的上月和下月日期
get days() {
const year = this.currentYear
const month = this.currentMonth
// 获取当前月份有多少天
const date = new Date(year, month, 0)
const totalDay = date.getDate()
// 获取上个月有多少天
const lastMonth = new Date(year, month - 1, 0)
const lastMonthDaysNum: number = lastMonth.getDate()
// 获取当前月份1号是星期几
const firstDay = new Date(year, month, 1)
const startDay = new Date(year + '/' + month + '/' + '01').getDay()
const placeholder = startDay === 0 ? 6 : startDay - 1
const lastMonthDays: Array<number> = []
for (let i = 0; i < placeholder; i++) {
const data: number = lastMonthDaysNum - i
lastMonthDays.unshift(data)
}
const tempSum = placeholder + totalDay
const nextMonthDay = tempSum % 7 === 0 ? 0 : 7 - (tempSum % 7)
return { totalDay, lastMonthDays, nextMonthDay }
}
get showMonth() {
return this.currentMonth < 10 ? `0${this.currentMonth}` : this.currentMonth
}
get showDay() {
return this.currentDay < 10 ? `0${this.currentDay}` : this.currentDay
}
// 判断是否是可选的日期
judgeIsActiveDays(day) {
const data = (this.startMonth < this.currentMonth ||
(this.startMonth === this.currentMonth && this.startDay <= day))
return data
}
chooseDate(day) {
const isActiveDays = this.judgeIsActiveDays(day)
if (!isActiveDays) return
this.currentDay = day
this.currentChooseTime = `${this.currentYear}-${this.showMonth}-${this.showDay}`
const params = {
year: this.currentYear,
month: this.currentMonth,
date: this.currentDay,
}
this.$emit('update-date', params)
// this.$emit('update-date', this.currentChooseTime)
}
changeDate() {
this.currentChooseTime = ''
this.$emit('update-date', this.currentChooseTime)
}
}
</script>
<style lang="sass" scoped>
.choose-box
background: #FFFFFF
border: 1px solid #D7DDE4
border-radius: 2px
width: 200px
height: 36px
padding-right: 10px
input
border: none
color: #666
.icon-calendar
// margin: 0 10px
color: #9DA7B4
.dropdown
.datepicker-popup
width: 312px
background: #FFFFFF
// border: 1px solid #D7DDE4
border-radius: 2px
.datepicker-popup-header
width: 100%
height: 50px
padding: 0 33px
border-bottom: 1px solid #E3E8EE
.iconfont
color: #9da7b4
.weekday
// border-bottom: 1px solid #E3E8EE
padding: 0 15px
.day-tips
display: inline-block
width: 40px
height: 37px
line-height: 37px
text-align: center
.days
width: 100%
padding: 0 15px 10px 15px
.day
display: inline-block
cursor: pointer
width: 40px
height: 40px
line-height: 40px
text-align: center
color: #C3CBD6
.current-month
color: #333
cursor: pointer
&:hover, &.active
background: #409EFF
border-radius: 50%
color: #FFF
.last-month, .next-month
color: #C3CBD6
</style>
<!-- 日期组件
接收参数isTimeFrame 是否显示为时间区间
isTimeFrame 若为false
反给父及组件选中的日期 格式为 'YYYY-MM-DD'
isTimeFrame 若为true
反给父级object { from: 'YYYY-MM-DD', to: 'YYYY-MM-DD'}
抛出的方法为 this.$emit('update-date', this.currentChooseTime)
-->
<template lang="pug">
.date-picker.flex.left
calendar(
@update-date="getStartDate"
)
.timeFrame.flex.left(v-if="isTimeFrame")
.interval 至
calendar(
:start-month="startMonth",
:start-day="startDate",
@update-date="getEndDate",
)
</template>
<script lang="ts">
import calendar from './_calendar.vue'
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component({
components: { calendar },
})
export default class datePicker extends Vue {
@Prop({ type: Boolean, default: true }) isTimeFrame
startYear: number = new Date().getFullYear()
startMonth: number = new Date().getMonth() + 1
startDate: number = new Date().getDate()
endYear: number = new Date().getFullYear()
endMonth: number = new Date().getMonth() + 1
endDate: number = new Date().getDate()
get showStartDate() {
const month = this.getShowDate(this.startMonth)
const day = this.getShowDate(this.startDate)
return `${this.startYear}-${month}-${day}`
}
get showEndDate() {
const month = this.getShowDate(this.endMonth)
const day = this.getShowDate(this.endDate)
return `${this.endYear}-${month}-${day}`
}
getShowDate(Date) {
return Date < 10 ? `0${Date}` : Date
}
getStartDate(val) {
if (!val) {
this.$emit('update-date', val)
return
}
this.startYear = val.year
this.startMonth = val.month
this.startDate = val.date
if (!this.isTimeFrame) {
this.$emit('update-date', this.showStartDate)
}
// else {
// this.$emit('update-date', `${this.showStartDate}_${this.showEndDate}`)
// }
}
getEndDate(val) {
if (!val) {
this.$emit('update-date', val)
return
}
this.endYear = val.year
this.endMonth = val.month
this.endDate = val.date
this.$emit('update-date', `${this.showStartDate}_${this.showEndDate}`)
}
}
</script>
<style lang="sass" scoped>
.date-picker
.interval
margin: 0 20px
color: #666
</style>
<!-- yaml编辑组件 -->
<template lang="pug">
codemirror.mirror-content(
ref="codeMirror",
:value="value",
:options="editorOptions",
@input="inputValue",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import { codemirror } from 'vue-codemirror'
import jsonYaml from 'js-yaml'
import 'codemirror/lib/codemirror.css'
import 'codemirror/mode/yaml/yaml.js'
@Component({
components: { codemirror },
})
export default class Code extends Vue {
@Prop({ default: null }) yaml
value: string = ''
get editorOptions() {
return {
tabSize: 2,
mode: 'text/x-yaml',
// lineWrapping: true,
}
}
get codemirror() {
return (this.$refs.codeMirror as any).codemirror
}
@Watch('yaml', { immediate: true })
init(val) {
try {
this.value = val ? jsonYaml.safeDump(val) : ''
} catch (e) {
this.$notify.error({
title: 'yaml格式错误',
message: e.message,
})
}
setTimeout(() => {
this.codemirror.setSize('100%', '100%')
})
}
inputValue(val) {
// 该事件暂时只需要获知输入内容,不需要转换
this.$emit('change', val)
}
submit() {
const value = this.codemirror.getValue()
try {
const jsonResult = jsonYaml.safeLoad(value)
return jsonResult
} catch (err) {
Toast.danger(vm.$t('public.yamlFormatError'))
}
}
}
</script>
<style lang="sass" scoped>
.mirror-content
overflow-y: auto
</style>
<style lang="sass">
.mirror-content
.CodeMirror
padding: 10px 15px
background: inherit
</style>
import Http from '@/http'
import { baseUrl } from '@/config'
import imgPretreat from '@/helpers/img-pretreat'
interface trData {
index: number,
data: { [key:string]: { index: number, type: string, value: any, originType: string } },
}
interface tdData {
index: number, type: string, value: any, originType: string
}
function base64toText(base64, type): Promise<any> {
// 将base64转为Unicode规则编码
const bstr = window.atob(base64)
let n = bstr.length
const u8arr = new Uint8Array(n)
let blobDate: any = {}
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
blobDate = new Blob([u8arr], { type })
// return this.blobToText(blobDate, type)
return new Promise((resolve, reject) => {
const fileReader = new FileReader()
const codeStyle = type.split('/')[1] === 'csv'
? 'GB18030'
: 'utf-8'
fileReader.readAsText(blobDate, codeStyle)
fileReader.onload = e => {
resolve(fileReader.result!)
}
})
}
export function formatDataList(propertyList): trData[] {
function classifyResource(contentType): string {
if (/^image/.test(contentType)) return 'image'
if (/^audio/.test(contentType)) return 'audio'
if (/^video/.test(contentType)) return 'video'
if (/^(text|application\/xml)/.test(contentType)) return 'text'
return 'unknow'
}
return _.map(propertyList, item => {
return {
index: item.index,
// type: classifyResource(item.format.contentType),
// data: item.data,
// conver: '',
data: _.reduce(item.data, (result, value, key) => {
const type = item.format[key] ? classifyResource(item.format[key]) : ''
result[key] = { index: item.index, type, value, originType: item.format[key] }
return result
}, {}),
}
})
}
export async function getConverData(rawDatasetId: number, dataList: trData[]) {
async function getImageData(dataUrl: string, tdData: tdData) {
const imgEle = await imgPretreat(dataUrl)
tdData.value = imgEle || ''
}
async function getMediaData(dataUrl: string, tdData: tdData) {
tdData.value = dataUrl
}
async function getTextData(dataUrl: string, tdData: tdData) {
const textData = await Http.get(dataUrl, {}, { routerCancel: true, valid_code: false })
tdData.value = textData
}
const requestList: Promise<void>[] = []
_.forEach(dataList, trData => {
_.forEach(trData.data, (tdData, tdIndex) => {
const dataUrl = `${baseUrl}/kplrecord/${rawDatasetId}/${trData.index}?key=${tdIndex}`
if (tdData.type === 'image') requestList.push(getImageData(dataUrl, tdData))
if (tdData.type === 'audio') requestList.push(getMediaData(dataUrl, tdData))
if (tdData.type === 'video') requestList.push(getMediaData(dataUrl, tdData))
if (tdData.type === 'text') requestList.push(getTextData(dataUrl, tdData))
})
})
await Promise.all(requestList)
}
<!-- 数据属性弹窗 -->
<template lang="pug">
popup.familiar(
:show.sync="showPopup",
popup-style="width: 500px; height: 400px",
fixed-size,
@dismiss="",
)
.popup-header(slot="header")
span {{$t('public.dataAttr')}}
.popup-body(slot="body")
.content {{ value }}
.popup-footer.flex.right(slot="footer")
.buttons.flex
button.btn.btn-gray(@click="showPopup = false") {{$t('public.cancel')}}
button.btn.btn-important(@click="confirm") {{$t('pipeline.copy')}}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import { copyText } from '@/utils/dom'
@Component
export default class datasetKeyPopup extends Vue {
@Prop({ type: Boolean, default: false }) show
@Prop({ default: '' }) value
get showPopup() { return this.show }
set showPopup(val) { this.$emit('update:show', val) }
// 确认赋值
confirm() {
const type = typeof this.value
copyText(type === 'object' ? JSON.stringify(this.value) : this.value)
this.showPopup = false
}
}
</script>
<style lang="sass" scoped>
.popup-body
padding: 30px
overflow: hidden
.content
line-height: 20px
height: 100%
overflow-y: auto
white-space: pre-wrap
</style>
<template lang="pug">
.popup-container
.img-preview.flex.column
.header.flex.right
.iconfont.icon-close(
@click.stop="propShow = false"
)
.preview-content.flex-1.flex.justify
.option-button.flex.center.pointer(
@click="switchPicture(currentImageIndex - 1)",
)
.iconfont.icon-lastpicture(
:class="{disabled: isFirstPicture}",
)
.option-zoom.flex
.btn-left
.btn-item.pointer(@click="doScale('zoomUp')")
span.iconfont.icon-zoom-in
.btn-item.pointer(@click="doScale('zoomDown')")
span.iconfont.icon-zoom-out
.large-img-container.flex-1.flex.column
data-empty(
v-if="!currentImage",
is-loading,
:tip-text="$t('public.noFindeData')",
)
mark-picture.flex-1(
v-else,
ref="mark",
:type="currentAnnotationForm",
:img-ele="currentImage.value",
:mark-info="currentMarkInfo",
:is-add-text="isAddText",
:zoom-scale="zoomValue",
@update-mark-info="updateMarkInfo"
)
.option-label
.label-info
template(v-if="currentRenderForm === 'out' &&\
currentLabel === 'object' &&\
currentAnnotationForm === 'boxing'")
.label-item.flex.left(
v-if="item.name",
v-for="item in formatLabelData",
:class="{active: currentNameList.includes(item.name)}",
)
.label-color(
:style="{background: item.lineColor}"
)
.label-name.flex-1.no-wrap {{ item.name }}
.option-button.flex.center.pointer(
@click="switchPicture(currentImageIndex + 1)",
)
.iconfont.icon-nextpicture(
:class="{disabled: isLastPicture}",
)
.cut-content.flex.center
.bottom-info-container
.choose-type.flex.left
.choose-item
.title {{$t('dataSet.markMethod')}}
v-select.select-item(
:innerStyle="innerStyle",
:notFound="$t('public.noFindeResult')",
:placeholder="$t('container.pleaseChoose')",
:notMatchText="$t('container.pleaseChoose')"
:options="labelMethodList | options('key')",
:value="currentAnnotationForm",
@change="changeAnnotationForm",
)
.choose-item
.title {{$t('public.markParam')}}
v-select.select-item(
:innerStyle="innerStyle",
:notFound="$t('public.noFindeResult')",
:placeholder="$t('container.pleaseChoose')",
:notMatchText="$t('container.pleaseChoose')"
:options="labelList",
:value="currentLabel",
@change="repaint",
)
.choose-item(v-if="currentAnnotationForm === 'boxing'")
.title {{$t('public.colour')}}
v-select.select-item(
:innerStyle="innerStyle",
:notFound="$t('public.noFindeResult')",
:placeholder="$t('container.pleaseChoose')",
:notMatchText="$t('container.pleaseChoose')"
:options="renderFormList | options('key')",
:value="currentRenderForm",
@change="changeRenderForm",
)
.cutout
.cut-item(
v-for="item in cutList",
v-if="item.content",
)
.img(:style="`background-image:url(${item.content})`")
.cut-name.no-wrap {{ item.name }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import { getElementProps } from '@/utils/dom'
import { getClipArray } from './clip'
import markPicture from '@/components/mark-view/index.vue'
interface markItem {
name: string,
xmin: number,
xmax: number,
ymin: number,
ymax: number,
}
@Component({
components: { markPicture },
})
export default class detailImage extends Vue {
$refs!: {
mark: HTMLFormElement,
}
@Prop({ type: Boolean, default: false }) show
// @Prop({ type: Array, default: () => [] }) imgList
@Prop({ type: Object, default: null }) imgGroup
// 起始打开文件Id
@Prop({ type: Object, required: true }) openMeta
@Prop({ type: Object, default: () => {} }) attributesList
// 该数据集的标注方式
@Prop({ type: String, default: '' }) labelMethod
// 当前图片对象位置
currentImageIndex: number = 0
// 当前标注形式
currentAnnotationForm: string = this.labelMethod
// 当前标签渲染形式
currentRenderForm: string = 'in'
labelViewInfo: {}[] = []
// 当前标注字段
currentLabel: string = ''
// 缩放次数
scaleCount: number = 5
// 图片缩放比例
zoomValue: number = 1
cutList: {}[] = []
// 图外标注列表
formatLabelData: {}[] = []
get innerStyle() {
return { background: '#494a4b', border: 'none' }
}
get propShow() { return this.show }
set propShow(val) { this.$emit('update:show', val) }
get imgList() {
if (!this.imgGroup) return []
return this.imgGroup[this.openMeta.key]
}
// 标注形式可选列表
get labelMethodList() { return this.$store.getters.labelMethodList || [] }
// 标注字段列表
get labelList() {
const currentProperties = _.get(this.attributesList, 'properties')
const currentList = _.keys(currentProperties[this.currentImageIndex].data)
return _.pull(currentList, 'content', 'contentType', 'path')
}
get isAddText() { return this.currentRenderForm === 'in' }
// 渲染形式列表
get renderFormList() {
return [{
key: 'in',
name: vm.$t('public.imgIn'),
}, {
key: 'out',
name: vm.$t('public.imgBeside'),
}]
}
get currentNameList() {
const currentData: any = _.filter(this.labelViewInfo, 'isContain')
return _.map(currentData, 'name')
}
// 当前是第一张图片
get isFirstPicture() {
return this.currentImageIndex <= 0
}
// 当前是最后一张图片
get isLastPicture() {
return this.currentImageIndex >= this.imgList.length - 1
}
get currentImage(): { index: number, value: HTMLImageElement, type: string } | null {
if (_.isEmpty(this.imgList)) return null
return this.imgList[this.currentImageIndex]
}
get currentTrData(): { [key: string]: any } {
if (!this.currentImage) return {}
const property = _.find(this.attributesList.properties, { index: this.currentImage.index })
const data = _.get(property, 'data') || {}
// 语义分割图片 mask: HTMLImageElement
if (this.imgGroup.mask) {
data.mask = _.get(_.find(this.imgGroup.mask, { index: this.currentImage.index }), 'value')
}
return data
}
get currentMarkInfo(): markItem[] {
if (!this.currentImage || !this.currentLabel) return []
// 标注形式为矩形框标注且标注字段为object 或 标注形式为语义分割注且标注字段为mask
// 有标注信息
return ((['object', 'class_name'].includes(this.currentLabel) &&
['boxing', 'single_label_classification'].includes(this.currentAnnotationForm)) ||
(this.currentLabel === 'mask' && this.currentAnnotationForm === 'segmentation'))
? this.currentTrData[this.currentLabel] || []
: []
}
created() { document.body.classList.add('back-hidden') }
@Watch('openMeta.index', { immediate: true })
onCurrentImgShow(val) {
// 初始标签显示方式
// this.currentAnnotationForm = this.labelMethodList[0].key
// 获取当前打开数据的序号
this.currentImageIndex = _.findIndex(this.imgList, { index: val })
}
@Watch('currentImage.value', { immediate: true })
drawImage() {
if (!this.currentImage || !this.currentImage.value) return
const labelKeys = _.keys(this.currentTrData)
if (labelKeys.includes('mask')) {
// 如果包含mask字段 则设置标注方式为 语义分割segmentation
this.currentAnnotationForm = 'segmentation'
this.currentLabel = 'mask'
} else if (labelKeys.includes('object')) {
// 如果包含object字段 则设置标注方式为 矩形框标注 boxing
this.currentAnnotationForm = 'boxing'
this.currentLabel = 'object'
} else if (labelKeys.includes('class_name')) {
// 如果包含class_name字段 则设置标注方式为 单标签分类 single_label_classification
this.currentAnnotationForm = 'single_label_classification'
this.currentLabel = 'class_name'
}
if (this.currentAnnotationForm === 'boxing') {
this.cutList = getClipArray(this.currentImage.value, this.currentMarkInfo)
}
}
// 按顺序上下切换图片
switchPicture(imageIndex) {
if (imageIndex < 0 || imageIndex > this.imgList.length - 1) return
this.currentImageIndex = imageIndex
this.cutList = []
this.zoomValue = 1
this.formatLabelData = []
}
// 图片缩放事件
doScale(option) {
const maxCount = this.scaleCount * 1.5
const minCount = 1 / (this.scaleCount * 1.5)
if (option === 'zoomUp' && this.zoomValue >= maxCount) return
if (option === 'zoomDown' && this.zoomValue <= minCount) return
switch (option) {
case 'zoomUp':
this.zoomValue *= 1.5
break
case 'zoomDown':
this.zoomValue /= 1.5
break
}
}
// 修改标注形式
changeAnnotationForm(val) {
this.currentAnnotationForm = val
this.cutList = []
if (this.currentImage && this.currentAnnotationForm === 'boxing') {
this.cutList = getClipArray(this.currentImage.value, this.currentMarkInfo)
}
}
// 标注字段改变 重绘
repaint(val) {
this.currentLabel = val
this.drawPage()
if (this.currentImage && this.currentAnnotationForm === 'boxing') {
this.cutList = getClipArray(this.currentImage.value, this.currentMarkInfo)
}
}
// 渲染形式改变 重绘
changeRenderForm(val) {
this.currentRenderForm = val
this.drawPage()
}
// 更新标注信息 添加标注框颜色信息等
updateMarkInfo(val) {
this.labelViewInfo = val
if (this.formatLabelData.length) return
this.formatLabelData = _.uniqBy(this.labelViewInfo, 'name')
}
drawPage() {
this.$refs.mark.drawPage(this.isAddText)
}
}
</script>
<style lang="sass" scoped>
.popup-container
position: fixed
z-index: 901
left: 0
right: 0
top: 0
bottom: 0
overflow: auto
background: rgba(0, 0, 0, .85)
.img-preview
height: 100%
min-height: 600px
min-width: 1200px
box-shadow: 0 0 5px rgba(0,0,0,.2)
.header
width: 100%
height: 50px
min-height: 50px
padding-right: 50px
.icon-close
cursor: pointer
font-size: 18px
color: #fff
z-index: 903
// opacity: 1
.preview-content
width: 100%
overflow: hidden
.option-button
position: relative
width: 120px
min-width: 120px
height: 100%
.iconfont
font-size: 38px
color: #fff
&.left
transform: rotate(180deg)
.disabled
opacity: .24
.option-zoom, .option-label
height: 100%
width: 120px
min-width: 120px
padding: 0 9px 0 14px
.option-zoom
justify-content: flex-end
.btn-left
.btn-item
background: rgba(0, 0, 0, .5)
border-radius: 2px
width: 43px
height: 43px
margin-bottom: 2px
text-align: center
line-height: 43px
.iconfont
font-size: 24px
color: #fff
&:hover
color: #409EFF
.option-label
.label-info
height: 100%
width: 100%
overflow-y: auto
.label-item
opacity: .5
&.active
opacity: 1
.label-color
width: 10px
height: 10px
border-radius: 50%
background: #ffda38
vertical-align: middle
.label-name
margin-left: 10px
color: #fff
.large-img-container
height: 100%
overflow: hidden
text-align: center
position: relative
.cut-content
height: 230px
width: 100%
min-height: 230px
padding-bottom: 50px
.bottom-info-container
height: 180px
width: 645px
min-height: 180px
justify-content: center
padding-top: 18px
.choose-type
.choose-item
margin-right: 20px
.title
font-size: 12px
color: #999999
margin-bottom: 10px
.select-item
width: 193px
color: #fff
.cutout
height: 100px
overflow-y: auto
width: 100%
margin-top: 21px
.cut-item
width: 75px
display: inline-block
color: #fff
margin: 0 5px 10px 0
.img
width: 50px
height: 50px
background-repeat: no-repeat
background-size: contain
background-position: center
margin: 0 auto
.cut-name
text-align: center
margin-top: 5px
</style>
<template lang="pug">
.data-td(v-if="display")
.image.flex.center(
v-if="display.type === 'image'",
@click="$emit('show-image', dataItem.index, keyItem.key)",
:class="changeLang?'dataset-detailJa':usedBy",
)
template(v-if="display.value")
img(:src="display.value.src")
.audio.flex.left(
v-if="display.type === 'audio'",
:class="changeLang?'audioJa':usedBy",
)
template(v-if="display.value")
.placeholder-icon(
v-if="!isPlaying"
@click="isPlaying = true",
)
img(src="@/assets/file-icon/audio.png")
audio(
v-else,
controls,
autoplay="autoplay",
controlsList="nodownload",
)
source(
:type="display.originType",
:src="display.value",
)
.video.flex.left(
v-if="display.type === 'video'",
:class="changeLang?'videoJa':usedBy",
)
template(v-if="display.value")
.placeholder-icon(
@click="isPlaying = true",
)
img(src="@/assets/file-icon/video.png")
video-preview(
:show.sync="isPlaying",
:data="display",
)
.text.pointer(
ref="textWrap",
v-if="display.type === 'text'",
v-tooltip-on-clip="tooltipOption",
@click="showText",
)
span {{ display.text | placeholder }}
.unknow(v-if="display.type === 'unknow'")
span {{$t('public.noKnowType')}}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component({
components: {
videoPreview: () => import(/* webpackChunkName: "dataset" */ './_video-preview.vue'),
},
})
export default class dataTd extends Vue {
$refs!: {
textWrap: HTMLLabelElement,
}
// 当前 行数据
@Prop({ type: Object, default: null }) dataItem
// 当前 列数据
@Prop({ type: Object, default: null }) keyItem
// 被使用于 默认使用于数据详情页的数据属性 另外一种使用于工作空间数据详情侧边栏
// dataset-detail | workspace
@Prop({ type: String, default: 'dataset-detail' }) usedBy
isPlaying: boolean = false
changeLang:boolean = false
// get contentType() { return this.dataItem.data.contentType || '' }
get tooltipOption() {
return {
value: this.display && this.display.value,
appendTo: this.usedBy === 'workspace' ? document.body : 'parent',
}
}
get display() {
const tdData = _.get(this.dataItem.data, [this.keyItem.key])
if (['ByteArray', 'File'].includes(this.keyItem.type)) {
let text = ''
if (tdData.type === 'text') {
const temp = typeof tdData.value === 'object' ? JSON.stringify(tdData.value) : tdData.value
text = _.truncate(temp, { length: 200 })
}
return {
...tdData,
text,
}
}
const text = typeof tdData.value === 'object' ? JSON.stringify(tdData.value) : tdData.value
const result: { type: string, value: string, text: string } = {
...tdData,
type: 'text',
text: _.truncate(text, { length: 200 }),
}
return result
}
showText(event) {
const tirggerEle = this.$refs.textWrap
if (!tirggerEle.contains(event.target)) return
if (tirggerEle.clientWidth >= tirggerEle.scrollWidth) return
this.$emit('show-text', this.display!.value)
}
@Watch('$route', { immediate: true })
changeLanguage() {
if (this.$route.params.lang === 'zh-cn') {
this.changeLang = false
} else {
this.changeLang = true
}
}
}
</script>
<style lang="sass" scoped>
.data-td
img
max-height: 100%
max-width: 100%
.text
white-space: nowrap
overflow: hidden
&[tabindex]
text-overflow: ellipsis
&:hover
text-decoration: underline
color: #378DFF
.unknow
color: #CCC
white-space: nowrap
overflow: hidden
.image
width: 40px
&.workspace
height: 40px
background: #D8D8D8
&.dataset-detail
height: 30px
background: #D8D8D8
cursor: pointer
position: relative
&::after
display: none
position: absolute
content: '查看'
top: 0
left: 0
width: 100%
height: 100%
color: #FFF
line-height: 30px
text-align: center
&:hover::after
display: block
background: rgba(0,0,0,0.5)
&.dataset-detailJa
height: 30px
background: #D8D8D8
cursor: pointer
position: relative
&::after
display: none
position: absolute
content: '詳細'
top: 0
left: 0
width: 100%
height: 100%
color: #FFF
line-height: 30px
text-align: center
&:hover::after
display: block
background: rgba(0,0,0,0.5)
.audio, .video
.placeholder-icon
width: 30px
height: 30px
cursor: pointer
position: relative
text-align: center
&::after
display: none
position: absolute
content: '播放'
top: 0
left: 0
width: 100%
height: 100%
color: #FFF
line-height: 30px
&:hover::after
display: block
background: rgba(0,0,0,0.5)
.audioJa, .videoJa
.placeholder-icon
width: 30px
height: 30px
cursor: pointer
position: relative
text-align: center
&::after
display: none
position: absolute
content: '放送'
top: 0
left: 0
width: 100%
height: 100%
color: #FFF
line-height: 30px
&:hover::after
display: block
background: rgba(0,0,0,0.5)
.audio
// 该宽度是火狐显示音量调节的最小宽度
width: 270px
&.workspace
height: 40px
&.dataset-detail
height: 30px
audio
width: 100%
height: 30px
</style>
<!-- 视频播放 -->
<template lang="pug">
.video-player(v-if="propShow")
.mask
.video-content.flex.center(@click.stop="propShow = false")
video(
controls,
autoplay="autoplay",
controlsList="nodownload",
width="800",
height="600",
@click.stop="",
)
source(
:type="data.originType",
:src="data.value",
)
p Your browser doesn't support HTML5 video.
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class VideoPreview extends Vue {
@Prop({ type: Object, required: true }) data
@Prop({ type: Boolean, default: false }) show
get propShow() { return this.show }
set propShow(val) { this.$emit('update:show', val) }
}
</script>
<style lang="sass" scoped>
.video-player
.mask
position: fixed
z-index: 901
left: 0
right: 0
top: 0
bottom: 0
background-color: rgba(0,0,0,.8)
.video-content
padding: 0
position: fixed
top: 0
left: 0
right: 0
bottom: 0
z-index: 902
</style>
interface markItem {
name: string,
xmin: number,
xmax: number,
ymin: number,
ymax: number,
}
export function getClipArray(imgEle: HTMLImageElement, currentMarkInfo: markItem[]) {
const canvas = document.createElement('canvas')
canvas.width = imgEle.width
canvas.height = imgEle.height
const context = canvas.getContext('2d')
context!.drawImage(imgEle, 0, 0)
if (!_.isArray(currentMarkInfo)) return []
const result = _.map(currentMarkInfo, clipItem => {
if (typeof clipItem.xmax !== 'number') return null
if (clipItem.xmin >= clipItem.xmax || clipItem.ymin >= clipItem.ymax) return null
const clipImage: ImageData = context!.getImageData(
clipItem.xmin,
clipItem.ymin,
clipItem.xmax - clipItem.xmin,
clipItem.ymax - clipItem.ymin,
)
return {
name: clipItem.name,
content: createNewCanvas(clipImage),
}
})
return <{ name: string, content: string }[]>_.without(result, null)
}
// 将canvas转换为base64
function createNewCanvas(clipImage: ImageData) {
const canvas = document.createElement('canvas')
const context = canvas.getContext('2d')
canvas.width = clipImage.width
canvas.height = clipImage.height
context!.putImageData(clipImage, 0, 0)
return canvas.toDataURL()
}
'use strict'
function Point(x:number, y:number): { x:number, y:number } {
return {
x: x,
y: y,
}
}
// function calcNewPoint(point: any, pCenter: any, angle: any): any {
// const newAngle = (angle * Math.PI) / 180
// const cosv = Math.cos(newAngle)
// const sinv = Math.sin(newAngle)
// const newX = (point.x - pCenter.x) * cosv - (point.y - pCenter.y) * sinv + pCenter.x
// const newY = (point.x - pCenter.x) * sinv + (point.y - pCenter.y) * cosv + pCenter.y
// return Point(newX, newY)
// }
// 获取rotbox四个顶点坐标
// function getPointCoordinates(width, height, x, y, angle) {
// const halfHeight = height / 2.0
// const halfWidth = width / 2.0
// const pCenter = Point(x, y)
// // 获取左上角坐标 中心坐标 x 减去宽的一半,中心坐标 y 加上高的一半
// const topLeft = Point(x - halfWidth, y + halfHeight)
// // 右上角坐标 中心坐标 x 加宽的一半 中心坐标y 加高的一半
// const topRight = Point(x + halfWidth, y + halfHeight)
// // 左下角坐标 中心坐标 x 减宽的一半 中心坐标y 减去 高的一半
// const bottomLeft = Point(x - halfWidth, y - halfHeight)
// // 右上角坐标 中心坐标 x 加宽的一半 中心坐标y 减去 高的一半
// const bottomRight = Point(x + halfWidth, y - halfHeight)
// const pointArr: { x: number, y: number }[] = []
// pointArr.push(calcNewPoint(topLeft, pCenter, -angle))
// pointArr.push(calcNewPoint(topRight, pCenter, -angle))
// pointArr.push(calcNewPoint(bottomRight, pCenter, -angle))
// pointArr.push(calcNewPoint(bottomLeft, pCenter, -angle))
// return pointArr
// }
// 绘制多边形框
function drawRectangle(ctx, pointArr, data, isAddText) {
pointArr.forEach((pointItem, index) => {
if (index === 0) {
ctx.strokeStyle = data.lineColor
ctx.beginPath()
ctx.moveTo(pointItem.x, pointItem.y)
return
}
ctx.lineTo(pointItem.x, pointItem.y)
if (index === pointArr.length - 1) {
ctx.closePath()
ctx.font = '18px Arial'
ctx.lineWidth = '3'
ctx.fillStyle = data.lineColor
ctx.globalAlpha = data.isContain ? 1 : 0.5
const name = data.display_name || data.name
if (name && isAddText) {
// 获取文字的高
// const height = ctx.measureText(data.name).actualBoundingBoxAscent * 2 + 2
// 背景矩形的高
const height = 23
const isBeyondEdges = pointArr[3].y <= height
const rectX = isBeyondEdges ? pointArr[3].x : pointArr[3].x - 1.5
const rectY = isBeyondEdges ? pointArr[3].y : pointArr[3].y - height
ctx.fillRect(rectX, rectY, ctx.measureText(data.name).width + 6, height)
ctx.textAlign = 'top'
ctx.fillStyle = '#fff'
ctx.shadowBlur = 1
ctx.shadowColor = 'rgba(0,0,0,0.5)'
const namaY = isBeyondEdges ? pointArr[3].y + 16 : pointArr[3].y - 6
ctx.fillText(name, pointArr[3].x + 2, namaY)
}
ctx.stroke()
}
})
}
// 获取bndbox 四个点坐标
function getBndboxCoordinates(data, zoomRate) {
const xmin = data.xmin * zoomRate
const xmax = data.xmax * zoomRate
const ymin = data.ymin * zoomRate
const ymax = data.ymax * zoomRate
const pointA = Point(xmin, ymax)
const pointB = Point(xmax, ymax)
const pointC = Point(xmax, ymin)
const pointD = Point(xmin, ymin)
const pointArr: { x:number, y:number }[] = []
pointArr.push(pointA, pointB, pointC, pointD)
return pointArr
}
// 绘制斜框检测图的方向线
// function drawDirectionLine(ctx, data, zoomRate, rotate) {
// const centerLine = +data.rotbox.w > +data.rotbox.h
// ? data.rotbox.w / 2 * zoomRate
// : data.rotbox.h / 2 * zoomRate
// const x = Math.cos(Math.PI / 180 * rotate) * centerLine + (data.rotbox.x * zoomRate)
// const y = Math.sin(Math.PI / 180 * rotate) * centerLine + (data.rotbox.y * zoomRate)
// ctx.beginPath()
// ctx.moveTo(data.rotbox.x * zoomRate, data.rotbox.y * zoomRate)
// ctx.lineTo(x, y)
// ctx.stroke()
// }
// 绘制斜框检测图
// function drawSkewFrameDetection(ctx, data, zoomRate, location, allLabelInfo) {
// const width = +data.rotbox.w * zoomRate
// const height = +data.rotbox.h * zoomRate
// const xCenter = +data.rotbox.x * zoomRate
// const yCenter = +data.rotbox.y * zoomRate
// const pointArr = getPointCoordinates(width, height, xCenter, yCenter, +data.rotbox.a)
// drawRectangle(ctx, pointArr, data, location, allLabelInfo)
// const rotate = -data.rotbox.a
// drawDirectionLine(ctx, data, zoomRate, rotate)
// }
// 绘制四边形
export function drawBndBox(ctx, data, zoomRate, isAddText: boolean = true) {
const bndArr = getBndboxCoordinates(data, zoomRate)
drawRectangle(ctx, bndArr, data, isAddText)
}
// 获取当前标注框的displayname
// function getDisplayName(data, allLabelInfo) {
// const currentLabel = data.display_name || data.name
// if (!allLabelInfo.currentLabels.includes(currentLabel)) {
// allLabelInfo.currentLabels.push(currentLabel)
// }
// }
// 根据不同的类别绘制标注框
// export function drawCanvasBox(ctx, data, zoomRate, location, allLabelInfo) {
// if (data.bndbox) {
// drawBndBox(ctx, data, zoomRate, location, allLabelInfo)
// } else if (data.rotbox) {
// drawSkewFrameDetection(ctx, data, zoomRate, location, allLabelInfo)
// }
// }
<!-- 算法/数据集/模型/处理器 编辑弹窗 -->
<template lang="pug">
popup.familiar(
:show.sync="propShow",
popup-style="width: 500px",
:percent-height=.8
@dismiss="setPropShow()",
)
.popup-header(slot="header")
.title {{this.$t('public.copy')}}
.popup-body(slot="body")
.top-tips {{$t('copy.fontAutoAdd')}}{{ typeText }}{{$t('copy.autoAddBack')}}
form-table(
ref="formTable"
:format-data="formatData",
:result-data="resultData",
:label-width="110",
style="width: 430px;margin-left: -4px",
)
.popup-footer(slot="footer")
.flex-1.flex.right
st-button(
@click="setPropShow()",
) {{$t('public.cancel')}}
st-button(
type="primary"
@click="confirm",
) {{$t('public.confirm')}}
</template>
<script lang="ts">
import { Vue, PropSync, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class dataEdit extends Vue {
$refs!: { formTable: any }
@PropSync('show', { type: Boolean, default: false }) propShow
@Prop({ type: String, default: '' }) type
@Prop({ type: Array, default: () => [] }) idList
resultData: { target_space_id: number } = {
target_space_id: 0,
}
spaceList: {}[] = []
get formatData(): {}[] {
return [
{
label: `${this.$t('copy.copyToSpace')}:`,
type: 'select',
key: 'target_space_id',
props: { options: this.$options.filters!.options(this.spaceList, 'id') },
validator: val => { if (!val) return vm.$t('model.chooseTarget') },
},
]
}
get typeText(): string {
switch (this.type) {
case 'dataset': return `${this.$t('navigation.dataSet')}`
case 'dataset_fs': return `${this.$t('navigation.dataSet')}`
case 'algo': return `${this.$t('index.algorithm')}`
case 'model': return `${this.$t('navigation.model')}`
case 'container': return `${this.$t('navigation.container')}`
default: return ''
}
}
setPropShow() {
this.propShow = false
if (this.type === 'dataset') {
this.$store.commit('uploadSerializedCopyPopup', false)
}
if (this.type === 'dataset_fs') {
this.$store.commit('uploadOriginCopyPopup', false)
}
}
async created() {
}
async confirm() {
const result = await this.$refs.formTable.submit()
const params = { ...result, id_list: this.idList }
if (!result) return
const requestMethod = (() => {
const params = { ...result, id_list: this.idList }
switch (this.type) {
// case 'dataset': return () => Dataset.copy(params)
// case 'dataset_fs': return () => Dataset.copyOrigin(params)
// case 'algo': return () => Algo.copy(params)
// case 'model': return () => Model.copy(params)
// case 'container': return () => Container.copy(params)
default: return () => {}
}
})()
const response = await requestMethod()
this.dealResponse(response)
}
dealResponse(res) {
if (res.code !== 'Success') return
Toast.success(this.$t('public.copyBackOpen', { type: this.typeText }))
this.propShow = false
if (this.type === 'container') {
// 如果是拷贝容器,显示弹出框提示
this.$emit('showMsg', res.data)
}
if (this.type === 'dataset') {
this.$store.commit('uploadSerializedCopyPopup', false)
}
if (this.type === 'dataset_fs') {
this.$store.commit('uploadOriginCopyPopup', false)
}
}
}
</script>
<style lang="sass" scoped>
.popup-body
padding: 10px 20px 0px 20px
.top-tips
font-size: 12px
margin: 10px 0
table.form
td:first-child
padding-top: 16px
input
width: 100%
</style>
<!-- 删除算法/数据集/模型/处理器 确认 -->
<template lang="pug">
popup.familiar(
:show.sync="propShow",
popup-style="width: 500px",
:percent-height=.8
@dismiss="propShow = false",
)
.popup-header(slot="header")
.title {{ typeText }}
.popup-body(slot="body")
.top-tips
.warning-tips {{ typeNoCover }}
.text-tips(v-if="detail")
span {{typePropName}}
span.algo-name {{ detail.name }}
span {{$t('public.confirmDeleteD')}}
.input-area
.key {{$t('public.confirmName')}}
input.input-text(
type="text",
:placeholder="typePlaceholder",
v-model="name",
@focus="showErrorTips = false",
)
.popup-footer.flex.justify(slot="footer")
.error-tips(
v-if="showErrorTips"
) {{ typeText }}{{$t('public.nameInputError')}}
.flex-1.flex.right
.btn.btn-gray(
@click="propShow = false",
) {{$t('public.cancel')}}
.btn.btn-important(
@click="confirm",
:disabledLabel="$t('public.handleing')"
) {{$t('public.confirm')}}
</template>
<script lang="ts">
import { Vue, PropSync, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class dataDelete extends Vue {
@PropSync('show', { type: Boolean, default: false }) propShow
@Prop({ type: Object, default: null }) detail
@Prop({ type: String, default: '' }) type
showErrorTips: boolean = false
name: string = ''
get typeText(): string {
switch (this.type) {
case 'dataset': return vm.$t('public.deleteDataset')
case 'dataset_fs': return vm.$t('public.deleteDataset')
case 'algo': return vm.$t('public.deleteAlgo')
case 'model': return vm.$t('public.deleteModel')
default: return ''
}
}
get typeNoCover(): string {
switch (this.type) {
case 'dataset': return vm.$t('public.dataSetNoCover')
case 'dataset_fs': return vm.$t('public.dataSetNoCover')
case 'algo': return vm.$t('public.algoNoCover')
case 'model': return vm.$t('public.modelNoCover')
default: return ''
}
}
get typePlaceholder(): string {
switch (this.type) {
case 'dataset': return vm.$t('public.inputDeleteDataset')
case 'dataset_fs': return vm.$t('public.inputDeleteDataset')
case 'algo': return vm.$t('public.inputDeleteAlgo')
case 'model': return vm.$t('public.inputDeleteModel')
default: return ''
}
}
get typePropName(): string {
switch (this.type) {
case 'dataset': return vm.$t('public.deleteDatasetName')
case 'dataset_fs': return vm.$t('public.deleteDatasetName')
case 'algo': return vm.$t('public.deleteAlgoName')
case 'model': return vm.$t('public.deleteModelName')
default: return ''
}
}
@Watch('propShow', { immediate: true })
resetForm(val) {
if (!val) return
this.name = ''
}
async confirm() {
if (this.name !== this.detail.name || !this.name) {
this.showErrorTips = true
return
}
this.showErrorTips = false
const requestMethod = (() => {
switch (this.type) {
// case 'dataset': return () => { return Dataset.delete({ dataset_id: this.detail.id }) }
// case 'dataset_fs': return () => { return Dataset.deleteOrigin({ dataset_id: this.detail.id }) }
// case 'algo': return () => { return Algo.delete({ algorithm_id: this.detail.id }) }
// case 'model': return () => { return Model.delete({ model_id: this.detail.id }) }
default: return () => {}
}
})()
const response = await requestMethod()
this.dealResponse(response)
// location.reload()
}
dealResponse(res) {
if (res.code === 'Success') {
Toast.success(this.$t('public.deleteSuc'))
this.propShow = false
routerRefresh()
} else {
Toast.danger(this.$t('public.deleteError'))
}
}
}
</script>
<style lang="sass" scoped>
.popup-header
// margin-bottom: 10px !important
.popup-body
// padding: 20px
.top-tips
.text-tips
margin-top: 5px
.algo-name
font-weight: 600
margin: 0 3px
color: #DC1818
.input-area
margin-top: 20px
.key
display: inline-block
font-size: 12px
.input-text
width: 300px
padding-left: 12px
&::-webkit-input-placeholder
color: #ccc
&:-moz-placeholder
color:#ccc
&::-moz-placeholder
color: #ccc
&:-ms-input-placeholder
color: #ccc
.popup-footer
.error-tips
color: #FA3C30
position: relative
margin-left: 10px
&:before
position: absolute
top: 3px
left: -10px
content: '*'
color: #FA3C30
</style>
<!-- 算法/数据集/模型/处理器 编辑弹窗 -->
<template lang="pug">
popup.familiar(
:show.sync="propShow",
popup-style="width: 520px",
:percent-height=.8
@dismiss="propShow = false",
)
.popup-header(slot="header")
.title {{$t('public.editor')}}{{ typeText }}
.popup-body(slot="body")
form-table(
ref="formTable"
:format-data="formatData",
:result-data="resultData",
:label-width="changeWidth",
:style="`width: 450px;margin-left: ${marginLeft}`",
)
.popup-footer(slot="footer")
.flex-1.flex.right
st-button(
@click="propShow = false",
) {{$t('public.cancel')}}
st-button(
type="primary"
@click="confirm",
) {{$t('public.confirm')}}
</template>
<script lang="ts">
import { Vue, PropSync, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class dataEdit extends Vue {
$refs!: { formTable: any }
@PropSync('show', { type: Boolean, default: false }) propShow
@Prop({ type: Object, default: () => {} }) detail
@Prop({ type: String, default: '' }) type
@Prop({ type: String, default: '-30px' }) marginLeft
resultData: { name: string, description: string } = {
name: '',
description: '',
}
changeWidth:number = 110
get typeText() {
switch (this.type) {
case 'dataset': return this.$t('navigation.dataSet')
case 'dataset_fs': return this.$t('navigation.dataSet')
case 'model': return this.$t('navigation.model')
case 'algo': return this.$t('index.algorithm')
}
}
get formatData(): {}[] {
return [
{
label: `${this.typeText}${this.$t('public.name')}:`,
type: 'input',
key: 'name',
validator: ['notEmpty', 'min2', 'max64', 'normName'],
props: { placeholder: this.$t('public.formatTwoSix') },
placeholder: this.$t('public.formatTwoSix'),
required: true,
}, {
label: `${this.typeText}${this.$t('public.desc')}:`,
type: 'textarea',
key: 'description',
},
]
}
@Watch('propShow', { immediate: true })
resetForm(val) {
if (!val) return
if (this.detail) {
this.resultData.name = this.detail.name
this.resultData.description = this.detail.description
} else {
this.resultData.name = ''
this.resultData.description = ''
}
}
checkExist(value):Promise<{
data: {existed: boolean}
}> {
const exist = false
// if (this.type === 'dataset') {
// return Dataset.checkName({ name: value })
// } else if (this.type === 'dataset_fs') {
// return Dataset.checkOriginName({ name: value })
// } else if (this.type === 'model') {
// return Model.checkExistName({ name: value })
// } else if (this.type === 'algo') {
// return Algo.checkExistedName({ name: value })
// }
return new Promise(() => {
return { data: { existed: false } }
})
}
async confirm() {
const result = await this.$refs.formTable.submit()
if (!result) return
const requestMethod = (() => {
switch (this.type) {
// case 'dataset': return () => Dataset.update({ ...result, dataset_id: this.detail.id })
// case 'dataset_fs': return () => Dataset.updateOrigin({ ...result, dataset_id: this.detail.id })
// case 'algo': return () => Algo.update({ ...result, algorithm_id: this.detail.id })
// case 'model': return () => Model.update({ ...result, model_id: this.detail.id })
default: return () => {}
}
})()
const response = await requestMethod()
this.dealResponse(response)
}
dealResponse(res) {
if (res.code === 'Success') {
Toast.success(this.$t('public.editSuc'))
this.propShow = false
routerRefresh()
} else {
Toast.danger(this.$t('public.editFail'))
}
}
@Watch('$route', { immediate: true })
changeLabelWidth() {
if (this.$route.params.lang === 'zh-cn') {
this.changeWidth = 110
} else {
this.changeWidth = 120
}
}
}
</script>
<style lang="sass" scoped>
.popup-body
padding: 10px 20px 0px 20px
table.form
td:first-child
padding-top: 16px
input
width: 100%
</style>
<template lang="pug">
.data-empty.flex.center
.tip-img.iconfont.icon-wushuju(
:style="tipIconStyle"
v-if="!isLoading"
)
.loading-gif(v-else)
.tip-text(:class="{ loading: isLoading }") {{tipDesc}}
</template>
<script>
export default {
name: 'data-empty',
props: {
isLoading: {
type: Boolean,
default: false,
},
tipText: {
type: String,
default: '没有找到相关数据',
},
tipIconStyle: {
type: String,
default: '',
},
},
computed: {
tipDesc() { return this.isLoading ? vm.$t('public.loadingCenter') + '...' : this.tipText },
},
}
</script>
<style lang="sass" scoped>
.data-empty
color: #666
width: 100%
padding-top: 60px
line-height: 1.5
.tip-img
font-size: 14px
.tip-text
margin-left: 10px
&.loading
color: #cccccc
.loading-gif
width: 14px
height: 14px
background: url(~@/assets/loading.gif) no-repeat center/100%
&.reverse
.tip-img
color: #F8B62D
.tip-text
color: #EEE
</style>
<template lang="pug">
seeta-tooltip(
v-if="showtooltip && item.type === 'td'"
placement="top"
)
template(
v-slot:content
)
span(v-html="tooltipValue")
td(
v-html="value",
)
td(
v-else-if="item.type === 'td'",
v-html="value",
)
td(
v-else-if="item.type === 'check'",
style="text-align: center",
@click.stop="checkRow",
)
input(
type="checkbox",
:checked="isCheck",
)
td(v-else-if="item.type === 'slot'")
slot
//- td(v-else)
</template>
<script>
import seetaTooltip from '@/components/seeta-ui/seeta-tooltip'
export default {
components: {
seetaTooltip,
},
props: {
// 这个 td 对应的 th item
item: Object,
// 这个 td 对应的 tr data
row: Object,
checkList: { type: Array, default: () => [] },
checkField: { type: String, default: 'id' },
},
computed: {
value() {
const display = _.isFunction(this.item.render)
? this.item.render(this.row)
: _.get(this.row, this.item.render)
return display == null || display === ''
? `<span style="color: #999">${this.item.placeholder}</span>`
: display
},
showtooltip() {
if (this.item.tooltip) {
return this.item.tooltip(this.row)
}
return false
},
tooltipValue() {
const display = _.isFunction(this.item.tooltipValue)
? this.item.tooltipValue(this.row)
: _.get(this.row, this.item.tooltipValue)
return display
},
// 用来判断是否匹配的对象
matchData() { return { [this.checkField]: this.row[this.checkField] } },
isCheck() {
if (this.item.type !== 'check') return false
return _.some(this.checkList, this.matchData)
},
},
methods: {
checkRow() {
if (this.isCheck) {
const deleteIndex = _.findIndex(this.checkList, this.matchData)
if (deleteIndex !== -1) this.checkList.splice(deleteIndex, 1)
} else {
this.checkList.push(this.row)
}
this.$emit('choose')
},
},
}
</script>
<style lang="sass" scoped>
</style>
<!--
表格组件
-->
<template lang="pug">
div.flex.column(
style="height:100%"
)
.header(:class="{ float: headFloat }")
table.through
thead
tr
template(v-for="(item, index) in reDefinitions")
th(
v-if="item.type === 'check'",
:style="{ width: item.width, 'text-align': 'center' }",
@click.stop="checkAll",
)
input(
v-if="data && data.list.length"
type="checkbox",
:checked="isAllCheck",
)
th(
v-else,
:style="{ width: item.width, cursor: item.sortable?'pointer':'' }",
@click="sortClick(item)"
)
span {{ item.label }}
span.iconfont.icon-question-o(
v-if="item.tooltip"
v-tooltip="item.tooltip",
)
//- 筛选
dropdown.dropdown(
v-if="item.filterKey"
ref="dropdown",
offset="0,7",
:computedWidth="false"
trigger-on-hover,
)
.filter-icon.pointer(
slot="dropdown-link",
@click.stop="",
@mouseenter="changeIcon(item)"
@mouseleave="resetIcon"
)
img(
v-if="item.label === hoverColumn"
src="@/assets/table-uncollapse.png")
img(
v-else
src="@/assets/table-collapse.png")
ul.filter-list(
@mouseenter="changeIcon(item)"
@mouseleave="resetIcon"
slot="dropdown-list"
)
li(
v-for="f in item.filterList"
@click="filterChange(item, f.value)"
:class="{active: currentFilters[item.filterKey] === f.value}"
) {{f.label}}
//- 排序
.sort-icon(
v-if="item.sortable"
)
span.el-icon-caret-top(
@click.stop="ascending(item)"
:class="{active: sortType === 'ascending' && item.label === sortCol}"
)
span.el-icon-caret-bottom(
@click.stop="descending(item)"
:class="{active: sortType === 'descending' && item.label === sortCol}"
)
.body.flex-1(
style="overflow:auto"
)
table.through
tbody
template(v-if="!dataReady || !data.list.length")
tr.empty
td(:colspan="reDefinitions.length")
data-empty.empty(
style="padding-top: 0",
:tip-text="$t('public.noData') + '~'",
:is-loading="!dataReady",
)
template(v-else)
tr.pointer(
v-for="row in data.list",
@click="$emit('tr-click', row)",
)
v-td(
v-for="(item, index) in reDefinitions",
:key="index",
:row="row",
:item="item",
:check-list="checkList",
:check-field="checkField",
:style="{ width: item.width }",
)
slot(
:name="item.slotName",
v-bind="row",
)
//- pagination(
//- v-v-if="pagination && data",
//- :total-data="data.result_total",
//- :page-size="pageSize",
//- v-bind="pagination",
//- style="margin: 15px auto 0",
//- )
div.pagebox(v-if="pagination && data")
el-pagination(
@current-change="handleCurrentChange"
background
layout="total, prev, pager, next, jumper"
:current-page.sync="pageIndex"
:page-size="pageSize"
:total="totalData")
</template>
<script>
import vTd from './_td.vue'
export default {
components: {
vTd,
},
props: {
// 表格的核心定义(reDefinitions里的参数是暂时所有接受的选项及其默认值)
definitions: { type: Array, required: true },
// 直接由父级给予数据(和加载函数相互冲突,都存在时优先级高于加载函数)
// 结构相似于后端传入 ex: { list: {}[], data_total: 0 }
assignData: { type: Object, default: null },
// 数据加载函数(刷新依赖路由)
loadFunction: { type: Function, default: null },
// 是否使用分页器 传入null 则不启用
// 可以传入 Object 来设置 pagination 的 props
pagination: { type: Object, default: () => { return {} } },
// 不使用分页器则可不传入该参数
pageSize: { type: Number, default: 20 },
headFloat: { type: Boolean, default: false },
// 仅在表单存在勾选时,存储同步当前勾选的数据列表
checkList: { type: Array, default: () => [] },
checkField: { type: String, default: 'id' },
/*
* 是否自定义选择页码后的操作
* 如果是,则触发change事件
* 如果不(默认情况),则跳转页面到 ?page=+1
*/
custom: {
type: Boolean,
default: false,
},
// totalData: {
// type: Number,
// default: 0,
// },
},
data() {
return {
data: null,
pageIndex: +this.$route.query.page_index || 1,
dataReady: false,
totalData: 0,
currentIcon: 'table-collapse.png',
currentFilters: {},
hoverColumn: '',
sortType: '',
sortIndex: 0,
sortTypes: ['', 'ascending', 'descending'],
sortCol: '',
}
},
computed: {
reDefinitions() {
return _.map(this.definitions, item => {
return {
// (td|slot|check) 其中check只允许出现在数组首位
type: 'td',
label: '',
render: null,
placeholder: '',
width: 'auto',
slotName: '',
...item,
}
})
},
isAllCheck() {
if (!this.data || this.reDefinitions[0].type !== 'check') return false
const currentMarks = _.map(this.data.list, this.checkField)
const checkMarks = _.map(this.checkList, this.checkField)
return _.every(currentMarks, mark => checkMarks.includes(mark))
},
filterIcon() {
return require(`@/assets/${this.currentIcon}`)
},
// pageIndex() {
// if (this.custom) return this.currentIndex
// return +this.$route.query.page_index || 1
// },
},
watch: {
$route: {
handler(val, oldVal) {
if (!val || val === oldVal) return
if (this.assignData || !this.loadFunction) return
this.loadData()
},
immediate: true,
},
'$route.query'(val, oldVal) {
if (val && val.page_index !== oldVal.page_index) {
this.pageIndex = Number(val.page_index)
}
},
assignData: {
handler(val, oldVal) {
if (!val || val === oldVal) return
this.dataReady = _.isArray(val.list)
this.data = val
},
immediate: true,
},
currentFilters: {
handler(val, oldVal) {
this.$emit('filter', val)
},
deep: true,
},
},
methods: {
async loadData(showLoad = true) {
if (showLoad) this.dataReady = false
this.data = await this.loadFunction()
this.dataReady = true
this.totalData = this.data.result_total
// 重新加载数据后,勾选应该被取消
// if (showLoad) {
// this.checkList.splice(0)
// }
// 容器列表的翻页器暂时特殊处理
if (this.data.result_total) this.$emit('sync-total', this.data.result_total)
},
checkAll() {
const willAllCheck = !this.isAllCheck
this.checkList.splice(0)
if (willAllCheck) this.checkList.push(...this.data.list)
},
handleCurrentChange(changed) {
if (!this.custom) {
// const newQuery = {
// ...this.$route.query,
// ...changed,
// }
const newQuery = {
...this.$route.query,
page_index: changed,
}
this.$router.replace({ query: newQuery })
} else {
// 在 event mode 中才需要设置这些参数因为页面不刷新
this.$emit(
'pagination-change',
changed.page_index,
)
}
this.pageIndex = changed
},
changeIcon(item) {
this.hoverColumn = item.label
},
resetIcon() {
this.hoverColumn = ''
},
// 回传筛选条件
filterChange(item, val) {
this.currentFilters[item.filterKey] = val
this.hoverColumn = ''
},
// 筛选
sortClick(item) {
if (!item.sortable) return
if (item.label !== this.sortCol) this.sortIndex = 0
if (this.sortIndex >= this.sortTypes.length - 1) this.sortIndex = 0
else this.sortIndex++
this.sortType = this.sortTypes[this.sortIndex]
item.sortable(this.sortType)
this.sortCol = item.label
},
ascending(item) {
this.sortType = 'ascending'
this.sortIndex = this.sortTypes.indexOf('ascending')
item.sortable(this.sortType)
this.sortCol = item.label
},
descending(item) {
this.sortType = 'descending'
this.sortIndex = this.sortTypes.indexOf('descending')
item.sortable(this.sortType)
this.sortCol = item.label
},
initFilters() {
// 初始化列表中包含的筛选条件
this.definitions.forEach(item => {
if (item.filterKey) {
this.$set(this.currentFilters, item.filterKey, item.filterList[0].value)
}
})
},
// 重置表格
async resetTable() {
this.$router.replace({ query: {} })
setTimeout(() => {
this.initFilters()
}, 100)
},
// 手动执行获取数据时间
refreshTable() {
setTimeout(() => {
this.loadData()
}, 100)
},
// 获取列表数据
getTableData() {
return this.data
},
},
created() {
this.initFilters()
},
}
</script>
<style lang="sass" scoped>
.header.float
position: sticky
top: 0
z-index: 1
.dropdown
img
vertical-align: text-top
margin-left: 8px
height: 14px
.sort-icon
color: #c0c4cc
display: inline-flex
flex-direction: column
vertical-align: text-top
cursor: pointer
margin-top: 0.8px
margin-left: 8px
span[class^=el-icon-]
line-height: 0.5
.active
color: #409EFF
.pagebox
height: 50px
background: #f1f1f5
border-bottom: 1px solid #e5e5e5
text-align: center
padding-top: 10px
.pagination
background: #f1f1f5
width: 100%
height: 50px
</style>
<style lang="sass">
.dropdown-content
.filter-list
.active
color: #409EFF
</style>
<template lang="pug">
.main-progress
.text(
:style="{ color: color }"
)
span.left {{ text }}
span.right {{ currentRate + '%' }}
.progress-container
.progress-content(
:style="{background: outBackColor}",
)
.progress-bar(
:style="{background: backgroundColor, left: offsetWidth}",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class ProgressBar extends Vue {
@Prop({ type: String, default: '' }) text
@Prop({ type: Number, default: 0 }) currentRate
@Prop({ type: String, default: '#409EFF' }) color
@Prop({ type: String, default: '#E8EBF2' }) outColor
get isOutOfMaxNumber():boolean {
return 100 - this.currentRate < 0
}
get offsetWidth():string | number {
const left = 100 - this.currentRate
return this.isOutOfMaxNumber ? 0 : `-${left}%`
}
get backgroundColor():string {
return this.isOutOfMaxNumber ? '#D66460' : this.color
}
get outBackColor():string {
return this.outColor
}
}
</script>
<style lang="sass" scoped>
.main-progress
display: inline-block
width: 100%
line-height: 19px
.progress-container
display: inline-block
width: 100%
height: 2px
position: relative
overflow: hidden
border-radius: 999px
margin-bottom: 3px
.progress-content
height: 100%
width: 100%
border-radius: 999px
.progress-bar
height: 100%
width: 100%
position: absolute
left: -100%
top: 0
border-radius: 999px
.left
display: inline-block
font-size: 13px
letter-spacing: 0
line-height: 13px
.right
display: inline-block
text-align: right
float: right
font-size: 13px
letter-spacing: 0
</style>
<!--dialog框下有一个选择按钮-->
<template lang="pug">
popup.confirm-popup(
:show.sync="show",
popup-style="max-width: 520px; width: 430px;",
:dismissable="false",
hide-header,
)
//- body
.confirm-body(slot="body")
//- span.dialog-icon.iconfont(:class="[mode, iconClass]")
.title
span.dialog-icon.iconfont(:class="[mode, iconClass]")
span.text {{ title }}
p.caption(v-if="message")
//- 支持html格式
span(v-html="message") {{ message }}
.options(v-if="options && options.length")
.option(v-for="option in options")
input.confirm-option(
type="checkbox",
v-model="selections",
:value="option"
)
span {{ option }}
//- footer
.confirm-footer.flex.right(slot="footer")
template(v-if="mode === 'confirm'")
button.btn.btn-primary(
@click="cancel",
style="margin-right: 20px"
) {{ cancelButtonText || buttonCancel }}
button.btn.btn-important(
@click="confirm",
ref="confirmBtn",
) {{ confirmButtonText || '确定' }}
template(v-if="mode === 'alertSelect'")
button.btn.btn-primary(
@click="cancel",
style="margin-right: 20px"
) {{ cancelButtonText || '取消' }}
button.btn.btn-important(
@click="confirm",
ref="confirmBtn",
) {{ confirmButtonText || '确定' }}
template(v-if="['warning', 'alert'].includes(mode)")
button.btn.btn-primary(
v-if="cancelButtonText"
@click="cancel",
style="margin-right: 20px"
) {{ cancelButtonText || '取消' }}
button.btn.btn-important(
@click="confirm",
ref="confirmBtn",
) {{ confirmButtonText || vm.$t('public.iKnow')}}
</template>
<script>
export default {
props: {
title: String,
message: String,
vm: Object,
/**
* confirm | alert | warning
*/
mode: {
type: String,
default: 'confirm',
},
/**
* 确认页面可以附带选项
*/
options: {
type: Array,
default() {
return []
},
},
confirmButtonText: {
type: String,
},
cancelButtonText: {
type: String,
},
},
data() {
return {
show: false,
selections: [],
buttonCancel: '',
buttonConfirm: '',
}
},
computed: {
iconClass() {
switch (this.mode) {
case 'confirm': return 'icon-jinggao'
case 'alert': return 'icon-tip'
case 'alertSelect': return 'icon-tip'
default: return 'icon-tip'
}
},
},
mounted() {
// NOTE 渲染完毕后设置 show = true, 以触发 transition 动画
this.show = true
this.buttonCancel = vm.$t('public.cancel')
this.buttonConfirm = vm.$t('public.confirm')
this.$nextTick(() => {
this.$refs.confirmBtn.focus()
})
},
methods: {
cancel() {
this.show = false
this.$emit('cancel')
},
confirm() {
this.show = false
if (this.options.length === 0) {
this.$emit('confirm', true)
}
// 构建一个记载选项是否被选择的boolean数组
const selectionResults = this.options.map(opt => _.includes(this.selections, opt))
this.$emit('confirm', selectionResults)
},
},
}
</script>
<style lang="sass" scoped>
@import "@/styles/theme.sass"
.confirm-body
padding: 40px
// text-align: center
.title
height: 22px
line-height: 22px
.dialog-icon
font-size: 20px
// vertical-align: top
&.confirm
color: $--color-primary
&.alert
color: #FF8805
&.warning
color: $--color-warning
&.alertSelect
color: #FF8805
.text
// text-align: center
font-size: 18px
height: 22px
line-height: 22px
font-weight: bold
color: $--color-text-primary
margin-left: 10px
.caption
color: #4C4C4C
font-size: 14px
margin-top: 20px
color: $--color-text-regular
.options
margin-top: 15px
font-size: 12px
.option+.option
margin-top: 5px
.confirm-option
vertical-align: middle
margin-right: 10px
.confirm-footer
padding: 16px 20px
border-top: 1px solid #E5E5E5
.btn
min-width: 56px
height: 32px
</style>
<template lang="pug">
.dropdown
.dropdown-link(
ref="trigger",
@click="toggleTrigger",
@mouseover="onMouseEnterTrigger",
@mouseleave="onMouseLeaveTrigger",
:class="{ show: show, disabled: disabled }",
)
slot(name="dropdown-link")
.dropdown-content(
ref="menu",
v-show="show",
:class="{list: isList, userInfo: userInfo, space: space}",
:style="{zIndex: zIndex}",
@click.stop="autoSetClose",
)
.dropdown-menu(
ref="dropdown",
@mouseenter="onMouseEnterDropdown",
@mouseleave="onMouseLeaveDropdown",
)
slot(name="dropdown-list")
</template>
<script>
import Popper from 'popper.js'
import { getElementProps } from '@/utils/dom'
export default {
name: 'dropdown',
data() {
return {
// timers used for hover mode
showTimer: null,
hideTimer: null,
popper: null,
hasCalculatedMenuWidth: false,
show: false,
}
},
props: {
// 空间下拉框top去掉间隙
space: {
type: Boolean,
default: false,
},
// 个人中心下拉框top去掉间隙
userInfo: {
type: Boolean,
default: false,
},
// 下拉内容的z-index属性值
zIndex: {
type: Number,
default: 1000,
},
triggerOnHover: {
type: Boolean,
default: false,
},
// 点击菜单后自动关闭
autoClose: {
type: Boolean,
default: true,
},
// 展开区域初始位置
placement: {
type: String,
default: 'bottom-start',
},
// 展开区域位置是否固定
positionFixed: {
type: Boolean,
default: false,
},
// 默认dropdown为列表样式(会对内部li元素写入样式)
isList: {
type: Boolean,
default: true,
},
// 用于调整下拉菜单的位置偏移
offset: {
type: String,
default: '5,3',
},
// 是否禁用当前 dropdown
disabled: {
type: Boolean,
default: false,
},
// 是否主动避免边缘
// avoidEdge: {
// type: Boolean,
// default: true,
// },
// 计算宽度
computedWidth: {
type: Boolean,
default: true,
},
},
mounted() {
document.addEventListener('click', this.domClose)
},
beforeDestroy() {
const menu = this.$refs.menu
if (menu && menu.parentNode === document.body) document.body.removeChild(menu)
document.removeEventListener('click', this.domClose)
},
watch: {
show(val, oldVal) {
if (val === oldVal) return
if (val) {
this.$emit('expand')
const trigger = this.$refs.trigger
const menu = this.$refs.menu
// so it's not constrained by any container
document.body.appendChild(menu)
this.$nextTick(() => {
// calculate menu width
if (this.computedWidth) {
if (!this.hasCalculatedMenuWidth && this.placement.includes('bottom')) {
const menuWidth = +getElementProps(menu, 'width')
const triggerWidth = +getElementProps(trigger, 'width')
menu.style.width = `${_.max([menuWidth, triggerWidth])}px`
this.hasCalculatedMenuWidth = true
}
}
this.popper = new Popper(trigger, menu, this.popperConfig)
})
} else {
this.$emit('on-close')
this.$emit('collapse')
if (this.popper) this.popper.destroy()
const menu = this.$refs.menu
if (menu && menu.parentNode === document.body) document.body.removeChild(menu)
}
},
},
computed: {
popperConfig() {
return {
placement: this.placement,
positionFixed: this.positionFixed,
modifiers: {
offset: { offset: this.offset },
hide: { enabled: false },
preventOverflow: { boundariesElement: 'window' },
},
}
},
},
methods: {
// 点击触发 展开关闭
toggleTrigger() {
if (this.triggerOnHover || this.disabled) return
this.show = !this.show
},
// 直接触发关闭
close() { this.show = false },
// 由dom点击触发的关闭事件
domClose(event) {
const isClickMenu = this.$refs.menu && this.$refs.menu.contains(event.target)
const isClickTrigger = this.$el.contains(event.target)
if (!isClickMenu && !isClickTrigger) this.show = false
},
autoSetClose() {
if (!this.autoClose) return
this.show = false
},
onMouseEnterTrigger(event) {
if (!this.triggerOnHover || this.disabled) return
// already showing
if (this.show) {
return clearTimeout(this.hideTimer)
}
// not showing
this.showTimer = setTimeout(() => {
this.show = true
}, 150)
},
onMouseLeaveTrigger(event) {
if (!this.triggerOnHover) return
this.setHideTimer()
clearTimeout(this.showTimer)
},
onMouseEnterDropdown() {
if (!this.triggerOnHover) return
clearTimeout(this.hideTimer)
},
onMouseLeaveDropdown() {
if (!this.triggerOnHover) return
this.setHideTimer()
},
setHideTimer() {
this.hideTimer = setTimeout(() => {
this.show = false
}, 200)
},
},
}
</script>
<style lang='sass' scoped>
.dropdown
display: inline-block
position: relative
.dropdown-link
display: inline-block
width: 100%
cursor: pointer
&.disabled
color: #CCC
cursor: not-allowed
.dropdown-content
max-width: 420px
position: absolute
background: #FFF
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.15)
border-radius: 2px
.userInfo
top: -7px !important
.space
top: -18px !important
</style>
<style lang="sass">
.dropdown-content
background-color: #FFF
&.list
.dropdown-menu
width: 100%
padding: 10px 0
ul
width: 100%
li, .drop-item
list-style: none
width: 100%
height: 32px
cursor: pointer
line-height: 32px
padding: 0 20px
text-align: left
color: #333
&:hover
background: #F5F7FA
color: #409EFF
&.disabled
color: #CCC
cursor: not-allowed
&:hover
// background: #F0F0F0
color: #CCC
// 对于表格内更多按钮的处理
table td
.dropdown-link.show
.more-button
color: #409EFF
</style>
<!--
当有网络请求在进行中时, 会禁用此按钮并显示 阻止文案
-->
<template lang="pug">
.btn(
:disabled="isDisable",
@click="trigger",
@mousedown="trigger",
@mouseup="trigger",
)
template(v-if="isDisable")
| {{ disabledLabel }}
slot(v-else)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class ajaxButton extends Vue {
@Prop({ type: String, default: '处理中...' }) disabledLabel
get isDisable() {
return this.$store.getters.allRequestCount > 0
}
trigger(event) {
if (this.isDisable) return
this.$emit(event.type, event)
}
}
</script>
<template lang="pug">
table.date-table
thead
th(v-for="week in weeks") {{ week }}
tbody
tr(v-for="week in rows")
td(
v-for="day in week",
:class="{\
'pre-month': day.isPre,\
'available': day.isAvailable,\
'next-month': day.isNext || !day.isAvailable,\
'current': day.isAvailable && isCurrent(day.day),\
}",
@click="day.isAvailable && $emit('pick', day.day)",
)
div
span {{ day.day }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class DateTable extends Vue {
@Prop({ type: Date, required: true }) date
@Prop({ type: String, default: '' }) value
weeks: Array<string> = []
get year() { return this.date.getFullYear() }
get month() { return this.date.getMonth() }
get defaultValue() { return this.value ? new Date(this.value) : null }
// 计算当月的天数,以及空缺位置的上月和下月日期
get rows() {
// 获取当前日期
const today = new Date()
// 获取当前月份有多少天
const date = new Date(this.year, this.month + 1, 0)
const totalDay = date.getDate()
// 获取上个月有多少天
const preMonth = new Date(this.year, this.month, 0)
const preMonthDays = preMonth.getDate()
// 获取当前月份1号是星期几
const firstDay = new Date(this.year, this.month, 1)
const startDay = firstDay.getDay()
const prePlaceholder = startDay === 0 ? 6 : startDay
// 固定显示6行 42个
const nextPlaceholder = startDay === 0 ? 42 - 7 - totalDay : 42 - prePlaceholder - totalDay
const days: any[] = []
for (let i = 0; i < prePlaceholder; i++) {
days.unshift({ isPre: true, day: preMonthDays - i })
}
for (let i = 0; i < totalDay; i++) {
let isAvailable = false
if (this.year < today.getFullYear()) {
isAvailable = true
} else if (this.year === today.getFullYear()) {
if (this.month < today.getMonth()) {
isAvailable = true
} else if (this.month === today.getMonth()) {
if (i + 1 <= today.getDate()) isAvailable = true
}
}
days.push({ isAvailable: isAvailable, day: i + 1 })
}
for (let i = 0; i < nextPlaceholder; i++) {
days.push({ isNext: true, day: i + 1 })
}
return _.chunk(days, 7)
}
isCurrent(day) {
if (!this.defaultValue) return false
return this.defaultValue.getFullYear() === this.year &&
this.defaultValue.getMonth() === this.month &&
this.defaultValue.getDate() === day
}
@Watch('$route', { immediate: true })
auto() {
this.weeks = [vm.$t('public.seven'), vm.$t('public.one'), vm.$t('public.two'), vm.$t('public.three'), vm.$t('public.four'), vm.$t('public.five'), vm.$t('public.six')]
}
}
</script>
<style lang="sass" scoped>
.date-table
table-layout: fixed
width: 100%
color: #4C4C4C
th
text-align: center
vertical-align: middle
height: 32px
padding: 5px
border-bottom: 1px solid #E5E5E5
td
width: 32px
height: 32px
padding: 4px 0
&.pre-month, &.next-month
color: #CCC
&.available
cursor: pointer
&:hover
color: #409EFF
div
height: 30px
padding: 3px 0
box-sizing: border-box
span
text-align: center
margin: 0 auto
display: block
width: 24px
height: 24px
line-height: 24px
border-radius: 50%
&.current
span
color: #FFF
background-color: #409EFF
</style>
<template lang="pug">
table.month-table
tbody
tr(v-for="row in rows")
td(
style="width: 25%",
v-for="item in row",
@click="$emit('pick', item.index)",
:class='{ current: isCurrent(item.index) }',
)
span.cell {{ item.text }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class MonthTable extends Vue {
@Prop({ type: Date, required: true }) date
@Prop({ type: String, default: '' }) value
months: string[] = []
get defaultValue() { return this.value ? new Date(this.value) : null }
get rows() {
const months = this.months.map((item, index) => {
return {
text: item,
index: index,
}
})
return _.chunk(months, 4)
}
isCurrent(monthIndex) {
return this.defaultValue &&
this.defaultValue.getFullYear() === this.date.getFullYear() &&
monthIndex === this.date.getMonth()
}
@Watch('$route', { immediate: true, deep: true })
auto() {
this.months = [vm.$t('public.monthOne'), vm.$t('public.twoMonth'), vm.$t('public.monthThree'), vm.$t('public.fourMonth'), vm.$t('public.fiveMonth'), vm.$t('public.sixMonth'),
vm.$t('public.sevenMonth'), vm.$t('public.eightMonth'), vm.$t('public.nineMonth'), vm.$t('public.tenMonth'), vm.$t('public.elevenMonth'), vm.$t('public.twelveMonth')]
}
}
</script>
<style lang="sass" scoped>
.month-table
table-layout: fixed
width: 100%
color: #4C4C4C
td
padding: 20px 3px
cursor: pointer
&.current, &:hover
color: #409EFF
span
text-align: center
width: 48px
height: 32px
display: block
line-height: 32px
margin: 0 auto
</style>
<template lang="pug">
transition(name="zoom-in-top")
.picker-pancel
.picker-pancel-header.flex.justify(
:class="{ 'header-border': currentView !== 'date' }",
)
.picker-header-pre-btns
span.iconfont.icon-pre.pointer(
@click="preYear",
)
span.iconfont.icon-lastpicture.pointer(
v-show="currentView === 'date'",
@click="preMonth",
style="margin-left: 6px",
)
.picker-header-label
span.year(@click="currentView = 'year'") {{ yearLabel }}
span.month(
@click="currentView = 'month'",
v-show="currentView === 'date'",
) {{ month + 1 }}
.picker-header-next-btns
span.iconfont.icon-nextpicture.pointer(
v-show="currentView === 'date'",
@click="nextMonth",
style="margin-right: 6px",
)
span.iconfont.icon-next.pointer(
@click="nextYear",
)
.picker-pancel-content
date-table(
v-show="currentView === 'date'",
:date="date",
:value="value",
@pick="handleDatePick",
)
year-table(
v-show="currentView === 'year'",
:date="date",
:value="value",
@pick="handleYearPick",
)
month-table(
v-show="currentView === 'month'",
:date="date",
:value="value",
@pick="handleMonthPick",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch, Model } from 'vue-property-decorator'
import dateTable from './_date-table.vue'
import yearTable from './_year-table.vue'
import monthTable from './_month-table.vue'
@Component({
components: {
dateTable,
yearTable,
monthTable,
},
})
export default class DatePanel extends Vue {
date: Date = new Date()
currentView: string = 'date'
@Prop({ type: String, default: '' }) value
@Watch('value', { immediate: true })
initDate(val) {
if (val) {
this.date = new Date(val)
}
}
get year() { return this.date.getFullYear() }
get month() { return this.date.getMonth() }
get yearLabel() {
if (this.currentView === 'year') {
const base = Math.floor(this.year / 10) * 10
return `${base} 年 - ${base + 10} 年`
}
return `${this.year} 年`
}
handleYearPick(year) {
this.setDate(year, this.month)
this.currentView = 'month'
}
handleMonthPick(month) {
this.setDate(this.year, month)
this.currentView = 'date'
}
handleDatePick(day) {
this.$emit('pick', `${this.year}-${this.month + 1}-${day}`)
}
preYear() {
if (this.currentView === 'year') {
this.setDate(this.year - 10, this.month)
} else {
this.setDate(this.year - 1, this.month)
}
}
nextYear() {
if (this.currentView === 'year') {
this.setDate(this.year + 10, this.month)
} else {
this.setDate(this.year + 1, this.month)
}
}
setDate(year, month) {
this.date = new Date(year, month, this.date.getDay(),
this.date.getMinutes(), this.date.getSeconds(), this.date.getMilliseconds())
}
preMonth() {
if (this.month === 0) {
this.setDate(this.year - 1, 12)
} else {
this.setDate(this.year, this.month - 1)
}
}
nextMonth() {
if (this.month === 11) {
this.setDate(this.year + 1, 0)
} else {
this.setDate(this.year, this.month + 1)
}
}
}
</script>
<style lang="sass" scoped>
.picker-pancel
z-index: 66
position: absolute
left: 0
transform: translateY(8px)
background: #FFFFFF
box-shadow: 0 0 8px 0 rgba(0,0,0,0.10)
border-radius: 2px
overflow: hidden
.picker-pancel-header
margin: 16px 25px 0
padding-bottom: 16px
font-size: 14px
&.header-border
border-bottom: 1px solid #E5E5E5
.picker-header-label
color: #262626
.year, .month
cursor: pointer
padding: 0 4px
&:hover
color: #409EFF
.iconfont
color: #B2B2B2
font-size: 12px
&:hover
color: #409EFF
.picker-pancel-content
width: 260px
position: relative
margin: 0 20px
font-size: 12px
.zoom-in-top-enter, .zoom-in-top-leave-to
max-height: 0
opacity: 0
.zoom-in-top-enter-to, .zoom-in-top-leave
max-height: 350px
opacity: 1
.zoom-in-top-enter-active, .zoom-in-top-leave-active
transition: all 0.3s
</style>
<template lang="pug">
table.year-table
tbody
tr(v-for="row in rows")
td(
style="width: 25%",
v-for="item in row",
:class="{ current: item === currentYear }",
@click="$emit('pick', item)",
)
span.cell {{ item }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class YearTable extends Vue {
@Prop({ type: Date, required: true }) date
@Prop({ type: String, default: '' }) value
get year() { return this.date.getFullYear() }
get defaultValue() { return this.value ? new Date(this.value) : null }
get currentYear() { return this.defaultValue ? this.defaultValue.getFullYear() : null }
get rows() {
const base = Math.floor(this.year / 10) * 10
const years = Array.from({ length: 10 }).map((item, index) => base + index)
return _.chunk(years, 4)
}
}
</script>
<style lang="sass" scoped>
.year-table
table-layout: fixed
width: 100%
color: #4C4C4C
td
text-align: center
padding: 20px 3px
cursor: pointer
&.current, &:hover
color: #409EFF
span
text-align: center
width: 48px
height: 32px
display: block
line-height: 32px
margin: 0 auto
</style>
<!-- 日期组件
接收参数format 默认格式为 'YYYY-MM-DD'
-->
<template lang="pug">
.data-picker(:class="{ error: isError }")
.date-picker-slot(@click="show = true")
slot
.default-input
input.input(
type="text",
:value="value",
@focus="show = true",
:placeholder="placeholder",
)
span.iconfont.icon-date
panel(
v-show="show",
@pick="emit",
:value="value",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch, Model } from 'vue-property-decorator'
import panel from './_panel.vue'
@Component({
name: 'data-picker',
components: { panel },
})
export default class DataPicker extends Vue {
@Model('change', { type: String }) value
@Prop({ type: String, default: 'YYYY-MM-DD' }) format
@Prop({ type: String, default: '选择日期' }) placeholder
@Prop({ type: Boolean, default: false }) isError
show: boolean = false
emit(value) {
// 子组件传出的值为 YYYY-MM-DD格式
this.$emit('change', moment(value, 'YYYY-MM-DD').format(this.format))
this.show = false
}
mounted() {
document.addEventListener('click', this.close)
}
beforeDestroy() {
document.removeEventListener('click', this.close)
}
close(event) {
if (!this.$el.contains(event.target)) this.show = false
}
}
</script>
<style lang="sass" scoped>
.data-picker
display: inline-block
position: relative
.default-input
position: relative
.input
cursor: pointer
width: 100%
.icon-date
position: absolute
right: 16px
top: 50%
transform: translateY(-50%)
font-size: 14px
color: #CCC
pointer-events: none
&.error
.input
border-color: #FF4433
</style>
'use strict'
Object.defineProperty(exports, '__esModule', {
value: true,
})
exports['default'] = void 0
const _default = {
username: function username(value) {
const usernameReg = /^[\u4e00-\u9fa5\w-]{2,64}$/
if (_.isEmpty(value)) {
return '请输入用户名'
}
if (value.length < 2 || value.length > 64) {
return '用户名长度在2-64位字符之间'
}
if (!usernameReg.test(value)) {
// return '用户名只支持中英文,数字及中划线下划线'
return '您输入的信息有误,请重新输入'
}
},
password: function password(value) {
// eslint-disable-next-line
// const passwordReg = /(?=.*([A-Z].*))(?=.*([a-z].*))(?=.*[0-9].*)[\w`~!@#$%^&*()\-+=<>?:{}|,.\/;\[\]]{8,64}$/
const passwordReg = /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,64}/
if (_.isEmpty(value)) {
return '请输入密码'
}
if (value.length < 8 || value.length > 64) {
return '密码长度在8-64位字符之间'
}
if (!passwordReg.test(value)) {
return '必须包含大写字母,小写字母和数字' // return '必须包含大写字母,小写字母和数字,只支持英文特殊符号及中划线下划线'
}
return ''
},
// 文件大小校验
FileSize: function FileSize(files) {
// console.log(files)
for (const count in files) {
const limit = (files[count].size / (1024 * 1024 * 1024)).toFixed(2)
if (limit > 1) return '最大只能上传大小为1G的文件'
}
},
notEmpty: function notEmpty(value) {
if (value == null || value === '' || value === -1 || value.length === 0) return '该字段不能为空'
return ''
},
updateNotEmpty: function updateNotEmpty(value) {
// 文件上传回显时,value为string,上传文件时value为Array,所以string就不能提示
if ((value == null || value.length === 0) && typeof value !== 'string') return '该字段不能为空'
return ''
},
max30: function max30(value) {
if (value.toString().length > 30) return '字段长度不能超过30'
return ''
},
min2: function min2(value) {
if (value.toString().length < 2) return '字段长度不能少于2位'
return ''
},
min4: function min4(value) {
if (value.toString().length < 4) return '字段长度不能少于4位'
return ''
},
max64: function max64(value) {
if (value.toString().length > 64) return '字段长度不能超过64位'
return ''
},
newMax64: function newMax64(value) {
if (value.toString().length > 64) return '仅支持1-64个字符'
return ''
},
engName: function engName(value) {
const regex = /^[\w-]*$/ // if (!regex.test(value)) return '只支持英文、数字、中下划线'
if (!regex.test(value)) return '您输入的信息有误,请重新输入'
},
normName: function normName(value) {
// const regex = /^[\u4e00-\u9fa5\w-]*$/
const regex = /[^A-Za-z0-9\u4e00-\u9fa5.:\-_()[\]{}\s]/g // if (!regex.test(value)) return '只支持中英文、数字、中下划线'
if (regex.test(value)) return '只支持中英文、数字、空格和.:-_()[]{}'
},
newNormName: function newNormName(value) {
// const regex = /^[\u4e00-\u9fa5\w-]*$/
const regex = /[^a-z|A-Z|0-9|\-|_|.]/g // if (!regex.test(value)) return '只支持中英文、数字、中下划线'
if (regex.test(value)) return '允许英文数字中划线、下划线'
},
email: function email(value) {
const regex = /^[A-Za-z0-9\u4e00-\u9fa5._]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
if (value === '' || value == null) return ''
if (!regex.test(value)) return '邮箱格式输入有误,请重新输入'
},
onlyNum: function onlyNum(value) {
const regx = /^\d+(\.\d+)?$/
if (!regx.test(value)) {
return '只能输入数字类型的值,请重新输入'
}
},
numRange: function numRange(value, result, param) {
const numVal = Number(value)
if (numVal < Number(param[0]) || numVal > Number(param[1])) {
return '\u6BD4\u4F8B\u503C\u5FC5\u987B\u5927\u4E8E'.concat(param[0], '\uFF0C\u5C0F\u4E8E').concat(param[1])
}
},
}
exports['default'] = _default
<!--
分组式select组件
-->
<template lang="pug">
.group-select(
:class="{'select_disabled': disabled}",
)
.select-box(
ref="box",
@click="showOptionList($event)",
:class="{ active: showOptions }",
)
.select-value.no-wrap(
:class="{ 'not-match': !value }"
)
| {{ this.chosenItem ? this.chosenItem.name : this.notMatchText }}
.iconfont.icon-angle-down.select-items-toggle
.drop-box(
ref="optionList",
v-show="showOptions"
)
.full.flex.center(v-if="!groupList.length") {{$t('public.nofindUseData')}}
.full.flex(v-else)
ul.group-list
li.flex.left(
v-for="group in groupList",
@click="chosenGroup = group",
:class="{ chosen: chosenGroup === group }",
) {{ group }}
ul.item-list.flex-1(
)
li(v-if="!itemList.length") {{$t('public.groupNoOption')}}
li(
v-for="item in itemList"
@click="toggleItem(item)",
:class="{ chosen: isChosen(item) }",
)
|{{ item.name }}
</template>
<script>
import Popper from 'popper.js'
import { getElementProps } from '@/utils/dom'
export default {
props: {
// 选项列表
// 在 computed 中处理成 realOptions
options: {
type: Array,
required: true,
},
// { group: string, name: string, value: string }
// group定义左侧分组,name定义右侧选项展示名,value定义数据标识
fields: {
type: Object,
default: () => {},
},
// 选中的 value
value: {
type: [String, Number, Boolean],
},
// value无匹配时显示文本
notMatchText: {
type: String,
default: '请选择',
},
disabled: {
type: Boolean,
default: false,
},
},
data() {
return {
// 是否显示选项
showOptions: false,
// 当前展示组
chosenGroup: '',
popper: null,
}
},
computed: {
// 处理传入的选项列表
realOptions() {
if (_.isEmpty(this.options)) return []
const realFields = { group: 'type', name: 'name', value: 'id', ...this.fields }
return _.map(this.options, option => {
const group = String(option[realFields.group])
const name = String(option[realFields.name])
const value = option[realFields.value]
return { group, name, value }
})
},
optionData() {
if (_.isEmpty(this.realOptions)) return {}
return _.groupBy(this.realOptions, 'group')
},
groupList() { return _.keys(this.optionData) },
itemList() {
if (!this.chosenGroup) return []
return this.optionData[this.chosenGroup]
},
chosenItem() {
const result = _.find(this.realOptions, { value: this.value })
return result || null
},
},
watch: {
showOptions(val) {
if (val) {
// 将菜单重新 append 到 body 上, 从根本上避免被容器遮挡
document.body.appendChild(this.$refs.optionList)
} else {
this.searchText = ''
const list = this.$refs.optionList
if (list && list.parentNode === document.body) document.body.removeChild(list)
}
},
},
mounted() {
document.addEventListener('click', this.closeOptionList, false)
},
beforeDestroy() {
const list = this.$refs.optionList
if (list && list.parentNode === document.body) document.body.removeChild(list)
document.removeEventListener('click', this.closeOptionList, false)
},
methods: {
showOptionList(e) {
if (this.disabled) return
if (this.showOptions) {
this.showOptions = false
this.$nextTick(this.popper.destroy)
} else {
const { box, optionList } = this.$refs
this.showOptions = true
this.chosenGroup = this.chosenItem ? this.chosenItem.group : this.groupList[0]
this.$nextTick(() => {
// 计算宽度, 至少与选择框同宽
const boxWidth = getElementProps(box, 'width')
optionList.style.minWidth = `${boxWidth}px`
this.popper = new Popper(box, optionList, {
placement: 'bottom-start',
modifiers: {
offset: { offset: '0,3' },
hide: { enabled: false },
preventOverflow: { enabled: false },
},
})
})
}
},
/**
* 选择选项
*/
toggleItem(item) {
if (this.disabled) return
this.showOptions = false
if (!this.isChosen(item)) {
this.$emit('change', item.value)
this.$emit('update:value', item.value)
}
},
closeOptionList({ target }) {
if (!this.$el.contains(target) && !this.$refs.optionList.contains(target)) {
this.showOptions = false
}
},
isChosen(item) {
return String(item.value) === String(this.value)
},
},
}
</script>
<style lang="sass" scoped>
.group-select
display: inline-block
position: relative
width: 100%
height: 32px
color: #404040
font-size: 12px
line-height: 14px
vertical-align: middle
&.error
.select-box
border-color: #F56C6C
.select-box
min-width: 70px
position: relative
width: 100%
height: 100%
transition: border .3s, box-shadow .3s
cursor: pointer
white-space: nowrap
overflow: hidden
text-overflow: ellipsis
background: #FFF
border: 1px solid #CCC
border-radius: 2px
&.active
border-color: #409EFF
.select-items-toggle
transform: rotate(180deg)
.select-value
height: 100%
padding: 0 25px 0 12px
line-height: 32px
&.not-match
color: #CCC
&:before
display: inline-block
content: ''
height: 100%
vertical-align: middle
.select-items-toggle
width: 40px
height: 30px
line-height: 30px
font-size: 16px
position: absolute
display: block
color: #B2B2B2
right: 0
top: 0
text-align: center
transition: transform .25s ease-in-out
.drop-box
position: absolute
z-index: 1200
// padding: 10px 0
top: 39px
height: 160px
background-color: #FFF
box-shadow: 0 1px 4px 1px rgba(0,0,0,0.15)
border-radius: 2px
cursor: pointer
overflow-y: auto
.group-list, .item-list
overflow-y: auto
list-style: none
li
white-space: nowrap
font-size: 12px
line-height: 14px
padding: 9px 15px
overflow: hidden
text-overflow: ellipsis
.group-list
background: #F1F1F5
li
&::before
content: ''
width: 15px
height: 15px
display: inline-block
border-radius: 999px
background: #B2B2B2
margin-right: 15px
&:hover, &.chosen
color: #409EFF
&::before
background: #409EFF
&.chosen
background: #FFF
.item-list
li
&:hover
color: #35ABF0
&.chosen, &.chosen:hover
color: #409EFF
</style>
<!-- 表单结构 -->
<template lang="pug">
table.form
tbody
tr(
v-for="(item,index) in renderData",
:class="{ required: item.required }",
)
td.labelname(
:style="{ width: `${labelWidth}px`,\
lineHeight: styleObj.lineHeight||(item.sink ? '32px' : 'inherit'),\
paddingTop: index==0?styleObj.paddingTop:'' }",
) {{ item.label }}
td.content
.input-area
template(v-if="item.type === 'slot'")
slot(:name="item.key")
template(v-else)
components(
:is="tanslateType(item.type)",
v-bind="item.props",
:value="item.value",
:maxlength="item.maxlength",
:placeholder="$t('container.pleaseInput')",
:is-error="!!errorDict[item.key]",
:is-empty="errorDict[item.key]"
:notMatchText="$t('container.pleaseChoose')"
:style="item.styles",
:class="item.classes",
@focus="errorDict[item.key] = ''",
@blur="blurValidate(item.key)",
@change="newValue => {\
if (item.ignore) return;\
changeValue(item.key, newValue);\
}",
)
slot(:name="item.key")
.tips-area(:class="{'member': item.key == 'member'}")
template(v-if="errorDict[item.key]")
span
span.iconfont.icon-warning
span.error-text {{ errorDict[item.key] }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import Validate from './validate'
import datePicker from './date-picker/index.vue'
import vInput from './input.vue'
import vTextarea from './textarea.vue'
import vSelect from './select.vue'
import vRadios from './radios.vue'
import groupSelect from './group-select.vue'
import upload from './upload.vue'
import ajaxButton from './ajax-button.vue'
// import stUpload from '@/components/seeta-ui/seeta-upload.vue'
interface renderItem {
label: string,
type: string,
key: string,
value: any,
props?: { [x:string]: any },
}
@Component({
components: {
datePicker,
vInput,
vTextarea,
vSelect,
vRadios,
groupSelect,
upload,
ajaxButton,
// stUpload,
},
})
export default class formTable extends Vue {
/*
* 结构定义 支持由下列参数组成的数组对象
* label: '密码', 左侧标签名
* type: 'input', 右侧引用组件名 | slot
* key: 'password', 主要标识 与 验证/结果/slot绑定 有关
* validator: 'password', 验证函数(可不传 可传入 string|function|array)
* props: { type: 'password' }, 向右侧组件传入的参数props
* ignore: false, 生产结果是否忽略该字段(主要用于slot)
* classes: [], 将类名绑定在组件上(仅作用于组件模式)
* styles: {}, 将样式绑定在组件上(仅作用于组件模式)
* sink: true, label是否以32px为行高 使文本下沉
* required: false, label前是否显示星号
*/
@Prop({ type: Array, required: true }) formatData
@Prop({ type: Object, default: () => { return {} } }) resultData
@Prop({ type: Number, default: 80 }) labelWidth
@Prop({ type: Object, default: () => { return { lineHeight: '', paddingTop: '' } } }) styleObj
// 表单结果
formResult: { [x:string]: any } = {}
// 异常字段提示文案(空字符串为通过)
errorDict: { [x:string]: string } = {}
// 用来渲染的表单数据
get renderData() {
return _.map(this.formatData, (item: renderItem) => {
if (item.type === 'slot') {
return { ignore: true, sink: false, required: false, ...item }
} else {
return {
ignore: false,
sink: true,
required: false,
...item,
value: this.formResult[item.key],
}
}
})
}
// 抽取字段的校验函数,抽取了字段和要校验的规则
// 例如{identity:['max64','normName']}
get validatorDict() {
return _.reduce(this.formatData, (result, renderItem) => {
if (renderItem.validator == null || renderItem.ignore) return result
result[renderItem.key] = renderItem.validator
return result
}, {})
}
// 通过表单结构初始化 报错结构
@Watch('renderData', { immediate: true })
initErrorDict() {
_.forEach(this.renderData, formatItem => {
if (formatItem.ignore) return
Vue.set(this.errorDict, formatItem.key, '')
})
}
// 接收组件父级传入新的表单结果
@Watch('resultData', { immediate: true, deep: true })
refreshResult() {
_.forEach(this.renderData, formatItem => {
if (formatItem.ignore) return
const value = this.resultData[formatItem.key]
Vue.set(this.formResult, formatItem.key, value != null ? value : '')
})
}
// 组件名称转换
tanslateType(type) {
if (type === 'slot') return false
switch (type) {
case 'input': return 'v-input'
case 'select': return 'v-select'
case 'textarea': return 'v-textarea'
case 'radios': return 'v-radios'
case 'date': return 'date-picker'
default: return type
}
}
// 单独数值修改,并触发该字段验证
changeValue(key, newValue) {
// 向上汇报字段更新(用于可能引起表单变化的字段监听)
this.$emit('change', key, newValue)
this.formResult[key] = newValue
this.validate(key, newValue)
}
// 失焦验证
blurValidate(key) {
this.validate(key, this.formResult[key])
}
// 表单整体验证
async validateForm() {
for (const formatItem of this.formatData) {
const key = formatItem.key
await this.validate(key, this.formResult[key])
}
}
// 验证单独字段
async validate(key, newValue) {
const tempValue = this.validatorDict[key]
// 文件未定义规则,输出是undefined,所以后面走不下去了
// identity返回的是 ["max64", "normName"]
if (!tempValue) return
let errorTips = ''
const formResult = this.formResult
async function onceValidate(valItem) {
if (errorTips) return
if (_.isString(valItem) && valItem.includes('(') && valItem.includes(')')) {
const valArr = valItem.split('(')
const param = valArr[1].replace(')', '').split(',')
errorTips = Validate[valArr[0]](newValue, formResult, param)
} else if (_.isString(valItem)) {
errorTips = Validate[valItem](newValue, formResult)
}
if (_.isFunction(valItem)) errorTips = await valItem(newValue, formResult)
}
// 遍历tempValue数组,按数组每一项进行校验
if (_.isArray(tempValue)) {
for (const valItem of tempValue) await onceValidate(valItem)
} else await onceValidate(tempValue)
Vue.set(this.errorDict, key, errorTips)
}
async submit(): Promise<{} | null> {
await this.validateForm()
if (_.some(this.errorDict, val => ![undefined, null, ''].includes(val))) return null
return this.formResult
}
}
</script>
<style lang="sass" scoped>
table.form
width: 100%
table-layout: fixed
& > tbody
// &>tr:not(:first-child) td.content
// padding-top: 0px
// &>tr:first-child td.content
// padding-top: 20px
tr
margin: 10px
td
padding-bottom: 0
padding-top: 0
vertical-align: top
td
font-size: 12px
text-align: right
white-space: nowrap
min-width: 80px
td.content
text-align: left
padding-left: 0px
width: 100%
.tips-area
min-height: 20px
color: #F56C6C
font-size: 12px
.error-text
margin-left: 3px
.member
min-height: 0px
td.labelname
padding-left: 0px
&.required
& > td.labelname::before
content: '*'
color: #DC1818
margin-right: 0px
</style>
<template lang="pug">
.wrap(:class="{ error: isError, empty: isEmpty=== $t('public.paramNull') }")
input.input(
:type="type",
:value="showValue",
:disabled="disabled",
:placeholder="placeholder"
:maxlength="maxlength"
@focus="$emit('focus')",
@blur="$emit('blur')",
@change="event => { changeValue(event.target.value) }",
)
span.suffix {{ suffix }}
span.iconfont.icon-clear(
@click="changeValue('')",
)
slot
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class vInput extends Vue {
@Prop({ type: String, default: 'text' }) type
@Prop({ type: [String, Number], default: '' }) value
@Prop({ type: Boolean, default: false }) isError
@Prop({ type: String, default: '' }) isEmpty
@Prop({ type: Boolean, default: false }) disabled
// 文本域placeholder
@Prop({ type: String, default: '' }) placeholder
// 最大长度maxlength
@Prop({ type: Number, default: Infinity }) maxlength
// 后缀 一单用来显示单位
@Prop({ type: String, default: '' }) suffix
// 输出比率 一般用于单位换算 (只有在type为 number时可用)(常用于 输入GB输出MB 的情况)
@Prop({ type: Number, default: 1 }) outputRate
get showValue() {
if (this.type !== 'number') return this.value
else return this.value / this.outputRate
}
changeValue(val) {
let newVal = val
if (this.type === 'number') newVal = val * this.outputRate
this.$emit('change', newVal)
this.$emit('update:value', newVal)
}
}
</script>
<style lang="sass" scoped>
.wrap
position: relative
.input
width: 100%
padding: 8px 12px
padding-left: 12px
&::-webkit-input-placeholder
color: #ccc
&:-moz-placeholder
color:#ccc
&::-moz-placeholder
color: #ccc
&:-ms-input-placeholder
color: #ccc
.suffix
position: absolute
left: 100%
padding: 8px 0 0 5px
white-space: nowrap
.icon-clear
display: none
position: absolute
right: 10px
top: 50%
transform: translateY(-50%)
font-size: 14px
color: #F56C6C
cursor: pointer
&.error
.input
border-color: #FF4433
padding-right: 30px
.icon-clear
display: block
&.empty
.icon-clear
display: none
</style>
<template lang="pug">
.wrap
.radio-item.pointer(
v-for="option in options",
@click="changeValue(option.value)"
)
input.radio(
type="radio",
:class="{checked: option.value === value}",
@click.prevent="",
)
span(style="margin-left: 10px") {{ option.name }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class formRadios extends Vue {
// ex: { name: '选项1', value: 1 } 结构可等同与 select
@Prop({ type: Array, default: () => [] }) options
@Prop({ default: '' }) value
changeValue(val) {
this.$emit('change', val)
this.$emit('update:value', val)
}
}
</script>
<style lang="sass" scoped>
.wrap
.radio-item
display: inline-block
margin-right: 25px
</style>
<!--
可接受动态参数的select组件
-->
<template lang="pug">
.select(:class="{ 'select_disabled': disabled, error: isError }")
.select-box(
ref="box",
@click="showOptionList($event)",
:style="innerStyle",
:class="{ active: showRealOptions }",
)
.select-value(style="height: 100%")
//- display single value
.select-single-value(
v-if="!multi",
:class="{ 'not-match': !chosenItem }"
)
.show-text.no-wrap {{ prefix }} {{ chosenItem ? chosenItem.name : notMatchText }}
//- display multi values
.select-selected-items(v-else)
.select-selected-item(v-for="item of selectedItems")
span.select-selected-item-name {{ item.name }}
span.icon.icon-close.pointer(
@click.stop="toggleItem(item)",
)
//- search input
input.select-search(
ref="searchInput",
:disabled="disabled",
v-model="searchText",
v-show="showSearchInput",
@keyup.enter="selectFirstOption",
)
.iconfont.icon-angle-down.select-items-toggle(
v-show="showIconfont"
)
ul.select-items(
ref="optionList",
v-show="showRealOptions"
)
li.select-item(
v-show="!items.length"
) {{ notFound }}
li.select-item(
v-for="item in items"
@click="toggleItem(item)",
:class="{ chosen: isChosen(item) }",
v-tooltip-on-clip="nameTooltip(item)"
)
template(v-if="item.empty")
| {{ item.name }}
template(v-else)
| {{ item.name }}
</template>
<script>
import Popper from 'popper.js'
import { getElementProps } from '@/utils/dom'
// 菜单最大宽度
const MAX_MENU_WIDTH = 400
export default {
props: {
// 选项列表
// 在 computed 中处理成 realOptions
options: {
type: Array,
required: true,
},
// 是否显示下拉icon
showIconfont: {
type: Boolean,
default: true,
},
// 选中的 value
value: {
type: [String, Number, Boolean],
},
defaultValue: {
type: Object,
default: null,
},
// 是否可以搜索选项
// 不传值为超过7条数据自动可以搜索,false为强制不允许搜索。
search: {
type: Boolean,
default: null,
},
// value无匹配时显示文本
notMatchText: {
type: String,
default: '请选择',
},
// 没有搜索到选项的提示信息
notFound: {
type: String,
default: '找不到任何结果',
},
// 是否包含一个空选项
// 传入格式为 { name: 1, value: 1 }
emptyOption: {
default: null,
},
// 加在.select-box的样式
innerStyle: {
type: [Object, String],
default: '',
},
// 是否可以多选
multi: {
type: Boolean,
default: false,
},
disabled: {
type: Boolean,
default: false,
},
isError: {
type: Boolean,
default: false,
},
prefix: {
type: String,
default: '',
},
// 限制下拉内容宽度 默认false不限制 true限制为trigger元素一样宽
widthLimit: {
type: Boolean,
default: false,
},
},
data() {
return {
// 是否显示选项
showRealOptions: false,
// 搜索文本
searchText: '',
// 是否已经计算过下拉框宽度
hasCalculatedWidth: false,
// list of items selected in multi mode
selectedItems: [],
popper: null,
}
},
computed: {
// 处理传入的选项列表
realOptions() {
if (_.isEmpty(this.options)) return [{ name: vm.$t('public.noOption') }]
const tempOptions = _.map(this.options, option => {
return _.isObject(option)
? option
: { name: String(option), value: option }
})
if (this.emptyOption != null) {
tempOptions.unshift({
name: this.emptyOption.name,
value: this.emptyOption.value,
// 空选项标识
empty: true,
})
}
return tempOptions
},
items() {
if (!this.searchable) return this.realOptions
return this.realOptions.filter(o => o.name.includes(this.searchText))
},
chosenItem() {
if (this.realOptions.find(o => String(o.value) === String(this.value)) === undefined) {
return this.defaultValue
}
return this.realOptions.find(o => String(o.value) === String(this.value))
},
showSearchInput() {
return this.searchable ? this.showRealOptions : false
},
searchable() {
if (this.search !== null) return this.search
return this.realOptions.length > 7
},
},
watch: {
value: {
immediate: true,
handler() {
if (this.multi) {
// 如果 value 是空字符串,split() 将会返回一个长度为1的空数组(不是我们想要的)
if (!this.value.length) {
this.selectedItems = []
} else {
const values = this.value.split(',')
this.selectedItems = this.realOptions.filter(option => {
return _.includes(values, option.value)
})
}
}
},
},
showRealOptions(val) {
if (val) {
this.$emit('focus')
// 将菜单重新 append 到 body 上, 从根本上避免被容器遮挡
document.body.appendChild(this.$refs.optionList)
} else {
this.$emit('blur')
this.searchText = ''
const list = this.$refs.optionList
if (list && list.parentNode === document.body) document.body.removeChild(list)
}
},
},
mounted() {
document.addEventListener('click', this.closeOptionList, false)
},
beforeDestroy() {
const list = this.$refs.optionList
if (list && list.parentNode === document.body) document.body.removeChild(list)
document.removeEventListener('click', this.closeOptionList, false)
},
methods: {
nameTooltip(item) {
return {
value: item.name,
placement: 'left-end',
arrow: false,
// followCursor: 'horizontal',
// theme: 'light-custom',
maxWidth: 250,
}
},
showOptionList(e) {
if (this.disabled) {
return
}
const input = this.$refs.searchInput
if (this.showRealOptions) {
// 点击搜索框不需要关闭菜单
if (e.target !== input) {
this.showRealOptions = false
this.$nextTick(() => {
this.popper.destroy()
})
}
} else {
const { box, optionList } = this.$refs
this.showRealOptions = true
this.$nextTick(() => {
// 计算宽度, 至少与选择框同宽, 不超过最大宽度
if (!this.hasCalculatedWidth) {
// 计算并设置最新位置
const boxWidth = getElementProps(box, 'width')
const realOptionsWidth = getElementProps(optionList, 'width')
const width = this.widthLimit ? +boxWidth : _.min([
_.max([+boxWidth, +realOptionsWidth + 30]), MAX_MENU_WIDTH,
])
optionList.style.width = `${width}px`
this.hasCalculatedWidth = true
}
this.popper = new Popper(box, optionList, {
placement: 'bottom-start',
modifiers: {
offset: { offset: '0,6' },
hide: { enabled: false },
preventOverflow: { enabled: false },
},
})
})
}
this.$nextTick(() => {
if (this.searchable) input.focus()
})
},
/**
* 单选下选择选项,多选下开关选项
*/
toggleItem(item) {
if (this.disabled) {
return
}
let tempValue = ''
if (this.multi) {
if (_.includes(this.selectedItems, item)) {
this.selectedItems.$remove(item)
} else {
this.selectedItems.push(item)
}
tempValue = _.map(this.selectedItems, 'value').join(',')
} else {
this.showRealOptions = false
if (!this.isChosen(item)) tempValue = item.value
else return
}
if (this.defaultValue && tempValue === '') {
tempValue = this.defaultValue
}
this.$emit('change', tempValue)
this.$emit('update:value', tempValue)
},
closeOptionList({ target }) {
if (!this.$el.contains(target) && !this.$refs.optionList.contains(target)) {
this.showRealOptions = false
}
},
/**
* check if an item is chosen
*/
isChosen(item) {
return this.multi
? _.includes(this.selectedItems, item)
: String(item.value) === String(this.value)
},
/**
* 在搜索时直接回车选中符合条件的第一个选项
*/
selectFirstOption() {
if (this.items.length) {
this.toggleItem(this.items[0])
} else {
this.searchText = ''
}
},
},
}
</script>
<style lang="sass" scoped>
.select
display: inline-block
position: relative
width: 100%
height: 32px
color: #404040
font-size: 12px
line-height: 14px
vertical-align: middle
&.select_transparent
min-height: 14px
.select-box
min-height: 14px
box-shadow: none !important
border-color: transparent !important
background-color: transparent !important
.select-single-value
padding: 0 18px 0 0
&.error
.select-box
border-color: #F56C6C
.select-box
min-width: 70px
position: relative
width: 100%
height: 100%
transition: border .3s, box-shadow .3s
cursor: pointer
white-space: nowrap
overflow: hidden
text-overflow: ellipsis
background: #FFF
border: 1px solid #CCC
border-radius: 2px
&.active
border-color: #409EFF
.select-items-toggle
transform: rotate(180deg)
.select-single-value
// 为了补足 boder占用的 2px
height: calc(100% + 2px)
padding: 0 18px 0 12px
&.not-match
color: #CCC
&:before
display: inline-block
content: ''
height: 100%
vertical-align: middle
.show-text
width: 100%
display: inline-block
vertical-align: middle
.select-search
position: absolute
padding: 0 22px 0 8px
border: 0
outline: 0
left: 0
top: 1px
bottom: 0
width: 100%
height: 100%
// box-shadow: inset 0 1px 3px 0 rgba(0,0,0,0.15)
// mutli style
.select-selected-items
white-space: normal
padding: 2px 20px 2px 8px
.select-selected-item
display: inline-block
border: 1px solid #d7e4fe
border-radius: 2px
background-color: #e5ebff
margin: 2px 5px 2px 0
padding: 0 5px
height: 22px
font-size: 13px
color: #494C56
.icon
vertical-align: top
margin-left: 3px
line-height: 20px
transition: color .3s ease
&:hover
color: red
.select-selected-item-name
display: inline-block
vertical-align: top
max-width: 100px
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
.select-items-toggle
width: 40px
height: 30px
line-height: 30px
font-size: 16px
position: absolute
display: block
color: #B2B2B2
right: 0
top: 0
text-align: center
transition: transform .25s ease-in-out
.select-items
list-style: none
position: absolute
z-index: 1200
// padding: 10px 0
top: 39px
max-height: 255px
background-color: #FFF
box-shadow: 0 2px 4px 0 rgba(0,0,0,0.15)
border-radius: 2px
cursor: pointer
overflow-y: auto
.select-item
white-space: nowrap
font-size: 12px
line-height: 14px
padding: 9px 16px
overflow: hidden
text-overflow: ellipsis
&:hover
// color: #3088F7
background-color: #F1F1F5
// text-overflow:inherit
// overflow: visible
// white-space: pre-line
&.chosen,
&.chosen:hover
color: #3088F7
background-color: #F1F1F5
// background-repeat: no-repeat
// background-position: right 9px center
// background-image: url('data:image/svg+xml;charset=utf-8,<svg width="10" height="10" viewBox="2 4 14 10" xmlns="http://www.w3.org/2000/svg"><path d="M2.716 9.881a.951.951 0 0 1 0-1.378l-.032.032a1.042 1.042 0 0 1 1.436.003L7 11.308l6.885-6.62a1.045 1.045 0 0 1 1.431 0l-.032-.03a.949.949 0 0 1-.005 1.382L7.72 13.306a1.053 1.053 0 0 1-1.437.005l-3.568-3.43z" fill="%23FFF" fill-rule="evenodd"/></svg>')
.select.select_disabled
cursor: not-allowed
color: #999
.select-box
cursor: not-allowed
background-color: #f2f2f2
.select-selected-item
cursor: not-allowed
.select-search
cursor: not-allowed
.pointer
cursor: not-allowed
.select-items-toggle
color: #999
.select.small
height: 24px
.select-box .select-items-toggle
width: 24px
height: 24px
line-height: 24px
font-size: 12px
</style>
<!-- textarea文本域组件 -->
<template lang="pug">
.wrap(:class="{ error: isError }")
textarea.textarea(
ref="textarea"
:style="resizeStyle"
:placeholder="placeholder"
:disabled="disabled"
v-model="textareaValue"
@blur="$emit('blur')"
@focus="$emit('focus')"
)
.amount(
v-if="length"
:class="{ 'max-amount': value.length === length }"
) {{ value.length }}/{{ length }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class vTextarea extends Vue {
// 文本域值
@Prop({ type: String, default: '' }) value
// 最大长度 如果值为0 则表示不限制长度
@Prop({ type: Number, default: 100 }) length
// resize属性
@Prop({ type: Boolean, default: false }) resize
// 禁用textarea
@Prop({ type: Boolean, default: false }) disabled
// 文本域placeholder
@Prop({ type: String, default: '请输入' }) placeholder
@Prop({ type: Boolean, default: false }) isError
get textareaValue(): string { return this.value }
set textareaValue(val) {
if (this.length && val.length > this.length) {
val = val.substring(0, this.length)
this.$refs.textarea['value'] = val
}
this.$emit('update:value', val)
this.$emit('change', val)
}
get resizeStyle() {
return {
resize: this.resize ? 'vertical' : 'none',
}
}
}
</script>
<style lang="sass" scoped>
.wrap
position: relative
// display: inline-block
// height: 80px
&.error .textarea
border-color: #FF4433
.textarea
width: 100%
height: 100%
min-height: 100px
padding-left: 12px
border-radius: 2px
line-height: 18px
font-family: inherit
&::-webkit-input-placeholder
color: #ccc
&:-moz-placeholder
color:#ccc
&::-moz-placeholder
color: #ccc
&:-ms-input-placeholder
color: #ccc
.amount
position: absolute
bottom: 8px
right: 8px
font-size: 12px
&.max-amount
color: #FF4433
</style>
<!-- 表单内部使用的 简易上传组件 需要完善 -->
<template lang="pug">
//- 单文件逻辑
div.single(v-if="numberLimit === 1")
input-file(
v-if="uploadArray.length === 0",
ref="uploadArray",
:type-limit="typeLimit",
:disabled="disabled",
@change="files => { changeFile(files[0]) }",
)
.btn-text
span.iconfont.icon-shangchuan(:class="{disabledinput: this.disabled}")
span(:class="{disabledinput: this.disabled}") {{ btnText }}
.upload-ready(v-else)
div.file-name.no-wrap(v-tooltip-on-clip="uploadArray[0].name") {{ uploadArray[0].name }}
div.iconfont.icon-error(@click="deleteFile(0)")
.tips {{ bottomTips }}
//- 多文件逻辑
div.multi(v-else)
input-file(
v-if="uploadArray.length < numberLimit",
ref="uploadArray",
:type-limit="typeLimit",
:disabled="disabled",
@change="files => { changeFile(files[0]) }",
)
.btn-text
span.iconfont.icon-shangchuan(:class="{disabledinput: this.disabled}")
span(:class="{disabledinput: this.disabled}") {{ btnText }}
.upload-ready(v-if="uploadArray.length>0")
.file(v-for="(file,index) in uploadArray" :key="index")
span.file-name.no-wrap(v-tooltip-on-clip="file.name") {{ file.name }}
span.iconfont.icon-error(@click="deleteFile(index)")
.tips {{ bottomTips }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import inputFile from '@/components/input-file.vue'
@Component({
components: {
inputFile,
},
})
export default class formUpload extends Vue {
@Prop({ type: String, default: '.zip, .gz' }) typeLimit
// 文件个数限制
@Prop({ type: Number, default: 1 }) numberLimit
@Prop({ type: String, default: '上传' }) btnText
@Prop({ type: String, default: '' }) bottomTips
@Prop({ type: Array, default: () => [] }) uploadArray
// 禁用上传
@Prop({ type: Boolean, default: false }) disabled
changeFile(file) {
if (this.disabled) return
// this.uploadFile = file
this.uploadArray.push(file)
if (this.numberLimit === 1) {
this.$emit('change', file)
} else {
this.$emit('change', this.uploadArray)
}
}
deleteFile(index) {
if (this.disabled) return
this.uploadArray.splice(index, 1)
this.$emit('change', this.uploadArray)
}
}
</script>
<style lang="sass" scoped>
.single
.btn-text .iconfont
margin-right: 5px
color: #fff
.btn-text
color: #fff
background: #409eff
padding: 6px
border-radius: 2px
.disabledinput
color: #CCCCCC
.disabledinput:hover
color: #CCCCCC
cursor: not-allowed
.upload-ready
display: flex
// width:400px
// overflow: hidden
// white-space: nowrap
// text-overflow: ellipsis
.file-name
max-width: 420px
overflow: hidden
white-space: nowrap
text-overflow: ellipsis
color: #409EFF
.iconfont
color: #DC1818
margin-left: 5px
cursor: pointer
.tips
margin-top: 5px
font-size: 12px
color: #C3CBD6
.multi
.btn-text .iconfont
margin-right: 5px
color: #fff
.btn-text
color: #fff
background: #409eff
padding: 6px
border-radius: 2px
.disabledinput
color: #CCCCCC
.disabledinput:hover
color: #CCCCCC
cursor: not-allowed
.upload-ready
margin-top: 20px
display: flex
flex-wrap: wrap
.file
display: flex
margin-bottom: 6px
margin-right: 20px
.file-name
color: #409EFF
max-width: 420px
overflow: hidden
white-space: nowrap
text-overflow: ellipsis
.iconfont
color: #DC1818
margin-left: 5px
cursor: pointer
.tips
margin-top: 5px
font-size: 12px
color: #C3CBD6
</style>
export default {
username(value) {
const usernameReg = /^[\u4e00-\u9fa5\u0800-\u4e00\w-]{2,64}$/
if (_.isEmpty(value)) {
return vm.$t('login.pleaseInputUsername')
} if (value.length < 2 || value.length > 64) {
return vm.$t('public.userNameLength')
} if (!usernameReg.test(value)) {
// return '用户名只支持中英文,数字及中划线下划线'
return vm.$t('public.reInput')
}
return ''
},
password(value) {
// eslint-disable-next-line
// const passwordReg = /(?=.*([A-Z].*))(?=.*([a-z].*))(?=.*[0-9].*)[\w`~!@#$%^&*()\-+=<>?:{}|,.\/;\[\]]{8,64}$/
const passwordReg = /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,64}/
if (_.isEmpty(value)) {
return vm.$t('login.pleaseInputPassword')
} if (value.length < 8 || value.length > 64) {
return vm.$t('public.passwordLength')
} if (!passwordReg.test(value)) {
return vm.$t('public.include')
// return '必须包含大写字母,小写字母和数字,只支持英文特殊符号及中划线下划线'
}
return ''
},
// 文件大小校验
FileSize(files) {
for (const count in files) {
const limit = (files[count].size / (1024 * 1024 * 1024)).toFixed(2)
if (limit > 1) return '最大只能上传大小为1G的文件'
}
},
notEmpty(value) {
if (value == null || value === '' || value === -1 || value.length === 0) return vm.$t('public.paramNull')
return ''
},
updateNotEmpty(value) {
// 文件上传回显时,value为string,上传文件时value为Array,所以string就不能提示
if ((value == null || value.length === 0) && typeof value !== 'string') return '该字段不能为空'
return ''
},
max30(value) {
if (value.toString().length > 30) return vm.$t('public.noMoreThirty')
return ''
},
min2(value) {
if (value.toString().length < 2) return vm.$t('public.lengthNoTwo')
return ''
},
min4(value) {
if (value.toString().length < 4) return '字段长度不能少于4位'
return ''
},
max64(value) {
if (value.toString().length > 64) return vm.$t('public.lengthNoSixFour')
return ''
},
newMax64(value) {
if (value.toString().length > 64) return '仅支持1-64个字符'
return ''
},
engName(value) {
const regex = /^[\w-]*$/
// if (!regex.test(value)) return '只支持英文、数字、中下划线'
if (!regex.test(value)) return vm.$t('public.reInput')
},
normName(value) {
// const regex = /^[\u4e00-\u9fa5\w-]*$/
const regex = /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00.:\-_()[\]{}\s]/g
// if (!regex.test(value)) return '只支持中英文、数字、中下划线'
if (regex.test(value)) return vm.$t('public.formatCJE')
},
newNormName(value) {
// const regex = /^[\u4e00-\u9fa5\w-]*$/
const regex = /[^a-z|A-Z|0-9|\-|_|.]/g
// if (!regex.test(value)) return '只支持中英文、数字、中下划线'
if (regex.test(value)) return '允许英文数字中划线、下划线'
},
email(value) {
const regex = /^[A-Za-z0-9\u4e00-\u9fa5._]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
if (value === '' || value == null) return ''
if (!regex.test(value)) return vm.$t('public.emailFormat')
},
onlyNum(value) {
const regx = /^\d+(\.\d+)?$/
if (!regx.test(value)) {
return vm.$t('public.onlyInputNum')
}
},
onlyInt(value) {
const regx = /^\d+$/
if (!regx.test(value)) {
return vm.$t('validator.int')
}
},
numRange(value, result, param) {
const numVal = Number(value)
if (numVal < Number(param[0]) || numVal > Number(param[1])) {
// return `比例值必须大于${param[0]},小于${param[1]}`
return vm.$t('public.proportion', { msg1: param[0], msg2: param[1] })
}
},
min(value, result, param) {
const numVal = Number(value)
if (numVal <= Number(param[0])) {
return vm.$t('validator.minVal', { val: param[0] })
}
},
minInclude(value, result, param) {
const numVal = Number(value)
if (numVal < Number(param[0])) {
return vm.$t('validator.minValInclude', { val: param[0] })
}
},
}
<!--
全屏幕弹窗
@author cui
-->
<template lang="pug">
.popup-container
transition(name="fade")
.popup-bg(v-if="propShow")
.close-button(
@click.stop="propShow = false"
) &times;
transition(name="fade")
.popup-content.flex.column(v-if="propShow")
//- 头部
.popup-header(ref="header")
slot(name="header")
//- 内容区 (内容元素过少, 可能出现滚动条, 增加少量padding即可解决)
.popup-body.flex-1(ref="body")
slot(name="body")
//- 底部
.popup-footer(v-if="showFooter")
slot(name="footer")
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
// import { getElementProps } from '@/utils/dom'
@Component
export default class fullPopup extends Vue {
// 控制显隐
@Prop({ type: Boolean, default: false }) show
// 默认不存在底部
@Prop({ type: Boolean, default: false }) showFooter
get propShow() { return this.show }
set propShow(val) {
this.$emit('dismiss')
this.$emit('update:show', val)
}
}
</script>
<style lang="sass" scoped>
.popup-container
.popup-bg
position: fixed
z-index: 901
left: 0
right: 0
top: 0
bottom: 0
background-color: rgba(0,0,0,.8)
.close-button
position: absolute
top: 20px
right: 20px
cursor: pointer
font-size: 30px
color: #9DA7B4
.popup-content
padding: 0
position: fixed
top: 70px
left: 20px
right: 20px
bottom: 20px
z-index: 902
border-radius: 2px
background-color: #FFF
box-shadow: 0 0 5px rgba(0,0,0,.2)
.popup-header
overflow: hidden
.popup-body
overflow-y: auto
word-break: break-word
</style>
// 使用频率高的组件挂载到全局
import popup from './popup.vue'
// import select from './form/select.vue'
import textarea from './form/textarea.vue'
import dropdown from './dropdown.vue'
// import codeEditor from './code-editor.vue'
// import tabs from './tabs.vue'
// import dataEmpty from './data-empty.vue'
import progressBar from './progress-bar.vue'
// import fullPopup from './full-popup.vue'
// import rightSlide from './right-slide.vue'
// import pagination from './pagination.vue'
import formTable from './form/index.vue'
// import ajaxButton from './form/ajax-button.vue'
import seetaInput from './seeta-ui/seeta-input.vue'
import seetaButton from './seeta-ui/seeta-button.vue'
// import seetaCollapse from './seeta-ui/seeta-collapse.vue'
import seetaForm from './seeta-ui/seeta-form/form.vue'
import seetaFormItem from './seeta-ui/seeta-form/form-item.vue'
import seetaUpload from './seeta-ui/seeta-upload.vue'
// import seetaDropdown from './seeta-ui/seeta-dropdown.vue'
import seetaTable from './seeta-ui/seeta-table'
// import seetaTooltip from './seeta-ui/seeta-tooltip.vue'
import seetaTabs from './seeta-ui/seeta-tabs.vue'
import seetaSelect from './seeta-ui/seeta-select.vue'
import seetaMenu from './seeta-ui/seeta-menu.vue'
import seetaCrumb from './seeta-ui/seeta-crumb.vue'
// import dateRange from './list-filter/date-range.vue'
// import name from './list-filter/name.vue'
// import time from './list-filter/time.vue'
import puzzlevalidator from './PuzzleValidator'
import Vue from 'vue'
import datePicker from './calendar/index.vue'
// Vue.component('datePicker', datePicker)
// Vue.component('dateRange', dateRange)
// Vue.component('name', name)
// Vue.component('timec', time)
// Vue.component('popup', popup)
// Vue.component('v-select', select)
Vue.component('v-textarea', textarea)
Vue.component('dropdown', dropdown)
// Vue.component('code-editor', codeEditor)
// Vue.component('tabs', tabs)
// Vue.component('data-empty', dataEmpty)
Vue.component('progress-bar', progressBar)
// Vue.component('full-popup', fullPopup)
// Vue.component('right-slide', rightSlide)
// Vue.component('pagination', pagination)
Vue.component('form-table', formTable)
// Vue.component('ajax-button', ajaxButton)
Vue.component('st-input', seetaInput)
Vue.component('st-button', seetaButton)
// Vue.component('st-collapse', seetaCollapse)
Vue.component('st-form', seetaForm)
Vue.component('st-form-item', seetaFormItem)
Vue.component('st-upload', seetaUpload)
// Vue.component('st-dropdown', seetaDropdown)
Vue.component('st-table', seetaTable)
Vue.component('st-dialog', popup)
Vue.component('popup', popup)
// Vue.component('v-table', seetaTable) // 兼容旧表格调用方法
// Vue.component('st-tooltip', seetaTooltip)
Vue.component('st-tabs', seetaTabs)
Vue.component('st-select', seetaSelect)
Vue.component('st-menu', seetaMenu)
Vue.component('st-crumb', seetaCrumb)
Vue.component('puzzle-validator', puzzlevalidator)
<!-- 上传逻辑封装,小型文件html上传方式 -->
<!--
eg: input-file(
ref="uploadFile",
style="width: 60px; height: 32px",
)
.btn.btn-important 上传
-->
<template lang="pug">
.import-file-box(:class="{ 'is-drag': isDrag }")
label.upload-label(
ref="uploadTrigger",
:for="inputFileId",
)
slot
input.upload-input(
type="file",
ref="uploadInput",
:id="inputFileId",
:accept="typeLimit",
@change="fileChange",
:disabled="disabled",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import Drag from '@/helpers/drag.ts'
@Component
export default class inputFile extends Vue {
@Prop({ type: String, default: '' }) typeLimit
// 允许拖拽上传
@Prop({ type: Boolean, default: false }) allowDrag
@Prop({ type: Boolean, default: false }) disabled
// 构建的 拖拽实例
reception: any = null
// 拖拽文件在文件上传区域时为true 用来增加样式类名
isDrag: boolean = false
$refs!: {
uploadTrigger: HTMLLabelElement,
}
mounted() { if (this.allowDrag) this.initDrag() }
beforeDestroy() { this.reception && this.reception.destroy() }
// 为文件上传区域增加拖拽逻辑
initDrag() {
this.$nextTick(() => {
const uploadEl = this.$refs.uploadTrigger
this.reception = new Drag(uploadEl, {
drop: e => {
this.isDrag = false
// 获取文件对象
const data = e.dataTransfer.files
if (data.length < 1) return
// 获取文件类型
const matchs = data[0].name.match(/.(\w+)$/)
const type = matchs && matchs[1]
// 校验文件类型
if (!type || this.typeLimit.indexOf(type) === -1) {
Toast.danger(`${vm.$t('public.onlyUpload')}${this.typeLimit}${vm.$t('public.formatFile')}`)
return
}
this.$emit('change', data)
},
dragOver: () => {
this.isDrag = true
this.$emit('drag-over')
},
dragLeave: () => {
this.isDrag = false
this.$emit('drag-leave')
},
})
})
}
get inputFileId() {
const rondomId = Math.random().toString(36).substr(2)
return `file-${rondomId}`
}
upload() {
const uploadTrigger: any = this.$refs.uploadTrigger
uploadTrigger.click()
}
fileChange(event) {
const files = event.target.files || event.dataTransfer.files
this.$emit('change', files)
event.target.value = ''
}
}
</script>
<style lang="sass" scoped>
.import-file-box
display: inline-block
.upload-label
display: block
height: 100%
cursor: pointer
.upload-input
display: none
</style>
<!-- 时间筛选 -->
<template lang="pug">
.time-filter
span.label-name {{title}}
date-picker.date-filter(
v-model="startTime",
@change="changeFilter({ start_time: formatDate(startTime) })",
)
.date-border(:class="{ empty: !startTime }") {{ startTimeText }}
span(style="margin: 0 6px") -
date-picker.date-filter(
v-model="endTime",
@change="changeFilter({ end_time: formatDate(endTime) })",
)
.date-border(:class="{ empty: !endTime }") {{ endTimeText }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import datePicker from '@/components/form/date-picker/index.vue'
@Component({
components: { datePicker },
})
export default class timeFilter extends Vue {
@Prop({ type: String, default: vm.$t('hashrateQuota.time') }) title
startTime: string = ''
endTime: string = ''
get startTimeValue() {
return this.$route.query.start_time || ''
}
get endTimeValue() {
return this.$route.query.end_time || ''
}
get startTimeText() {
return this.startTime
? (this.$options.filters as any).date(this.startTime, 'YYYY.MM.DD')
: this.$t('public.chooseDate')
}
get endTimeText() {
return this.endTime
? (this.$options.filters as any).date(this.endTime, 'YYYY.MM.DD')
: this.$t('public.chooseDate')
}
@Watch('$route', { immediate: true })
setDate(val) {
const { query } = val
this.startTime = query.start_time || ''
this.endTime = query.end_time || ''
}
getFormatDate(preDay = 0) {
return this.formatDate(moment().add(preDay ? 1 - preDay : 0, 'day'))
}
// 统一要挂载到路由上的日期格式
formatDate(value) {
return moment(value).format('YYYY-MM-DD')
}
// 选择时间区间
changeDate(val) {
this.changeFilter({
start_time: val.startTime,
end_time: val.endTime,
})
}
// 更改筛选项 并触发路由
changeFilter(filter = {}) {
const s = filter['start_time'] || this.startTime
const e = filter['end_time'] || this.endTime
if (s > e) {
if (filter['start_time']) {
this.endTime = ''
filter['end_time'] = ''
} else {
this.startTime = ''
filter['start_time'] = ''
}
}
this.$emit('change', [this.startTime, this.endTime])
}
}
</script>
<style lang="sass" scoped>
.time-filter
display: inline-block
vertical-align: middle
.label-name
vertical-align: middle
margin-right: 6px
.filter-item
height: 32px
line-height: 32px
&:not(:last-child)
margin-right: 6px
.date-filter
vertical-align: middle
.date-border
width: 100px
height: 24px
line-height: 24px
border: 1px solid #CCC
border-radius: 2px
text-align: center
cursor: pointer
&.empty
color: #CCC
</style>
<!-- 名称筛选 -->
<template lang="pug">
.search
input.search-input(
type="text",
v-model="name",
:placeholder="placeholder",
@keyup.enter="search"
)
.iconfont.icon-search(@click="search")
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class nameFilter extends Vue {
@Prop({ type: String, default: vm.$t('public.inputDataName') }) placeholder
name: string = ''
@Watch('$route', { immediate: true })
setDate(val) {
this.name = val.query.name || ''
}
search() {
const routeQuery = this.$route.query
// 避免重复搜索
if (this.name === routeQuery.name) return
const query = {
...routeQuery,
name: this.name,
page_index: '1',
}
this.$router.replace({ query: _.omitBy(query, item => item === '') })
}
}
</script>
<style lang="sass" scoped>
.search
width: 240px
position: relative
display: inline-block
.search-input
width: 100%
padding-right: 35px
.icon-search
position: absolute
right: 0
top: 0
width: 44px
height: 32px
text-align: center
line-height: 32px
font-size: 18px
color: #CCC
cursor: pointer
border-radius: 0 2px 2px 0
</style>
<!-- 时间筛选 -->
<template lang="pug">
.time-filter
span.label-name {{$t('hashrateQuota.time')}}
button.btn.btn-gray.filter-item(
:class="{active: startTimeValue === item.startTime &&\
endTimeValue === item.endTime }",
@click="changeDate(item)",
v-for="item in dateList",
) {{ item.name }}
date-picker.date-filter(
v-model="startTime",
@change="changeFilter({ start_time: formatDate(startTime) })",
)
.date-border(:class="{ empty: !startTime }") {{ startTimeText }}
span(style="margin: 0 6px") -
date-picker.date-filter(
v-model="endTime",
@change="changeFilter({ end_time: formatDate(endTime) })",
)
.date-border(:class="{ empty: !endTime }") {{ endTimeText }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import datePicker from '@/components/form/date-picker/index.vue'
@Component({
components: { datePicker },
})
export default class timeFilter extends Vue {
startTime: string = ''
endTime: string = ''
get startTimeValue() {
return this.$route.query.start_time || ''
}
get endTimeValue() {
return this.$route.query.end_time || ''
}
get startTimeText() {
return this.startTime
? (this.$options.filters as any).date(this.startTime, 'YYYY.MM.DD')
: this.$t('public.chooseDate')
}
get endTimeText() {
return this.endTime
? (this.$options.filters as any).date(this.endTime, 'YYYY.MM.DD')
: this.$t('public.chooseDate')
}
get dateList() {
return [
{ name: this.$t('public.all'), startTime: '', endTime: '' },
{ name: this.$t('public.today'), startTime: this.getFormatDate(1), endTime: this.getFormatDate() },
{ name: this.$t('public.week'), startTime: this.getFormatDate(7), endTime: this.getFormatDate() },
{ name: this.$t('public.oneMonth'), startTime: this.getFormatDate(30), endTime: this.getFormatDate() },
{ name: this.$t('public.threeMonth'), startTime: this.getFormatDate(90), endTime: this.getFormatDate() },
]
}
@Watch('$route', { immediate: true })
setDate(val) {
const { query } = val
this.startTime = query.start_time || ''
this.endTime = query.end_time || ''
}
getFormatDate(preDay = 0) {
return this.formatDate(moment().add(preDay ? 1 - preDay : 0, 'day'))
}
// 统一要挂载到路由上的日期格式
formatDate(value) {
return moment(value).format('YYYY-MM-DD')
}
// 选择时间区间
changeDate(val) {
this.changeFilter({
start_time: val.startTime,
end_time: val.endTime,
})
}
// 更改筛选项 并触发路由
changeFilter(filter = {}) {
const s = filter['start_time'] || this.startTime
const e = filter['end_time'] || this.endTime
if (s > e) {
if (filter['start_time']) {
this.endTime = ''
filter['end_time'] = ''
} else {
this.startTime = ''
filter['start_time'] = ''
}
}
const query = {
...this.$route.query,
page_index: '1',
...filter,
}
this.$router.replace({ query: _.omitBy(query, item => item === '') })
}
}
</script>
<style lang="sass" scoped>
.time-filter
display: inline-block
vertical-align: middle
.label-name
vertical-align: middle
margin-right: 6px
.filter-item
height: 32px
line-height: 32px
font-size: 14px
&:not(:last-child)
margin-right: 6px
.date-filter
vertical-align: middle
.date-border
width: 100px
height: 32px
line-height: 32px
border: 1px solid #CCC
border-radius: 2px
text-align: center
cursor: pointer
&.empty
color: #999
font-size: 14px
</style>
<template lang="pug">
.mark-picture.flex(
:style="currentContainerStyle",
)
.wrap(v-if="imgEle")
img.picture(
:class="{mobile: !showSize.width}",
ref="image",
:src="imgEle.src",
:width="showSize.width || 'auto'",
:height="showSize.height || 'auto'",
)
canvas.canvas(
ref='canvas',
:width="showSize.width",
:height="showSize.height",
:class="type",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import MarkRect from './mark-common'
import imgPretreat from '@/helpers/img-pretreat'
import { getElementProps } from '../../utils/dom'
interface size {
width: number,
height: number,
}
@Component
export default class markPicture extends Vue {
$refs!: {
canvas: HTMLCanvasElement,
}
// 图片元素
@Prop({ type: HTMLImageElement, default: null }) imgEle
// 标注类型
// rectangle_box_detection | boxing(矩形标注)
// segmentation(语义分割)
// single_label_classification(单标签分类标注)
@Prop({ type: String, default: 'rectangle_box_detection' }) type
// 绘制信息
@Prop({ type: [Array, HTMLImageElement, String], default: () => [] }) markInfo
// 缩放倍数
@Prop({ type: Number, default: 1 }) zoomScale
// 是否在标注框显示标签
@Prop({ type: Boolean, default: true }) isAddText
// 是否添加点击高亮标注框事件
@Prop({ type: Boolean, default: false }) isAddClickEvent
// 是否是移动端
@Prop({ type: Boolean, default: false }) isMobile
containerSize: size = { width: 0, height: 0 }
markAction: any = null
mounted() {
window.addEventListener('resize', this.getContainerSize)
this.getContainerSize()
}
beforeDestroy() {
if (this.markAction) this.markAction.destroy()
window.removeEventListener('resize', this.getContainerSize)
}
@Watch('imgEle', { immediate: true })
async onPictureChange() {
if (this.isMobile) this.containerSize = { width: 0, height: 0 }
if (!this.imgEle) return
this.$nextTick(() => {
if (this.isMobile) this.getContainerSize()
if (this.markAction) this.markAction.destroy()
this.markAction = new MarkRect(this.$refs.canvas, {
scale: this.finalScale,
canvasSize: this.showSize,
isAddText: this.isAddText,
isClick: this.isAddClickEvent,
updateMarkInfo: info => {
this.$emit('update-mark-info', info)
},
})
})
}
@Watch('type', { immediate: true })
onTypeChange(val) { this.reDraw() }
@Watch('markInfo', { immediate: true })
onMarkInfoChange(val) { this.reDraw() }
@Watch('finalScale')
onImageZoom() {
this.$nextTick(() => {
this.markAction.zoomReDraw(this.finalScale, this.showSize)
})
}
reDraw() {
if (!this.imgEle) return
this.$nextTick(() => {
this.markAction.draw(this.type, this.markInfo)
})
}
get currentContainerStyle() {
const mobileStyle = {
width: this.containerSize.width ? `${this.containerSize.width}px` : 'auto',
height: this.containerSize.height ? `${this.containerSize.height}px` : 'auto',
}
const commonStyle = {
'align-items': this.showSize.height < this.containerSize.height ? 'center' : 'start',
'justify-content': this.showSize.width < this.containerSize.width ? 'center' : 'start',
}
return this.isMobile ? { ...commonStyle, ...mobileStyle } : commonStyle
}
get initScale() {
if (!this.imgEle) return 1
let tempScale = 1.0
const widthGap = this.imgEle.width - this.containerSize.width
const heightGap = this.imgEle.height - this.containerSize.height
const widthScale = this.containerSize.width * 1.0 / this.imgEle.width
const heightScale = this.containerSize.height * 1.0 / this.imgEle.height
// 宽或高超出的情况下,根据超出最大的计算缩放比例。 没有超出则返回默认1.0
if (widthGap > 0 || heightGap > 0) {
tempScale = widthScale > heightScale ? heightScale : widthScale
}
return tempScale
}
get finalScale() { return this.zoomScale * this.initScale }
// 图片当前显示尺寸
get showSize() {
if (!this.imgEle) return { width: 0, height: 0 }
return {
width: this.imgEle.width * this.finalScale,
height: this.imgEle.height * this.finalScale,
}
}
getContainerSize() {
this.containerSize = getElementProps(this.$el, ['width', 'height'])
}
// 切换渲染方式
drawPage(isAddText: boolean = true) {
this.markAction.changeDrawType(isAddText)
}
}
</script>
<style lang="sass" scoped>
.mark-picture
overflow: auto
.wrap
position: relative
display: inline-block
.picture
display: block
&.mobile
max-width: 100%
.canvas
position: absolute
left: 0
top: 0
&.segmentation
opacity: 0.5
</style>
import { drawBndBox } from '../data-attributes/draw'
import getSegmentationImg from './segmentation'
import { drawText, preFormatImageData, windowToCanvas, getPointDistance } from './util'
import Vue from 'vue'
interface options {
scale: number,
canvasSize: size,
isAddText: boolean,
isClick?: boolean,
updateMarkInfo?: Function,
}
interface size {
width: number,
height: number,
}
// 绘制类型
// rectangle_box_detection | boxing(矩形标注)
// single_label_classification(单标签分类标注)
// segmentation(语义分割)
type drawType = 'rectangle_box_detection'
| 'boxing'
| 'segmentation'
| 'single_label_classification'
export default class ImageMarkCommon {
private _dom!: HTMLCanvasElement
private _options!: options
private _mousemoveFunction!: (event: MouseEvent) => any
private _clickCanvasFunction!: (event: MouseEvent) => any
// 标注框颜色List
private _infoColorList: string[] = ['#DD0000', '#D59D03', '#A329A3',
'#C15400', '#B51939', '#2960A3', '#6D13A8', '#269980', '#AE2163']
private _scale: number = 1
private _isAddText: boolean = true
private _isClick: boolean = false
ctx!: CanvasRenderingContext2D
canvasSize: size = { width: 0, height: 0 }
// 要绘制的类型 rectangle_box_detection(矩形标注)/segmentation(语义分割)
type: drawType = 'rectangle_box_detection'
drawInfo: any = null
constructor(dom: HTMLCanvasElement, options: options) {
if (!dom) {
const error = '[MarkRect]: 请提供放置目标容器。'
console.error(error)
return
}
this._options = options
this._dom = dom
this.ctx = dom.getContext('2d')!
this.canvasSize = options.canvasSize
this._scale = options.scale
this._isAddText = options.isAddText
this._isClick = options.isClick || false
this.canvasInit()
}
canvasInit() {
const _this = this
const target = this._dom
if (this._isClick) {
this._clickCanvasFunction = function(event: MouseEvent) {
_this.getCurrentMarkInfo(event)
}
target.addEventListener('click', this._clickCanvasFunction)
} else {
this._mousemoveFunction = function(event: MouseEvent) {
_this.getCurrentMarkInfo(event)
}
target.addEventListener('mousemove', this._mousemoveFunction, false)
}
}
// 绘制
async draw(type, drawInfo) {
if (!type || !['rectangle_box_detection', 'boxing', 'single_label_classification',
'segmentation'].includes(type)) {
console.error('[markAction]:传入标注类型错误')
return
}
this.type = type
this.clear()
switch (this.type) {
// 矩形框标注
case 'rectangle_box_detection':
case 'boxing':
this.drawInfo = preFormatImageData(drawInfo, this._infoColorList)
this.startDrawRect()
break
// 语义分割覆盖图
case 'segmentation':
if (!_.isElement(drawInfo)) return
this.drawInfo = await getSegmentationImg(drawInfo)
this.drawSegmentation()
break
/**
* 单标签分类标注
* object类型的为旧数据单标签对应object标注字段
* 新数据对应的class_name字段为字符串
*/
case 'single_label_classification':
if (typeof drawInfo === 'object') this.drawInfo = drawInfo[0] && drawInfo[0].name
else this.drawInfo = drawInfo
this.drawLabel()
}
}
// 缩放重绘
zoomReDraw(scale, size) {
this.canvasSize = size
this._scale = scale
this.clear()
switch (this.type) {
case 'rectangle_box_detection':
case 'boxing':
this.drawMarkFrame()
break
case 'segmentation':
this.drawSegmentation()
break
case 'single_label_classification':
this.drawLabel()
break
}
}
// 开始绘制标注框
startDrawRect() {
this.operateFunction('updateMarkInfo')
this.drawMarkFrame()
}
// 绘制矩形标注框
drawMarkFrame() {
_.forEach(this.drawInfo, info => {
drawBndBox(this.ctx, info, this._scale, this._isAddText)
})
}
// 绘制语义分割
drawSegmentation() {
if (!this.drawInfo) return
this.ctx.drawImage(this.drawInfo, 0, 0, this.canvasSize.width, this.canvasSize.height)
}
// 绘制左上角标签
drawLabel() {
if (!this.drawInfo) return
drawText(this.ctx, this.drawInfo, [0, 0], this._scale)
}
// 切换渲染形式 圈内或者圈外
changeDrawType(isAddText) {
if (this.type === 'segmentation') return
this._isAddText = isAddText
this.clear()
this.drawMarkFrame()
}
// 清除画布
clear() {
this.ctx!.clearRect(0, 0, this.canvasSize.width, this.canvasSize.height)
}
getCurrentMarkInfo(e) {
// 如果不是矩形框标注 则不做逻辑处理
if (!['rectangle_box_detection', 'boxing'].includes(this.type)) return
const _event = e
const location = _event
? windowToCanvas(this._dom, _event.clientX, _event.clientY)
: { x: 0, y: 0 }
_.forEach(this.drawInfo, markPoint => {
const xMin = markPoint.xmin * this._scale
const xMax = markPoint.xmax * this._scale
const yMin = markPoint.ymin * this._scale
const yMax = markPoint.ymax * this._scale
const isContain = (location.x >= xMin && location.x <= xMax) &&
(location.y >= yMin && location.y <= yMax)
markPoint.isContain = isContain
})
this.clear()
this.startDrawRect()
}
destroy() {
this.removeEvents()
}
/**
* 移除拖拽相关事件
*/
removeEvents() {
const target = this._dom
if (this._isClick) {
target.removeEventListener('click', this._clickCanvasFunction)
} else {
target.removeEventListener('mousemove', this._mousemoveFunction, false)
}
}
operateFunction(type: string) {
if (typeof this._options[type] === 'function') {
this._options[type](this.drawInfo)
}
}
}
// 处理图片语义分割 将黑底(背景)设置白色,其他颜色进行替换
export default async function getSegmentationImg(imgEl: HTMLImageElement)
: Promise<HTMLImageElement> {
const { width, height } = imgEl
const canvas = document.createElement('canvas')
canvas.width = width
canvas.height = height
const ctx: CanvasRenderingContext2D = canvas.getContext('2d')!
ctx.drawImage(imgEl, 0, 0)
const pDate = ctx.getImageData(0, 0, width, height).data
const len = pDate.length
const getColorFn = createColorObject()
ctx.clearRect(0, 0, width, height)
const imgData = ctx.createImageData(width, height)
for (let i = 0; i < len; i += 4) {
const flag: string = `${pDate[i]}&${pDate[i + 1]}&${pDate[i + 2]}`
const colors = getColorFn(flag)
imgData.data[i] = colors[0]
imgData.data[i + 1] = colors[1]
imgData.data[i + 2] = colors[2]
imgData.data[i + 3] = colors[3]
}
ctx.putImageData(imgData, 0, 0)
const drawImg = new Image()
drawImg.src = canvas.toDataURL('image/png')
return drawImg
}
// 处理分割颜色值映射关系
function createColorObject() {
const colorObject = {
'0&0&0': [255, 255, 255, 0],
}
let index = 0
// 语义分割颜色List
const colorList = [
[221, 0, 0, 255], [213, 157, 3, 255], [163, 41, 163, 255],
[193, 84, 0, 255], [181, 25, 57, 255], [41, 96, 163, 255],
[109, 19, 168, 255], [38, 153, 128, 255], [174, 33, 99, 255],
]
const length = colorList.length
return function(colorFlag: string): number[] {
if (colorFlag in colorObject) return colorObject[colorFlag]
colorObject[colorFlag] = colorList[index] || colorList[index % length]
index++
return colorObject[colorFlag]
}
}
// 处理标注图片信息,按名字分组标注颜色
export function preFormatImageData(markInfo, infoColorList): any[] {
const markInfoByGroup = _.values(_.groupBy(markInfo, info => {
return info.name
}))
const tempMarkColor = _.map(markInfoByGroup, (infoGroup, index) => {
return _.map(infoGroup, info => {
const colorIndex = index % (infoColorList.length)
return {
...info,
isContain: false,
lineColor: infoColorList[colorIndex],
}
})
})
return _.flattenDeep(tempMarkColor)
}
// 计算鼠标在canvas上的坐标
export function windowToCanvas(canvas, x, y) {
const bbox = canvas.getBoundingClientRect()
return {
x: x - bbox.left,
y: y - bbox.top,
}
}
// 计算鼠标位置到多边形顶点距离
export function getPointDistance(location, x, y) {
const dx = Math.abs(location.x - x)
const dy = Math.abs(location.y - y)
return Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2))
}
// 画文本
export function drawText(
ctx: CanvasRenderingContext2D,
name: string,
point: [number, number],
scale: number = 1
) {
const [x, y] = [point[0] * scale, point[1] * scale]
const height = 21 * scale
const isBeyondEdges = y <= height
const rectX = isBeyondEdges ? x + 1 : x - 1
const rectY = isBeyondEdges ? y + 1 : y - height - 1
ctx.fillStyle = 'rgba(0,0,0,0.50)'
ctx.fillRect(rectX, rectY, name.length * scale * 10 + 10, height)
ctx.fillStyle = '#fff'
ctx.font = `${18 * scale}px Arial`
const nameX = x + 5 * scale
const nameY = isBeyondEdges ? y + 16 * scale : y - 4 * scale
ctx.fillText(name, nameX, nameY)
}
<!-- 页面顶部加载进度条 -->
<template lang="pug">
.network-loader(v-if="routeIsNew && allRequestCount !== 0")
.progress(
:style="{ width: `${progress * 100 + fakePadding}%` }",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import { mapGetters } from 'vuex'
@Component
export default class networkLoader extends Vue {
// 虚假填充进度
fakePadding: number = 0
// 虚假填充增长函数
fillPadding: any = null
// computed
// 总计请求数
get allRequestCount():number {
return this.$store.getters.allRequestCount
}
// 完成的请求数
get completeRequestCount():number {
return this.$store.getters.completeRequestCount
}
get routeIsNew():boolean { return this.$store.getters.routeIsNew }
// 剩余未完成的请求
get residueRequestCount():number {
return this.allRequestCount - this.completeRequestCount
}
// 当前实际的进度比 (视图美化)
get progress(): number {
if (!this.allRequestCount || !this.residueRequestCount) return 1
return (this.completeRequestCount / this.allRequestCount) * 0.8
}
@Watch('residueRequestCount')
controlProgress(val: number) {
if (val === 0) {
this.clearRequestCount()
} else {
if (this.fillPadding) return
this.fillPadding = setInterval(() => {
if (this.fakePadding >= 20) return
this.fakePadding++
}, 1000)
}
}
clearRequestCount() {
setTimeout(() => {
if (this.residueRequestCount > 0) return
this.$store.commit('clearRequestCount')
this.fakePadding = 0
this.fillPadding = null
clearInterval(this.fillPadding)
}, 500)
}
}
</script>
<style lang="sass" scoped>
.network-loader
width: 100%
height: 5px
position: fixed
top: 0
left: 0
z-index: 2000
overflow: hidden
.progress
height: 100%
background-color: #409EFF
transition: width 0.5s
</style>
<template lang="pug">
.pagination(v-if="pageTotal > 0")
ul
//- li.tirgger(
//- @click="pageIndex !== 1 ? changePage(pageIndex - 1) : ''",
//- :class="pageIndex == 1 ? 'firstpage' : ''"
//- ) 保留更改
li.tirgger(
v-show="pageIndex !== 1",
@click="changePage(pageIndex - 1)",
)
span.iconfont.icon-arrow-right(
style="transform: rotate(180deg)",
)
//- 页数循环start
template(v-for="page in pageNodes")
li.tirgger.disallow(
v-if="page.ellipsis === 'before'",
) ...
li.tirgger(
:class="{'current': page.value === pageIndex}",
@click="changePage(page.value)",
) {{ page.text }}
li.tirgger.disallow(
v-if="page.ellipsis === 'after'",
) ...
//- 页数循环end
li.tirgger(
v-show="pageIndex !== pageTotal",
@click="changePage(pageIndex + 1)",
)
span.iconfont.icon-arrow-right
//- .text-secondary.total-number-text {{ $t('共{number}条数据', {number: numbers}) }}
//- div(
//- v-if="showPerPage"
//- style="margin-right: 8px; min-width: 60px"
//- )
//- v-select(
//- :options="perPages"
//- :value="pageSize"
//- prefix="每页"
//- suffix="条"
//- @change="changePageSize"
//- )
.skip(v-if="pageTotal > 5 && mode !== 'small'")
span 跳至
input(
type="text",
v-model="tempPage",
@keyup.enter.stop.prevent="changePage()",
class="form-input-border-normal page-input",
style="width: 64px; margin: 0 10px",
)
span
//- button.btn.btn-default.skip-btn(
//- type="button"
//- @click="changePage()",
//- ) 跳转
</template>
<script>
export default {
props: {
// data: {
// type: Object,
// },
// 数据总数
totalData: {
type: Number,
default: 0,
},
// 页容量
pageSize: {
type: Number,
default: 15,
},
//
// 当前页码
currentIndex: {
type: Number,
default: 0,
},
// showPerPage: {
// type: Boolean,
// default: true,
// },
/*
* 是否自定义选择页码后的操作
* 如果是,则触发change事件
* 如果不(默认情况),则跳转页面到 ?page=+1
*/
custom: {
type: Boolean,
default: false,
},
// normal为正常显示 数字按钮一共7个 small数字按钮显示
/*
* 是否自定义选择页码后的操作
* normal为正常显示 数字按钮显示7个
* small 数字按钮显示5个 并隐藏跳转功能
*/
mode: {
type: String,
default: 'normal',
},
// /**
// * 隐藏跳转到某页
// */
// hideGoto: { type: Boolean, default: false },
},
data() {
return {
// // 数据总数
// total: 0,
// // 页容量
// pageSize: 15,
// // 当前页码
// pageIndex: 1,
// 临时页码(记录将要跳转的页码)
tempPage: null,
}
},
methods: {
changePage(page_index) {
const isInput = page_index == null
page_index = page_index || this.tempPage
if (isInput) {
// 对输入的无效信息进行清空
if (!page_index || isNaN(page_index)) {
this.tempPage = ''
return
}
if (page_index < 1) {
this.tempPage = 1
} else if (page_index > this.pageTotal) {
this.tempPage = this.pageTotal
}
page_index = this.tempPage
}
this.triggerChange({ page_index })
},
// changePageSize(per) {
// this.triggerChange({ page: 1, 'per-page': per })
// },
// setList(data) {
// if (data && typeof data.totalCount !== 'undefined') {
// this.total = parseInt(data.result_total)
// // this.pageSize = parseInt(data.page_size)
// this.pageIndex = parseInt(data.page_index)
// }
// },
/**
* 触发页面跳转(页面条数或第几页发生了变化)
* @param {Object} changed - { page_index }
*/
triggerChange(changed) {
if (!this.custom) {
const newQuery = {
...this.$route.query,
...changed,
}
this.$router.replace({ query: newQuery })
} else {
// 在 event mode 中才需要设置这些参数因为页面不刷新
this.$emit(
'pagination-change',
changed.page_index,
)
}
},
},
// watch: {
// data(newData) { this.setList(newData) },
// },
computed: {
// perPages() {
// const perPages = [20, 50, 100]
// if (perPages.indexOf(Number(this.pageSize)) === -1) {
// perPages.push(this.pageSize)
// }
// return _.sortBy(perPages)
// },
pageIndex() {
if (this.custom) return this.currentIndex
return +this.$route.query.page_index || 1
},
pageTotal() {
return Math.ceil(this.totalData / this.pageSize)
},
pageNodes() {
// 当前页
const pageIndex = this.pageIndex
// 总页数
const pageTotal = this.pageTotal
// 最大连续按钮个数(值+2为要显示的按钮个数)
const maxPageNumber = this.mode === 'small' ? 3 : 5
// 中心按钮左右个多少个按钮
const extendNum = this.mode === 'small' ? 1 : 2
const pages = []
let begin = 1
let end = pageTotal + 1
// 如果页数小于等于要显示的按钮数量 则全部显示
if (pageTotal <= maxPageNumber + 2) {
for (let i = begin; i < end; i++) {
pages.push({ text: i, value: i, ellipsis: '' })
}
return pages
}
// 选中页数大于最大连续按钮数量 则前面有按钮省略显示
if (pageIndex > maxPageNumber) {
// 默认两边有省略按钮
begin = pageIndex - extendNum
end = pageIndex + extendNum + 1
// 如果选中按钮离与最大按钮差值在最大连续数量减去扩展数量之内
if (pageTotal - pageIndex < maxPageNumber) {
begin = pageTotal - maxPageNumber
end = pageTotal + 1
}
pages.push({
ellipsis: 'after',
text: '1',
value: 1,
})
} else if (pageTotal - pageIndex >= maxPageNumber) {
end = maxPageNumber + 2
}
for (let i = begin; i < end; i++) {
pages.push({ text: i, value: i, ellipsis: '' })
}
if (pageTotal - pageIndex >= maxPageNumber) {
pages.push({
ellipsis: 'before',
text: `${pageTotal}`,
value: pageTotal,
})
}
return pages
},
},
}
</script>
<style lang="sass" scoped>
$boxHeight: 30px
.pagination
display: flex
justify-content: center
align-items: center
user-select: none
.btn
vertical-align: top
// .box
// display: inline-block
// line-height: 28px
// text-align: center
// border-radius: 2px
// cursor: pointer
// border: 1px solid rgba(0,0,0,0)
// .page-box
// min-width: 30px
// margin: 0 3px
// color: #666666
// &:hover
// border: 1px solid #409EFF
// &.current
// background-color: #409EFF
// color: #fff
ul
.tirgger
display: inline-block
min-width: 24px
height: 24px
text-align: center
line-height: 24px
color: #666666
margin: 0 2px
border: 1px solid #D7DDE4
// border-radius: 2px
cursor: pointer
vertical-align: top
&:not(.disallow)
&:hover
color: #409EFF
background: #E6F7FF
border: 1px solid #409EFF
border-radius: 2px
border-radius: 2px
&.current
color: #409EFF
background: #E6F7FF
border: 1px solid #409EFF
border-radius: 2px
border-radius: 2px
&:hover
color: #409EFF
background: #E6F7FF
border: 1px solid #409EFF
border-radius: 2px
border-radius: 2px
.iconfont
display: inline-block
font-size: 10px
.firstpage
color: #63686D
background: #FFFFFF
border: 1px solid #CCCCCC
border-radius: 2px
border-radius: 2px
.page-input
width: 40px
height: $boxHeight
padding: 5px
&:focus
outline: none
border: 1px solid #409EFF
box-shadow: rgba(#409EFF, .36) 0 0 4px
// .per-page-select
// background-color: #fff
// border: 1px solid #BBB
// height: $boxHeight
// outline: none
// .total-number-text
// margin-right: 15px
// min-width: 90px
// color: #999999
.skip
height: 30px
margin-left: 20px
color: #666666
// .skip-btn
// margin-left: 5px
// height: 30px
// padding: 0 13px
</style>
<!--
弹窗组件
例子暂可查看 home/base/data-area/intro-popup 文件 (根据需求使用以下几种示例, 事例文件使用第3种)
@author cui
-->
<!--
四种使用示例:
(推荐按以下模板使用,width可追加min/max-width, height相关推荐与模板一致,否则可能有样式问题)
1. 宽度650px,高度最大为浏览器高度80%,内容不足时自动变矮
popup(
:show.sync="show",
popup-style="width: 650px",
:percent-height=.8
)
2. 宽度650px,高度最大为600px,内容不足时自动变矮(该方法使用最大高度推荐不超过650px)
popup(
:show.sync="show",
popup-style="width: 650px; max-height: 600px",
)
2-1. 宽度650px,高度最大为屏幕高,内容不足自动变矮(尽可能完全显示数据 和 偷懒时使用)
popup(
:show.sync="show",
popup-style="width: 650px,
)
3. 宽度650px,高度为600px,盒子大小不会因内容多少产生变化(height必写,且不要使用min|max-height)
popup(
:show.sync="show",
popup-style="width: 650px; height: 600px",
fixed-size,
)
4. 宽度650px,高度为浏览器高度60%,盒子大小不会因内容多少产生变化(不要写height)
popup(
:show.sync="show",
popup-style="width: 650px",
:percent-height=.6,
fixed-size,
)
-->
<template lang="pug">
.popup-container.familiar
transition(name="fade")
.popup-bg(
v-if="showPopup",
@click="dismissable && dismiss()"
)
transition(
:name="animation",
@after-appear="destory",
)
.popup-content.flex.center(v-if="showPopup")
#wrap.wrap(:style="contentStyle")
//- 头部
.popup-header(
v-if="!hideHeader"
ref="header",
)
//- 可以通过slot和title属性两种方式配置头部,title属性优先级高于slot
//- slot方式参照原弹窗使用
//- title方式兼容element
.popup-header(v-if="title") {{title}}
slot(v-else name="header")
.iconfont.icon-guanbi.close-button(
v-if="!hideClose",
@click="dismiss"
)
//- 内容区 (内容元素过少, 可能出现滚动条, 增加少量padding即可解决)
.popup-body(
ref="body",
:style="{ 'max-height': `${contentMaxHeight}px` }",
:class="{ 'hide-header': hideHeader, 'hide-footer': hideFooter }"
)
slot(name="body")
.iconfont.icon-guanbi.close-button(
v-if="!hideClose && hideHeader",
@click="dismiss"
)
//- 底部
.popup-footer(
v-if="!hideFooter && $slots.footer"
ref="footer",
:class="{ fixedSize: fixedSize }"
)
slot(name="footer")
</template>
<script>
import { getElementProps } from '@/utils/dom'
export default {
props: {
/**
* 是否显示 popup
*/
show: {
default: false,
type: Boolean,
},
/**
* 作用于 popup-content 的额外样式
*/
popupStyle: {
type: String,
default: 'width: 600px;',
},
/* 自适应高度时,最大高度与浏览器窗口高度的比值(默认0关闭,推荐0.8)*/
percentHeight: {
type: Number,
default: 0,
},
/**
* 点击页面背景是否能关闭 popup
*/
dismissable: {
type: Boolean,
default: true,
},
/**
* 传入参数,是否使 popup 尺寸固定且不自适应(使用该属性需要自定义窗口高度样式,推荐不大于650px)
*/
fixedSize: {
type: Boolean,
default: false,
},
/**
* 隐藏头部
*/
hideHeader: {
type: Boolean,
default: false,
},
/**
* 隐藏底部
*/
hideFooter: {
type: Boolean,
default: false,
},
/**
* 隐藏关闭按钮
*/
hideClose: {
type: Boolean,
default: false,
},
/**
* 显隐时的动画,具体设置请参照 styles/animation.sass
*/
animation: {
type: String,
default: 'fade-bottom',
},
// 标题属性
title: {
type: String,
default: '',
},
},
data() {
return {
// 复写 防止报错
showPopup: this.show,
contentMaxHeight: 0,
}
},
beforeDestroy() { this.destory() },
computed: {
/**
* 外部盒子样式
*/
contentStyle() {
if (this.percentHeight > 0) {
const height = Math.floor(window.innerHeight * this.percentHeight)
return this.fixedSize
? `height: ${height}px; ${this.popupStyle}`
: `max-height: ${height}px; ${this.popupStyle}`
} else {
return this.popupStyle
}
},
},
watch: {
show: {
handler: function(val, oldVal) {
if (val === oldVal) return
this.showPopup = val
this.hackBarShake()
if (val) {
this.$nextTick(function() {
document.body.appendChild(this.$el)
// 重新计算 popup-body 最大高度
this.contentMaxHeight = this.getContentMaxHeight()
})
}
},
immediate: true,
},
},
methods: {
dismiss() {
this.showPopup = false
this.$emit('dismiss')
this.$emit('update:show', false)
},
destory() {
if (this.$el && this.$el.parentNode === document.body) document.body.removeChild(this.$el)
},
/**
* 计算 popup-body 最大高度
*/
getContentMaxHeight() {
// 如果该元素 (header|footer) 没有设置隐藏, 且无法取得该元素dom,
// 则容器不完整不需要计算高度, 且内部判断元素高度时会报错
if (!this.hideHeader && !this.$refs.header && this.$slots.header) return 0
if (!this.hideFooter && !this.$refs.footer && this.$slots.footer) return 0
// 如果隐藏头部,则不计算头部高度
const headerHeight = !this.hideHeader && this.$slots.header
? getElementProps(this.$refs.header, 'height')
: 0
// 如果隐藏底部,则不计算底部高度
const footerHeight = !this.hideFooter && this.$slots.footer
? getElementProps(this.$refs.footer, 'height')
: 0
const height = +headerHeight + +footerHeight
if (this.fixedSize && this.percentHeight <= 0) {
// 如果固定盒子高度,则计算popup-body高度
return this.popupStyle.match(/[^-]height:\s?(\d+)px/)[1] - height
} else if (this.percentHeight > 0) {
// 如果传入高度百分比,则按照百分比计算
return Math.ceil(window.innerHeight * this.percentHeight) - height
} else {
// 未传入fixedHeight||percentHeight模式,则定义为标准样式。
if ((/height/).test(this.popupStyle)) {
return this.popupStyle.match(/height:\s?(\d+)px/)[1] - height
} else {
return window.innerHeight - 200
}
}
},
// 处理显示隐藏时滚动条抖动
hackBarShake() {
if (this.showPopup) {
// 现在页面宽度
const nowWidth = document.documentElement.clientWidth
document.documentElement.style.overflowY = 'hidden'
// 禁止滚动时页面宽度
const noScrollWidth = document.documentElement.clientWidth
// 获取当前浏览器滚动条宽度
// 如果原来没有滚动条,则两值相等,结果为0,无影响
const scrollBarWidth = noScrollWidth - nowWidth
document.documentElement.style.paddingRight = `${scrollBarWidth}px`
} else {
// 隐藏popup时重置受影响样式
document.documentElement.style.overflowY = ''
document.documentElement.style.paddingRight = ''
}
},
},
}
</script>
<style lang="sass" scoped>
@import "@/styles/theme.sass"
.popup-container
.popup-bg
position: fixed
z-index: 1101
left: 0
right: 0
top: 0
bottom: 0
background-color: rgba(0,0,0,.5)
.popup-content
padding: 0
position: fixed
top: 0
left: 0
right: 0
bottom: 0
// width: 100%
// height: 100%
z-index: 1102
.wrap
border-radius: 2px
background-color: #FFF
box-shadow: 0 0 5px rgba(0,0,0,.2)
position: relative
.popup-header
// min-height: 50px
overflow: hidden
position: relative
border-radius: 5px 5px 0 0
background-color: $--dialog-header-background
color: $--dialog-header-text
font-weight: 400
.close-button
color: $--color-text-regular
vertical-align: middle
&:hover
color: $--color-primary
.popup-body
height: 100%
position: relative
overflow-y: auto
word-break: break-word
background-color: #fff
&.hide-header
border-top-left-radius: 5px
border-top-right-radius: 5px
&.hide-footer
border-bottom-left-radius: 5px
border-bottom-right-radius: 5px
.popup-footer
position: relative
min-height: 60px
// padding: 14px 20px
background-color: #FFF
border-radius: 0 0 5px 5px
&.fixedSize
position: absolute
bottom: 0
width: 100%
.close-button
position: absolute
top: 11px
right: 15px
padding: 5px
cursor: pointer
font-size: 10px
color: #CCC
</style>
<style lang="sass">
@import "@/styles/theme.sass"
.popup-container.familiar
font-size: 14px !important
.popup-header .popup-header
padding: 13px 20px
font-size: 16px
border-bottom: 1px solid $--dialog-header-border
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #3C3D40
line-height: 22px
.popup-body
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #666666
line-height: 20px
.popup-body, .key
margin-top: 24px
font-size: 14px !important
padding: 0 20px
margin-bottom: 24px
.top-tips
padding: 6px 20px
margin: 0 0 20px 0px
background: $--dialog-tip-background
font-size: 12px
color: $--dialog-tip-text
border: 1px solid $--dialog-tip-border
.popup-footer
padding: 15px 20px
border-top: 1px solid $--dialog-header-border
.btn
margin-left: 20px
min-width: 80px
// &.footer
// border-top: 1px solid $--dialog-header-border
// display: flex
// justify-content: space-between
.popup-footer .popup-footer
padding: 15px 20px
border-top: 1px solid $--dialog-header-border
.btn
font-size: 14px
margin-left: 20px
min-width: 80px
.el-button.el-button--primary.el-button--small
width: 80px !important
</style>
<template lang="pug">
.main-progress
.text(
:style="{ color: color }"
)
span.left {{ text }}
span.right {{ currentRate + '%' }}
.progress-container
.progress-content(
:style="{background: outBackColor}",
)
.progress-bar(
:style="{background: backgroundColor, left: offsetWidth}",
)
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class ProgressBar extends Vue {
@Prop({ type: String, default: '' }) text
@Prop({ type: Number, default: 0 }) currentRate
@Prop({ type: String, default: '#409EFF' }) color
@Prop({ type: String, default: '#E8EBF2' }) outColor
get isOutOfMaxNumber():boolean {
return 100 - this.currentRate < 0
}
get offsetWidth():string | number {
const left = 100 - this.currentRate
return this.isOutOfMaxNumber ? 0 : `-${left}%`
}
get backgroundColor():string {
return this.isOutOfMaxNumber ? '#D66460' : this.color
}
get outBackColor():string {
return this.outColor
}
}
</script>
<style lang="sass" scoped>
.main-progress
display: inline-block
width: 100%
line-height: 19px
.progress-container
display: inline-block
width: 100%
height: 2px
position: relative
overflow: hidden
border-radius: 999px
margin-bottom: 3px
.progress-content
height: 100%
width: 100%
border-radius: 999px
.progress-bar
height: 100%
width: 100%
position: absolute
left: -100%
top: 0
border-radius: 999px
.left
display: inline-block
font-size: 13px
letter-spacing: 0
line-height: 13px
.right
display: inline-block
background: #fff
text-align: right
float: right
font-size: 13px
letter-spacing: 0
color: #333333
</style>
<template lang="pug">
.right-slide
.mask(
v-if="showSlide && !triggerDom",
ref="mask",
)
transition(
name="slide-right",
@after-appear="destory",
)
.sidebar(
ref="sidebar"
v-show="showSlide",
@mousedown.stop="",
:style="{ width: `${realTimeWidth}px` }",
)
.drag-area(
ref="dragArea"
@mousedown="startDrag"
)
span.iconfont.icon-tuozhuai1
.content
slot(v-if="noDestroy || showSlide")
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class rightSlide extends Vue {
$el: any
$refs!: {
mask: HTMLFormElement
}
@Prop({ type: Boolean, default: false }) show
@Prop({ type: Boolean, default: true }) autoClose
// NOTE 不要传入 document, 会存在一些问题
@Prop({ type: Element, default: null }) triggerDom
@Prop({ type: Number, default: 250 }) width
@Prop({ type: Boolean, default: false }) noDestroy
showSlide: boolean = false
isDraging: boolean = false
realTimeWidth: any = null
currentX: number = 0
get closeDom() { return this.triggerDom || this.$refs.mask }
get parentWidth() {
if (!document.getElementById('workCanvas')) return
return (document.getElementById('workCanvas') as HTMLInputElement).offsetWidth
}
created() {
this.realTimeWidth = this.width
}
mounted() {
if (this.closeDom) {
this.closeDom.addEventListener('mousedown', this.closeSlide, true)
}
document.addEventListener('mouseup', this.stopDrag)
}
beforeDestroy() {
if (this.closeDom) {
this.closeDom.removeEventListener('mousedown', this.closeSlide)
}
this.destory()
}
@Watch('show')
toggleShow(val: boolean): void {
this.showSlide = val
this.realTimeWidth = this.width
if (val) this.$nextTick(() => { document.body.appendChild(this.$el) })
}
closeSlide(event?: Event) {
if (!this.showSlide) return
this.$emit('close')
// 主动触发 或 dom触发并自动关闭 则向下执行
if (!event || (event && this.autoClose)) {
this.showSlide = false
this.$emit('update:show', false)
}
}
destory() {
if (!this.$el || this.$el.parentNode !== document.body) return
document.body.removeChild(this.$el)
}
/**
* 拖拽改变大小逻辑
*/
// 开始拖拽
startDrag(event) {
this.isDraging = true
// 获取鼠标拖动前的位置
this.currentX = event.pageX
// 绑定鼠标移动事件
document.addEventListener('mousemove', this.changeWidth)
}
stopDrag() {
this.isDraging = false
// 松开鼠标后移除事件
document.removeEventListener('mousemove', this.changeWidth)
}
changeWidth(event) {
if (!this.isDraging) return
// 获取侧滑框容器最大宽度
const parentWidth = (document.getElementById('workCanvas') as HTMLInputElement).offsetWidth
const changeWidth = this.currentX - event.pageX // 计算宽度改变量
if (this.realTimeWidth + changeWidth < this.width) return
if (this.realTimeWidth + changeWidth >= parentWidth) return
this.realTimeWidth += changeWidth // 计算最新宽度
this.currentX = event.pageX // 更新鼠标位置
}
}
</script>
<style lang="sass" scoped>
.mask
position: fixed
top: 0
left: 0
right: 0
bottom: 0
z-index: 499
.sidebar
position: fixed
top: 50px
right: 0
bottom: 0
background: #FFF
box-shadow: 0 3px 6px rgba(0,0,0,0.1)
z-index: 500
user-select: none
.drag-area
width: 25px
height: 100%
z-index: 999
float: left
position: absolute
cursor: col-resize
span
position: relative
top: 50%
transform: translateY(-50%)
color: #D3D3D3
cursor: col-resize
font-size: 18px
.content
float: right
height: 100%
width: 100%
.close
text-align: right
.trigger
display: inline-block
margin: 10px
color: #9DA7B4
font-size: 24px
line-height: 24px
cursor: pointer
opacity: .7
transition: opacity .5s ease
&:hover
opacity: 1
// transition
.slide-right-enter, .slide-right-leave-to
right: -100%
opacity: 0
.slide-right-enter-active, .slide-right-leave-active
transition: all 0.5s ease
opacity: 1
</style>
<template>
<div ref="st-charts" class="st-charts"></div>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import echarts from 'echarts'
@Component
export default class stCharts extends Vue {
$refs!: {
'st-charts': any
}
@Prop({ type: Object, default: () => {} }) options
stCharts:any = null
parentWidth:number = 0
initLinearGradient(val) {
return new echarts.graphic.LinearGradient(val)
}
@Watch('options', { deep: true })
refresh(val) {
this.stCharts.setOption(val, true)
}
@Watch('parentWidth')
sizeChange() {
this.stCharts.resize()
}
mounted() {
const _this = this
this.stCharts = echarts.init(this.$refs['st-charts'])
this.stCharts.setOption(this.options)
// 绑定事件
// this.stCharts.getZr().on('mousewheel', event => {
// console.log(event)
// // const scrollHeight = event.event.deltaY
// const param = {}
// // 当前图表参数
// const curOptions = this.stCharts.getOption()
// console.log(curOptions.dataZoom)
// let start = curOptions.dataZoom[0].start
// let end = curOptions.dataZoom[0].end
// let zoomStart = curOptions.dataZoom[1].start
// let zoomEnd = curOptions.dataZoom[1].end
// const size = end - start
// console.log(start, end, size)
// // start -= size * (scrollHeight / 200)
// // end -= size * (scrollHeight / 200)
// start -= (zoomEnd - zoomStart)
// end -= (zoomEnd - zoomStart)
// if (start < 0) {
// console.log(start)
// start = 0
// end = start + size
// }
// if (end > 100) {
// end = 100
// start = end - size
// }
// this.stCharts.dispatchAction({
// type: 'dataZoom',
// batch: [
// {
// start: start,
// end: end,
// }, {}
// ]
// })
// })
// 监听窗口变动,重新计算图表大小
this.parentWidth = this.$refs['st-charts']['parentElement'].clientWidth
let transitionInterval:any = null
// 监听父组件 transition 属性变化,更新图表大小
this.$refs['st-charts']['parentElement'].addEventListener('transitionstart', () => {
this.stCharts.resize()
transitionInterval = setInterval(() => {
this.stCharts.resize()
},
100
)
})
this.$refs['st-charts']['parentElement'].addEventListener('transitionend', () => {
this.stCharts.resize()
clearInterval(transitionInterval)
transitionInterval = null
})
// window窗口大小改变时更新图表大小
window.addEventListener('resize', function() {
_this.stCharts.resize()
})
}
}
</script>
<style lang="sass" scoped>
.st-charts
height: 100%
width: 100%
</style>
<template>
<div ref="line-charts" class="line-box"></div>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import echarts from 'echarts'
@Component({
components: {
},
})
export default class monitorLeftTop extends Vue {
@Prop({ type: String, default: '' }) title
@Prop({ type: Object, default: () => {} }) data
// @Prop({ type: Array, default: () => [] }) xData
parentWidth:number = 0
lineCharts:any = null
get option() {
return {
title: {
text: this['title'],
textStyle: {
color: 'rgba(0,0,0,0.85)',
fontSize: '16',
},
left: 'left',
},
tooltip: {
trigger: 'axis',
hideDelay: 0,
axisPointer: {
label: {
backgroundColor: '#6a7985',
},
},
},
// legend: {
// left: 'left',
// top: '8%',
// textStyle: {
// color: '#8C8C8C',
// fontSize: '16px',
// },
// },
grid: {
left: '0',
right: '3%',
// bottom: '4%',
containLabel: true,
},
dataZoom: [{
type: 'inside',
start: 0,
end: 100,
}, {
start: 0,
end: 100,
height: '25px',
backgroundColor: '#F1F1F5',
borderColor: '#F1F1F5',
labelFormatter: '',
handleStyle: {
color: '#fff',
shadowBlur: 3,
shadowColor: 'rgba(0, 0, 0, 0.6)',
shadowOffsetX: 2,
shadowOffsetY: 2,
},
}],
dataset: {
source: this['data'].dataset,
},
xAxis: {
type: 'value',
axisLine: {
lineStyle: {
color: 'rgba(0,0,0,0.45)',
},
},
splitLine: {
show: false,
lineStyle: {
color: '#4A4949',
type: 'dashed',
},
},
boundaryGap: false,
},
yAxis: {
type: 'value',
axisLine: {
lineStyle: {
color: 'rgba(0,0,0,0.45)',
},
},
splitLine: {
show: true,
lineStyle: {
color: 'rgba(0,0,0,0.15)',
// type: 'dashed',
},
},
},
series: this['data'].yData,
}
}
@Watch('option', { deep: true })
updateChart() {
this.lineCharts.setOption(this.option, true)
}
@Watch('parentWidth')
sizeChange() {
this.lineCharts.resize()
}
mounted() {
const _this = this
this.lineCharts = echarts.init(this.$refs['line-charts'])
this.lineCharts.setOption(this.option)
// 监听窗口变动,重新计算图表大小
this.parentWidth = this.$refs['line-charts']['parentElement'].clientWidth
let transitionInterval:any = null
// 监听父组件 transition 属性变化,更新图表大小
this.$refs['line-charts']['parentElement'].addEventListener('transitionstart', () => {
this.lineCharts.resize()
transitionInterval = setInterval(() => {
this.lineCharts.resize()
},
100
)
})
this.$refs['line-charts']['parentElement'].addEventListener('transitionend', () => {
this.lineCharts.resize()
clearInterval(transitionInterval)
transitionInterval = null
})
// window窗口大小改变时更新图表大小
window.addEventListener('resize', function() {
_this.lineCharts.resize()
})
}
}
</script>
<style lang="sass" scoped>
.line-box
width: 100%
height: 100%
// min-height: 180px
</style>
<template>
<div class="box-radio">
<span
class="radio-item"
v-for="item in options"
:key="item.value"
:class="{
'is-active': item.value === currentItem
}"
@click="checkItem(item.value)">{{item.label}}</span>
</div>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class tensorboard extends Vue {
@Prop({ type: Array, default: [] }) options
@Prop({ type: String || Array || Object, default: '' }) value
currentItem:any = ''
checkItem(val) {
this.currentItem = val
this.$emit('input', val)
}
@Watch('value')
valChange(newVal) {
this.currentItem = newVal
}
created() {
this.currentItem = this.value
}
}
</script>
<style lang="sass" scoped>
.box-radio
background: #F1F1F5
width: fit-content
border-radius: 2px
line-height: 27px
height: 32px
padding: 2px 2px
.radio-item
font-size: 13px
display: inline-block
vertical-align: middle
padding: 0px 14px
cursor: pointer
.radio-item + .radio-item
margin-left: 4px
.is-active
background: #FFF
border-radius: 2px
// margin: 2px 0
box-sizing: border-box
color: #409EFF
transition: background .3s
</style>
<template>
<el-button
v-bind="$attrs"
v-on="$listeners"
:size="size"
:class="{
'el-button--delete': deleted
}"
:style="{
display: block?'block':'',
width: width
}"
>
<slot></slot>
</el-button>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class seetaButton extends Vue {
@Prop({
type: Boolean,
required: false,
default: false,
}) deleted
@Prop({
type: Boolean,
required: false,
default: false,
}) block
@Prop({
type: String,
default: 'small',
}) size
@Prop({
type: String,
default: 'auto',
}) width
// handleClick(evt) {
// this.$emit('click', evt)
// }
}
</script>
<style lang="sass" scoped>
@import "~@/styles/theme.sass"
// 按钮全局样式
.el-button
font-family: inherit
font-weight: inherit
border-radius: 2px
min-width: 80px
font-size: 14px
&.is-disabled, &.is-disabled:hover
color: #999999
background-color: #F5F7FA
border: 1px solid #D7DAE0
::v-deep .iconfont + span
margin-left: 6px
& + .el-button
margin-left: 20px
// small 按钮默认样式
.el-button--small
padding: 8px 12px
font-size: 14px
// 默认按钮样式
.el-button--default
color: #333333
background: #FFF
border: 1px solid #D7DAE0
// 重置focus状态样式,修复Element点击按钮后仍有样式的问题
// 不要调整和其它状态的顺序
&:focus
color: #4C4C4C
background: #FFF
border: 1px solid #DCDFE6
&:hover
color: #409EFF
background: #EDF5FF
border: 1px solid #C6E1FF
&:active
border: 1px solid #4092EF
&.is-disabled, &.is-disabled:hover
color: #999999
background-color: #F5F7FA
border: 1px solid #D7DAE0
// 主要按钮样式
.el-button--primary
&:focus
background: $--color-primary
&:hover
background-color: #66B1FF
&:active
background-color: #4092EF
&.is-disabled, &.is-disabled:hover
background-color: #9FCEFF
border-color: #9FCEFF
color: #FFF
// 危险按钮
.el-button--danger
&:focus
background-color: $--color-danger
border-color: $--color-danger
&:hover
background-color: #F78989
&:active
background-color: #E66565
&.is-disabled, &.is-disabled:hover
background-color: #FAB6B5
border-color: #FAB6B5
color: #FFF
// 文字按钮样式
.el-button--text
min-width: fit-content
padding: 8px 0
&:hover
color: #66B1FF
&:active
color: #4092EF
&.is-disabled, &.is-disabled:hover
color: #999
background: transparent
border-color: transparent
// 删除按钮样式
.el-button--delete
color: $--color-danger
background: transparent
border-color: transparent
min-width: auto
padding: 8px 0
&:focus
color: $--color-danger
background: transparent
border-color: transparent
&:hover
color: #F78989
background: transparent
border-color: transparent
&:active
color: #E66565
&.is-disabled, &.is-disabled:hover
color: #999
background: transparent
border-color: transparent
// 图标样式
.el-button--icon
width: 32px
min-width: 32px
padding: 8px
&:focus
color: #4C4C4C
background: #FFF
border: 1px solid #DCDFE6
&:hover
color: #409EFF
background: #EDF5FF
border: 1px solid #C6E1FF
&:active
border: 1px solid #4092EF
&.is-disabled, &.is-disabled:hover
color: #999999
background-color: #F5F7FA
border: 1px solid #D7DAE0
</style>
<template>
<div>
<el-checkbox
v-if="options.length>0"
:indeterminate="isIndeterminate"
v-model="checkAll"
@change="handleCheckAllChange"
style="margin-bottom: 10px">全选</el-checkbox>
<el-checkbox-group
v-bind="$attrs"
v-on="$listeners"
:class="{
'block-item': $attrs.block !== undefined
}">
<el-checkbox
v-for="item in options"
:key="item.value"
:label="item.value">
<span
v-if="$attrs.icon"
:class="{
'checkbox-icon': true,
circle: $attrs.icon === 'circle'
}"
:style="{
'background-color': $attrs.value.includes(item.value) ?
$attrs['icon-color'][item.value] :
'rgba(0,0,0,0.15)'
}"></span>
<span class="checkbox-label">{{item.label}}</span>
</el-checkbox>
</el-checkbox-group>
</div>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class checkboxgroup extends Vue {
@Prop({ type: Array, default: () => { return [] } }) options
isIndeterminate:boolean = false
checkAll:boolean = false
get allValue() {
const result:any = []
this.options.forEach(item => {
result.push(item.value)
})
return result
}
@Watch('$attrs.value')
selectChange() {
this.checkAll = this.$attrs.value.length === this.options.length
}
handleCheckAllChange(val) {
this.$attrs.value = val ? this.allValue : []
if (!val) {
this.$emit('input', [])
} else {
this.$emit('input', JSON.parse(JSON.stringify(this.allValue)))
}
// this.isIndeterminate = false;
}
created() {
this.checkAll = this.$attrs.value.length === this.options.length
}
}
</script>
<style lang="sass" scoped>
.block-item
.el-checkbox
display: block
.el-checkbox + .el-checkbox
margin-top: 10px
.el-checkbox
font-size: 13px
color: #4C4C4C
::v-deep .el-checkbox__label
padding-left: 0
.checkbox-icon
width: 12px
height: 12px
display: inline-block
.checkbox-icon + .checkbox-label
padding-left: 8px
.circle
border-radius: 12px
::v-deep .is-checked
.el-checkbox__inner
background-color: #409EFF
border-color: #409EFF
::v-deep .el-checkbox__label
color: #4C4C4C
</style>
<template>
<el-collapse
v-bind="$attrs"
v-on="$listeners"
v-model="active">
<el-collapse-item
v-for="item in collapseList"
:key="item.name"
:title="item.title"
:name="item.name">
<slot :name="item.name"></slot>
</el-collapse-item>
</el-collapse>
</template>
<script>
export default {
props: {
collapseList: { type: Array, default: () => [] },
activeItem: { type: String, default: '' },
},
computed: {
active: {
get() { return this.activeItem },
set(val) { this.$emit('input', val) },
},
},
}
</script>
<style lang="sass" scoped>
.el-collapse
border-color: #E4E7ED
::v-deep .el-collapse-item__header
border-color: #E4E7ED
font-weight: bold
font-size: 14px
&.is-active
border-color: transparent
::v-deep .el-collapse-item__wrap
border-color: #E4E7ED
</style>
<template>
<el-breadcrumb separator-class="el-icon-arrow-right">
<template v-for="(item, index) in crumbs">
<el-breadcrumb-item :to="{ path: item.path }" :key="index">{{item.title}}</el-breadcrumb-item>
</template>
</el-breadcrumb>
</template>
<script>
export default {
props: ['crumbs'],
}
</script>
<style>
</style>
<template>
<el-dropdown v-bind="$attrs" v-on="$listeners" :placement="placement">
<slot></slot>
<el-dropdown-menu
slot="dropdown"
:style="{
width: width
}">
<el-dropdown-item
v-for="item in options"
:key="item.name"
:command="item.name">
{{item.label}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component
export default class seetaDropdown extends Vue {
@Prop({ type: Array, default: () => {} }) options
@Prop({ type: String, default: 'bottom-start' }) placement
@Prop({ type: String, default: '' }) width
}
</script>
<style lang="sass">
@import "@/styles/theme.sass"
.el-dropdown-menu
padding: 8px 0
border-radius: 2px
.el-dropdown-menu__item
color: $--color-text-primary
&:not(.is-disabled):hover
color: $--color-primary
background-color: #F5F7FA
&.is-disabled
color: $--color-info
</style>
<template>
<el-form-item
v-bind="$attrs"
v-on="$listeners"
:class="{
dynamicFormItem: dynamic
}">
<slot></slot>
</el-form-item>
</template>
<script>
export default {
props: {
dynamic: { type: Boolean, default: false },
},
}
</script>
<style lang="sass" scoped>
@import "@/styles/theme.sass"
.el-form-item
margin-bottom: 24px
.el-form-item.dynamicFormItem
& > ::v-deep .el-form-item__content
// 动态表单外层容器 class
.dynamic-item
// border: 1px dashed #D7DAE0
padding: 24px 0 1px 0
position: relative
width: 400px
margin-bottom: 24px
background-image: linear-gradient(to right, #D7DAE0 0%, #D7DAE0 50%, transparent 50%),linear-gradient(to bottom, #D7DAE0 0%, #D7DAE0 50%, transparent 50%),linear-gradient(to right, #D7DAE0 0%, #D7DAE0 50%, transparent 50%),linear-gradient(to bottom, #D7DAE0 0%, #D7DAE0 50%, transparent 50%)
background-size: 15px 1px, 1px 15px
background-repeat: repeat-x, repeat-y
background-position: top, right, bottom, left
border-radius: 3px
.el-form-item
margin-bottom: 24px
& + .dynamic-item
margin-top: 24px
.delete-icon
position: absolute
right: 10px
top: 10px
line-height: 1
cursor: pointer
color: #999999
&:hover
color: #666666
::v-deep .el-form-item__error
width: 400px
::v-deep .el-form-item__label
padding: 0 20px 0 0
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #666666
</style>
<template>
<el-form
ref="seetaForm"
v-bind="$attrs"
v-on="$listeners"
:rules="rules">
<slot></slot>
</el-form>
</template>
<script>
import validate from './validator'
export default {
data() {
return {
...validate,
rules: {},
}
},
methods: {
// 适配validate方法
validate(callback) {
this.$refs.seetaForm.validate(valid => {
callback(valid)
})
},
validateField(props, cb = () => {}) {
this.$refs.seetaForm.validateField(props, valid => {
cb(valid)
})
},
/**
* 表单校验处理
* validate.js 中包含的校验表单外已用请使用字符串格式
* 自定义校验参照Element文档
*/
handleRules() {
const _this = this
const rules = { ...this.$attrs.rules }
for (const r in rules) {
rules[r].forEach(i => {
if (typeof i['validator'] === 'string') {
// eslint-disable-next-line
i['validator'] = eval('_this.' + i['validator'])
}
})
}
this.rules = rules
},
// 定义方法,防止调用组件时丢失
clearValidate() {
this.$refs.seetaForm.clearValidate()
}
},
created() {
this.handleRules()
},
}
</script>
<style lang="sass" scoped>
</style>
// 汉字和日文算两个字符
const getByteLen = item => {
let result = 0
if (item) {
for (let i = 0; i < item.length; i++) {
const a = item.charAt(i)
// eslint-disable-next-line
if (a.match(/[^\x00-\xff]/ig) !== null) {
result += 2
} else {
result += 1
}
}
}
return result
}
export default {
getByteLen: getByteLen,
// 实例名称校验
normName: (rule, value, cb) => {
// 支持中文、英文、日文、数字和特殊字符_-@(),长度限制4~30个字符,中文及日文算2个字符
const regex = /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00_\-@()\s]/g
// const regex = /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00.:\-_()[\]{}\s]/g
if (regex.test(value)) cb(new Error('格式错误'))
else cb()
},
// 最少两位
min2: (rule, value, cb) => {
// 检查是否全是空格
const reg = /^\s+$/g
if (getByteLen(value) < 2 || reg.test(value)) { cb(new Error(vm.$t('public.lengthNoTwo'))) }
cb()
},
// 最少4位
min4: (rule, value, cb) => {
if (getByteLen(value) < 4) { cb(new Error('字段长度不能少于4位')) }
cb()
},
// 最少4位
zeroOrMin4: (rule, value, cb) => {
if (getByteLen(value) > 0 && getByteLen(value) < 4) { cb(new Error('字段长度不能少于4位')) }
cb()
},
// 最大64位
max64(rule, value, cb) {
const reg = /^\s+$/g
if (getByteLen(value) > 64 || reg.test(value)) {
cb(new Error('最大64个字符'))
}
cb()
},
max30(rule, value, cb) {
if (getByteLen(value) > 30) cb(new Error('最大30个字符'))
cb()
},
max32(rule, value, cb) {
if (getByteLen(value) > 32) cb(new Error('最大32个字符'))
cb()
},
max100(rule, value, cb) {
if (getByteLen(value) > 100) cb(new Error('最大100个字符'))
cb()
},
max16(rule, value, cb) {
if (getByteLen(value) > 16) cb(new Error('最大16个字符'))
cb()
},
// 必填项
notEmpty(rule, value, cb) {
if (value == null || value === '' || value === -1 || value.length === 0) cb(new Error(vm.$t('public.paramNull')))
cb()
},
// 只支持中、日、英文、数字、_和-
formatAll(rule, value, cb) {
const reg = /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00\-_]/g
if (reg.test(value)) cb(new Error('格式错误'))
cb()
},
// 标签检验
formatBottomLineArray(rule, value, cb) {
// eslint-disable-next-line
const reg = /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00_\s\.\-\:\(\)\[\]\{\}]/g
const reg2 = /^\s+$/g
value.forEach(item => {
if (reg.test(item) || reg2.test(item) || getByteLen(item) < 4 || getByteLen(item) > 64) cb(new Error('支持中文、英文字母、日文、数字和下划线(_),长度限制4-64个字符,中文及日文算2个字符'))
})
cb()
},
// 版本号检验
version(rule, value, cb) {
const reg = /^([0-9]\d|[0-9])(\.([0-9]\d|\d)){0,2}$/g
if (!reg.test(value)) cb(new Error('版本号格式为X、XX.XX、XX.XX.XX'))
cb()
},
// 只支持中、日、英文、数字和下划线
formatBottomLine(rule, value, cb) {
const reg = /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00_]/g
if (reg.test(value)) cb(new Error('格式错误'))
cb()
},
// 名称类的输入框:支持中日英文、数字、空格和.:-_()[]{}
formatSearchName(rule, value, cb) {
// eslint-disable-next-line
const reg = /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00_\s\.\-\:\(\)\[\]\{\}]/g
if (reg.test(value)) cb(new Error('格式错误'))
cb()
},
// 编码类的输入框:支持英文、数字、空格和.:-_()[]{}
formatSearchCode(rule, value, cb) {
// eslint-disable-next-line
const reg = /[^A-Za-z0-9_\s\.\-\:\(\)\[\]\{\}]/g
if (reg.test(value)) cb(new Error('格式错误'))
cb()
},
// 只支持英文、数字、_和-
formatEng(rule, value, cb) {
const reg = /[^A-Za-z0-9\-_]/g
if (reg.test(value)) cb(new Error('格式错误'))
cb()
},
// 只支持英文、数字、空格.-:()[]{}
formatNewEng(rule, value, cb) {
// eslint-disable-next-line
const reg = /[^A-Za-z0-9\s\.\-\:\(\)\[\]\{\}]/g
if (reg.test(value)) cb(new Error('最大64个字符,允许英文数字空格.-:()[]{}'))
cb()
},
// 只支持英文、数字和.
formatDot(rule, value, cb) {
// eslint-disable-next-line
const reg = /[^A-Za-z0-9\.]/g
if (reg.test(value)) cb(new Error('格式错误'))
cb()
},
// 仅支持数字
onlyNum(rule, value, cb) {
const regx = /^\d+(\.\d+)?$/
if (!regx.test(value)) {
cb(new Error(vm.$t('public.onlyInputNum')))
} else {
cb()
}
},
}
<template>
<el-input
v-bind="$attrs"
v-on="$listeners"
:size="size"
:style="{
width: width
}"
:placeholder="placeholder"
></el-input>
</template>
<script>
export default {
props: {
size: { type: String, default: 'small' },
width: { type: String, default: '400px' },
placeholder: { type: String, default: '请输入' }
},
}
</script>
<style lang="sass" scoped>
.el-input
::v-deep input[type=text], ::v-deep input[type=password], ::v-deep input[type=number], ::v-deep textarea
font-size: 14px
color: #333
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
&::placeholder
color: #999999
font-size: 14px
.el-textarea.el-input--small
::v-deep .el-textarea__inner
border-radius: 2px
height: 100px
padding: 6px 12px
::v-deep .el-input__count
line-height: 1
bottom: 10px
right: 10px
</style>
<template>
<el-menu
:background-color="backgroundColor"
v-bind="$attrs"
v-on="$listeners"
@select="selectMenuItem"
class="el-menu-vertical-demo">
<template
v-for="(menu, index) in menus">
<!-- 单独一级菜单,当前页打开 -->
<el-menu-item
v-if="!menu.children && !menu._blank && showMenu(menu.showKey)"
:key="menu.key"
:index="menu.key"
:route="menu.router"
class="top-level-menu"
:class="{
'active-menu': routeGroup === menu.key
}">
<i class="iconfont"
:class="{
[menu.icon]: true
}"></i>
<span class="name" slot="title">{{menu.label}}</span>
</el-menu-item>
<!-- 单独一级菜单,新开tab页 -->
<a
v-else-if="menu._blank && showMenu(menu.showKey)"
:key="menu.key"
:href="menu._blank"
target="_blank">
<div class="el-menu-item top-level-menu"
:index="menu.key">
<i class="iconfont"
:class="{
[menu.icon]: true
}"></i>
<span class="name"
:style="{
display: $attrs.collapse ? 'none' : 'auto'
}">{{menu.label}}</span>
</div>
</a>
<!-- 用户自定义菜单 -->
<el-submenu
v-else-if="menu.custom && menu.children.length && showMenu(menu.showKey)"
:key="index"
:index="menu.key">
<template slot="title">
<i
class="iconfont"
:class="{
[menu.icon]: true
}"></i>
<span class="name">{{menu.label}}</span>
</template>
<el-menu-item
v-for="child in menu.children"
:key="child.key"
:index="child.key"
@click="customClick(child)">
<span>{{child.label}}</span>
</el-menu-item>
</el-submenu>
<!-- 二级菜单 -->
<el-submenu
v-else-if="!menu.custom && showMenu(menu.showKey)"
:key="menu.key"
:index="menu.key">
<template slot="title">
<i
class="iconfont"
:class="{
[menu.icon]: true
}"></i>
<span class="name">{{menu.label}}</span>
</template>
<el-menu-item
v-for="child in menu.children.filter(item => !item._blank)"
:key="child.router.name"
:index="child.router.name"
:route="child.router"
:class="{
'active-menu': routeGroup === child.key
}">
<span>{{child.label}}</span>
</el-menu-item>
<a v-for="child in menu.children.filter(item => item._blank)"
:key="child.key" :href="child._blank" class="blank_link" target="_blank">
{{child.label}}
</a>
</el-submenu>
</template>
</el-menu>
</template>
<script lang="ts">
import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
@Component
export default class seetaMenu extends Vue {
@Prop({ type: Array, default: () => [] }) menus
@Prop({ type: String, default: '#222C38' }) backgroundColor
get routeGroup(): string { return this.$route.meta.group || undefined }
customClick(menu) {
window.open(menu.address)
}
/**
* 自定义点击跳转路由事件
* router模式自定义菜单和新开窗口跳转会出现高亮问题
*/
selectMenuItem(index, path, item) {
this.$router.push(item.route)
this.$emit('select', index, path, item)
}
showMenu(key) {
return key ? this.$store.getters.featureControl[key] : true
}
}
</script>
<style lang="sass" scoped>
@import "@/styles/theme.sass"
.el-menu
border: none
transition: width 0.3s ease
.el-submenu
::v-deep .el-submenu__title
color: $--color-info
height: 44px
line-height: 44px
text-align: left
.iconfont
font-size: 20px
span.name
font-size: 14px
margin-left: 14px
&:hover
background-color: #182129 !important
color: $--color-primary
.iconfont, .el-submenu__icon-arrow
color: $--color-primary
.el-menu-item
color: #FFF
padding-left: 52px !important
.el-menu-item
color: #FFF
height: 44px
line-height: 44px
text-align: left
&.is-active
background-color: #182129 !important
color: $--color-primary
.iconfont
color: $--color-primary !important
&.top-level-menu
.iconfont
font-size: 20px
color: $--color-info
span.name
font-size: 14px
margin-left: 14px
&:hover
color: $--color-primary
background-color: #182129 !important
&.top-level-menu
.iconfont
color: $--color-primary
.el-menu-vertical-demo:not(.el-menu--collapse)
width: 215px
height: 100%
.blank_link
display: inline-block
width: 100%
height: 44px
line-height: 44px
color: #fff
padding-left: 52px
text-align: left
&:hover
background: #182129
color: #409EFF
</style>
<style lang="sass">
.el-menu--vertical
.el-menu.el-menu--popup
min-width: 150px
</style>
<template>
<el-popover
v-bind="$attrs"
v-on="$listeners"
:popper-class="popClass">
<slot></slot>
<slot name="reference" slot="reference"></slot>
</el-popover>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component
export default class popover extends Vue {
@Prop({ type: String, default: '' }) popperClass
get popClass() {
return `seeta-popover ${this.$attrs.dark ? 'dark-style' : ''} ${this.popperClass}`
}
}
</script>
<style lang="sass">
.seeta-popover
border-radius: 0px !important
min-width: 50px !important
.dark-style
background: #161A1D !important
border-color: #161A1D !important
color: #FFF !important
.el-popper[x-placement^=bottom].seeta-popover
margin-top: 15px !important
top: 35px !important
.el-popper[x-placement^=bottom].seeta-popover
.popper__arrow
display: none
.el-popper.seeta-popover
padding: 16px 20px !important
</style>
<template>
<el-select
v-model="currentValue"
v-bind="$attrs"
v-on="$listeners"
size="small"
:multiple="multiple"
:style="{
width: width
}">
<el-option
v-for="item in $attrs.options"
:key="item.value"
:label="item[label]"
:value="item[name]"
:disabled="item.disabled"
></el-option>
</el-select>
</template>
<script lang="ts">
import { Vue, Component, Prop } from 'vue-property-decorator'
@Component
export default class seetaSelect extends Vue {
@Prop({ type: [String, Boolean, Number, Array], default: '' }) value
@Prop({ type: String, default: '400px' }) width
@Prop({ type: String, default: 'label' }) label
@Prop({ type: String, default: 'value' }) name
// 禁选
@Prop({ type: Boolean, default: false }) disabled
@Prop({ type: Boolean, default: false }) multiple
get currentValue() {
return this.value
}
set currentValue(val) { this.$emit('input', val) }
}
</script>
<style lang="sass">
.el-select-dropdown
.el-select-dropdown__item
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #333333
.el-select-dropdown__item.selected
font-weight: normal
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
color: #409EFF
.el-select__tags
.el-icon-close
background-color: transparent !important
.el-tag__close.el-icon-close::before
font-size: 18px !important
.el-tag__close:hover
color: #999999 !important
.el-select__tags-text
font-size: 12px !important
font-family: PingFangSC-Regular, PingFang SC !important
font-weight: 400 !important
color: #666666 !important
line-height: 17px !important
.el-select
.el-input__inner
font-size: 14px !important
font-family: PingFangSC-Regular, PingFang SC !important
font-weight: 400 !important
</style>
<template>
<div class="table-box" ref="tableBox">
<el-table
ref="table"
stripe
v-bind="$attrs"
v-on="$listeners"
v-loading="isLoading"
:data="tableData"
:max-height="autoHeight ? tableHeight : maxHeight"
:row-class-name="$listeners['row-click']? 'row-can-click':''"
@filter-change="filterChange"
@sort-change="sortChange"
>
<template
v-for="col in options">
<!-- 多选框 -->
<el-table-column
v-if="col.type === 'check' || col.type === 'selection'"
:key="col.label"
type="selection"
width="37"
:reserve-selection="true"
:selectable="selectable(col)">
</el-table-column>
<!-- 插槽 -->
<el-table-column
header-align="left"
align="left"
v-else-if="col.type === 'slot'"
:key="col.label"
:label="col.label"
:min-width="col.width? col.width : ''"
:column-key="col.filterKey"
:filters="handleFilters(col.filterList)"
:filter-multiple="false"
filter-placement="bottom"
:sortable="!!col.sortable">
<template slot-scope="scope">
<div
v-if="(col.slotName === 'status' || col.slotName === 'state' || col.slotName === 'api_status')&& col.animation &&col.animation(scope.row)"
class="status-icon-animation"
:style="{
background: col.statusColor && col.statusColor(scope.row)
}">
</div>
<div
v-else-if="col.slotName === 'status' || col.slotName === 'state' ||col.slotName === 'api_status'"
class="status-icon"
:style="{
background: col.statusColor && col.statusColor(scope.row)
}">
</div>
<div class="any-slot">
<slot :name="col.slotName" v-bind="scope.row"></slot>
</div>
</template>
</el-table-column>
<!-- 普通列 -->
<!-- 表头居中 -->
<el-table-column
header-align="left"
align="left"
v-else-if="!(typeof col.render === 'function')"
:key="col.label"
:label="col.label"
:prop="col.render"
:min-width="col.width? col.width : ''"
:column-key="col.filterKey"
:filters="handleFilters(col.filterList)"
:filter-multiple="false"
filter-placement="bottom"
:sortable="!!col.sortable">
<!-- <template slot-scope="scope">
<st-tooltip v-if="col.tooltip && col.tooltip(scope.row)" placement="top">
<template v-slot:content>
<span v-html="typeof col.tooltipValue === 'function' ?
col.tooltipValue(scope.row) :
col.tooltipValue"></span>
</template>
<div>{{scope.row[col.render]}}</div>
</st-tooltip>
<div v-else>{{window.eval(((col) => {return `scope.row.${col.render.toString()}`})(col))}}</div>
</template> -->
</el-table-column>
<!-- 函数render 目前tooltip仅支持此种方式 -->
<el-table-column
v-else
:key="col.label"
:label="col.label"
:min-width="col.width? col.width : ''"
:column-key="col.filterKey"
:filters="handleFilters(col.filterList)"
:filter-multiple="false"
filter-placement="bottom"
:sortable="!!col.sortable">
<template slot-scope="scope">
<st-tooltip v-if="col.tooltip && col.tooltip(scope.row)" placement="top">
<template v-slot:content>
<span v-html="typeof col.tooltipValue === 'function' ?
col.tooltipValue(scope.row) :
col.tooltipValue"></span>
</template>
<div v-html="col.render(scope.row)"></div>
</st-tooltip>
<div v-else v-html="col.render(scope.row)"></div>
</template>
</el-table-column>
</template>
<slot></slot>
</el-table>
<div class="pagination" v-if="pagination">
<el-pagination
:current-page.sync="currentPage"
:page-size.sync="currentSize"
:total="total"
:layout="pageLayout"
></el-pagination>
</div>
</div>
</template>
<script lang="ts">
import { Vue, Watch, Component, Prop } from 'vue-property-decorator'
@Component
export default class seetaTableIndex extends Vue {
$refs!: {
tableBox: any,
table: any,
}
// 传入遮罩控制
@Prop({ type: Boolean, default: false }) outerLoading
// 列表参数
@Prop({ type: Array, default: () => [] }) options
// 数据加载函数
@Prop({ type: Function, default: () => { return {} } }) loadFunction
@Prop({ type: Number, default: 10 }) pageSize
@Prop({ type: Number, default: 1 }) pageIndex
// 手动传入数据
@Prop({ type: Object, default: () => {} }) data
// 是否分页
@Prop({ type: Boolean, default: true }) pagination
// 自动高度,仅适用于父级容器有明确高度的情况
@Prop({ type: Boolean, default: true }) autoHeight
// 最大高度,当autoHeight为false时生效
@Prop({ type: [Number, String], default: '100%' }) maxHeight
// 是否自动刷新
@Prop({ type: Boolean, default: false }) autoRefresh
// 轮询周期
@Prop({ type: Number, default: 5000 }) refreshCycle
// 是否开启置灰
@Prop({ type: Boolean, default: false }) isSelectAble
// 页码样式
@Prop({ type: String, default: 'total, prev, pager, next, sizes, jumper' }) pageLayout
isLoading: boolean = false
tableData: {}[] = []
total: number = 0
// currentPage: number = 1
// currentSize: number = 10
tableHeight: number = 500
currentFilters: {} = {}
loopRefresh: any = null
// 当前页
get currentPage() { return Number(this.$route.query.page_index) || this.pageIndex }
set currentPage(val) {
// if(this.total / this.currentSize > val) val = 1
this.$emit('page-change', val)
// 兼容旧表格使用方式
if (this.$route.query.page_index && Number(this.$route.query.page_index) === val) return
const newQuery = {
...this.$route.query,
page_index: val,
}
this.$router.replace({ query: newQuery })
}
// 每页条数
get currentSize() { return Number(this.$route.query.page_size) || this.pageSize }
set currentSize(val) {
this.$emit('size-change', val)
// 兼容旧表格使用方式
const newQuery = {
...this.$route.query,
page_size: val,
}
this.$router.replace({ query: newQuery })
}
// 在resize的过程中保持ref的获取
get refTableBox() {
// console.log(this.$refs['tableBox'])
return this.$refs['tableBox']
}
// 获取列表数据
async loadTableData(showLoading) {
if (showLoading) this.isLoading = true
const res = await this.loadFunction()
this.tableData = res.list
this.total = res.result_total
this.getTableHeight()
this.isLoading = false
}
// 更新筛选条件
filterChange(filters) {
this.$set(this.currentFilters, Object.keys(filters)[0], filters[Object.keys(filters)[0]][0])
}
// 排序改变
sortChange(val) {
const tableItem = this.options.filter(col => {
return col.label === val.column['label']
})[0]
if (!tableItem.sortable) console.error('不存在排序回调函数')
tableItem.sortable(val.order)
}
// 获取列表数据,用于父组件获取数据
getTableData() {
return this.tableData
}
// 重置列表
resetTable() {
this.$refs.table.clearFilter()
this.$router.replace({ query: {} })
setTimeout(() => {
this.currentFilters = {}
}, 100)
}
// 计算列表高度
getTableHeight() {
this.$nextTick(() => {
this.tableHeight = this.refTableBox.getBoundingClientRect().height - 66
// console.log(this.tableHeight)
})
}
/**
* 预处理筛选条件
* 非字符串类型需要序列化,否则报错
* 非字符串类型条件需要在组件@filter 事件中进行反序列化
*/
handleFilters(filters) {
if (!filters) return
return filters.map(f => {
if (typeof f.value !== 'string') f.value = JSON.stringify(f.value)
return f
})
}
@Watch('$route.query')
routeChange(val, oldVal) {
if (!val || val === oldVal) return
this.loadData()
}
// 监听手动传入的数据
@Watch('data', { deep: true, immediate: true })
dataChange(val) {
if (!val) return
this.tableData = val.list
if (val.total || val.total === 0) {
this.total = val.total
}
}
// 监听传入的loading状态
@Watch('outerLoading', { immediate: true })
loadingChange(val) {
this.isLoading = val
}
@Watch('currentFilters', { deep: true })
filtersChange(val, oldVal) {
this.$emit('filter', val)
}
// 加载表格数据
loadData(showLoading = true) {
if (this.data) return
this.loadTableData(showLoading)
}
// 自动轮询
refeshList() {
if (!this.autoRefresh) return
clearInterval(this.loopRefresh)
this.loopRefresh = setInterval(() => {
this.loadData(false)
}, this.refreshCycle)
}
// 后端返回的默认选中
toggleRowSelection(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.table.toggleRowSelection(row)
})
} else {
this.$refs.table.clearSelection()
}
}
// 多选框置灰
selectable(col) {
return (row, index) => {
// console.log(row, index, col)
if (col.selectable) {
if (typeof col.selectable !== 'function') console.error('selectable属性必须是函数类型')
return col.selectable(row, index)
} else return true
}
}
created() {
this.loadData()
}
mounted() {
const _this = this
this.getTableHeight()
// window窗口大小改变时更新图表大小
window.addEventListener('resize', function() {
_this.getTableHeight()
})
window.onload = () => {
this.getTableHeight()
}
this.refeshList()
}
beforeDestroy() {
clearInterval(this.loopRefresh)
}
}
</script>
<style lang="sass" scoped>
@import "@/styles/theme.sass"
.table-box
height: 100%
overflow: auto
background: #fff
position: relative
.el-table
color: $--color-text-primary
font-size: 14px
::v-deep .el-table__header
font-size: 14px
font-family: PingFang-SC-Bold, PingFang-SC
font-weight: bold
color: #333333
line-height: 20px
::v-deep th
background-color: $--color-table-header
color: $--color-text-primary
font-weight: 'bold'
border-top: 1px solid #E8EBF2
.cell
text-align: left
padding-left: 30px
white-space: nowrap
.el-checkbox
.el-checkbox__input.is-indeterminate .el-checkbox__inner
background-color: #FFF
border-color: #D7DAE0
.el-table__column-filter-trigger
.el-icon-arrow-down
&::before
content: '\e774'
font-family: "iconfont" !important
font-size: 16px
color: #666 !important
vertical-align: middle
position: relative
bottom: 2px
margin-left: 6px
&:hover::before
color: #409EFF !important
&.el-table-column--selection .cell
text-overflow: unset
input[type=checkbox], .checkbox
display: none
//
@keyframes ripple
0%
opacity: 0.6
transform: scale(1)
50%
opacity: 0.2
transform: scale(1.8)
100%
opacity: 0.6
transform: scale(1)
::v-deep .el-table__row
.status-icon, .status-icon-animation
width: 6px
height: 6px
border-radius: 6px
position: relative
display: inline-block
vertical-align: middle
.status-icon-animation
&::before
content: ''
display: block
position: absolute
width: 100%
height: 100%
border-radius: inherit
background: inherit
animation: ripple 3s infinite
&.row-can-click:hover //仅当表格有行点击事件时才添加pointer属性
cursor: pointer
&:hover
td
background-color: $--color-table-hover
.el-table-column--selection .cell
text-overflow: unset
input[type=checkbox], .checkbox
display: none
.cell
text-align: left
padding-left: 30px
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #333333
line-height: 20px
// 防止换行引起抖动
white-space: nowrap
// 列表中操作区域按钮间距方式特殊处理
td:last-child
button.el-button--text, button.el-button--delete
& + button
margin-left: 0
&:not(:last-child)
margin-right: 20px
// 斑马纹
&.el-table--striped
::v-deep .el-table__row--striped
td
background-color: $--color-table-stripe
&:hover
td
background-color: $--color-table-hover
.pagination
text-align: center
margin-top: 24px
margin-bottom: 10px
.el-pagination
white-space: nowrap
padding: 2px 5px
color: #333
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
::v-deep .el-pagination__total
font-size: 14px
color: $--color-text-primary
::v-deep .el-pager
font-weight: 500
::v-deep.el-pagination__sizes, ::v-deep.el-pagination__jump, ::v-deep.el-pagination__total
font-weight: 400
::v-deep .btn-next, ::v-deep .btn-prev
color: #666
&:disabled
color: #C0C4CC
</style>
<style lang="sass">
.el-table-filter__list
.el-table-filter__list-item.is-active
color: #409EFF !important
background-color: #ffffff !important
.el-table-filter__list-item:hover
background-color: #F5F7FA !important
.el-select-dropdown__item
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
.el-select-dropdown__item, .selected
font-weight: normal !important
::v-deep .el-icon-arrow-down:hover
color: #409EFF !important
.any-slot
display: inline-block
vertical-align: middle
</style>
<template>
<el-tabs v-model="activeTab" v-bind="$attrs" v-on="$listeners">
<el-tab-pane
v-for="tab in tabs"
:key="tab.name"
:label="tab.label"
:name="tab.name">
<slot :name="tab.name"></slot>
</el-tab-pane>
</el-tabs>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class seetaTabs extends Vue {
@Prop({ type: Array, default: [] }) tabs
@Prop({ type: String, default: '' }) value
get activeTab() { return this.value }
set activeTab(val) { this.$emit('input', val) }
created() {
// this.activeTab = this.value
}
}
</script>
<style lang="sass" scoped>
.el-tabs
height: 100%
::v-deep .el-tabs__header
margin: 0 0 14px
::v-deep .el-tabs__item
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
&.is-active
color: #409EFF
&:hover
color: #409EFF
::v-deep .el-tabs__active-bar
background-color: #409EFF
.el-tabs--top.el-tabs--card
& > ::v-deep .el-tabs__header
border-bottom: none
background: #ebeef5
.el-tabs__nav
border: none
.el-tabs__item
background: #FBFCFD
border-color: #EBEEF5
border-top-left-radius: 2px
border-top-right-radius : 2px
border-bottom: 2px solid #EBEEF5
padding: 0 30px
&:last-child
padding-right: 30px
&:first-child
padding-left: 30px
&:nth-child(2)
padding-left: 30px
& + .el-tabs__item
margin-left: 1px
&.is-active
border-bottom: none
background-color: #FFF
</style>
<style lang="sass">
.el-tabs--top.el-tabs--card > .el-tabs__header .el-tabs__item:last-child
padding-right: 30px
</style>
<template>
<el-tooltip
v-bind="$attrs"
v-on="$listeners"
:popper-class="popperClass">
<slot name="content" slot="content"></slot>
<slot></slot>
</el-tooltip>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class tooltip extends Vue {
get popperClass() {
return this.$attrs.effect === 'light' ? 'light' : 'seeta-tooltip'
}
}
</script>
<style lang="sass">
.el-tooltip__popper
border-radius: 2px
.el-tooltip__popper.is-light
border: none
.el-tooltip__popper[x-placement^=right].is-light.light .popper__arrow
border-right-color: #FFF
.el-tooltip__popper[x-placement^=right].is-light.light .popper__arrow:after
border-right-color: #FFF
.el-tooltip__popper[x-placement^=left].is-light.light .popper__arrow
border-left-color: #FFF
.el-tooltip__popper[x-placement^=left].is-light.light .popper__arrow:after
border-left-color: #FFF
.seeta-tooltip
background: #4C4C4C !important
border-radius: 2px
max-width: 180px
.el-tooltip__popper[x-placement^=right] .popper__arrow
border-right-color: #4C4C4C
.el-tooltip__popper[x-placement^=right].seeta-tooltip .popper__arrow:after
border-right-color: #4C4C4C
</style>
<template>
<el-upload
type="input"
v-bind="$attrs"
v-on="$listeners"
:action="action"
:file-list="useCustom?customFileList:fileList"
:on-remove="removeFile"
:on-change="onChange"
:auto-upload="autoUpload"
:limit="limit"
class="seeta-upload"
:style="{
width: width
}"
:id="id">
<div ref="uploader"></div>
<slot name="trigger" slot="trigger">
<st-button
v-if="useCustom"
type="primary"
icon="iconfont icon-shangchuan"
@click.prevent="handleClick">{{text}}</st-button>
<st-button
v-else-if="newupload"
type="primary"
icon="iconfont icon-shangchuan"
@click.prevent.stop="newUploadClick">{{text}}</st-button>
<!-- 避免设置type为primary防止引起st-input的回车事件触发选取文件 -->
<st-button
v-else
icon="iconfont icon-shangchuan"
class="primary-button"
@click.prevent.stop="uploadClick">{{text}}</st-button>
</slot>
<slot name="tip" slot="tip" class="tip"></slot>
</el-upload>
</template>
<script>
// import WebUploader from './web-uploader'
export default {
data() {
return {
uploader: null,
NativeButton: 'button'
}
},
props: {
action: { type: String, default: '' },
// 是否自定义上传行为,开启后可当做原生element组件使用
useCustom: { type: Boolean, default: false },
autoUpload: { type: Boolean, default: false },
width: { type: String, default: '300px' },
text: { type: String, default: '上传' },
newupload: { type: Boolean, default: false },
id: { type: String, default: () => (Math.random() * 100).toFixed(2) * 100 + '' },
limit: { type: Number, default: 3 },
// 编辑时使用的已有文件,必需要包含file_id字段
currentFile: { type: Array, default: () => [] },
},
methods: {
uploadClick() {
const btn = document.getElementsByName('file')[0]
btn.click()
},
// 新上传事件,调用新的webuploader类
newUploadClick(event) {
const element = document.getElementById(this.id).getElementsByClassName('webuploader-container')
// console.log('el', element)
const btn = element[0].getElementsByTagName('input')[0]
btn.click()
},
handleClick(evt) {
this.$emit('click', evt)
},
/**
* 移除文件钩子
* 自定义模式:调用传入的remove钩子
* 否则调用 webuploader 删除机制
*/
removeFile(val) {
if (this.useCustom) {
// 自定义上传
if (!this.$attrs['on-remove']) return
this.$attrs['on-remove'](val)
} else if (this.newupload) {
// 新版上传
if (val.id) {
// 新上传的文件删除
this.uploader.removeFile(val.id)
} else {
// 编辑时显示的已有文件删除
this.fileList.splice(f => f.file_id === val.file_id, 1)
this.serverFile.splice(f => f.file_id === val.file_id, 1)
}
// 如果存在,调用自定义的remove钩子
if (this.$attrs['on-remove']) this.$attrs['on-remove'](val)
} else {
// 移除视图中的文件
if (this.$attrs['on-remove']) this.$attrs['on-remove'](val)
}
},
// 文件改变
onChange(file, fileList) {
if (this.$attrs['on-change']) {
this.$attrs['on-change'](file, fileList)
}
},
// 开始上传(新版上传)
startUpload(params = {}, cb) {
if (this.fileList) {
this.fileList.forEach(file => {
if (file.id) {
this.uploader.startUpload(file.id, params, cb)
}
})
}
},
},
mounted() {
this.uploader = new WebUploader({
dom: this.$refs.uploader,
fileNumLimit: this.limit,
})
this.uploader.initUploader()
},
computed: {
serverFile() {
return _.cloneDeep(this.currentFile)
},
// 默认模式(异步上传)文件列表
fileList() {
if (this.newupload && this.uploader) {
let fileList = []
fileList = [
...this.uploader.getFilelist(),
...this.serverFile,
]
this.$emit('getFileList', fileList)
return fileList
}
this.$emit('getFileList', this.$store.getters.fileList)
return _.cloneDeep(this.$store.getters.fileList)
},
// 自定义模式文件列表
customFileList() {
return [...this.serverFile]
},
},
}
</script>
<style lang="sass" scoped>
@import "~@/styles/theme.sass"
.seeta-upload
.el-button
font-size: 14px
::v-deep .el-upload-list
.el-upload-list__item
.el-upload-list__item-name
i
&::before
content: '\e788'
font-family: "iconfont" !important
::v-deep .tip
color: $--color-text-tip
font-size: 12px
margin-top: 12px
::v-deep .el-upload-list__item-status-label
display: block
::v-deep .el-upload-list__item.is-ready
&:hover
.el-upload-list__item-status-label
display: none
.primary-button
color: #FFFFFF
background-color: #409EFF
border-color: #409EFF
</style>
<!--步进器组件-->
<template lang="pug">
.status-area.flex.left
.item.flex.flex-1.column(
v-for="(item, index) in stepInfo"
)
.item-tu.flex.center(:class="{ active: index+1 <= currentStep }")
.item-left
.item-round
.item-right(:class="{ active: index+1 < currentStep }")
.item-status {{ item.status }}
.item-time {{ item.time }}
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
@Component
export default class stepper extends Vue {
/**
* @param {Array<object>} stepInfo
* @param {String} stepInfo.status - 步骤的名字
* @param {String} stepInfo.time - 步骤结束的时间
*/
@Prop({ type: Array, default: () => [] }) stepInfo
@Prop({ type: Number, default: 1 }) currentStep
}
</script>
<style lang="sass" scoped>
.status-area
padding: 10px
background: transparent
.item
font-size: 13px
color: #333
line-height: 26px
text-align: center
.item-tu
width: 100%
height: 30px
&.active
.item-round
background-color: #378DFF
.item-left
border-color: #ECEFF3
.item-round
min-width: 8px
min-height: 8px
margin: 0 5px
border-radius: 50%
background: #ECEFF3
.item-left
width: 50%
border: 1px solid #ECEFF3
.item-right
width: 50%
border: 1px solid #ECEFF3
&.active
border-color: #ECEFF3
&:first-child
.item-tu
.item-left
border: transparent
&:last-child
.item-tu
.item-right
border: transparent
.item-time
color: #99A1A9
</style>
<!--
次级tabs组件 与路由无关
@author cui
-->
<template lang="pug">
.tabs(v-if="tabs.length")
.tabs-header
ul.tabs-list
li.tabs-item(
v-for="tab in tabs",
@click="currentTab = tab.key",
:class="{ active: tab.key === currentTab }",
)
span.name {{ tab.name }}
.tabs-content
slot
</template>
<script>
export default {
props: {
/**
* { key: 'detail', name: '详情' }[]
*/
tabs: {
type: Array,
default: () => [],
},
chooseTab: {
type: String,
},
},
computed: {
currentTab: {
get() { return this.chooseTab || this.tabs[0].key },
set(val) { this.$emit('update:chooseTab', val) },
},
},
}
</script>
<style lang="sass" scoped>
.tabs
.tabs-header
border-bottom: 1px solid #E5E5E5
.tabs-list
vertical-align: bottom
.tabs-item
display: inline-block
min-width: 80px
height: 32px
line-height: 32px
text-align: center
font-size: 14px
cursor: pointer
color: #4C4C4C
bottom: -1px
margin: 0 20px
vertical-align: middle
position: relative
// span
// display: inline-block
// &:first-child
// margin-left: 0
&:hover
color: #409EFF
&.active
color: #409EFF
// border-bottom: 2px solid #409EFF
&::before
content: ''
position: absolute
width: 100%
height: 2px
bottom: 0
left: 0
background-color: #409EFF
&.full
height: 100%
display: flex
flex-direction: column
.tabs-content
flex: 1
background: #FFF
overflow: hidden
</style>
<!--
tabs组件
@author cui
-->
<!--
使用示例:
tabs(:tabs="tabs")
router-view(
:一些神奇的props
)
computed: {
tabs() {
return [
{
name: '版本',
routeOnClick: { name: 'version' },
activeOnRouteNames: ['version-second'],
},
]
}
}
-->
<template lang="pug">
.tabs.flex.column.flex-1(
v-if="tabs.length"
)
.tabs-header.flex.justify
ul.tabs-list
li.tabs-item(
v-for="tab in formatTabs",
@click="chooseTab(tab)",
:class="{ active: tab === activeTab }",
)
//- span.iconfont(
//- v-if="tab.icon",
//- :class="`icon-${tab.icon}`",
//- )
span.name {{ tab.name }}
slot(name="shoulder")
.tabs-content.flex.column.flex-1(
style="overflow: auto"
)
slot
</template>
<script>
export default {
props: {
/**
* 格式为 [{ name: string, routeOnClick: { name, query }, activeOnRouteNames: [ name1, name2... ], history: boolean }]
* name 表示tab上的标签名称
* routeOnClick 表示点击tab会切换到的地址
* [activeOnRouteNames] 表示切换到该数组内路由也会设定当前 tab 为 active
* [history] 值为 true 时使用 router.push
* 在当前路由名称不存在于 routeOnClick/activeOnRouteNames 中时, 则不主动变化active tab
*/
tabs: {
type: Array,
default: () => [],
},
keepQuery: {
type: Boolean,
default: false,
},
},
data() {
return {
activeTab: null,
}
},
methods: {
// 切换tab标签
chooseTab(tab) {
if (!this.formatTabs.length) return
const route = !this.keepQuery
? tab.routeOnClick
: {
...tab.routeOnClick,
query: this.$route.query,
}
const action = tab.history ? 'push' : 'replace'
this.$router[action](route)
},
getActiveTab() {
return _.find(this.formatTabs, tab => {
return _.includes(tab.activeOnRouteNames, this.currentRouteName)
})
},
},
computed: {
currentRouteName() {
return this.$route.name
},
formatTabs() {
const tempTabs = _.clone(this.tabs)
for (const tab of tempTabs) {
if (!tab.routeOnClick) throw new Error('tabs参数存在问题')
if (!tab.activeOnRouteNames || tab.activeOnRouteNames.length === 0) {
tab.activeOnRouteNames = [tab.routeOnClick.name]
} else {
tab.activeOnRouteNames.unshift(tab.routeOnClick.name)
tab.activeOnRouteNames = _.uniq(tab.activeOnRouteNames)
}
}
return tempTabs
},
},
watch: {
// 路由切换时, 根据情况改变 activeTab
$route: {
immediate: true,
handler(val, oldVal) {
if (val === oldVal || !val) return
this.activeTab = this.getActiveTab() || this.activeTab
},
},
// tabs参数变更时, 需要修正 activeTab
tabs: {
immediate: true,
handler(val, oldVal) {
if (val === oldVal || val.length === 0) return
this.activeTab = this.getActiveTab() || this.activeTab
},
},
},
}
</script>
<style lang="sass" scoped>
$bg-color: #EEE
.tabs
.tabs-header
.tabs-list
vertical-align: bottom
.tabs-item
display: inline-block
width: fit-content
height: 32px
padding: 0 20px
line-height: 32px
text-align: center
font-size: 14px
cursor: pointer
color: #4C4C4C
background-color: $bg-color
border-bottom: 1px solid #FFF
position: relative
bottom: -1px
margin-left: 2px
vertical-align: middle
&:first-child
margin-left: 0
&:hover
color: #409EFF
&.active
color: #409EFF
background-color: #FFF
&::before
content: ''
position: absolute
width: 100%
height: 2px
top: 0
left: 0
background-color: #409EFF
// .iconfont
// font-size: 12px
// margin-right: 10px
// .tabs-content
// box-shadow: 0 0 3px rgba(0,0,0,0.1)
&.full
height: 100%
display: flex
flex-direction: column
.tabs-content
flex: 1
background: #FFF
</style>
// 因为ts获取不到windos下的内容,在这里进行暴露数据
const baseUrl = window.g.baseURL
const defaultLang = window.g.defaultLang
const osList = window.g.osList
const versionList = window.g.versionList
export { baseUrl, defaultLang, osList, versionList }
/**
* 高频使用的东西直接附在 window 上
*/
import Vue from 'vue'
import _ from 'lodash'
import moment from 'moment'
import Toast from '@/helpers/toast'
import router from '@/router'
// TODO 需要实现刷新页面的功能
function refresh() {
}
window.Vue = Vue
window._ = _
window.moment = moment
window.Toast = Toast
Vue.prototype.routerRefresh = refresh
window.routerRefresh = refresh
import confirm from '@/components/dialog'
export default {
/**
* 提示框
* @param {string} title
* @param {Object} params
* @return {Promise.<boolean>} resolve with true:我知道了
*/
alert(title, params) {
return this._dialog('alert', title, params)
},
/**
* 带选择框的提示框
* @param {string} title
* @param {Object} params
* @return {Promise.<boolean>} resolve with true:确定 reject with false:取消
*/
alertSelect(title, params) {
return this._dialog('alertSelect', title, params)
},
/**
* 警示框
* @param {string} title
* @param {Object} params
* @return {Promise.<boolean>} resolve with true:我知道了
*/
warning(title, params) {
return this._dialog('warning', title, params)
},
/**
* 确认框
* @param {string} title
* @param {Object} params
* @return {Promise.<boolean>} resolve with selections:确认(返回的array为选项选择的boolean数组,每个boolean对应一个选项),false:取消
*/
confirm(title, params) {
return this._dialog('confirm', title, params)
},
/**
* 提示框/确认框共用的私有方法
* @param {string} mode - confirm | alert
* @param {string} title
* @param {Object} params
* @return {Promise.<boolean>} resolve with true/selections:确认/我知道了, false:取消
*/
_dialog(mode, title, params = {}) {
const { message, confirmButtonText, cancelButtonText, options } = params
return new Promise((resolve, reject) => {
const el = document.createElement('div')
document.body.appendChild(el)
/* eslint-disable no-new */
new Vue({
el,
template: `
<confirm
:mode="mode"
:title="title"
:message="message"
:options="options"
:confirm-button-text="confirmButtonText"
:cancel-button-text="cancelButtonText"
:vm="vm"
@confirm="resolvePromise"
@cancel="resolvePromise(false)"
></confirm>
`,
components: { confirm },
data() {
return { mode, title, message, confirmButtonText, cancelButtonText, options, vm }
},
methods: {
resolvePromise(val) {
resolve(val)
},
},
})
})
},
}
/**
* 拖拽
*/
export default class Drag {
private _dom: any
private _options: any
/**
* 初始化
* @param {Object} dom - 放置目标容器
* @param {Object} [options]
* @param {Function} [options.dragEnter] - 开始拖动元素 callback
* @param {Function} [options.dragOver] - 拖动的元素在放置目标范围内移动 callback
* @param {Function} [options.dragLeave] - 拖动的元素离开放置目标范围 callback
* @param {Function} [options.drop] - 拖动的元素放到了放置目标中 callback
*/
constructor(dom: any, options?: {}) {
if (!dom) {
const error = '[Drag]: 请提供放置目标容器。'
// Toast.danger(error)
console.error(error)
return
}
this._dom = dom
this._options = options
this.init()
}
init() {
this.initEvents()
}
destroy() {
this.removeEvents()
}
/**
* 初始化拖拽相关事件
*/
initEvents() {
const target = this._dom
target.addEventListener('dragenter', this.dragEnter.bind(this), false)
target.addEventListener('dragover', this.dragOver.bind(this), false)
target.addEventListener('dragleave', this.dragLeave.bind(this), false)
target.addEventListener('drop', this.drop.bind(this), false)
}
/**
* 移除拖拽相关事件
*/
removeEvents() {
const target = this._dom
target.removeEventListener('dragenter', this.dragEnter.bind(this), false)
target.removeEventListener('dragover', this.dragOver.bind(this), false)
target.removeEventListener('dragleave', this.dragLeave.bind(this), false)
target.removeEventListener('drop', this.drop.bind(this), false)
}
/**
* 开始拖动元素
*/
dragEnter(e) {
e.preventDefault()
if (typeof this._options.dragEnter === 'function') {
this._options.dragEnter(e)
}
}
/**
* 拖动的元素在放置目标范围内移动
*/
dragOver(e) {
e.preventDefault()
if (typeof this._options.dragOver === 'function') {
this._options.dragOver(e)
}
}
/**
* 拖动的元素离开放置目标范围
*/
dragLeave(e) {
if (typeof this._options.dragLeave === 'function') {
this._options.dragLeave(e)
}
}
/**
* 拖动的元素放到了放置目标中
*/
drop(e) {
e.preventDefault()
if (typeof this._options.drop === 'function') {
this._options.drop(e)
}
}
}
import Http from '@/http'
import EXIF from 'exif-js'
/**
* 对图片进行旋转对称处理
* @param {element} query.img - 图片元素
* @param {object} query.options - 参数
* @return {string} - base64图片url
*/
export function orientRotate(
img: HTMLImageElement,
options?: { orient?: number, size?: number },
): Promise<string> {
// 图片宽高
let { width, height } = img
if (options && options.size) {
if (height > width) {
width = +options.size * width / height
height = +options.size
} else {
height = +options.size * (height / width)
width = +options.size
}
}
const canvas = document.createElement('canvas')
// 是否侧放 侧方则宽高互换
const orient = (options && options.orient) || 1
const isLateral = [5, 6, 7, 8].includes(orient)
canvas.width = isLateral ? height : width
canvas.height = isLateral ? width : height
const ctx = canvas.getContext('2d')
switch (orient) {
case 2:
ctx!.translate(width / 2, 0)
ctx!.scale(-1, 1)
ctx!.translate(-width / 2, 0)
break
case 3:
ctx!.translate(width / 2, height / 2)
ctx!.scale(-1, -1)
ctx!.translate(-width / 2, -height / 2)
break
case 4:
ctx!.translate(0, height / 2)
ctx!.scale(1, -1)
ctx!.translate(0, -height / 2)
break
case 5:
ctx!.translate(0, width / 2)
ctx!.scale(1, -1)
ctx!.translate(0, -width / 2)
ctx!.translate(height, 0)
ctx!.rotate(Math.PI / 2)
break
case 6:
ctx!.translate(height, 0)
ctx!.rotate(Math.PI / 2)
break
case 7:
ctx!.translate(0, width / 2)
ctx!.scale(1, -1)
ctx!.translate(0, -width / 2)
ctx!.translate(0, width)
ctx!.rotate(-Math.PI / 2)
break
case 8:
ctx!.translate(0, width)
ctx!.rotate(-Math.PI / 2)
break
}
ctx!.drawImage(img, 0, 0, width, height)
return new Promise((resolve, reject) => {
canvas.toBlob(blob => {
const resultBlobSrc = URL.createObjectURL(blob)
resolve(resultBlobSrc)
})
})
}
// 对图片进行方向修正
async function recoverOrient(imgEle: HTMLImageElement): Promise<string> {
const orient: number = await new Promise(resolve => {
EXIF.getData((imgEle as any), () => {
const orient = EXIF.getTag(imgEle, 'Orientation') || 1
resolve(orient)
})
})
const resultBlobSrc = orient === 1
? imgEle.src
: await orientRotate(imgEle, { orient })
return resultBlobSrc
}
// 异步等待图片加载完成
function getImgElement(imgSrc: string): Promise<HTMLImageElement> {
return new Promise((resolve, reject) => {
const img = new Image()
img.onload = () => {
// URL.revokeObjectURL(imgSrc)
resolve(img)
}
img.onerror = () => { reject(img) }
img.src = imgSrc
})
}
// 对图片进行显示前的预处理
// 返回 处理并加载完成的 图片元素
export default async function imgPretreat(imgSrc: string) {
let blobSrc = ''
if (/^blob:/.test(imgSrc)) blobSrc = imgSrc
else {
const imgBlob = await Http.get(imgSrc, {}, {
routerCancel: true,
responseType: 'blob',
valid_code: false,
})
if (imgBlob && imgBlob.size) blobSrc = URL.createObjectURL(imgBlob)
}
if (!blobSrc) return null
const initialImgEle = await getImgElement(blobSrc).catch(errorImg => { return errorImg })
const newBlobSrc = await recoverOrient(initialImgEle)
const resultIimgEle = await getImgElement(newBlobSrc)
return resultIimgEle
}
/**
* toast
* @param {string} text - 显示的消息提示文本
* @param {string} handle - 显示的操作提示文本
* @param {string} type - 显示类型 success:default|text|danger|warning|info
* @memberof toast
*/
function toast(text: string = '', handle: string = '', type: string = 'success') {
if (text.length > 0) {
let toastDOM: HTMLElement
const toastAllDOM = document.querySelectorAll('.message-tip-toast') as NodeListOf<HTMLElement>
if (toastAllDOM.length === 0) {
toastDOM = createToast(text, handle, type)
toastDOM.style.top = '70px'
} else {
const lastElement = _.last(toastAllDOM)
if (lastElement == null || lastElement.style.top == null) return
const lastTop:number = +lastElement.style.top.slice(0, -2) + 42
toastDOM = createToast(text, handle, type)
const top:number = lastTop > document.body.clientHeight - 32 ? 70 : lastTop
toastDOM.style.top = `${top}px`
}
document.body.appendChild(toastDOM)
setTimeout(() => {
try {
document.body.removeChild(toastDOM)
} catch (e) {
// 忽略错误,有时候是5秒后,页面已经替换
}
}, 3000)
}
}
function createToast(text: string, handle: string, type: string) {
const toastDOM = document.createElement('div')
const iconDOM = document.createElement('span')
iconDOM.className = `iconfont ${toastIconObject[type]}`
const toastTextDOM = document.createElement('span')
toastTextDOM.appendChild(document.createTextNode(text))
toastTextDOM.className = 'text'
const descBoxDOM = document.createElement('div')
descBoxDOM.appendChild(iconDOM)
descBoxDOM.appendChild(toastTextDOM)
descBoxDOM.className = 'desc'
toastDOM.className = `message-tip-toast ${type}`
const closeBtnDOM = document.createElement('span')
closeBtnDOM.className = 'iconfont icon-close close'
closeBtnDOM.onclick = () => { document.body.removeChild(toastDOM) }
toastDOM.appendChild(descBoxDOM)
toastDOM.appendChild(closeBtnDOM)
if (handle) {
const toastHandleDOM = document.createElement('span')
toastHandleDOM.appendChild(document.createTextNode(handle))
toastHandleDOM.className = 'handle'
toastDOM.appendChild(toastHandleDOM)
}
return toastDOM
}
const toastIconObject = {
text: '',
success: 'icon-success-circle',
danger: 'icon-error',
warning: 'icon-tip',
info: 'icon-tip',
}
const TEXT = 'text'
const SUCCESS = 'success'
const DANGER = 'danger'
const WARNING = 'warning'
const INFO = 'info'
/**
* toast
* @param {string} text - 显示的消息提示文本
* @param {string} handle - 显示的操作提示文本
* @param {string} type - 显示类型 success:default|text|danger|warning|info
* @class Toast
* @memberof toast
*/
export default class Toast {
static text(text = '', handle = '') {
toast(text, handle, TEXT)
}
static success(text = '', handle = '') {
toast(text, handle, SUCCESS)
}
static danger(text = '', handle = '') {
toast(text, handle, DANGER)
}
static warning(text = '', handle = '') {
toast(text, handle, WARNING)
}
static info(text = '', handle = '') {
toast(text, handle, INFO)
}
}
'use strict'
import Axios from 'axios'
import { getToken } from '@/utils/user'
// import * as api from '../src/client'
import { baseUrl } from '../src/config'
import browserStorage from '@/services/local-storage'
import store from '@/store'
import { Notification } from 'element-ui'
import Router from '@/router/index.js'
// 配置默认进度条事件
Axios.defaults.onUploadProgress = p => {
const obj = document.querySelector('.uploadForm .el-icon-circle-check')
if (obj) {
const percent = ((p.loaded / p.total) * 100) | 0
obj.setAttribute('data-text', percent + '%')
store.dispatch('setChangeUploadPercent', percent)
}
}
function notificationError(title: any, msg: any, duration: number = 1500) {
Notification.error({
title: title,
message: msg,
duration: duration
})
}
interface resData { code: string, text: string, msg: string }
interface optionsType {
allow_throw: boolean,
valid_code: boolean,
error_page: boolean,
must_fields?: [],
routerCancel?: boolean,
cancelToken?: any,
}
const m = new Map()
// 获取请求头
function getHeaders() {
const token = getToken()
return token ? { Authorization: token } : null
}
// 全局错误提示
function throwErr(resData: resData) {
vm.$notify.error({
title: resData.text,
message: resData.msg,
})
}
function validBackendCode(resData: resData, options: optionsType) {
if (resData.code === 'Success') return true
if (options.error_page) {
if (resData.code === 'NoAuthority') vm.$router.replace('/403')
if (resData.code === 'RecordNotFoundError') vm.$router.replace('/404')
}
if (options.allow_throw) {
const code = resData.code
const d = new Date()
if (m.has(code)) {
if (d.getTime() - m.get(code) > 2000) {
throwErr(resData)
m.set(code, d.getTime())
}
} else {
throwErr(resData)
m.set(code, d.getTime())
}
}
return false
}
// 添加请求拦截器
Axios.interceptors.request.use(function(config) {
const urlBase = config.url.split('?')[0]
const urlQueryArr = Array.from(new URLSearchParams(config.url.split('?')[1]))
let result = '?'
for (const [key, value] of urlQueryArr) {
if (value) {
result = `${result}${result === '?' ? '' : '&'}${key}=${value}`
}
}
config.url = urlQueryArr.length ? urlBase + result : config.url
// 所有请求存储在取消请求数组中,若完成(成功与否),则移除该请求,若未完成,则取消请求并移除该请求
config.cancelToken = new Axios.CancelToken(cancel => {
store.commit('addAxiosCancelArr', { cancel, url: config.url, method: config.method, type: store.state.uploadType })
})
return config
}, function(error) {
return Promise.reject(error)
})
// 添加响应拦截器
Axios.interceptors.response.use(res => {
// Toast.success('操作成功')
store.getters.axiosCancelArr.map((item, index) => {
if (item.url === res.config.url) {
store.commit('removeAxiosCancelArr', index)
}
})
return res
}, error => {
error.response && error.response.data && notificationError('提示', error.response.data.message)
if (error.response.status === 401) {
Router.push('/login')
}
// 如果后台接口连接不上,提示错误
// if (!error.response) {
// throwErr({
// code: '001',
// text: 'Error',
// msg: '网络连接错误',
// })
// return
// }
// 用户登录失败返回错误信息给界面
if ((error.response && error.response.data.message === vm.$t('login.usernameOrPwd')) || (error.response && error.response.data.message === vm.$t('login.parameterError'))) {
vm.$store.commit('updateErrorInfo', { msg: error.response.data.message })
} else {
// throwErr({
// code: '001',
// text: 'Error',
// msg: error.response.data.message,
// })
}
})
// const configuration = new api.Configuration({
// // basePath: process.env.API_URL,
// basePath: baseUrl,
// apiKey() {
// // TODO: 从localStorage中获取Token,Organization-Id
// return browserStorage.getItem('id')
// }
// })
// export const usersApi = new api.UsersApi(configuration)
import VueI18n from 'vue-i18n'
import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
import jaLocale from 'element-ui/lib/locale/lang/ja'
import zhCN from './strings/zh-CN.js'
import enUS from './strings/en-US.js'
import jp from './strings/jp'
// import momentLocaleZhCn from './moment/locale/zh-cn'
// 兼容浏览器
import browserStorage from '@/services/local-storage'
import store from '@/store'
browserStorage.lang = browserStorage.lang ? browserStorage.lang : (window.g.defaultLang || 'zh-CN')
const lang = store.getters.lang ||
browserStorage.getItem('lang') ||
window.navigator.language ||
window.navigator.browserLanguage ||
window.navigator.systemLanguage
const i18n = new VueI18n({
locale: lang,
messages: {
en: enUS,
'zh-CN': Object.assign(zhCN, zhLocale),
ja: Object.assign(jp, jaLocale),
},
})
export default i18n
export default {
/**
* When a property is not set
*/
error_notset: '属性を設定してください',
/**
* When a string must not be empty
*/
error_notempty: '数値を入力してください',
/**
* When a value is not one of the enumerated values
*/
error_enum: '列挙型の数値を入力してください',
/**
* When a value doesn't validate any schema of a 'anyOf' combination
*/
error_anyOf: '提供されたパターンに対して値を検証する必要があります',
/**
* When a value doesn't validate
* @variables This key takes one variable: The number of schemas the value does not validate
*/
error_oneOf: '数値は、パターンで検証する必要があります。今検証パターンは{{0}}です',
/**
* When a value does not validate a 'not' schema
*/
error_not: '提供されたパターンに対して数値を検証できません',
/**
* When a value does not match any of the provided types
*/
error_type_union: '数値は指定されたタイプと一致する必要があります',
/**
* When a value does not match the given type
* @variables This key takes one variable: The type the value should be of
*/
error_type: '数値は{{0}}タイプと一致する必要があります',
/**
* When the value validates one of the disallowed types
*/
error_disallow_union: '数値は許可されていないタイプにすることはできません',
/**
* When the value validates a disallowed type
* @variables This key takes one variable: The type the value should not be of
*/
error_disallow: '数値のタイプを{{0}}にすることはできません',
/**
* When a value is not a multiple of or divisible by a given number
* @variables This key takes one variable: The number mentioned above
*/
error_multipleOf: '数値は{{0}}の整数倍でなければなりません',
/**
* When a value is greater than it's supposed to be (exclusive)
* @variables This key takes one variable: The maximum
*/
error_maximum_excl: '数値は{{0}}未満で入力してください',
/**
* When a value is greater than it's supposed to be (inclusive
* @variables This key takes one variable: The maximum
*/
error_maximum_incl: '数値は{{0}}以下で入力してください',
/**
* When a value is lesser than it's supposed to be (exclusive)
* @variables This key takes one variable: The minimum
*/
error_minimum_excl: '数値は{{0}}より大きくで入力してください',
/**
* When a value is lesser than it's supposed to be (inclusive)
* @variables This key takes one variable: The minimum
*/
error_minimum_incl: '数値は{{0}}以上で入力してください',
/**
* When a value have too many characters
* @variables This key takes one variable: The maximum character count
*/
error_maxLength: '文字列の長さは{{0}}桁以下で入力してください',
/**
* When a value does not have enough characters
* @variables This key takes one variable: The minimum character count
*/
error_minLength: '文字列の長さは{{0}}桁以上で入力してください',
/**
* When a value does not match a given pattern
*/
error_pattern: '数値は指定されたパターンと一致する必要があります{{0}}',
/**
* When an array has additional items whereas it is not supposed to
*/
error_additionalItems: '該当配列にアイテムは追加できません',
/**
* When there are to many items in an array
* @variables This key takes one variable: The maximum item count
*/
error_maxItems: '配列のアイテム数は{{0}}以下に設定してください',
/**
* When there are not enough items in an array
* @variables This key takes one variable: The minimum item count
*/
error_minItems: '配列のアイテム数は{{0}}以上に設定してください',
/**
* When an array is supposed to have unique items but has duplicates
*/
error_uniqueItems: '配列の重複項目は設定できません',
/**
* When there are too many properties in an object
* @variables This key takes one variable: The maximum property count
*/
error_maxProperties: 'オブジェクトの属性は{{0}}以下に設定してください',
/**
* When there are not enough properties in an object
* @variables This key takes one variable: The minimum property count
*/
error_minProperties: 'オブジェクトの属性は{{0}}以上に設定してください',
/**
* When a required property is not defined
* @variables This key takes one variable: The name of the missing property
*/
error_required: 'オブジェクトの属性を設定してください:{{0}}',
/**
* When there is an additional property is set whereas there should be none
* @variables This key takes one variable: The name of the additional property
*/
error_additional_properties: '属性{{0}}はすでに追加されています',
/**
* When a dependency is not resolved
* @variables This key takes one variable: The name of the missing property for the dependency
*/
error_dependency: '{{0}}に依存属性',
/**
* When a date is in incorrect format
* @variables This key takes one variable: The valid format
*/
error_date: '日付のフォーマット:{{0}}',
/**
* When a time is in incorrect format
* @variables This key takes one variable: The valid format
*/
error_time: '時間のフォーマット:{{0}}',
/**
* When a datetime-local is in incorrect format
* @variables This key takes one variable: The valid format
*/
error_datetime_local: '日付と時刻フォーマット:{{0}}',
/**
* When a integer date is less than 1 January 1970
*/
error_invalid_epoch: '日付は1970年1月1日より前に設定してください',
/**
* Text on Delete All buttons
*/
button_delete_all: 'すべて',
/**
* Title on Delete All buttons
*/
button_delete_all_title: 'すべて削除',
/**
* Text on Delete Last buttons
* @variable This key takes one variable: The title of object to delete
*/
button_delete_last: '最後に{{0}}',
/**
* Title on Delete Last buttons
* @variable This key takes one variable: The title of object to delete
*/
button_delete_last_title: '末尾を削除します{{0}}',
/**
* Title on Add Row buttons
* @variable This key takes one variable: The title of object to add
*/
button_add_row_title: '{{0}}を追加',
/**
* Title on Move Down buttons
*/
button_move_down_title: '下へ',
/**
* Title on Move Up buttons
*/
button_move_up_title: '上へ',
/**
* Title on Object Properties buttons
*/
button_object_properties: '項目属性',
/**
* Title on Delete Row buttons
* @variable This key takes one variable: The title of object to delete
*/
button_delete_row_title: '{{0}}を削除',
/**
* Title on Delete Row buttons, short version (no parameter with the object title)
*/
button_delete_row_title_short: '削除',
/**
* Title on Collapse buttons
*/
button_collapse: '収束',
/**
* Title on Expand buttons
*/
button_expand: '展開',
/**
* Title on Flatpickr toggle buttons
*/
flatpickr_toggle_button: '切替',
/**
* Title on Flatpickr clear buttons
*/
flatpickr_clear_button: 'クリア',
}
export default {
/**
* When a property is not set
*/
error_notset: '属性必须被设置',
/**
* When a string must not be empty
*/
error_notempty: '值不能为空',
/**
* When a value is not one of the enumerated values
*/
error_enum: '数值必须属于枚举值之一',
/**
* When a value doesn't validate any schema of a 'anyOf' combination
*/
error_anyOf: '值需要对提供的模式进行验证',
/**
* When a value doesn't validate
* @variables This key takes one variable: The number of schemas the value does not validate
*/
error_oneOf: '值必须对所提供的模式之一进行验证,当前对应的验证模式为 {{0}}',
/**
* When a value does not validate a 'not' schema
*/
error_not: '值不能对提供的模式进行验证',
/**
* When a value does not match any of the provided types
*/
error_type_union: '值需要与提供的类型匹配',
/**
* When a value does not match the given type
* @variables This key takes one variable: The type the value should be of
*/
error_type: '值必须匹配 {{0}} 类型',
/**
* When the value validates one of the disallowed types
*/
error_disallow_union: '值不能属于任何一种不被允许的类型',
/**
* When the value validates a disallowed type
* @variables This key takes one variable: The type the value should not be of
*/
error_disallow: '值不可以是 {{0}} 类型',
/**
* When a value is not a multiple of or divisible by a given number
* @variables This key takes one variable: The number mentioned above
*/
error_multipleOf: '值必须是 {{0}} 的整数倍',
/**
* When a value is greater than it's supposed to be (exclusive)
* @variables This key takes one variable: The maximum
*/
error_maximum_excl: '值必须小于 {{0}}',
/**
* When a value is greater than it's supposed to be (inclusive
* @variables This key takes one variable: The maximum
*/
error_maximum_incl: '值应该不超过 {{0}}',
/**
* When a value is lesser than it's supposed to be (exclusive)
* @variables This key takes one variable: The minimum
*/
error_minimum_excl: '值必须大于 {{0}}',
/**
* When a value is lesser than it's supposed to be (inclusive)
* @variables This key takes one variable: The minimum
*/
error_minimum_incl: '值应该不小于 {{0}}',
/**
* When a value have too many characters
* @variables This key takes one variable: The maximum character count
*/
error_maxLength: '字符串的长度应该不超过 {{0}}',
/**
* When a value does not have enough characters
* @variables This key takes one variable: The minimum character count
*/
error_minLength: '字符串的长度应该不小于 {{0}}',
/**
* When a value does not match a given pattern
*/
error_pattern: '值必须与指定的模式匹配 {{0}}',
/**
* When an array has additional items whereas it is not supposed to
*/
error_additionalItems: '当前数组不允许有额外的子项',
/**
* When there are to many items in an array
* @variables This key takes one variable: The maximum item count
*/
error_maxItems: '当前数组只允许最多 {{0}} 个子项',
/**
* When there are not enough items in an array
* @variables This key takes one variable: The minimum item count
*/
error_minItems: '当前数组不能少于 {{0}} 个子项',
/**
* When an array is supposed to have unique items but has duplicates
*/
error_uniqueItems: '当前数组的子项不允许存在重复',
/**
* When there are too many properties in an object
* @variables This key takes one variable: The maximum property count
*/
error_maxProperties: '当前对象最多允许有 {{0}} 个属性',
/**
* When there are not enough properties in an object
* @variables This key takes one variable: The minimum property count
*/
error_minProperties: '当前对象不能少于 {{0}} 个属性',
/**
* When a required property is not defined
* @variables This key takes one variable: The name of the missing property
*/
error_required: '当前对象缺失的必要的属性: {{0}}',
/**
* When there is an additional property is set whereas there should be none
* @variables This key takes one variable: The name of the additional property
*/
error_additional_properties: '不允许额外的属性,但属性 {{0}} 已经被添加',
/**
* When a dependency is not resolved
* @variables This key takes one variable: The name of the missing property for the dependency
*/
error_dependency: '需要依赖的属性 {{0}}',
/**
* When a date is in incorrect format
* @variables This key takes one variable: The valid format
*/
error_date: '日期的格式必须设置为: {{0}}',
/**
* When a time is in incorrect format
* @variables This key takes one variable: The valid format
*/
error_time: '时间的格式必须设置为: {{0}}',
/**
* When a datetime-local is in incorrect format
* @variables This key takes one variable: The valid format
*/
error_datetime_local: '日期时间的格式必须设置为: {{0}}',
/**
* When a integer date is less than 1 January 1970
*/
error_invalid_epoch: '日期设置必须早于 1970年1月1日',
/**
* Text on Delete All buttons
*/
button_delete_all: '全部',
/**
* Title on Delete All buttons
*/
button_delete_all_title: '删除全部',
/**
* Text on Delete Last buttons
* @variable This key takes one variable: The title of object to delete
*/
button_delete_last: '末尾 {{0}}',
/**
* Title on Delete Last buttons
* @variable This key takes one variable: The title of object to delete
*/
button_delete_last_title: '删除末尾 {{0}}',
/**
* Title on Add Row buttons
* @variable This key takes one variable: The title of object to add
*/
button_add_row_title: '添加 {{0}}',
/**
* Title on Move Down buttons
*/
button_move_down_title: '下移',
/**
* Title on Move Up buttons
*/
button_move_up_title: '上移',
/**
* Title on Object Properties buttons
*/
button_object_properties: '项目属性',
/**
* Title on Delete Row buttons
* @variable This key takes one variable: The title of object to delete
*/
button_delete_row_title: '删除 {{0}}',
/**
* Title on Delete Row buttons, short version (no parameter with the object title)
*/
button_delete_row_title_short: '删除',
/**
* Title on Collapse buttons
*/
button_collapse: '收起',
/**
* Title on Expand buttons
*/
button_expand: '展开',
/**
* Title on Flatpickr toggle buttons
*/
flatpickr_toggle_button: '切换',
/**
* Title on Flatpickr clear buttons
*/
flatpickr_clear_button: '清空',
}
'use strict'
module.exports = {
login: {
title: '活用・信頼・フルスタック',
desc: '人工知能サービス構築プラットフォーム',
logTitle: 'アカウント登録',
threePartiesLogin: '外部アカウントログイン',
loginButton: 'ログイン',
adminPlease: '管理者はこちらへ',
backLogin: 'システム管理画面ログイン',
pleaseInputUsername: 'ユーザー名を入力してください',
pleaseInputPassword: 'パスワードを入力してください',
pleaseInputCode: '認証コード',
format: 'パスワードの長さは8~64桁以内です',
noAgree: 'パスワードが一致しません',
},
status: {
starting: '起動中',
running: '実行中',
succeed: '成功',
stopping: '停止中',
stopped: '終了',
failed: '失敗',
unknown: '不明',
creating: '作成中',
createFailed: '作成失敗',
created: '作成完了',
waitUpload: 'アップロード待ち',
uploading: 'アップロード中',
uploadFinished: 'アップロード完了',
uploadFailed: 'アップロード失敗',
extracting: '解凍中',
generating: '生成中',
copyFinished: 'コピー完了',
},
mission: {
termination: '終了',
fail: '失敗',
success: '成功',
running: '実行中',
},
overview: 'ホーム',
index: {
hello: 'こんにちは!',
quickNavigation: 'ナビゲーション',
taskRunNumber: 'タスク実行数量',
algorithmRunningTime: 'アルゴリズムの実行時間',
algorithmRunningFrequency: 'アルゴリズムの実行頻度',
newDataSet: '新規データセット',
recently: '近直15日',
taskFlow: 'ワークフロー',
algorithm: 'アルゴリズム',
unit: '単位:件',
modelComponents: 'モジュール',
unitTime: '単位:時',
unitNum: '単位:回',
},
navigation: {
message: 'メッセージ',
changeAdmin: '管理者切替',
buildTasks: 'タスク',
codeDevelop: 'プログラミング',
graphicalOperation: 'GUI',
toolkit: 'ツール',
modelDeployment: 'サービス',
container: 'コンテナ',
dataSet: 'データセット',
model: 'モデル',
algorithm: 'アルゴリズム',
processor: 'プロセッサ',
ApiDeployment: 'API公開',
edgeComputing: 'エッジ',
terminalEquipment: 'デバイス',
personalCenter: 'マイページ',
calculatePowerManagement: '計算能力管理',
clusterForce: 'クラスター一覧',
calculatePowerQuota: '計算能力割合',
calculatePowerDetail: '計算能力明細',
accessSecurity: '鍵認証',
SSHKey: 'SSH鍵',
developerToken: '開発者Token',
contentManage: 'コンテンツ',
spaceManage: 'ワークスペース',
taskFlowManage: 'ワークフロー',
runHistoryManagement: '実行履歴',
containerManagement: 'コンテナ',
algorithmMangement: 'アルゴリズム',
dataSetManagement: 'データセット',
modelManagement: 'モデル',
processorManagement: 'プロセッサ',
systemManagement: 'システム',
userInterface: 'ユーザー画面構成',
userManagement: 'ユーザー',
platformSave: 'セキュリティ',
userWhite: 'ユーザーホワイトリスト',
mirror: 'イメージホワイトリスト',
dataDic: 'データ辞書',
systemSet: 'システム設定',
algoForceManage: '計算能力',
overviewCluster: '計算能力監視',
algoForceType: 'チップセット',
clusterAlgoForce: 'クラスター一覧',
watchCenter: 'ダッシュボード',
logout: 'ログアウト',
changeFront: 'ロール切替',
userFront: 'フロントエンド',
manageBack: 'バックエンド',
document: 'バックアップ',
transmission: 'データ送信',
systemConfig: 'システム構成',
basicConfig: '基本構成',
userInfo: 'ユーザー情報',
},
space: {
spaceSet: 'スペース設定',
spaceMember: 'スペースメンバー',
mySpace: '自分のスペース',
createSpace: '新規作成スペース',
spaceName: 'スペース名',
spaceUserName: '用户名称',
tip: 'スペースを作成するにあたって、他のメンバーを招待して、アルゴリズム開発はチームワークしましょう',
spaceManagement: 'スペース管理',
onlyKey: 'スペースキー',
basicInformation: '基本情報',
spaceDescription: 'スペース説明',
memberManagement: 'メンバー管理',
userName: 'ユーザー名',
memberRole: 'メンバー役割',
edit: '修正',
removeMember: 'メンバー削除',
permissionsManagement: '権限管理',
copy: '他のスペースにコピーすることを許可する',
download: 'データダウンロードを許可する',
deleteSpace: 'スペース削除',
confirm: '確定',
cancel: 'キャンセル',
'delete': '削除',
operation: '操作',
addMember: 'メンバー追加',
normalMem: '一般メンバー',
editMember: 'メンバー修正',
adminMember: '管理者メンバー',
chooseRole: 'ユーザーロールを選択してください',
pleaseAddMember: 'ユーザーを追加してください',
noMoreEight: '項目は8桁以内で入力してください',
confirmDeleteMem: 'ユーザーを削除してよろしいですか?',
lookUp: '検索中...',
inputLookUp: 'ユーザー名を入力し、検索してください',
noFind: '一致するユーザーが見つかりません',
addNewMember: '新規メンバー追加',
confirmDeleteSpace: 'ワークスペースを削除してよろしいですか?',
noRecover: 'ワークスペースを削除すると、データを復元できません!',
searchPlaceholder: '请输入空间名称',
},
pipeline: {
createPipeline: '新規ワークフロー',
pipelineName: 'ワークフロー名',
runHistory: '実行履歴',
searchKey: 'キーワード検索',
workSpace: '作業エリア',
runPipeline: 'ワークフロー実行',
saveTemplate: 'テンプレート保存',
createProcessorTemplate: 'プロセッサテンプレート新規作成',
runName: 'ワークフロー実行名',
startRun: '実行開始',
removeComponent: 'コンポーネント削除',
copyComponent: 'コンポーネントコピー',
pasteComponent: 'コンポーネント貼付',
tip: '入力名/出力名を決めたら、該当ノードを有効にします。入力、出力とワークフローは3つインスタンス以内となります。',
inputPipelineName: 'ワークフロー名入力',
confirmDelete: '削除してよろしいですか?',
clear: '該当ワークフロー削除すると、関連するデータセットは全部削除します',
pipelineDesc: 'ワークフロー説明',
confirmDeleteTask: '該当ワークフローを削除してよろしいですか?',
confirmStopTask: '実行中のタスクを停止してもよろしいですか?',
stopPipeline: 'ワークフロー停止',
copy: 'コピー',
que: '待ち',
ongo: '処理中',
opening: '起動中',
clearDataConfirmD: 'ワークフローの実行履歴を削除すると、関連したデータセットが削除します。削除してもよろしいですか?',
copyPipeline: 'ワークフローコピー',
saveModel: 'モデルを名前付けて保存',
outputFile: '出力ファイル',
log: 'ログ',
dataHandle: 'データ処理',
lookAllLog: 'ログは最大200行まで表示されています。すべてのログ情報は右側リンクをクリックしてください',
downloadAllLog: '全てのログダウンロード',
loading: '読み込み中...',
noLog: 'ログなし',
noImgTableData: 'グラフデータはありません',
save: '保存',
noInclude: 'テンプレートを作成する場合、ワークスペースに他のテンプレートを含めることはできません',
template: 'テンプレート',
lookMore: 'もっと見る',
packup: '畳む',
runOverview: '実行概要',
nodeName: 'ノード名',
startTime: '起動時刻',
basicInformation: '基本情報',
runTiming: '実行情報',
localUpload: 'ファイル開く',
apiDemo: 'APIデプロイ',
apiDemoTip1: '多様なインスタンス、可用性、拡張APIなどをデプロイする場合は、',
apiDemoTip2: 'を使用してください',
remainTimeTip1: 'APIのデプロイは',
remainTimeTip2: '後に自動的に停止します',
savaData: '名前を付けてデータを保存',
fromToSame: '节点的输出不能作为同节点的输入',
stopPipelineName: '确认停止任务流【{name}】吗',
},
container: {
name: 'コンテナ名',
mirror: 'イメージ',
dataSet: 'データセット',
model: 'モデル',
connectMethod: '接続方法',
connectNotebook: 'Notebook接続',
sshLogin: 'SSH登录',
inputContainerName: 'コンテナ名',
createContainer: 'コンテナ作成',
state: 'ステータス',
unmountDataSet: 'データセット稼働しない',
unmountModel: 'モデル稼働しない',
launchLog: '起動ログ',
event: 'イベント',
nodeInformation: 'ノード情報',
launchHistory: '起動履歴',
operatior: '操作者',
operatingContent: '操作内容',
result: '結果',
basicNode: 'マルチノードの場合は下記は「マスター」ノード状況を示します。',
lookMetric: '[/kpl/tensorboard]にEventファイルを書込みした後で、ここでMetric情報を確認します。',
nodeInstanceNumber: 'ノードインスタンス数',
calculateForce: '計算能力',
assignPermissions: 'sudo権限割当',
containerDesc: 'コンテナ説明',
noLonger: 'sudoでディレクトリがを変更した場合、再起動後にコンテナは永続化できなくなります。',
nodeDefined: 'ノード定義',
acceleratorCard: 'GPUカード',
memory: 'メモリ',
addDataSet: 'データセット追加',
addModel: 'モデル追加',
mountLocalDisk: 'マウント',
mountPath: 'マウントパス/ kpl / cache',
notice: '上記パスフォルダ直下にデータのIO読込処理は最適化できます。注:コンテナ再起動後にデータ永続化できない。',
addNewNodeInstance: 'ノード追加',
lookFree: '余裕クラスター表示',
openPort: 'ポート5050公開',
watchPort: 'ポート5050を公開できたら、外部からコンテナ内のサービスをアクセスできます',
pleaseInput: '文字入力',
pleaseChoose: '未選択',
compileMirror: 'イメージビルド',
schedulingMachine: '配置PC',
schedulingSuc: '配置成功',
containerInit: 'コンテナ初期化',
pullMirror: 'ノードのイメージをプル',
nowRunning: '実行中',
fail: '失敗',
stoping: '停止中',
openContainer: 'コンテナを起動しますか?',
confirmStopContainer: 'コンテナを停止してよろしいですか',
confirmDeleteContainer: 'コンテナを削除してよろしいですか',
noEvent: 'イベントなし',
evetnGetting: 'イベント取得中...',
secKey: 'キー',
remoteAccess: 'リモートアクセス',
containerNoOpen: 'コンテナ起動しない',
linux: 'LinuxおよびMacユーザーは、キーファイルのパーミッションを変更が必要です',
remoteCopy: 'リモートコピー',
perform: '実行',
data: 'データ',
noKnowCard: '不明なカードタイプ',
editContainer: 'コンテナ編集',
pleaseInputContainerName: 'コンテナ名を入力してください',
inputKeyName: 'キー名を入力してください',
createDownloadKey: 'キーを作成してダウンロード',
inputNodeNum: 'ノードインスタンス数を入力してください',
clusterFree: '余裕クラスター計算能力',
createKey: '新規キーペア作成',
chooseKey: '既存キーペア利用',
inputNewKeyName: '新しいキー名を入力してください',
noUseSpeed: '加速カード利用しない',
keyRepeat: 'キー名が重複しています。名前を変更してください',
autoCreateKey: 'キーファイルは自動的に作成し、ダウンロードされています。ご確認ください',
createSuc: 'コンテナ作成完了',
createFail: 'コンテナ作成は失敗しました。しばらくしてからもう一度お試しください',
updateSuc: 'コンテナ更新完了',
noDesc: '説明なし',
maxTwo: '2つのデータセットまで追加できます',
beyond: '申請された計算能力の合計量は現在クラスター空いた計算能力を超えています',
cpuRequire: 'CPU要件',
clusterLeisure: '空いたクラスター',
memoryRequire: 'メモリ要件',
iscontinue: '続けますか?',
continueSubmit: 'コミット',
startImmediate: '起動',
proxyPort: 'プロキシポート',
containerProxyPort: 'コンテナプロキシポート公開',
exposePort: 'ポート番号公開',
portPlaceholder: '公開用ポート番号を入力してください',
proxyPortError: '正しいポート番号を入力してください。ポート番号の範囲は1000〜50000です。',
proxyPortStep1: 'ローカルシェルで次のコマンドを実行します',
proxyPortStep2: 'ローカルブラウザが開きます',
dataTips: 'コンテナ再起動後にデータが失われるので、ソースコードやデータはHOMEディレクトリ(/home/kpl/)に配置してください。',
startTime: '起動時刻',
stopTime: '停止時間',
startUser: '起動者',
stopUser: '停止者',
stopMethod: '停止方法',
customStop: '手動停止',
errorStop: '異常停止',
usedGpu: '稼働済の計算能力',
errorMsg: '異常情報',
sshusername: '密钥所属',
batchCopyFail: '{total}つコンテナタスクをコピー作成します、{failed}つが失敗しました。<span style="color: #409EFF; cursor: pointer" onclick="lookList()">転送一覧</span>で実施状況を確認できます。',
batchCopySuc: '{total}つコンテナタスクをコピー作成します、<span style="color: #409EFF; cursor: pointer" onclick="lookList()">転送一覧</span>で実施状況を確認できます。',
copyContainer: 'コンテナのコピーを実施します、<span style="color: #409EFF; cursor: pointer" onclick="lookList()">転送一覧</span>で実施状況を確認できます。',
runningContainerNoCopy: '実行中のコンテナはコピー出来ません',
},
dataSet: {
dataSetName: 'データセット名',
dataSetSize: 'サイズ',
state: 'ステータス',
dataSetLabel: 'データセットラベル',
uploadDataSet: 'アップロード',
inputDataSetName: 'データセット名',
createMark: '新規タグ付け',
dataSetDesc: 'データセット説明',
isMarkDataSet: 'アノテーション',
importMethod: 'インポート方式',
localUpload: 'ファイル開く',
KS3: 'URL導入',
root: 'データセットのディレクトリ名は「半角英数字、"_"、"-"のみ」を対応します',
pleaseInput: '文字入力',
pleaseChoose: '未選択',
compression: 'ファイルは.zip、.tarと.tar.gz形式のみ対応します',
dataField: 'データフィールド',
metadata: 'メタデータ',
key: 'キー(Key))',
value: '値(Value)',
example: 'メタデータでは、プロセッサまたはアルゴリズムによって生成されます。アルゴリズムでキーによりメタデータに利用できます。例:データセットのラベルはメタデータに記録されています',
handleAddRecord: '手動でレコードを追加する',
exist: 'キーがすでに存在する場合、元の値が上書きされます',
allImage: 'すべて画像',
marked: '完了',
noMark: '未完了',
markType: 'タグ付け類型',
markMethod: 'タグ付け方式',
commitMark: 'タグ付け提出',
'continue': 'タグ付けが提出すると、SeeTaas専用データセットを作成しますが、よろしいですか。',
deleteMark: 'タグ削除',
editLabel: 'タグ編集',
editMarkLabel: '下記テキストボックスに、タグの内容を変更できます。',
enterConfirm: 'タグを入力したら、Enter / Spaceキーを押して確認します。タグは20文字以内で半角英数字、"_"、"-"のみ対応します。',
nameExit: 'データセット名が重複しています',
dataType: 'データ種類',
dataTypeNull: 'データタイプが必須項目です',
markNull: 'タグ付け類型が必須項目です',
markMethodNull: 'タグ付け方法が必須項目です',
url: 'リソースURL',
accessKey: 'Access Keyが持っている場合、入力してください',
secretKey: 'Secret Keyが持っている場合、入力してください',
pleaseUploadDataSet: 'データセットをアップロードしてください',
nameNull: 'データセット名が必須項目です',
urlNull: 'リソースURLが必須項目です',
formatError: '入力形式が不正です。もう一度入力してください',
all: 'すべて',
editDataSet: 'データセット編集',
inputDesc: '説明を入力してください',
pleaseInputDataSetName: 'データセット名を入力してください',
editSuc: 'データセットが更新しました',
ready: '準備完了',
marking: 'タグ付け中',
publishing: '公開中',
noSupportCopy: '準備中のデータセットはコピーできない。',
noUploadCopy: 'アップロードされたデータセットはコピーをサポートしていません!',
allDataSet: '全部データセット',
confirmDeleteParam: '該当項目を削除してよろしいですか?',
continueMark: 'タグを付け続ける',
uploadFor: 'アップロード',
createMarkDataSet: '新規タグ付けデータセット',
noImpact: 'タグ付け用データセットを作成します。元データセットは影響しません。',
lookProgress: '新しいタグ付きデータセットが作成されています。進捗状況は通知センターのメッセージを確認してください',
scalarValue: '1、 "1"、1.11などのスカラー値にすることができます\n複雑な構造はYAML形式で入力されます:\ncat:1 \ndog:2 \nperson:3',
downloadDesc: 'データはエクスポートされています。データ転送一覧でダウンロードしてください',
serializedDataset: 'シリアル化データセット',
originalDataset: '元のデータセット',
dataSetType: 'データ種類',
image: '画像',
text: 'テキスト',
audio: 'オーディオ',
video: 'ビデオ',
other: 'その他',
theDataSetType: 'データセット形式',
amountTo: '合計',
notAllowDownload: 'ワークスペースはデータのダウンロードをサポートしていません',
},
model: {
modelName: 'モデル名',
modelSize: 'モデルサイズ',
inputModelName: 'モデル名',
uploadModel: 'アップロード',
modelDesc: 'モデル説明',
localUpload: 'ファイルを開く',
root: '圧縮ファイルをアップロードする場合は、ディレクトリ名は「半角英数字、"_"、"-"のみ」を対応します。',
inputModelDesc: 'モデル説明',
compression: 'ファイルかディレクトリをアップロードします。圧縮ファイルは.zip、.tarと.tar.gz形式のみ対応します',
fileLook: 'ファイル表示',
file: 'ファイル',
size: 'サイズ',
updateTime: '更新時刻',
modelNameNull: 'モデル名が必須項目です',
modelNameError: 'モデル名入力エラー',
pleaseUploadModel: 'モデルをアップロードしてください',
chooseTarget: 'コピー先ワークスペースを選択してください',
},
algorithm: {
algorithmName: 'アルゴリズム名',
algorithmLabel: 'アルゴリズムラベル',
inputAlgorithmName: 'アルゴリズム名',
updateAlgorithm: 'アルゴリズム更新',
installAlgorithm: 'インストール',
algorithmDesc: '説明',
algorithmFramework: 'フレームワーク',
algorithmCodeBag: 'アルゴリズム',
uploadCode: 'ソースコードアップロード',
root: 'ディレクトリ名には「半角英数字、"_"、"-"のみ」対応します。',
compression: '.zip、.tarおよび.tar.gz形式のみをサポートしています、自動的に解凍します。',
updateNote: '更新備考',
basicInformation: '基本情報',
envParameter: '環境変数',
superParameter: 'ハイパーパラメータ',
framework: 'フレームワーク',
version: 'バージョン',
reupload: 'もう一度アップロード',
algoNameNull: 'アルゴリズム名を入力してください',
chooseUse: 'フレームワークを選択してください',
pleaseUploadCode: 'アルゴリズムソースコードをアップロードしてください',
inputUpdateNote: '更新備考を入力してください',
algoUpdateSuc: 'アルゴリズムソースコードは更新しました',
algoEditSuc: 'アルゴリズムを修正しました',
algoUploadSuc: 'アルゴリズムアップロード成功',
editAlgo: 'アルゴリズム編集',
pleaseInputAlgoName: 'アルゴリズム名を入力してください',
useSay: '使用説明',
algoInfo: 'アルゴリズム情報',
configInfo: '構成情報',
train: 'トレーニング',
test: 'テスト',
reason: 'バッチ処理',
deploy: 'API仕組み',
noFindFile: '解凍されたファイルが見つかりません',
successAnalysis: 'environment.ymlおよびparameter.ymlの構成情報が導入されました。パラメーターを設定して、アルゴリズムのインストールを進めてください。',
forceConfig: '計算能力設定',
superConfig: 'ハイパーパラメータ設定',
userControl: '操作出来るのハイパーパラメーターを設定',
pleaseUploadAlgoCode: 'アルゴリズムのリソースパッケージをアップロードしてください',
pleaseInputNote: '備考を入力してください',
anliaSuccess: 'environment.ymlおよびparameter.ymlの構成情報が導入されました。パラメーターを設定して、アルゴリズムのインストールを進めてください。',
noFindOwnFile: '解凍されたファイルが見つかりません',
compileSDK: 'SDKコンパイル',
setUpAlgoSuccess: 'アルゴリズムがインストールしました',
name: '名前',
type: '種類',
nickName: 'エイリアス',
pleaseInputParamName: 'パラメータ名を入力してください',
pleaseInputParamDesc: 'パラメータ説明を入力してください',
chooseParam: 'parameter.ymlからハイパーパラメータを選択します',
addParam: 'パラメータ追加',
paramInfor: 'パラメータ情報',
versionRecord: 'バージョン履歴',
updatePerson: '更新者',
yamlError: 'yaml解析異常',
dataError: 'データ異常',
completeConfig: '該当アルゴリズムのハイパーパラメーターは構成されていませんので、開発者に直接お問い合わせください',
saveSuc: '保存しました',
algoNameExist: 'アルゴリズム名はすでに存在します。もう一度入力してください',
fileNoFivety: '添付ファイル上限は50MBまで、もう一度アップロードしてください',
completeInfo: '足りない情報を入力してください',
pleaseUpRight: '正しいアルゴリズムパッケージをアップロードしてください',
allAlgo: '全てのアルゴリズム',
cmd: 'コマンド実行',
notPermissionCard: '【{msg}】加速カードは設定しないので、他の加速カードを選択してください',
},
processor: {
processorName: 'プロセッサー名',
processorVersion: 'プロセッサバージョン',
updateTime: '更新日時',
inputName: 'プロセッサ名を入力してください',
},
ApiDeployment: {
apiName: 'API名',
belong: '作成先ワークフロー',
state: 'ステータス',
stopDeployment: '公開停止',
instanceNumber: 'インスタンス数',
running: '実行中',
error: '異常',
serviceError: '異常停止',
basicSet: '基本設定',
serviceCreateFrom: 'サービス開始時刻',
correspondingTaskFlow: '関連ワークフロー',
correspondingTask: '関連タスク',
configInformation: '構成情報',
instanceConfig: 'リソース',
stopPattern: '停止モード',
callUrl: '呼出API',
permissionToken: '認証Token',
copyPermissionToken: '認証Tokenコピー',
testApi: 'APIテスト',
localUploadImage: '写真アップロード',
mobileTest: 'モバイルテスト',
imageFormat: '写真ファイルは「.jpg/.png」のみサポートします。サイズは5MB以内。',
backInformation: 'ファイルをアップロードしてから、画像認識情報を表示する',
scanCodeTest: 'QRコードを携帯またはパソコンで読み込みして、APIテストを実行できます。',
onlinePlayL: 'オンラインデモ',
callPython: 'Python呼出',
confirmStopDep: 'API公開を停止してよろしいですか?',
stopSuc: '停止しました',
stopFail: 'API停止は失敗しました。しばらくもう一度お試しください!',
copySuc: 'コピーしました',
allDep: '配置詳細',
copyFail: 'コピー失敗',
stoped: '停止された',
createApiDeploy: 'APIデプロイ作成',
inputApiDeployName: 'APIデプロイ名を入力してください',
editApiDeploy: 'APIデプロイ情報編集',
apiDeployName: 'APIデプロイ名',
supportCJEN: '入力制限:2~64桁、英数字、日本語、スペース、および.:-_()[]{}',
chooseAlgo: 'アルゴリズム選択',
chooseModel: 'モデル選択',
apiDeployNameNull: 'APIデプロイ名を入力してください',
apiDeployEditSuc: 'APIデプロイ情報を修正しました',
startApi: 'API起動',
deleteNotCover: '削除後は復元できません。',
stopRestart: 'API再開することできます。',
pleaseInputApiDeployName: 'APIデプロイ名を入力してください',
pleaseChooseModel: 'モデルを選択してください',
pleaseChooseAlgo: 'アルゴリズムを選択してください',
stopApiDeploy: 'APIの公開を停止します',
apiRunTime: '稼働時間',
algoForceResource: '計算能力',
usedAlgoForceCard: '稼働済計算能力',
runInfor: '実行情報',
nodeOutPut: 'ノード出力',
onlineApiPlay: 'オンラインAPIデモ',
editAppId: 'AppID修正',
careEdit: '警告:AppIDを変更すると、使用中のプログラムが呼び出すことができなくなります。ご注意してください。',
pleaseInputAppId: 'AppIDを入力してください',
AppIdNull: 'AppIDを入力してください',
supportfourT: '入力制限:4~36桁、半角英数字、"-"、"_"',
AppIdEditSuc: 'AppIDが修正しました',
confirmDeleteApi: '{msg}を削除してもよろしいですか?',
confirmStopApi: '{msg}を止めてもよろしいですか?',
deployFormatLength: '入力制限:2〜64文字',
deployFormatSymbol: '入力制限:英数字、日本語、スペース、及び:-()[] {}',
apiNameRepeat: 'APIデプロイ名が重複しています',
appIdRepeat: 'AppIDが重複しています。もう一度入力してください',
noDesc: 'コメントなし',
'function': '機能',
startFail: 'API起動失敗',
moreLookLog: '詳しく情報はログに確認してください',
noRun: '未実行',
noStart: '未起動',
},
edge: {
regEquipment: 'デバイス登録',
equipmentCode: 'デバイスID',
equipmentName: 'デバイス名',
platformInfor: 'プラットフォーム情報',
regPerson: '登録者',
state: 'ステータス',
regTime: '登録日時',
desc: '説明',
operation: '操作',
confirm: '確定',
regSomeDevice: '該当パッケージには認証情報を含まれていますので、大切に保管してください。 このパッケージは複数のデバイスを登録できますので、登録されたデバイスはこのページに表示されます。',
downAgent: '1.エージェントパッケージをダウンロードして、デバイスにコピーして解凍し、Shellコマンドで `agent`を実行して外部機器サービスを開始します。',
findInitDevice: '2.デバイス起動時に、デバイスID(device_uuid)を確認して、クラウド側に該当デバイス名と説明を編集できます。 再起動時に該当デバイスIDをもってもう一度初期化処理を行いません。',
SDKonly: 'SDKの一意の識別子は設定後に変更できません',
storageFile: 'ライブラリファイル',
uploadStorageFile: 'ライブラリアップロード',
modelFile: 'モデルファイル',
uploadModelFile: 'モデルアップロード',
lookEvent: 'イベント詳細',
setTime: 'インストール時間',
unloadSDK: 'SDKアンインストール',
inputEquitName: 'デバイス名を入力してください',
noSetName: '未設定',
leaveLine: 'オフライン',
onLine: 'オンライン',
openEdge: 'デバイス起動',
installSDK: 'SDKインストール',
confirmDeleteDevice: 'デバイス削除確認?',
editDevice: 'デバイス編集',
inputDeviceName: 'デバイス名を入力してください',
deviceDesc: 'デバイス説明',
inputDeviceDesc: 'デバイス説明を入力してください',
updateSDK: 'SDK更新',
onlyLabel: 'SDKの一意の識別子を設定してください',
oneSix: '入力制限:1〜64文字',
EnglishNum: '入力制限:英数字、"-"、"_"',
returnResult: 'コマンドが実行されています。お待ちください。 SDKイベントで結果を表示することもできます。取得中...',
prop: '属性名を入力してください',
inputDefault: 'デフォルト値を入力してください',
identity: 'identity重複',
listSDK: 'SDKインストールリスト',
uninstall: 'アンインストール',
installIng: 'インストール中',
installFail: 'インストール失敗',
installSuc: 'インストール成功',
uninstallFail: 'アンインストール失敗',
uninstallEd: 'アンインストール済',
noRoot: 'SDKのアンインストール権限がありません',
confirmUninstall: 'SDK{msg}をアンインストールしてもよろしいですか?',
eventStatus: 'イベントステータス',
},
clusterforce: {
service: 'ノードHost',
free: '未稼働計算能力',
total: '総計算能力(分配可能)',
},
calPQ: {
useLimit: '使用上限',
current: '稼働中',
currentUse: '利用可能計算能力(コア・時間)',
totalGet: '累積配置計算能力(コア・時間)',
totalCost: '累積稼働計算能力(コア・時間)',
speedCard: '加速カード',
useType: '利用可能なモデルタイプ',
coefficient: '計算能力係数',
cardHour: 'カード・時間',
GBHour: 'GB*時間',
centerHour: 'コア・時間',
memory: 'メモリ',
useForce: '利用可能計算能力',
getForce: '累積配置計算能力',
costForce: '累積稼働計算能力',
card: 'カード',
ct: 'コア',
},
hashrateQuota: {
totalCost: '稼働量明細',
totalGet: '配置量明細',
time: '時間',
use: '計算能力利用量',
note: '備考',
forceHour: '計算能力時間',
getMethod: '入手方法',
},
SSHKey: {
SSHName: 'キーペア名',
},
developer: {
tokenName: 'Token名',
authorSpace: '許可スペース',
newtoken: '新規Token',
},
'public': {
all: 'すべて',
today: '今日',
week: '直近1週間',
oneMonth: '直近1ヶ月',
threeMonth: '直近3ヶ月',
chooseDate: '日付選択',
founder: '作成者',
createTime: '作成時刻',
operation: '操作',
confirm: '確定',
cancel: 'キャンセル',
'delete': '削除',
desc: '説明',
more: 'その他',
editor: '編集',
launch: '起動',
stop: '停止',
download: 'ダウンロード',
finish: '完了',
copy: 'コピー',
noData: 'データが見つかりませんでした',
jump: 'ページ',
page: 'へ',
name: 'コンテナ名',
prompt: '確認',
member: 'ユーザー',
operationFail: '操作失敗',
fail: '失敗',
success: '成功',
inputNum: '1〜99の整数を入力してください',
allowScope: '入力範囲1〜99',
nameExit: '該当コンテナ名はすでに存在します。新しいコンテナ名を入力してください',
chooseMirror: 'イメージを選択してください',
reInput: '入力情報が正しくありません。もう一度入力してください',
userNameLength: 'ユーザー名の長さは2~64桁以内です',
passwordLength: 'パスワードの長さは8~64桁以内です',
include: '英大文字・英小文字・数字それぞれを1文字以上含む',
paramNull: '該当項目は必須項目です',
lengthNoTwo: '項目は2桁以上で入力してください',
lengthNoSixFour: '項目は64桁以内で入力してください',
emailFormat: 'メールアドレスの形式が正しくありません',
onlyInputNum: '数値を入力してください',
confirmName: '名前確認',
fileMoreThree: '最大300ファイルが表示されます',
noOpenFile: '該当ファイルを開けません',
overviewOf: '概要',
fileMoreFive: 'ファイルは5MBを超える',
rechooseImg: '他の画像をアップロードしてください',
formula: '稼働済計算能力 = 計算能力数量 * 計算能力係数 * 時間 ',
back: '返却',
recharge: 'チャージ',
bornToken: 'Token生成',
saveToken: 'Tokenファイルは再表示できないので、適切に保存してください',
close: '閉じる',
noFindToken: '使用可能なTokenは存在しない',
soonBornToken: '新しいTokenを生成します',
listNull: 'Tokenリストはデータ存在しない',
deleteTokenSuc: 'Tokenが削除しました',
copyBackOpen: '{type}はコピー中、転送一覧でコピー実施状況を確認できます。',
modelFile: 'モデルファイル',
editSuc: '編集成功',
editFail: '編集失敗',
deleteNoRecover: '削除後は回復不能',
'return': '戻る',
fontUserLogin: '作業者ロール登録',
inputNamePassword: 'ユーザー名とパスワードを入力してください',
no: '無',
systemProcessor: 'システムプロセッサ',
adminBack: 'プラットフォーム管理の背景',
supportPng: '.png形式のみサポート',
imgSay: '注:画像サイズは140px * 140px以内にしてください。ウォーターマーク効果を明確にするので、黒、暗い、または明るい色の画像をアップロードしてください。',
waterMarkPreview: 'ウォーターマークプレビュー',
imgWaterMark: 'ウォーターマーク',
uploadWI: 'ウォーターマークをアップロードしてください',
resetSuc: 'リセットしました',
createUser: 'ユーザー作成',
normal: '正常',
password: 'パスワード',
type: 'タイプ',
uploadFile: 'ファイルアップロード',
enable: '起動',
unenable: '停止',
white: 'ホワイトリスト',
create: '作成',
deleteSuc: '正常に削除されました',
editReupload: '変更して再アップロードする',
nuclear: 'コア',
resourceO: 'リソース',
shelve: '登録',
underShelve: '却下',
newAdd: '新規追加',
speedUserTake: '加速カードのユーザー専用',
freedom: '空いた',
monitorCenter: '監視センター',
firstLogin: '初めてログインの場合、パスワードを変更してください',
confirmEdit: '変更確認',
inputNewPassword: '新しいパスワードを入力してください',
mustInclude: '「英大文字・英小文字・数字それぞれを1文字以上含む。英語記号の文字列をサポートします',
againInputPassword: '新しいパスワードをもう一度入力してください',
passwordEditF: 'パスワード変更は失敗しました',
returnSpace: 'ワークスペース戻る',
confirmChange: '現在のワークスペースに切り替えるか?',
uploadTaskStop: 'アップロードしているタスクは終了させる',
confirmUnlog: 'ログアウトしますか?',
KS3import: 'KS3インポート',
localUploadDataSet: 'データセットアップロード',
localUploadModel: 'モデルアップロード',
uploadProcessor: 'プロセッサアップロード',
saveDateSet: 'データセット保存',
saveModel: 'モデル保存',
downloadDataSet: 'データセットダウンロード',
copyDataSet: 'データセットコピー',
copyModel: 'モデルコピー',
copyAlgo: 'アルゴリズムコピー',
createMarkDataSet: 'タグ付けデータセット作成',
finishMark: 'タグ付け完成',
downloadData: 'データダウンロード',
importing: 'エクスポート中、お待ちください...',
uploading: 'アップロード中、しばらくお待ちください...',
createing: '作成中...',
search: '検索...',
systemInit: 'システム初期化設定',
initAdmin: 'システム管理者初期化',
finishInit: '初期化完了',
confirmPassword: 'パスワード確認',
confirmLeavePage: 'このサイトから離れますか?',
buildSpacConnect: 'ワークスペースリンク作成',
welcome: 'ようこそ',
platform: 'プラットフォーム',
inputRunName: '実行名を入力してください',
runUser: '実行ユーザー',
startTime: '開始時間',
finishTime: '終了時間',
noFinish: '実行中',
unknown: '不明',
stopPipeline: '実行中のワークフローを停止すると、再開できません。停止を続けますか?',
secondStop: 'タスクは数秒後に停止します...',
imageTable: 'グラブ',
besideSave: 'データセット保存',
output: '出力',
dataSetA: 'データセット属性',
runTimeLong: '実行時間',
restTime: '残り時間',
caling: '計算中',
wait: '待って',
besideS: '保存',
dataDownload: 'データダウンロード',
downloadFileType: 'ダウンロードファイルタイプ',
param: '項目',
chooseDownload: 'ダウンロードする項目を選択してください',
requestSuc: 'リクエストは成功しました。通知メッセージを確認してください',
noMoreThanThree: '入出力ノード数量は3つを超えることはできません',
templateName: 'テンプレート名',
templateDesc: 'テンプレート説明',
templateSaveSuc: 'テンプレートを保存しました',
push: '紛失',
show: '展開',
highLevel: '高級',
noCompile: 'プロセッサの内部関数を解析できません',
resetInit: 'パラメータの設定値がリセットされます。続行しますか?',
dragChange: 'ここにドラッグして、該当コンポーネントを置き換える',
noNeedSpeed: '加速カード要らない',
reStart: 'コンテナ内容修正すると、再起動する必要があります',
update: '更新',
require: '要求',
newCreateMark: 'タグ付け新規作成',
getImgData: '画像データ取得中',
dataSetMark: 'データセットタグ付け',
commitChangeUse: 'タグ付け情報コミットすると、SeeTaaS専用なデータセットに変換されます。続行しますか?',
noImg: '非画像データ',
pleaseInputLabelName: 'タグ名を入力してください',
editSave: 'タグが重複しています。もう一度入力してください',
inputError: '入力形式が正しくありません。英数字、日本語、「_」、「-」のみがサポートされています',
noImgnoMark: '画像以外のデータ、タグ付けできません',
allImg: 'すべての写真',
markLable: 'タグ付け',
difficult: '異例ですか',
clickUpload: 'クリックまたはドラッグしてプロセッサフ​​ァイルをアップロードします',
processorFile: 'プロセッサフ​​ァイル',
handleStop: '手動停止',
memberUserName: 'メンバーのユーザー名',
pleaseInputSpaceDesc: 'ワークスペースの説明を入力してください',
noMoreThirty: '項目長さは30以内にしてください',
formatCJE: '入力制限:英数字、日本語、スペース、および.:-_()[]{}',
formatTwoSix: '入力制限:2~64桁、英数字、日本語、スペース、および.:-_()[]{}',
nameInputError: '名前入力エラー',
deleteError: '削除失敗',
node: 'ノード',
cjeNoMoreThrity: '入力制限:30桁以内、英数字、日本語、"-"、"_"',
distribute: '分散処理',
open: '起動',
clusterNodeNum: 'クラスターノード数量',
pleaseInputKey: 'キーを入力してください',
nameUsed: '入力した名前はすでに使用されています。もう一度入力してください',
inputRightNum: '正しい数量を入力してください',
checkCpuNum: 'CPUの個数を確認してください。範囲は0〜999です',
inputMemoryNum: 'メモリの個数を確認してください。範囲は0〜9999です',
loadSSH: 'キーファイルをダウンロードしてください',
chooseSSH: 'キーを選択してください',
inputDataName: 'データセット名前を入力してください',
noFindeResult: '結果が見つかりません',
noOption: '選択項目は存在しません',
noFindeData: '関連するデータが見つかりません',
loadingCenter: '読み込み中',
nofindUseData: '使用可能なデータが見つかりません',
groupNoOption: '該当グループには利用可能な項目は存在しません',
handleing: '処理中...',
onlyUpload: 'アップロードのみ',
formatFile: 'ファイルフォーマット',
iKnow: '確認しました',
highLevelSet: '上位設定',
twiceDev: '二次開発設定',
onlyIndexNode: '二次開発中にノードキーとして使用されます',
regular: '*適用正規表現:[A-Za_0-9-]+',
look: '詳細',
play: '再生',
markParam: 'タグ付け',
colour: '表示方式',
imgIn: '画像内部表示',
imgBeside: '画像外部表示',
fileListNull: 'ファイルは存在しません',
permitToken: 'ライセンスToken',
confirmDeleteToken: 'API接続用Tokenを削除してよろしいですか?',
hit: '隠し',
showDisplay: '表示',
waterMark: '透かし',
createNewRole: '新しいキャラクターを作り出す',
confirmDeleteSSH: 'このキーペアを削除してよろしいですか?',
upNoMoreEight: '大小文字、数字、中線、以下8桁',
supportCJE: '日中の英文、数字、中下線のみをサポートします',
checkFile: 'ファイルをチェックしていますので、後でメッセージウィンドウでアップロードの進捗をチェックしてください',
handleData: 'データ処理',
twoSixFour: '名前の長さは2〜64以内に入力してください',
num: '第',
gNode: 'のノード',
noKnowType: '未知タイプ',
onlySupportTwo: '入力制限:2~64桁、英数字、日本語、スペース、および.:-_()[]{}',
noFindDataAttr: 'データ属性の内容は見つからなかった',
waitRunDataAttr: 'データ属性の取得が行われる',
onlyInclude: '大小文字、数字、中下線しか含まない',
noFindePage: '該当ページを見つけることができません',
youCan: 'よろしゅうございます',
returnHome: 'ホームページに戻る',
addLabelMark: 'タグを付ける必要があります',
Esc: '取消(Escキー)',
dataAttr: 'データ属性',
one: '月',
two: '火',
three: '水',
four: '木',
five: '金',
six: '土',
seven: '日',
monthOne: '1月',
twoMonth: '2月',
monthThree: '3月',
fourMonth: '4月',
fiveMonth: '5月',
sixMonth: '6月',
sevenMonth: '7月',
eightMonth: '8月',
nineMonth: '9月',
tenMonth: '10月',
elevenMonth: '11月',
twelveMonth: '12月',
pleaseInputOperator: '操作者を入力してください',
refernceApi: 'API呼び出しの例を参照して、どのようにAppIDを使用するかを調べてください',
operationTime: '作業時間',
startCon: '容器を動かす',
stopCon: '停止容器',
delCon: '容器を削除する',
updateCon: '容器を更新する',
createTemplate: 'テンプレートを作成する',
allTemplate: 'テンプレートを作成すると、テンプレート全体を1つのノードとしてタスクフローに使用することができます',
opnNumNoT: '入出力名を記入することは当該ノードを有効化することであり、入出力ノードの有効化数は3つ以下である',
threeIONode: 'テンプレートは最大3つの入出力ノードを含む',
waitCen: '待機中',
noDescContent: '説明なし',
pleaseInputInName: '入力名を入力してください',
pleaseInputOutName: '出力名を入力してください',
uploadImage: '写真アップロード',
clickUploadImage: 'ここにクリックして、写真をアップロードする',
pngJpg: '写真ファイルは「.jpg/.png」のみサポートします',
MB5: 'サイズは5MB以内',
watchNode: 'ノード監視',
deleteDataset: 'データセット削除',
dataSetNoCover: 'データセットを削除すると、データを復元できません!',
inputDeleteDataset: 'データセット名を入力してください',
deleteModel: 'モデル削除',
modelNoCover: 'モデルを削除すると、データを復元できません!',
inputDeleteModel: 'モデル名を入力してください',
deleteAlgo: 'アルゴリズム削除',
algoNoCover: 'アルゴリズムを削除すると、データを復元できません!',
inputDeleteAlgo: 'アルゴリズム名を入力してください',
nodenum: 'ノード[{num}]',
deleteDatasetName: 'データセット名',
deleteModelName: 'モデル名',
deleteAlgoName: 'アルゴリズム名',
confirmDeleteD: 'を削除してよろしいですか?',
browserPrompt: 'Chromeブラウザの互換性が優れているため、Chromeをお勧めします。',
yamlFormatError: 'yamlフォーマットが正しくありません。修正してください。',
ApiExample: 'API呼出サンプル',
allContainer: '全てのコンテナ',
proportion: '比率値の範囲は{msg1}~{msg2}となります。',
fileNameTest: '文件名只能包含字母、数字、下划线、中划线和小数点',
notRemind: '我知道了不再提示',
shareMemoryUse: 'コンテナ利用可能な共有メモリ(Shared Memory) =申請したメモリ*共有メモリの割合。一般的にはこのデフォルト値の修正は推奨されない。',
notHaveData: '暂无数据',
year: '年',
month: '月',
day: '日',
hour: '時',
minute: '分',
second: '秒',
status: 'ステータス',
edit: '修正',
upload: 'アップロード',
otherAdminUpload: '其他管理员正在上传文档,请稍后重试。',
fileTypeError: 'ファイルのタイプが間違っています、もう一度アップロードしてください',
goDownload: 'ダウンロード',
saveSuccess: '保存しました',
},
copy: {
copyToSpace: 'コピー先',
fontAutoAdd: 'ワークスペース',
autoAddBack: 'へコピーします。名前が重複する場合、自動的にリネームします。',
},
transmission: {
missionName: 'タスク名',
missionType: '操作タイプ',
missionObj: '操作対象',
operatior: '操作者',
deleteTip: 'データを削除すると復元できません、続行しますか?',
},
//* ****************************************后台 */
spaceManage: {
createTime: '作成日時',
to: '~',
chooseDate: '日付選択',
onlyKey: 'スペースKey',
founder: '作成者',
spaceName: 'スペース名',
lookMember: 'ユーザー詳細',
userName: 'ユーザー名',
role: 'ロール',
timeInSpace: 'スペース参加日時',
member: 'ユーザー',
deleteTip1: '実行中のタスクがあるので、タスクを停止してから削除を実施してください。',
deleteTip2: 'スペースにはアップロード中のタスクがあります,削除できません',
},
taskFlowManage: {
space: 'スペース',
createTime: '作成日時',
taskFlowName: 'ワークフロー名',
spaceName: 'スペース名',
onlyKey: 'スペースKey',
},
runHistoryManage: {
space: 'スペース',
runHistoryName: '実行履歴名',
},
containerManage: {
lastRun: '最終実行日時',
containerName: 'コンテナ名',
},
algoManage: {
algoName: 'アルゴリズム名',
},
dataSetManage: {
dataSetName: 'データセット名',
dataSetSize: 'データセットサイズ',
},
modelManage: {
modelName: 'モデル名',
modelSize: 'モデルサイズ',
},
pretreatManage: {
pretreatName: 'プロセッサー名',
pretreatVersion: 'プロセッサバージョン',
updateTime: '更新日時',
},
userInterface: {
platformVersion: '現在のバージョン',
platformName: 'プラットフォーム名',
inputPlatformName: 'プラットフォーム名を入力してください',
confirm: '確定',
logo: 'プラットフォームLOGO',
recommendSize: '推奨サイズ:高さ48px *幅320px(サイズが合わない場合、Logoファイルの高さは最大48pxに設定し、幅は自動的に合わせて変更します)',
pageWaterMark: '画像ウォーターマーク',
inputWaterMark: 'ウォーターマーク文字を入力してください',
textWaterMark: '文字ウォーターマーク',
reset: 'リセット',
uploadImg: '写真をアップロードしてください',
setSuccess: '設定は完了しました',
setFail: '設定は失敗しました',
platformSuc: 'プラットフォーム名の設定は完了しました',
platformFail: 'プラットフォーム名の設定は失敗しました',
web: 'ウェブサイト',
add: '追加',
clickDragAdd: 'ここをクリックして、LOGOを変更します',
clickDragEdit: 'ここをクリック/ドラッグして、LOGOを変更します',
isDownloadDoc: '該当ファイルをダウンロードして、よろしいですか【{msg}】?',
uploadWarning: '圧縮形式「.zip、.tar、.tar.gz」のみがサポートされており、かつ解凍したファイルはdocとresourceフォルダを含める必要があります。',
manual: 'マニュアル',
menuSet: 'メニュー構成',
addMenu: 'メニュー新規',
editMenu: 'メニュー編集',
menuName: 'メニュー名',
menuAddress: 'URL',
menuJS: '处理方法',
namePlaceholder: 'メニュー名を入力してください',
addressPlaceholder: 'URLを入力してください',
deleteWarning: 'メニューを削除すると復元できません、続行しますか?',
revoke: '撤销',
compress: '解凍します...',
},
adminManage: {
regTime: '登録時間',
userName: 'ユーザー名',
spaceNum: '現在スペース数',
regOrgin: '登録サイト',
finalLog: '最終ログイン日時',
state: 'ステータス',
note: '備考',
operation: '操作',
set: 'ユーザー設定',
email: 'メール',
shareMemory: 'メモリ共有率',
configForce: '計算能力分配',
add: '追加',
'delete': '削除',
configForceType: '加速カードタイプ',
speedCard: '加速カード',
useLimit: '使用制限',
center: 'コア',
memory: 'メモリ',
cancel: 'キャンセル',
rechargeForceTime: '計算能力チャージ',
addForceTime: 'ユーザーの計算能力をチャージする',
cardTime: 'カード*時間',
centerTime: 'コア・時間',
GBTime: 'GB・時間',
lookForce: '計算能力概要表示',
forbidden: 'アクセス許可',
recover: 'アクセス拒否',
confirmRecover: '該当ユーザーからのアクセスを許可しますか?',
newPassword: '新パスワード',
resetPassword: 'パスワードリセット',
inputConfirm: 'パスワード(確認)を入力してください',
confirmNew: '新パスワード(確認)',
inputPassword: 'パスワードを入力してください',
confirmForbidden: '該当ユーザーからのアクセスを拒否しますか?',
operationSuc: '操作完了',
passwordNo: 'パスワードが一致しません',
card: 'カード',
deleteUser: '用户删除后不可恢复,是否继续?',
},
safe: {
userWhite: 'ユーザーホワイトリスト',
regOrigin: '登録サイト',
isWhite: 'ホワイトリストを有効しますか?',
yes: 'はい',
no: 'いいえ',
operation: '操作',
openWhite: 'ホワイトリスト有効',
confirmOpen: 'ホワイトリストを有効にしますか?',
importWhite: 'インポート',
lastFile: '前回ファイル',
oneUserName: 'ユーザー名は一行ずつを設定してください',
lookWhite: 'ホワイトリスト',
noData: 'データが見つかりませんでした',
closeWhite: 'ホワイトリスト無効',
confirmClose: 'ホワイトリストを無効にしますか?',
mirrorWhite: 'イメージホワイトリスト',
addWhite: 'ホワイトリスト追加',
createWhite: 'ホワイトリスト作成',
express: '正規表現',
type: '種類',
exactMatch: '完全一致',
wildCard: 'ワイルドカード',
soonOpen: 'すぐ起動',
state: 'ステータス',
edit: '修正',
'delete': '削除',
confirmDelete: '該当レコードを削除しますか?',
dataDic: 'データ辞書',
whiteSuc: 'ホワイトリストがインポートしました',
No2MB: '最大2MBまでのファイルをアップロードできます',
pleaseUploadFile: 'ファイルをアップロードしてください',
confirmDeleteMirror: 'コンテナイメージを削除してもよろしいですか?',
},
dict: {
algoLabel: 'アルゴリズムラベル',
addAlgoLabel: 'アルゴリズムラベル追加',
labelName: 'ラベル名',
dataSetLabel: 'データセットラベル',
addDataSetLabel: 'データセットラベル追加',
containerMirror: 'イメージリポジトリ',
addContainerMirror: 'イメージ追加',
mirrorAddress: 'イメージURL',
mirrorType: 'イメージ種類',
mlu: '寒武紀(MLU)',
mirrorDesc: 'イメージ説明',
systemSet: 'システム設定',
edit: '修正',
createAlgoLabel: 'アルゴリズムラベル新規作成',
editAlgoLabel: 'アルゴリズムラベル修正',
createDatasetLabel: 'データセットラベル新規作成',
editDatasetLabel: 'データセットラベル修正',
createContainerMirror: 'イメージリポジトリ新規作成',
editContainerMirror: 'イメージリポジトリ修正',
},
system: {
threeLogin: '3rdログイン',
addThreeLogin: '3rdユーザー登録',
threeLoginName: '3rdユーザー名',
httpName: 'プロトコル名',
threeLoginIcon: '3rdアイコン',
upload: 'アップロード',
format: 'jpg、png、icon型のファイルをサポート',
http: 'プロトコル',
state: 'ステータス',
operation: '操作',
},
cluster: {
nodeNum: 'ノード総数',
cpuNode: 'CPUノード',
gpuNode: 'GPUノード',
runNum: '実行中タスク数',
cpuTask: 'CPUタスク',
gpuTask: 'GPUタスク',
takeUp: '稼働中',
total: '合計',
resource: 'リソース',
memory: 'メモリ',
resourceTakeUp: '即時計算能力監視',
nodeMonitor: '監視ノード',
computingPower: 'ノード計算能力監視',
occupationProfile: 'ユーザー計算能力監視',
},
device: {
addDevice: '新規追加',
deviceName: 'タイプ名',
state: 'ステータス',
forceNum: '計算能力パラメータ',
key: 'K8SリソースKey',
forceType: '計算能力タイプ',
},
resource: {
service: 'ノードHost',
freeForce: '未稼働計算能力',
total: '総計算能力(利用可能)',
detail: '詳細',
status: 'ステータス',
operation: '操作',
warn: '警告',
normal: '正常',
disabled: '無効にしました',
ready: '準備',
error: '異常',
open: '起動',
disable: '禁止',
viewRunningTasks: '実行中のタスクを表示する',
idle: '空闲',
taskName: 'タスク名',
taskType: 'タスク類型',
user: 'ユーザー',
occupyGPU: '稼働加速カード',
createdAt: '開始時間',
runningTime: '実行時間',
},
monitor: {
autoShuffling: '自動切替',
refresh: '更新',
nodeNum: 'ノード数',
cpuTotal: 'CPU総数',
gpuTotal: 'GPU総数',
mluTotal: 'MLU総数',
storage: 'ストレージ(TB)',
utilization: 'クラスター使用率',
list: 'ランキング',
runTime: 'コンテナ実行時間',
containerName: 'コンテナ名',
fiveDay: '使用時間(過去5日)',
founder: '作成者',
forceUse: '計算能力使用',
speedCardTake: '加速カード使用数(現在)',
algoUse: 'アルゴリズム使用',
algoName: 'アルゴリズム名',
useNum: '使用回数(過去5日)',
dataSetUse: 'データセット使用',
dataSetName: 'データセット名',
dataSetTotal: 'データセット統計',
algoTotal: 'アルゴリズム統計',
modelTotal: 'モデル統計',
},
occupation: {
name: 'ユーザー名',
PPU: '現在稼働中加速カード',
CPU: '現在稼働中CPU',
memory: '現在メモリ使用量',
operation: '操作',
RunNoteBook: 'コンテナ',
RunWorkSpace: 'タスクフロー',
RunDeploy: 'APIデプロイ情報',
RunPreprocess: 'プロセッサ実行',
RunAlgorithm: 'アルゴリズム実行',
ConfirmEnableServer: 'このノードを有効にします、よろしいですか?',
ConfirmDisableServer: '該当ノードを無効にしてもよろしいですか?無効にすると、このノードはクラスターのスケジュールされなくなります。すでに実行されているタスクは影響しない。',
MemoryPressure: 'ノードメモリ容量が不足しています。ノードメモリ容量の使用量に注意してください',
DiskPressure: 'ディスク容量が不足しています。ディスク容量の使用量に注意してください',
PIDPressure: 'ノードの実行プロセス最大限に近づいていますので、ノードの実行プロセス数を確認してください',
NetworkUnavailable: 'ノードのネットワーク構成が間違っています、確認してください',
GPUDriverError: 'GPUドライバーに障害がある可能性があります。GPUドライバーが稼働いるかどうかを確認してください',
NetworkHighLaterncy: 'ノードとKubernetes Masterノード間のネットワーク通信遅延が発生しました。クラスターのネットワーク接続を確認してください。',
checkRunning: '実行中のタスクを表示する',
card: 'ード',
serviceHost: 'ノードHost',
acceleratorOccupation: 'アクセラレータカードの職業',
missionInfo: 'タスク情報',
hour: '時間',
day: '日',
minute: '分',
second: '秒',
noCard: '未稼働加速カード',
},
}
'use strict'
module.exports = {
login: {
title: '自主 · 可控 · 全栈',
desc: '人工智能开发平台',
logTitle: '账号登录',
threePartiesLogin: '三方登录',
loginButton: '登录',
adminPlease: '管理员请至',
backLogin: '系统后台登录',
pleaseInputUsername: '请输入用户名',
pleaseInputPassword: '请输入密码',
pleaseInputCode: '请输入验证码',
format: '长度在8-64位字符之间',
noAgree: '两次密码不一致',
},
status: {
starting: '启动中',
running: '运行中',
succeed: '成功',
stopping: '停止中',
stopped: '终止',
failed: '失败',
unknown: '未知',
creating: '创建中',
createFailed: '创建失败',
created: '创建成功',
waitUpload: '等待上传',
uploading: '上传中',
uploadFinished: '上传完成',
uploadFailed: '上传失败',
extracting: '解压中',
generating: '生成中',
copyFinished: '拷贝完成',
waitCreate: '等待创建',
},
validator: {
'int': '请输入整数值',
minVal: '该字段必须大于{val}',
minValInclude: '该字段必须大于等于{val}',
},
mission: {
termination: '终止',
fail: '失败',
success: '成功',
running: '运行中',
},
overview: {
title: '总览',
commonUsed: '常用',
component: '组件统计',
runningTask: '运行任务统计',
containerDesc: '即开即用的AI开发环境。弹性申请算力资源,在线编写调试AI算法,支持Notebook在线IDE和SSH远程连接',
taskFlow: '任务流',
missionDesc: '通过拖拉拽的方式对数据、模型、算法进行可视化建模,完成训练可视化、模型测试可视化。帮助您简单快速完成AI模型训练及应用',
apiDesc: '一键完成AI模型部署,提供云端API服务。支持在线测试、流量监控、弹性伸缩、 GPU 共享',
more: '了解更多',
running: '运行任务',
},
index: {
hello: '您好!',
quickNavigation: '快速导航',
taskRunNumber: '任务运行数量',
algorithmRunningTime: '算法运行时长',
algorithmRunningFrequency: '算法运行频次',
newDataSet: '新增数据集',
recently: '最近15天',
taskFlow: '任务流',
algorithm: '算法',
unit: '单位:个',
modelComponents: '建模组件',
unitTime: '单位:小时',
unitNum: '单位:次',
},
navigation: {
message: '消息',
changeAdmin: '切换为管理员',
buildTasks: '构建任务',
codeDevelop: '源代码开发',
graphicalOperation: '图形拖拉拽',
toolkit: '工具箱',
modelDeployment: '模型部署',
container: '容器',
dataSet: '数据集',
model: '模型',
algorithm: '算法',
processor: '处理器',
ApiDeployment: 'API部署',
edgeComputing: '边缘计算',
terminalEquipment: '终端设备',
personalCenter: '个人中心',
calculatePowerManagement: '算力管理',
clusterForce: '集群算力',
calculatePowerQuota: '算力配额',
calculatePowerDetail: '算力明细',
accessSecurity: '访问安全',
SSHKey: 'SSH密钥',
developerToken: '开发者Token',
contentManage: '内容管理',
spaceManage: '空间管理',
taskFlowManage: '任务流管理',
runHistoryManagement: '运行历史管理',
containerManagement: '容器管理',
algorithmMangement: '算法管理',
dataSetManagement: '数据集管理',
modelManagement: '模型管理',
processorManagement: '处理器管理',
systemManagement: '系统管理',
userInterface: '用户界面配置',
userManagement: '用户管理',
platformSave: '平台安全',
userWhite: '用户白名单',
mirror: '镜像白名单',
dataDic: '数据字典',
systemSet: '系统设置',
algoForceManage: '算力管理',
overviewCluster: '算力监控',
algoForceType: '算力型号',
clusterAlgoForce: '集群算力',
watchCenter: '监控中心',
logout: '退出登录',
changeFront: '切换前台用户',
userFront: '用户前台',
manageBack: '管理后台',
document: '使用文档',
transmission: '数据传输',
systemConfig: '系统配置',
basicConfig: '基本配置',
userInfo: '用户信息',
myImage: '我的镜像',
},
space: {
spaceSet: '空间设置',
spaceMember: '空间成员',
mySpace: '我的空间',
createSpace: '创建新空间',
spaceName: '空间名称',
spaceUserName: '用户名称',
tip: '通过创建空间,邀请伙伴一起协作开发算法等',
spaceManagement: '空间管理',
onlyKey: '空间唯一Key',
basicInformation: '基本信息',
spaceDescription: '空间描述',
memberManagement: '成员管理',
userName: '用户名',
memberRole: '成员角色',
edit: '修改',
removeMember: '移除成员',
permissionsManagement: '权限管理',
copy: '允许成员拷贝内容到其他Space',
download: '允许下载数据',
deleteSpace: '删除空间',
confirm: '确定',
cancel: '取消',
'delete': '删除',
operation: '操作',
addMember: '添加成员',
normalMem: '普通成员',
editMember: '修改成员',
adminMember: '管理员',
chooseRole: '请选择成员角色',
pleaseAddMember: '请添加成员',
noMoreEight: '字段长度不能超过8',
confirmDeleteMem: '确认移除该成员?',
lookUp: '查找中...',
inputLookUp: '输入以查找用户',
noFind: '未发现匹配用户',
addNewMember: '添加新成员',
confirmDeleteSpace: '确认删除空间?',
noRecover: '空间删除后数据不可恢复!',
searchPlaceholder: '请输入空间名称',
},
pipeline: {
createPipeline: '创建任务流',
pipelineName: '任务流名称',
runHistory: '运行历史',
searchKey: '搜索组件关键词',
workSpace: '工作区',
runPipeline: '运行任务流',
saveTemplate: '保存模板',
createProcessorTemplate: '创建处理器模板',
runName: '运行名称',
startRun: '开始运行',
removeComponent: '删除组件',
copyComponent: '复制组件',
pasteComponent: '粘贴组件',
tip: '填写输入/输出名称即代表启用该节点,输入/输出节点启用数量均不能多余3个',
inputPipelineName: '输入任务流名称',
confirmDelete: '确认删除?',
clear: '删除后,所有此任务流相关的运行数据都将清空',
pipelineDesc: '任务流描述',
confirmDeleteTask: '确认删除任务?',
confirmStopTask: '确认停止正在运行的任务?',
stopPipeline: '停止任务流',
copy: '复制',
que: '排队中',
ongo: '进行中',
opening: '启动中',
clearDataConfirmD: '删除任务流运行历史后,该任务流的节点数据将被清空,确认删除?',
copyPipeline: '复制任务流',
saveModel: '另存模型',
outputFile: '输出文件',
log: '日志',
dataHandle: '数据处理',
lookAllLog: '当前仅显示最新200行日志,若需查看全部日志,请点击',
downloadAllLog: '下载所有日志',
loading: '正在加载...',
noLog: '暂无日志',
noImgTableData: '没有相关图表数据',
save: '保存',
noInclude: '创建模版时,空间中不能包含其他模版',
template: '模板',
lookMore: '查看更多',
packup: '收起',
fromToSame: '节点的输出不能作为同节点的输入',
runOverview: '运行概述',
nodeName: '节点名称',
startTime: '启动时间',
basicInformation: '基本信息',
runTiming: '运行信息',
localUpload: '本地上传',
apiDemo: 'API部署',
apiDemoTip1: '如果您期望以高可用、多实例、弹性扩容的API部署落地生产应用,请使用',
apiDemoTip2: '对模型进行高可用部署',
apiDemoTip: '如果您期望以高可用、多实例、弹性扩容的API部署落地生产应用,请使用API部署对模型进行高可用部署',
remainTimeTip1: '您的API部署将在',
remainTimeTip2: '后自动停止',
savaData: '另存数据',
stopPipelineName: '确认停止任务流【{name}】吗',
},
container: {
name: '名称',
mirror: '镜像',
dataSet: '数据集',
model: '模型',
connectMethod: '连接方式',
connectNotebook: '连接Notebook',
sshLogin: 'SSH登录',
inputContainerName: '输入容器名称',
createContainer: '创建容器',
state: '状态',
unmountDataSet: '未挂载数据集',
unmountModel: '未挂载模型',
launchLog: '启动日志',
event: '事件',
nodeInformation: '节点信息',
launchHistory: '启动历史',
operatior: '操作人',
operatingContent: '操作内容',
result: '结果',
basicNode: '如为分布式多节点任务,以下展示的为连接“主”节点的状态',
lookMetric: '请将events文件写入/kpl/tensorboard目录后在此查看metric',
nodeInstanceNumber: '节点实例数量',
calculateForce: '算力',
assignPermissions: '分配sudo权限',
containerDesc: '容器描述',
noLonger: '如果通过sudo对系统目录进行了修改,容器重启后将无法持久化',
nodeDefined: '节点定义',
acceleratorCard: '加速卡',
memory: '内存',
addDataSet: '添加数据集',
addModel: '添加模型',
mountLocalDisk: '挂载本地磁盘',
mountPath: '挂载路径/kpl/cache',
notice: '在该路径下读取数据可以优化IO。注意:该目录下的数据在容器停止后不会持久化',
addNewNodeInstance: '增加一组新的节点实例',
lookFree: '查看集群空闲算力',
openPort: '开启5050端口',
watchPort: '端口开启后可从外网访问容器中监听5050端口的服务',
pleaseInput: '请输入',
pleaseChoose: '请选择',
compileMirror: '编译镜像',
schedulingMachine: '调度机器',
schedulingSuc: '调度成功',
containerInit: '容器初始化',
pullMirror: '节点拉取镜像',
nowRunning: '正在运行',
fail: '失败',
stoping: '停止中',
openContainer: '启动容器?',
confirmStopContainer: '确认停止容器',
confirmDeleteContainer: '确认删除容器',
noEvent: '暂无事件',
evetnGetting: '事件获取中...',
secKey: '密钥',
remoteAccess: '远程访问',
containerNoOpen: '容器未启动',
linux: 'Linux和Mac用户需先修改密钥文件权限',
remoteCopy: '远程拷贝',
perform: '执行',
data: '数据',
noKnowCard: '未知卡类型',
editContainer: '编辑容器',
pleaseInputContainerName: '请输入容器名称',
inputKeyName: '输入密钥名称',
createDownloadKey: '创建并下载密钥',
inputNodeNum: '请输入节点实例数量',
clusterFree: '集群空闲算力',
createKey: '创建新的密钥对',
chooseKey: '选择已有密钥对',
inputNewKeyName: '请输入新的密钥名称',
noUseSpeed: '不使用加速卡',
keyRepeat: '密钥名称重复,请修改名称',
autoCreateKey: '已为您自动创建并下载密钥,请查收',
createSuc: '容器创建成功',
createFail: '容器创建失败,请稍后重试',
updateSuc: '容器更新成功',
noDesc: '暂无描述',
maxTwo: '最多可添加2个数据集',
beyond: '您申请的算力总量可能超出了当前集群空闲算力数量',
cpuRequire: 'CPU需求',
clusterLeisure: '集群空闲',
memoryRequire: '内存需求',
iscontinue: '仍然继续?',
continueSubmit: '继续提交',
startImmediate: '立即启动',
proxyPort: '代理端口',
containerProxyPort: '暴露容器代理端口',
exposePort: '暴露端口号',
portPlaceholder: '请输入要暴露的端口号',
proxyPortError: '请输入正确的端口号,端口号范围1000-50000',
proxyPortStep1: '在本地Shell中执行以下命令',
proxyPortStep2: '本地浏览器打开',
dataTips: '代码和数据请放在HOME(/home/kpl/)目录下,否则容器重启后数据将会丢失!',
startTime: '启动时间',
stopTime: '停止时间',
startUser: '启动人',
stopUser: '停止人',
stopMethod: '停止方式',
customStop: '手动停止',
errorStop: '异常停止',
usedGpu: '消耗算力时',
errorMsg: '异常信息',
batchCopyFail: '创建拷贝容器任务{total}个,失败{failed}个,您可以到<span style="color: #409EFF; cursor: pointer" onclick="lookList()">传输列表</span>查看拷贝进度。',
batchCopySuc: '创建拷贝容器任务{total}个,您可以到<span style="color: #409EFF; cursor: pointer" onclick="lookList()">传输列表</span>查看拷贝进度。',
copyContainer: '容器拷贝中,您可以到<span style="color: #409EFF; cursor: pointer" onclick="lookList()">传输列表</span>查看拷贝进度。',
runningContainerNoCopy: '正在运行的容器不支持拷贝',
sshusername: '密钥所属',
chooseMirrorList: '选择镜像',
resetChoose: '重新选择',
custom: '自定义',
confirmRunContainer: '确认启动容器【{msg}】?',
chooseNode: '选择调度节点',
nodeHost: '节点host',
allocateNoEnough: '您申请的算力总量可能超出了选择节点空闲算力数量',
},
dataSet: {
dataSetName: '数据集名称',
dataSetSize: '大小',
state: '状态',
dataSetLabel: '标签',
uploadDataSet: '上传数据集',
inputDataSetName: '输入数据集名称',
createMark: '创建标注',
dataSetDesc: '数据集描述',
isMarkDataSet: '是否标注数据集',
importMethod: '导入方式',
localUpload: '本地上传',
KS3: '网络URL导入',
root: '请确保数据集压缩包的根目录仅包含大小写字母、数字、中下划线',
pleaseInput: '请输入',
pleaseChoose: '请选择',
compression: '只支持.zip、.tar 和 .tar.gz压缩格式,系统将自动解压',
dataField: '数据字段',
metadata: '元数据',
key: '键(key)',
value: '值(value)',
example: '元数据一般由处理器或算法生成。可供算法代码等根据键读取元数据的值。如:将数据集的标签类别名称记录在元数据中',
handleAddRecord: '手动添加记录',
exist: 'key如果已经存在,会覆盖原来的value',
allImage: '全部图片',
marked: '已标注',
marking: '标注中',
publishing: '发布中',
noMark: '未标注',
markType: '标注类型',
markMethod: '标注方式',
commitMark: '提交标注',
'continue': '标注提交后将转换为可用数据集,是否继续?',
deleteMark: '删除标注',
editLabel: '编辑标签',
editMarkLabel: '在下方输入框中修改标注标签',
enterConfirm: '每输入一个标签后按回车/空格键确认,标签在20个字符以内,只支持字母、数字、"_"和"-"',
nameExit: '数据集名称已重复',
dataType: '数据类型',
dataTypeNull: '数据类型不能为空',
markNull: '标注类型不能为空',
markMethodNull: '标注方式不能为空',
url: '资源URL',
accessKey: '如果有,请输入您的Access Key',
secretKey: '如果有,请输入您的Secret Key',
pleaseUploadDataSet: '请上传数据集',
nameNull: '数据集名称不能为空',
urlNull: '资源Url不能为空',
formatError: '您的格式不正确,请重新输入',
all: '全部',
editDataSet: '编辑数据集',
inputDesc: '请输入描述',
pleaseInputDataSetName: '请输入数据集名称',
editSuc: '数据集编辑成功',
ready: '就绪',
uploading: '上传中',
uploadFailed: '上传失败',
copyFailed: '拷贝失败',
noSupportCopy: '未就绪状态的数据集不支持拷贝!',
noUploadCopy: '正在上传中的数据集不支持拷贝!',
allDataSet: '所有数据集',
confirmDeleteParam: '确认删除该字段么?',
continueMark: '继续标注',
uploadFor: '上传于',
createMarkDataSet: '新建标注数据集',
noImpact: '会新建一个数据集用于标注,不影响原数据集内容',
lookProgress: '新的标注数据集在创建中,请在消息通知窗口中查看进度',
scalarValue: '可以为标量值,如:1,“1”,1.11\n复杂结构以YAML格式填写:如:\ncat: 1\ndog: 2\nperson: 3',
downloadDesc: '数据正在导出,请到数据传输列表下载数据',
serializedDataset: '序列化数据集',
originalDataset: '原始数据集',
dataSetType: '类型',
image: '图片',
text: '文本',
audio: '音频',
video: '视频',
other: '其他',
theDataSetType: '数据集格式',
amountTo: '共计',
notAllowDownload: '空间不支持下载数据',
},
model: {
modelName: '模型名称',
modelSize: '大小',
inputModelName: '输入模型名称',
uploadModel: '上传模型',
modelDesc: '模型描述',
localUpload: '本地上传',
root: '如上传压缩包,请确保压缩包的根目录只包含大小写字母,数字及中下划线',
inputModelDesc: '请输入模型描述',
compression: '上传单个文件或压缩包,压缩包格式支持.zip、.tar 和 .tar.gz,系统将自动解压',
fileLook: '文件浏览',
file: '文件',
size: '大小',
updateTime: '更新时间',
modelNameNull: '模型名称不能为空',
modelNameError: '模型名称输入错误',
pleaseUploadModel: '请上传模型',
chooseTarget: '请选择拷贝的目标空间',
},
algorithm: {
algorithmName: '算法名称',
algorithmLabel: '算法标签',
inputAlgorithmName: '输入算法名称',
updateAlgorithm: '更新算法',
installAlgorithm: '安装算法',
algorithmDesc: '算法描述',
algorithmFramework: '算法框架',
algorithmCodeBag: '算法代码包',
uploadCode: '上传代码',
root: '请确保算法代码包的根目录仅包含大小写字母、数字、中下划线',
compression: '只支持.zip、.tar和.tar.gz压缩格式,系统将自动解压',
updateNote: '更新备注',
basicInformation: '基本信息',
envParameter: '环境参数',
superParameter: '超参数',
framework: '框架',
version: '版本',
reupload: '重新上传',
algoNameNull: '算法名称不能为空',
chooseUse: '请选择使用的框架',
pleaseUploadCode: '请上传代码',
inputUpdateNote: '请输入更新备注',
algoUpdateSuc: '算法更新成功',
algoEditSuc: '算法编辑成功',
algoUploadSuc: '算法上传成功',
editAlgo: '编辑算法',
pleaseInputAlgoName: '请输入算法名称',
useSay: '使用说明',
algoInfo: '算法信息',
configInfo: '配置信息',
train: '训练',
test: '测试',
reason: '批量推理',
deploy: 'API部署',
noFindFile: '解压后未找到文件',
successAnalysis: '成功解析代码中的environment.yml和parameter.yml配置信息,请继续参数配置完成算法安装',
forceConfig: '算力配置',
superConfig: '超参数配置',
userControl: '配置用户可调的超参数',
pleaseUploadAlgoCode: '请上传算法代码包',
pleaseInputNote: '请输入备注',
anliaSuccess: '成功解析代码中的environment.yml和parameter.yml配置信息,请继续参数配置完成算法安装',
noFindOwnFile: '解压后未找到文件',
compileSDK: '编译SDK',
setUpAlgoSuccess: '安装算法成功',
name: '名称',
type: '类型',
nickName: '别名',
pleaseInputParamName: '请输入参数名称',
pleaseInputParamDesc: '请输入对参数的描述',
chooseParam: '从parameter.yml选择超参数字段',
addParam: '添加参数',
paramInfor: '参数信息',
versionRecord: '版本记录',
updatePerson: '更新人',
yamlError: 'yaml解析异常',
dataError: '数据异常',
completeConfig: '该算法未配置任何可调超参数,如有需要请联系算法作者进行配置',
saveSuc: '保存成功',
algoNameExist: '算法名称已存在,请重新输入',
fileNoFivety: '文件大小不能超过50MB,请重新上传',
completeInfo: '请完善信息',
pleaseUpRight: '请上传正确的算法代码包',
allAlgo: '所有算法',
cmd: '执行命令',
notPermissionCard: '您未配置【{msg}】型号的加速卡,请选择其他加速卡',
},
processor: {
processorName: '处理器名称',
processorVersion: '处理器版本',
updateTime: '更新时间',
inputName: '输入处理器名称',
},
ApiDeployment: {
apiName: 'API名称',
belong: '所属任务流',
state: '状态',
stopDeployment: '停止部署',
instanceNumber: '实例数量',
running: '运行中',
error: '异常',
serviceError: '服务异常',
basicSet: '基本设置',
serviceCreateFrom: '服务创建于',
correspondingTaskFlow: '对应任务流',
correspondingTask: '对应任务',
configInformation: '配置信息',
instanceConfig: '实例配置',
stopPattern: '停止模式',
callUrl: '调用URL',
permissionToken: '鉴权token',
copyPermissionToken: '复制鉴权token',
testApi: 'API测试',
localUploadImage: '本地上传图片',
mobileTest: '移动端测试',
imageFormat: '只能上传.jpg 和 .png格式的图片,文件大小不超过5MB。',
backInformation: '上传图片获取反馈信息',
scanCodeTest: '使用手机微信、浏览器等扫码后,可通过手机端进行API测试',
onlinePlayL: '在线演示',
callPython: 'Python调用',
confirmStopDep: '确认停止API部署?',
stopSuc: '停止成功',
stopFail: '停止部署失败,请稍后再试!',
copySuc: '复制成功',
allDep: '所有部署',
copyFail: '复制失败',
stoped: '已停止',
createApiDeploy: '创建API部署',
inputApiDeployName: '输入API部署名称',
editApiDeploy: '编辑API部署',
apiDeployName: 'API部署名称',
supportCJEN: '仅支持2-64个字符,允许中日英文数字空格.-: ()[]{}',
chooseAlgo: '选择算法',
chooseModel: '选择模型',
apiDeployNameNull: 'API部署名称不能为空',
apiDeployEditSuc: 'API部署编辑成功',
startApi: '启动API',
deleteNotCover: '删除后将不可恢复',
stopRestart: '停止后您还可以重启恢复该API部署',
pleaseInputApiDeployName: '请输入API部署名称',
pleaseChooseModel: '请选择模型',
pleaseChooseAlgo: '请选择算法',
stopApiDeploy: '停止API部署',
apiRunTime: '运行时间',
algoForceResource: '算力资源',
usedAlgoForceCard: '消耗算力时',
runInfor: '运行信息',
nodeOutPut: '节点输出',
onlineApiPlay: '在线API演示',
editAppId: '修改AppID',
careEdit: '警告:修改AppID会对正在使用该API的程序造成无法正常调用,请谨慎修改。',
pleaseInputAppId: '请输入AppID',
AppIdNull: 'AppID不能为空',
supportfourT: '仅支持4-36个字符,允许英文数字-_',
AppIdEditSuc: 'AppID修改成功',
confirmDeleteApi: '确认删除{msg}吗?',
confirmStopApi: '确认停止{msg}吗?',
deployFormatLength: '仅支持2-64个字符',
deployFormatSymbol: '只支持中日英文、数字、空格和.:-_()[]{}',
apiNameRepeat: 'API部署名称已重复',
appIdRepeat: 'AppID已重复,请重新输入',
noDesc: '无描述',
'function': '功能',
startFail: 'API启动失败',
moreLookLog: '更多信息请查看日志',
noRun: '未运行',
noStart: '未启动',
},
edge: {
regEquipment: '注册设备',
equipmentCode: '设备码',
equipmentName: '设备名称',
platformInfor: '平台信息',
regPerson: '注册人',
state: '状态',
regTime: '注册时间',
desc: '描述',
operation: '操作',
confirm: '确定',
regSomeDevice: '程序包中有您的授权信息,请不要拷贝给其他人。该程序包可复用于注册若干设备,注册的设备在当前空间的设备列表中可见。',
downAgent: '1. 下载agent程序包,拷贝到设备上解压后,在shell中执行`agent`启动边缘端服务。',
findInitDevice: '2. 在启动输出中找到初始化设备码(device_uuid),您可以据此设备码在云端找到对应设备,并维护该设备的名称和描述。再次启动时设备码不会重复初始化。',
SDKonly: 'SDK唯一标识设置后将不可更改',
storageFile: '库文件',
uploadStorageFile: '上传库文件',
modelFile: '模型文件',
uploadModelFile: '上传模型文件',
lookEvent: '查看事件',
setTime: '安装时间',
unloadSDK: '卸载SDK',
inputEquitName: '输入设备名称',
noSetName: '未设置名称',
leaveLine: '离线',
onLine: '在线',
openEdge: '打开终端',
installSDK: '安装SDK',
confirmDeleteDevice: '确认删除设备?',
editDevice: '编辑设备',
inputDeviceName: '请输入设备名称',
deviceDesc: '设备描述',
inputDeviceDesc: '请输入设备描述',
updateSDK: '更新SDK',
onlyLabel: '请设置SDK唯一标识',
oneSix: '仅支持1-64个字符',
EnglishNum: '允许英文数字中划线、下划线',
returnResult: '正在执行指令,请等待返回。您也可以在SDK事件中查看返回结果。',
prop: '请输入属性名',
inputDefault: '请输入默认值',
identity: 'identity重复',
listSDK: 'SDK安装列表',
uninstall: '卸载',
installIng: '安装中',
installFail: '安装失败',
installSuc: '安装成功',
uninstallFail: '卸载失败',
uninstallEd: '已卸载',
noRoot: '您没有SDK卸载权限',
confirmUninstall: '确认卸载SDK【{msg}】吗?',
eventStatus: '事件状态',
},
clusterforce: {
service: '节点Host',
free: '当前空闲算力',
total: '总算力(可被调度部分)',
},
calPQ: {
useLimit: '使用上限',
current: '当前占用',
currentUse: '当前可用算力时(核*时)',
totalGet: '累计获取算力时(核*时)',
totalCost: '累计消耗算力时(核*时)',
speedCard: '加速卡',
useType: '可用型号',
coefficient: '算力系数',
cardHour: '卡*时',
GBHour: 'GB*时',
centerHour: '核*时',
memory: '内存',
useForce: '当前可用算力时',
getForce: '累计获取算力时',
costForce: '累计消耗算力时',
card: '卡',
ct: '核',
},
hashrateQuota: {
totalCost: '总消耗明细',
totalGet: '总获取明细',
time: '时间',
use: '算力用量',
note: '备注',
forceHour: '算力时',
getMethod: '获取方式',
},
SSHKey: {
SSHName: '密钥对名称',
},
developer: {
tokenName: 'Token名称',
authorSpace: '授权空间',
newtoken: '生成新Token',
},
myImage: {
addMirror: '添加镜像',
errorAdress: '错误的镜像地址,不允许创建',
},
'public': {
all: '全部',
today: '今天',
week: '近1周',
oneMonth: '近1个月',
threeMonth: '近3个月',
chooseDate: '选择日期',
founder: '创建人',
createTime: '创建时间',
operation: '操作',
confirm: '确定',
cancel: '取消',
'delete': '删除',
desc: '描述',
more: '更多',
editor: '编辑',
launch: '启动',
stop: '停止',
download: '下载',
finish: '完成',
copy: '拷贝',
noData: '暂未搜索到相关数据',
jump: '前往',
page: '页',
name: '名称',
prompt: '提示',
member: '成员',
operationFail: '操作失败',
fail: '失败',
loadData: '下载数据',
success: '成功',
inputNum: '请输入1-99之间的整数',
allowScope: '允许数量范围1-99',
nameExit: '名称已存在,请输入新名称',
chooseMirror: '请选择镜像',
reInput: '您输入的信息有误,请重新输入',
userNameLength: '用户名长度在2-64位字符之间',
passwordLength: '密码长度在8-64位字符之间',
include: '必须包含大写字母,小写字母和数字',
paramNull: '该字段不能为空',
lengthNoTwo: '字段长度不能少于2位',
lengthNoSixFour: '字段长度不能超过64位',
emailFormat: '邮箱格式输入有误,请重新输入',
onlyInputNum: '只能输入数字类型的值,请重新输入',
confirmName: '确认名称',
fileMoreThree: '文件数量可能超出300个,最多显示300个文件',
noOpenFile: '无法打开此类型文件',
noOpenTerminal: '仅运行中的节点可打开终端',
overviewOf: '概览',
fileMoreFive: '文件大于5MB',
rechooseImg: '请重新选择图片上传',
formula: '消耗算力时 = 算力数量 * 算力系数 * 时间',
back: '退还',
recharge: '充值',
bornToken: '生成Token',
saveToken: '请妥善保存Token,关闭后将不再可见',
close: '关闭',
noFindToken: '未找到可用Token',
soonBornToken: '立即生成新Token',
listNull: 'token列表为空',
deleteTokenSuc: '删除token成功',
copyBackOpen: '{type}拷贝中,您可以到传输列表查看拷贝进度',
modelFile: '模型文件',
editSuc: '编辑成功',
editFail: '编辑失败',
deleteNoRecover: '删除后不可恢复',
'return': '返回',
fontUserLogin: '前台用户登录',
inputNamePassword: '请输入用户名和密码',
no: '无',
systemProcessor: '系统处理器',
adminBack: '平台管理后台',
supportPng: '支持.png格式',
imgSay: '说明:图片尺寸不超过140px*140px;为保证水印效果,请上传黑色、深色、或颜色鲜艳的图片',
waterMarkPreview: '水印预览',
imgWaterMark: '图片水印',
uploadWI: '请上传水印图片',
resetSuc: '重置成功',
createUser: '创建用户',
normal: '正常',
password: '密码',
type: '型号',
uploadFile: '上传文件',
enable: '启用',
unenable: '停用',
white: '白名单',
create: '创建',
deleteSuc: '删除成功',
editReupload: '修改并重新上传',
nuclear: '核',
resourceO: '资源',
shelve: '上架',
underShelve: '下架',
newAdd: '新增',
speedUserTake: '加速卡用户占用',
freedom: '空闲',
monitorCenter: '监控中心',
firstLogin: '这是您首次登录,请修改密码',
confirmEdit: '确认修改',
inputNewPassword: '请输入新密码',
mustInclude: '必须包含大写字母,小写字母和数字,只支持英文特殊符号及中划线下划线',
againInputPassword: '请再次输入新密码',
passwordEditF: '密码修改失败',
returnSpace: '返回空间',
confirmChange: '确认切换当前所在空间?',
uploadTaskStop: '您正在上传的任务将会被终止',
confirmUnlog: '确认退出登录么?',
KS3import: 'KS3导入数据集',
localUploadDataSet: '本地上传数据集',
localUploadModel: '本地上传模型',
uploadProcessor: '上传处理器',
saveDateSet: '保存数据集',
saveModel: '保存模型',
downloadDataSet: '下载数据集',
copyDataSet: '拷贝数据集',
copyModel: '拷贝模型',
copyAlgo: '拷贝算法',
createMarkDataSet: '创建标注数据集',
finishMark: '完成标注',
downloadData: '下载数据',
importing: '正在导出,请稍候...',
uploading: '正在上传,请耐心等候...',
createing: '创建中...',
search: '搜索...',
systemInit: '系统初始化设置',
initAdmin: '初始化超级管理员',
finishInit: '完成初始化',
confirmPassword: '确认密码',
confirmLeavePage: '确认离开当前页面么',
buildSpacConnect: '正在建立空间链接',
welcome: '欢迎回到',
platform: '平台',
inputRunName: '输入运行名称',
runUser: '运行用户',
startTime: '开始时间',
finishTime: '结束时间',
noFinish: '未结束',
unknown: '未知',
stopPipeline: '停止任务流后不可恢复运行,继续停止?',
secondStop: '任务会在几秒后停止...',
imageTable: '图表',
besideSave: '另存数据集',
output: '输出',
dataSetA: '数据集属性',
runTimeLong: '运行时长',
restTime: '剩余时长',
caling: '正在计算',
wait: '等待',
besideS: '另存',
dataDownload: '数据下载',
downloadFileType: '下载文件类型',
param: '字段',
chooseDownload: '请选择要下载的字段',
requestSuc: '请求成功,请在消息中查看下载',
noMoreThanThree: '输入/输出节点数量不能多于3个',
templateName: '模板名称',
templateDesc: '模板描述',
templateSaveSuc: '模板保存成功',
push: '丢失',
show: '展开',
highLevel: '高级',
noCompile: '处理器内部函数无法解析',
resetInit: '参数将全部重置为初始值,是否继续?',
dragChange: '拖至此处以替换此组件',
noNeedSpeed: '不需要加速卡',
reStart: '编辑后需要重启容器生效',
update: '更新',
require: '需求',
newCreateMark: '新建标注',
getImgData: '正在获取图像数据',
dataSetMark: '数据集标注',
commitChangeUse: '标注提交后将转换为可用数据集,是否继续?',
noImg: '非图片数据',
pleaseInputLabelName: '请输入标签名称',
editSave: '编辑的标签有重复,请先修改再保存',
inputError: '输入格式不正确,只支持字母、数字、日语、"_"和"-"',
noImgnoMark: '非图片数据,无法标注',
allImg: '全部图片',
markLable: '标注标签',
difficult: '是否为难例',
clickUpload: '点击或拖拽上传处理器文件',
processorFile: '处理器文件',
handleStop: '手动停止',
memberUserName: '成员用户名',
pleaseInputSpaceDesc: '请输入空间描述',
noMoreThirty: '字段长度不能超过30',
formatCJE: '只支持中日英文、数字、空格和.:-_()[]{}',
formatTwoSix: '仅支持2-64个字符,允许中日英文数字空格.-:()[]{}',
nameInputError: '名称输入错误',
deleteError: '删除失败',
node: '节点',
cjeNoMoreThrity: '中日英文、数字、中下划线,长度不超过30',
distribute: '分布式计算',
open: '开启',
clusterNodeNum: '集群节点数量',
pleaseInputKey: '请输入密钥',
nameUsed: '您输入的名称已被使用,请重新输入',
inputRightNum: '请输入正确的数量',
checkCpuNum: '请检查CPU数量,数量范围0-999',
inputMemoryNum: '请输入内存数量,数量范围0-9999',
loadSSH: '请先下载密钥',
chooseSSH: '请选择密钥',
inputDataName: '输入数据名称',
noFindeResult: '找不到任何结果',
noOption: '没有可选选项',
noFindeData: '没有找到相关数据',
loadingCenter: '加载中',
nofindUseData: '未发现可使用数据',
groupNoOption: '该组内没有任何可选项',
handleing: '处理中...',
onlyUpload: '只能上传',
formatFile: '格式文件',
iKnow: '我知道了',
highLevelSet: '高级设置',
twiceDev: '二次开发设置',
onlyIndexNode: '二次开发时用于唯一索引节点',
regular: '*满足正则[A-Za_0-9-]+',
look: '查看',
play: '播放',
markParam: '标注字段',
colour: '渲染形式',
imgIn: '图内注释',
imgBeside: '图外注释',
fileListNull: '该文件列表为空',
permitToken: '授权Token',
confirmDeleteToken: '确认删除API授权Token',
hit: '隐藏',
showDisplay: '显示',
waterMark: '水印',
createNewRole: '创建新角色',
confirmDeleteSSH: '确认删除该密钥吗',
upNoMoreEight: '大小写字母、数字、中划线,不超过8位',
supportCJE: '只支持中日英文、数字、中下划线',
checkFile: '正在校验文件,请稍后在消息窗口查看上传进度',
handleData: '处理数据',
twoSixFour: '名称长度需在2-64位之间',
num: '第',
gNode: '个节点',
noKnowType: '未知类型',
onlySupportTwo: '仅支持2-64个字符,允许中日英文数字空格.-: ()[]{}',
noFindDataAttr: '未发现相关数据属性内容',
waitRunDataAttr: '待运行获取数据属性',
onlyInclude: '只能包含大小写字母、数字、中下划线',
noFindePage: '无法找到该页面',
youCan: '您可以',
returnHome: '回到主页',
addLabelMark: '您需要添加标签后,才能进行标注',
Esc: '按 ESC 取消绘制',
dataAttr: '数据属性',
one: '一',
two: '二',
three: '三',
four: '四',
five: '五',
six: '六',
seven: '日',
monthOne: '一月',
twoMonth: '二月',
monthThree: '三月',
fourMonth: '四月',
fiveMonth: '五月',
sixMonth: '六月',
sevenMonth: '七月',
eightMonth: '八月',
nineMonth: '九月',
tenMonth: '十月',
elevenMonth: '十一月',
twelveMonth: '十二月',
pleaseInputOperator: '请输入操作人',
refernceApi: '请参考API调用示例查看如何使用AppID',
operationTime: '操作时间',
startCon: '启动容器',
stopCon: '停止容器',
delCon: '删除容器',
updateCon: '更新容器',
createTemplate: '创建模版',
allTemplate: '创建模板后,您可以将整个模板当做一个节点在任务流中使用',
opnNumNoT: '填写输入输出名称即代表启用该节点,输入/输出节点启用数量均不多于3个',
threeIONode: '模板最多包含三个输入输出节点',
waitCen: '等待中',
shareMemoryUse: '容器可用共享内存(Shared Memory)= 申请的内存 * 共享内存比例。一般情况下不推荐修改该默认值。',
noDescContent: '无描述内容',
pleaseInputInName: '请填写输入名称',
pleaseInputOutName: '请填写输出名称',
uploadImage: '上传图片',
clickUploadImage: '点击上传图片',
pngJpg: '只支持上传.jpg 和 .png格式的图片',
MB5: '文件大小不超过5MB',
watchNode: '监控节点',
deleteDataset: '删除数据集',
dataSetNoCover: '数据集删除后不可恢复!',
inputDeleteDataset: '请输入数据集名称',
deleteModel: '删除模型',
modelNoCover: '模型删除后不可恢复!',
inputDeleteModel: '请输入模型名称',
deleteAlgo: '删除算法',
algoNoCover: '算法删除后不可恢复',
inputDeleteAlgo: '请输入算法名称',
nodenum: '第[{num}]个节点',
deleteDatasetName: '请输入数据集名称:',
deleteModelName: '请输入模型名称:',
deleteAlgoName: '请输入算法名称:',
confirmDeleteD: '确认删除?',
browserPrompt: 'Chrome浏览器产品兼容性及浏览体验更好,推荐使用 Chrome 打开',
yamlFormatError: 'yaml格式错误,请正确填写',
ApiExample: 'API调用示例',
allContainer: '所有容器',
proportion: '比例值必须大于{msg1},小于{msg2}',
fileNameTest: '文件名只能包含字母、数字、下划线、中划线和小数点',
notRemind: '我知道了不再提示',
notHaveData: '暂无数据',
year: '年',
month: '月',
day: '天',
hour: '小时',
minute: '分钟',
second: '秒',
status: '状态',
edit: '修改',
fileTypeError: '文件类型错误,请重新上传',
goDownload: '去下载',
upload: '上传',
saveSuccess: '保存成功',
otherAdminUpload: '其他管理员正在上传文档,请等待。',
cmdToolTip1: '支持更多命令',
cmdToolTip2: 'block:阻塞式命令,调用后容器进入睡眠状态。',
cmdToolTip3: 'resume:与block搭配使用,调用后block提前结束。',
},
copy: {
copyToSpace: '拷贝到空间',
fontAutoAdd: '拷贝',
autoAddBack: '到空间,如名称已存在会自动添加后缀',
},
transmission: {
missionName: '任务名称',
missionType: '操作类型',
missionObj: '操作对象',
operatior: '操作人',
deleteTip: '数据删除后将不可恢复,是否继续?',
},
//* ****************************************后台 */
spaceManage: {
createTime: '创建时间',
to: '至',
chooseDate: '选择日期',
onlyKey: '空间唯一Key',
founder: '创建人',
spaceName: '空间名称',
lookMember: '查看成员',
userName: '用户名',
role: '角色',
timeInSpace: '加入空间时间',
member: '成员',
deleteTip1: '空间存在正在运行的任务,请先停止后再操作删除',
deleteTip2: '空间存在正在进行的上传任务,无法删除',
},
taskFlowManage: {
space: '空间',
createTime: '创建时间',
taskFlowName: '任务流名称',
spaceName: '空间名称',
onlyKey: '空间唯一Key',
},
runHistoryManage: {
space: '空间',
runHistoryName: '运行历史名称',
},
containerManage: {
lastRun: '上次运行时间',
containerName: '容器名称',
},
algoManage: {
algoName: '算法名称',
},
dataSetManage: {
dataSetName: '数据集名称',
dataSetSize: '数据集大小',
},
modelManage: {
modelName: '模型名称',
modelSize: '模型大小',
},
pretreatManage: {
pretreatName: '处理器名称',
pretreatVersion: '处理器版本',
updateTime: '更新时间',
},
userInterface: {
platformVersion: '当前版本',
platformName: '平台名称',
inputPlatformName: '请输入平台名称',
confirm: '确定',
logo: '平台LOGO',
recommendSize: '推荐尺寸:高48px*宽320px(如尺寸为非推荐尺寸会自适应显示,LOGO最高显示48px,宽度自适应)',
pageWaterMark: '页面水印',
inputWaterMark: '请输入水印文字',
textWaterMark: '文字水印',
reset: '重置',
uploadImg: '请先上传图片',
setSuccess: '设置成功',
setFail: '设置失败',
platformSuc: '平台名称设置成功',
platformFail: '平台名称设置失败',
web: '网站',
add: '添加',
clickDragAdd: '点击/拖拽至此添加水印LOGO',
clickDragEdit: '点击/拖拽至此修改网站LOGO',
manual: '使用手册',
menuSet: '菜单配置',
addMenu: '新增菜单',
editMenu: '编辑菜单',
menuName: '菜单名称',
menuAddress: '网页地址',
menuJS: '处理方法',
namePlaceholder: '请输入菜单名称',
addressPlaceholder: '请输入网页地址',
deleteWarning: '菜单删除后不可恢复,是否继续?',
revoke: '撤销',
isDownloadDoc: '确认下载使用文档【{msg}】?',
uploadWarning: '仅支持.zip、.tar和.tar.gz压缩格式,且解压后须包含doc和source文件夹。',
compress: '解压中...',
},
adminManage: {
regTime: '注册时间',
userName: '用户名',
spaceNum: '空间数量',
regOrgin: '注册来源',
finalLog: '最后登录时间',
state: '状态',
note: '备注',
operation: '操作',
set: '设置',
email: '邮箱',
shareMemory: '共享内存比例',
configForce: '配置算力',
add: '添加',
'delete': '删除',
configForceType: '配置算力型号',
speedCard: '加速卡',
useLimit: '使用上限',
center: '核',
memory: '内存',
cancel: '取消',
rechargeForceTime: '充值算力时',
addForceTime: '在用户现有算力时基础上增加新的算力时',
cardTime: '卡*时',
centerTime: '核*时',
GBTime: 'GB*时',
lookForce: '查看算力概要',
forbidden: '禁止访问',
recover: '恢复访问',
confirmRecover: '确认恢复访问么?',
newPassword: '新密码',
resetPassword: '重置密码',
inputConfirm: '请输入确认密码',
confirmNew: '确认新密码',
inputPassword: '请输入密码',
confirmForbidden: '确认禁止访问吗?',
operationSuc: '操作成功',
passwordNo: '两次密码不一致',
card: '卡',
deleteUser: '用户删除后不可恢复,是否继续?',
createUser: '创建用户',
createUserFrom: '从{from}创建用户',
batchCreateUser: '批量创建用户',
batchConfigForceType: '批量配置算力型号',
batchRechargeForceTime: '批量充值算力时',
userTemplate: '\u6279\u91CF\u521B\u5EFA\u683C\u5F0F\u8BF4\u660E\uFF1A\n 1\u3001\u7528\u6237\u540D\u548C\u5BC6\u7801\u4E3A\u5FC5\u586B\u4FE1\u606F\n 2\u3001\u7528\u6237\u540D\uFF1A\u652F\u6301\u4E2D\u82F1\u65E5\u6587\uFF0C\u6700\u957F\u4E0D\u8D85\u8FC732\u4E2A\u5B57\u7B26\n 3\u3001\u5BC6\u7801\uFF1A\u5FC5\u9700\u5305\u542B\u5927\u5C0F\u5199\u5B57\u6BCD\u548C\u6570\u5B57\uFF0C\u957F\u5EA6\u57288-64\u4F4D\u4E4B\u95F4\n\u6CE8\uFF1A\u8BF7\u52FF\u4FEE\u6539\u6A21\u677F\u5185\u5BB9\uFF0C\u5426\u5219\u4F1A\u5BFC\u81F4\u4FE1\u606F\u8BFB\u53D6\u9519\u8BEF\n \n*\u7528\u6237\u540D\u79F0, *\u5BC6\u7801, \u90AE\u7BB1, \u5907\u6CE8\n\u5B9E\u4F8B\uFF1A\u5F20\u4E09, \u5B9E\u4F8B\uFF1AZhangSan123, \u5B9E\u4F8B\uFF1A123456789@163.com, \u8FD9\u91CC\u586B\u5199\u7528\u6237\u5907\u6CE8\u4FE1\u606F',
uploadFile: '上传文件',
userNumber: '用户',
startCreate: '开始创建',
downloadTemplate: '下载模板',
uploadTemplate: '上传模板',
fileError: '请上传csv格式文件',
remainResource: '剩余算力时',
},
safe: {
userWhite: '用户白名单',
regOrigin: '注册来源',
isWhite: '是否开启白名单',
yes: '是',
no: '否',
operation: '操作',
openWhite: '开启白名单',
confirmOpen: '确认开启白名单?',
importWhite: '导入白名单',
lastFile: '上次文件',
oneUserName: '文件内容请以每行一个用户名存放',
lookWhite: '查看白名单',
noData: '没有找到亲要的数据哦',
closeWhite: '关闭白名单',
confirmClose: '确认关闭白名单?',
mirrorWhite: '镜像白名单',
addWhite: '添加白名单',
createWhite: '创建白名单',
express: '表达式',
type: '类型',
exactMatch: '精确匹配',
wildCard: '通配符表达式',
soonOpen: '立即启用',
state: '状态',
edit: '修改',
'delete': '删除',
confirmDelete: '确认删除吗?',
dataDic: '数据字典',
whiteSuc: '白名单导入成功',
No2MB: '文件大小不超过2MB',
pleaseUploadFile: '请上传文件',
confirmDeleteMirror: '确认删除该容器镜像么?',
},
dict: {
algoLabel: '算法标签',
addAlgoLabel: '添加算法标签',
labelName: '标签名称',
dataSetLabel: '数据集标签',
addDataSetLabel: '添加数据集标签',
containerMirror: '容器镜像',
addContainerMirror: '添加容器镜像',
mirrorAddress: '镜像地址',
mirrorType: '镜像类型',
mlu: '寒武纪',
mirrorDesc: '镜像描述',
systemSet: '系统设置',
edit: '修改',
createAlgoLabel: '创建算法标签',
editAlgoLabel: '编辑算法标签',
createDatasetLabel: '创建数据集标签',
editDatasetLabel: '编辑数据集标签',
createContainerMirror: '创建容器镜像',
editContainerMirror: '编辑容器镜像',
mirrorLabel: '镜像标签',
inputMirrotAdress: '请输入镜像地址',
descripMirror: '请简要描述镜像',
mirrorAdressNotNull: '镜像地址不能为空',
addImageLabel: '添加镜像标签',
editImageLabel: '编辑镜像标签',
labelNameNotNull: '标签名称不能为空',
labelNameNotTwenty: '标签名称在20个字符以内',
labelNameFormat: '只支持中、日、英文、数字、_和-',
confirmDeleteLabel: '确认删除该镜像标签吗',
labelFormat: '标签名称在20个字符以内,只支持中、日、英文、数字、"_"和"-"',
enterOrSpaceConfirm: '每输入一个标签后按回车/空格键确认',
},
system: {
threeLogin: '三方登录',
addThreeLogin: '添加三方登录',
threeLoginName: '第三方登录名称',
httpName: '协议名称',
threeLoginIcon: '第三方登录ICON',
upload: '上传',
format: '只支持jpg、png、icon格式文件',
http: '协议',
state: '状态',
operation: '操作',
},
cluster: {
nodeNum: '节点数量',
cpuNode: 'CPU节点',
gpuNode: 'GPU节点',
runNum: '运行数量',
cpuTask: 'CPU型任务',
gpuTask: 'GPU型任务',
takeUp: '占用',
total: '总共',
resource: '实时资源',
memory: '内存',
resourceTakeUp: '实时算力监控',
nodeMonitor: '监控节点',
computingPower: '节点算力监控',
occupationProfile: '用户算力监控',
},
device: {
addDevice: '新增型号',
deviceName: '型号名称',
state: '状态',
forceNum: '算力系数',
key: 'K8S资源key',
forceType: '算力类型',
},
resource: {
service: '节点Host',
freeForce: '当前空闲算力',
total: '总算力(可被调度部分)',
detail: '详情',
status: '状态',
operation: '操作',
warn: '预警',
normal: '正常',
disabled: '已禁用',
ready: '准备',
error: '异常',
open: '启用',
disable: '禁用',
viewRunningTasks: '查看运行任务',
idle: '空闲',
taskName: '任务名称',
taskType: '任务类型',
user: '用户',
occupyGPU: '占用加速卡',
createdAt: '开始时间',
runningTime: '运行时长',
},
occupation: {
name: '用户名',
PPU: '当前占用加速卡',
CPU: '当前占用CPU',
memory: '当前占用内存',
operation: '操作',
RunNoteBook: '容器',
RunWorkSpace: '任务流',
RunDeploy: 'API部署',
RunPreprocess: '运行预处理器',
RunAlgorithm: '运行算法',
ConfirmEnableServer: '确认启用该节点?',
ConfirmDisableServer: '确认禁用该节点?禁用后新任务将不再调度到该节点,已经运行的任务不受影响',
MemoryPressure: '节点内存存在压力,请注意内存使用',
DiskPressure: '磁盘空间存在压力请注意磁盘空间使用',
PIDPressure: '节点上的进程数量接近操作系统设置的进程数量限制,请检查节点上的进程数量',
NetworkUnavailable: '节点网络可能没有被正确配置,请检查网络配置',
GPUDriverError: '节点GPU驱动可能出现故障,请检查GPU驱动是否正常工作',
NetworkHighLaterncy: '节点与Kubernetes Master节点间网络通信延迟较高,请检查集群内部网络是否畅通',
checkRunning: '查看运行任务',
card: '卡',
serviceHost: '节点Host',
acceleratorOccupation: '加速卡占用',
missionInfo: '任务信息',
hour: '小时',
day: '天',
minute: '分',
second: '秒',
noCard: '未使用加速卡',
},
monitor: {
autoShuffling: '自动轮播',
refresh: '刷新',
nodeNum: '节点数量',
cpuTotal: 'CPU总数',
gpuTotal: 'GPU总数',
mluTotal: 'MLU总数',
storage: '存储(TB)',
utilization: '集群利用率',
list: '排行榜',
runTime: '容器运行时长',
containerName: '容器名称',
fiveDay: '使用时长/小时(最近5天累计)',
founder: '创建人',
forceUse: '算力使用',
speedCardTake: '加速卡占用量/卡(实时)',
algoUse: '算法使用',
algoName: '算法名称',
useNum: '使用次数(最近5天累计)',
dataSetUse: '数据集使用',
dataSetName: '数据集名称',
dataSetTotal: '数据集统计',
algoTotal: '算法统计',
modelTotal: '模型统计',
},
}
module.exports = {
overview: 'overview',
'你好': 'hello',
'关于': 'about',
'欢迎': 'welcome',
// login page i18n
'您好,欢迎回来!': 'Hello, Welcome back',
'请输入右侧信息进行登录': 'Please enter the right information to login',
'输入用户名,邮箱或手机号': 'enter user name, email or phone number',
'输入密码': 'enter password',
'忘记密码': 'forgetPassword',
'请输入密码': 'Please enter your password',
'登 录': 'Login',
'没有账号': 'no account',
'注册': 'register',
// register page i18n
'您好,欢迎来到SeeTaaS': 'Hello, welcome to interesting annotation',
'输入用户名': 'enter username',
'再次输入密码': 'enter password again',
'输入手机号': 'input mobile phone number',
'输入验证码': 'enter confirmation code',
'获取验证码': 'get verification code',
'阅读并同意': 'read and agree',
'SeeTaaS用户协议': 'SeeTaaS User Agreement',
'确认注册': 'read and agree',
'已有账号': '已有账号',
'登录': '登录',
'格式有误': 'incorrect format',
'两次密码不一致': 'two passwords are inconsistent',
'验证码有误': 'verification code error',
}
module.exports = {
login: {
title: '活用・信頼・フルスタック',
desc: '人工知能サービス構築プラットフォーム',
logTitle: 'アカウント登録',
threePartiesLogin: '外部アカウントログイン',
loginButton: 'ログイン',
adminPlease: '管理者はこちらへ',
backLogin: 'システム管理画面ログイン',
pleaseInputUsername: 'ユーザー名を入力してください',
pleaseInputPassword: 'パスワードを入力してください',
pleaseInputCode: '認証コード',
format: 'パスワードの長さは8~64桁以内です',
noAgree: 'パスワードが一致しません',
usernameOrPwd: '用户名或密码不正确',
parameterError: 'parameter error',
},
status: {
starting: '起動中',
running: '実行中',
succeed: '成功',
stopping: '停止中',
stopped: '終了',
failed: '失敗',
unknown: '不明',
creating: '作成中',
createFailed: '作成失敗',
created: '作成完了',
waitUpload: 'アップロード待ち',
uploading: 'アップロード中',
uploadFinished: 'アップロード完了',
uploadFailed: 'アップロード失敗',
extracting: '解凍中',
generating: '生成中',
copyFinished: 'コピー完了',
waitCreate: '作成待ち',
unknownError: '不明なエラー',
ready: '準備完了',
converting: '转换中',
active: '在线',
lixian: '离线',
weijihuo: '未激活',
},
validator: {
int: '请输入整数值',
minVal: '该字段必须大于{val}',
minValInclude: '该字段必须大于等于{val}',
},
mission: {
termination: '終了',
fail: '失敗',
success: '成功',
running: '実行中',
},
overview: {
title: 'ホーム',
commonUsed: '常用',
component: '组件统计',
runningTask: '运行任务统计',
containerDesc: '即开即用的AI开发环境。弹性申请算力资源,在线编写调试AI算法,支持Notebook在线IDE和SSH远程连接',
taskFlow: 'ワークフロー',
missionDesc: '通过拖拉拽的方式对数据、模型、算法进行可视化建模,完成训练可视化、模型测试可视化。帮助您简单快速完成AI模型训练及应用',
apiDesc: '一键完成AI模型部署,提供云端API服务。支持在线测试、流量监控、弹性伸缩、 GPU 共享',
more: '了解更多',
running: '运行任务',
},
index: {
hello: 'こんにちは!',
quickNavigation: 'ナビゲーション',
taskRunNumber: 'タスク実行数量',
algorithmRunningTime: 'アルゴリズムの実行時間',
algorithmRunningFrequency: 'アルゴリズムの実行頻度',
newDataSet: '新規データセット',
recently: '近直15日',
taskFlow: 'ワークフロー',
algorithm: 'アルゴリズム',
unit: '単位:件',
modelComponents: 'モジュール',
unitTime: '単位:時',
unitNum: '単位:回',
},
navigation: {
message: 'メッセージ',
changeAdmin: '管理者切替',
buildTasks: 'タスク',
codeDevelop: 'プログラミング',
graphicalOperation: 'GUI',
toolkit: 'ツール',
modelDeployment: 'サービス',
container: 'コンテナ',
dataSet: 'データセット',
model: 'モデル',
algorithm: 'アルゴリズム',
processor: 'プロセッサ',
ApiDeployment: 'API公開',
edgeComputing: 'エッジ',
terminalEquipment: 'デバイス',
personalCenter: 'マイページ',
calculatePowerManagement: '計算能力管理',
clusterForce: 'クラスター一覧',
calculatePowerQuota: '計算能力割合',
calculatePowerDetail: '計算能力明細',
accessSecurity: '鍵認証',
SSHKey: 'SSH鍵',
developerToken: '開発者Token',
contentManage: 'コンテンツ',
spaceManage: 'ワークスペース',
taskFlowManage: 'ワークフロー',
runHistoryManagement: '実行履歴',
containerManagement: 'コンテナ',
algorithmMangement: 'アルゴリズム',
dataSetManagement: 'データセット',
modelManagement: 'モデル',
processorManagement: 'プロセッサ',
systemManagement: 'システム',
userInterface: 'ユーザー画面構成',
userManagement: 'ユーザー',
platformSave: 'セキュリティ',
userWhite: 'ユーザーホワイトリスト',
mirror: 'イメージホワイトリスト',
dataDic: 'データ辞書',
systemSet: 'システム設定',
algoForceManage: '計算能力',
overviewCluster: '計算能力監視',
algoForceType: 'チップセット',
clusterAlgoForce: 'クラスター一覧',
watchCenter: 'ダッシュボード',
logout: 'ログアウト',
changeFront: 'ロール切替',
userFront: 'フロントエンド',
manageBack: 'バックエンド',
document: 'バックアップ',
transmission: 'データ送信',
systemConfig: 'システム構成',
basicConfig: '基本構成',
userInfo: 'ユーザー情報',
myImage: 'イメージ',
deployManage: 'APIデプロイ管理',
clusterMonitor: '集群算力监控',
},
space: {
spaceSet: 'スペース設定',
spaceMember: 'スペースメンバー',
mySpace: '自分のスペース',
createSpace: '新規作成スペース',
spaceName: 'スペース名',
spaceUserName: '用户名称',
tip: 'スペースを作成するにあたって、他のメンバーを招待して、アルゴリズム開発はチームワークしましょう',
spaceManagement: 'スペース管理',
onlyKey: 'スペースキー',
basicInformation: '基本情報',
spaceDescription: 'スペース説明',
memberManagement: 'メンバー管理',
userName: 'ユーザー名',
memberRole: 'メンバー役割',
edit: '修正',
removeMember: 'メンバー削除',
permissionsManagement: '権限管理',
copy: '他のスペースにコピーすることを許可する',
download: 'データダウンロードを許可する',
deleteSpace: 'スペース削除',
confirm: '確定',
cancel: 'キャンセル',
delete: '削除',
operation: '操作',
addMember: 'メンバー追加',
normalMem: '一般メンバー',
editMember: 'メンバー修正',
adminMember: '管理者メンバー',
chooseRole: 'ユーザーロールを選択してください',
pleaseAddMember: 'ユーザーを追加してください',
noMoreEight: '項目は8桁以内で入力してください',
confirmDeleteMem: 'ユーザーを削除してよろしいですか?',
lookUp: '検索中...',
inputLookUp: 'ユーザー名を入力し、検索してください',
noFind: '一致するユーザーが見つかりません',
addNewMember: '新規メンバー追加',
confirmDeleteSpace: 'ワークスペースを削除してよろしいですか?',
noRecover: 'ワークスペースを削除すると、データを復元できません!',
searchPlaceholder: '请输入空间名称',
},
pipeline: {
createPipeline: '新規ワークフロー',
pipelineName: 'ワークフロー名',
runHistory: '実行履歴',
searchKey: 'キーワード検索',
workSpace: '作業エリア',
runPipeline: 'ワークフロー実行',
saveTemplate: 'テンプレート保存',
createProcessorTemplate: 'プロセッサテンプレート新規作成',
runName: 'ワークフロー実行名',
startRun: '実行開始',
removeComponent: 'コンポーネント削除',
copyComponent: 'コンポーネントコピー',
pasteComponent: 'コンポーネント貼付',
tip: '入力名/出力名を決めたら、該当ノードを有効にします。入力、出力とワークフローは3つインスタンス以内となります。',
inputPipelineName: 'ワークフロー名入力',
confirmDelete: '削除してよろしいですか?',
clear: '該当ワークフロー削除すると、関連するデータセットは全部削除します',
pipelineDesc: 'ワークフロー説明',
confirmDeleteTask: '該当ワークフローを削除してよろしいですか?',
confirmStopTask: '実行中のタスクを停止してもよろしいですか?',
stopPipeline: 'ワークフロー停止',
copy: 'コピー',
que: '待ち',
ongo: '処理中',
opening: '起動中',
clearDataConfirmD: 'ワークフローの実行履歴を削除すると、関連したデータセットが削除します。削除してもよろしいですか?',
copyPipeline: 'ワークフローコピー',
saveModel: 'モデルを名前付けて保存',
outputFile: '出力ファイル',
log: 'ログ',
dataHandle: 'データ処理',
lookAllLog: 'ログは最大200行まで表示されています。すべてのログ情報は右側リンクをクリックしてください',
downloadAllLog: '全てのログダウンロード',
loading: '読み込み中...',
noLog: 'ログなし',
noImgTableData: 'グラフデータはありません',
save: '保存',
noInclude: 'テンプレートを作成する場合、ワークスペースに他のテンプレートを含めることはできません',
template: 'テンプレート',
lookMore: 'もっと見る',
packup: '畳む',
runOverview: '実行概要',
nodeName: 'ノード名',
startTime: '起動時刻',
basicInformation: '基本情報',
runTiming: '実行情報',
localUpload: 'ファイル開く',
apiDemo: 'APIデプロイ',
apiDemoTip1: '多様なインスタンス、可用性、拡張APIなどをデプロイする場合は、',
apiDemoTip2: 'を使用してください',
remainTimeTip1: 'APIのデプロイは',
remainTimeTip2: '後に自動的に停止します',
savaData: '名前を付けてデータを保存',
fromToSame: '节点的输出不能作为同节点的输入',
stopPipelineName: '确认停止任务流【{name}】吗',
},
container: {
name: 'コンテナ名',
mirror: 'イメージ',
dataSet: 'データセット',
model: 'モデル',
connectMethod: '接続方法',
connectNotebook: 'Notebook接続',
sshLogin: 'SSH登录',
inputContainerName: 'コンテナ名',
createContainer: 'コンテナ作成',
state: 'ステータス',
unmountDataSet: 'データセット稼働しない',
unmountModel: 'モデル稼働しない',
launchLog: '起動ログ',
event: 'イベント',
nodeInformation: 'ノード情報',
launchHistory: '起動履歴',
operatior: '操作者',
operatingContent: '操作内容',
result: '結果',
basicNode: 'マルチノードの場合は下記は「マスター」ノード状況を示します。',
lookMetric: '[/kpl/tensorboard]にEventファイルを書込みした後で、ここでMetric情報を確認します。',
nodeInstanceNumber: 'ノードインスタンス数',
calculateForce: '計算能力',
assignPermissions: 'sudo権限割当',
containerDesc: 'コンテナ説明',
noLonger: 'sudoでディレクトリがを変更した場合、再起動後にコンテナは永続化できなくなります。',
nodeDefined: 'ノード定義',
acceleratorCard: 'GPUカード',
memory: 'メモリ',
addDataSet: 'データセット追加',
addModel: 'モデル追加',
mountLocalDisk: 'マウント',
mountPath: 'マウントパス/ kpl / cache',
notice: '上記パスフォルダ直下にデータのIO読込処理は最適化できます。注:コンテナ再起動後にデータ永続化できない。',
addNewNodeInstance: 'ノード追加',
lookFree: '余裕クラスター表示',
openPort: 'ポート5050公開',
watchPort: 'ポート5050を公開できたら、外部からコンテナ内のサービスをアクセスできます',
pleaseInput: '文字入力',
pleaseChoose: '未選択',
compileMirror: 'イメージビルド',
schedulingMachine: '配置PC',
schedulingSuc: '配置成功',
containerInit: 'コンテナ初期化',
pullMirror: 'ノードのイメージをプル',
nowRunning: '実行中',
fail: '失敗',
stoping: '停止中',
openContainer: 'コンテナを起動しますか?',
confirmStopContainer: 'コンテナを停止してよろしいですか',
confirmDeleteContainer: 'コンテナを削除してよろしいですか',
noEvent: 'イベントなし',
evetnGetting: 'イベント取得中...',
secKey: 'キー',
remoteAccess: 'リモートアクセス',
containerNoOpen: 'コンテナ起動しない',
linux: 'LinuxおよびMacユーザーは、キーファイルのパーミッションを変更が必要です',
remoteCopy: 'リモートコピー',
perform: '実行',
data: 'データ',
noKnowCard: '不明なカードタイプ',
editContainer: 'コンテナ編集',
pleaseInputContainerName: 'コンテナ名を入力してください',
inputKeyName: 'キー名を入力してください',
createDownloadKey: 'キーを作成してダウンロード',
inputNodeNum: 'ノードインスタンス数を入力してください',
clusterFree: '余裕クラスター計算能力',
createKey: '新規キーペア作成',
chooseKey: '既存キーペア利用',
inputNewKeyName: '新しいキー名を入力してください',
noUseSpeed: '加速カード利用しない',
keyRepeat: 'キー名が重複しています。名前を変更してください',
autoCreateKey: 'キーファイルは自動的に作成し、ダウンロードされています。ご確認ください',
createSuc: 'コンテナ作成完了',
createFail: 'コンテナ作成は失敗しました。しばらくしてからもう一度お試しください',
updateSuc: 'コンテナ更新完了',
noDesc: '説明なし',
maxTwo: '2つのデータセットまで追加できます',
beyond: '申請された計算能力の合計量は現在クラスター空いた計算能力を超えています',
cpuRequire: 'CPU要件',
clusterLeisure: '空いたクラスター',
memoryRequire: 'メモリ要件',
iscontinue: '続けますか?',
continueSubmit: 'コミット',
startImmediate: '起動',
proxyPort: 'プロキシポート',
containerProxyPort: 'コンテナプロキシポート公開',
exposePort: 'ポート番号公開',
portPlaceholder: '公開用ポート番号を入力してください',
proxyPortError: '正しいポート番号を入力してください。ポート番号の範囲は1000〜50000です。',
proxyPortStep1: 'ローカルシェルで次のコマンドを実行します',
proxyPortStep2: 'ローカルブラウザが開きます',
dataTips: 'コンテナ再起動後にデータが失われるので、ソースコードやデータはHOMEディレクトリ(/home/kpl/)に配置してください。',
startTime: '起動時刻',
stopTime: '停止時間',
startUser: '起動者',
stopUser: '停止者',
stopMethod: '停止方法',
customStop: '手動停止',
errorStop: '異常停止',
usedGpu: '稼働済の計算能力',
errorMsg: '異常情報',
sshusername: '密钥所属',
batchCopyFail: '{total}つコンテナタスクをコピー作成します、{failed}つが失敗しました。<span style="color: #409EFF; cursor: pointer" onclick="lookList()">転送一覧</span>で実施状況を確認できます。',
batchCopySuc: '{total}つコンテナタスクをコピー作成します、<span style="color: #409EFF; cursor: pointer" onclick="lookList()">転送一覧</span>で実施状況を確認できます。',
copyContainer: 'コンテナのコピーを実施します、<span style="color: #409EFF; cursor: pointer" onclick="lookList()">転送一覧</span>で実施状況を確認できます。',
runningContainerNoCopy: '実行中のコンテナはコピー出来ません',
chooseMirrorList: 'ミラーリングを選ぶ',
resetChoose: '選び直す',
custom: 'カスタマイズ',
confirmRunContainer: 'コンテナ【{msg}】を起動して、よろしいでしょうか?',
chooseNode: 'スケジューリングノードの選択',
nodeHost: 'ノードhost',
allocateNoEnough: '申請された計算能力がノードの稼働可能な計算能力を超えている',
keepDefault: '如无特殊需要,保持默认即可。',
dataDelete: '数据已被删除',
distributeContainer: '分布式容器暂不支持按显存调度,请重新配置第{msg}个节点',
},
dataSet: {
dataSetName: 'データセット名',
dataSetSize: 'サイズ',
state: 'ステータス',
dataSetLabel: 'データセットラベル',
uploadDataSet: 'アップロード',
inputDataSetName: 'データセット名',
createMark: '新規タグ付け',
dataSetDesc: 'データセット説明',
isMarkDataSet: 'アノテーション',
importMethod: 'インポート方式',
localUpload: 'ファイル開く',
KS3: 'URL導入',
root: 'データセットのディレクトリ名は「半角英数字、"_"、"-"のみ」を対応します',
pleaseInput: '文字入力',
pleaseChoose: '未選択',
compression: 'ファイルは.zip、.tarと.tar.gz形式のみ対応します',
dataField: 'データフィールド',
metadata: 'メタデータ',
key: 'キー(Key))',
value: '値(Value)',
example: 'メタデータでは、プロセッサまたはアルゴリズムによって生成されます。アルゴリズムでキーによりメタデータに利用できます。例:データセットのラベルはメタデータに記録されています',
handleAddRecord: '手動でレコードを追加する',
exist: 'キーがすでに存在する場合、元の値が上書きされます',
allImage: 'すべて画像',
marked: '完了',
noMark: '未完了',
markType: 'タグ付け類型',
markMethod: 'タグ付け方式',
commitMark: 'タグ付け提出',
continue: 'タグ付けが提出すると、SeeTaas専用データセットを作成しますが、よろしいですか。',
deleteMark: 'タグ削除',
editLabel: 'タグ編集',
editMarkLabel: '下記テキストボックスに、タグの内容を変更できます。',
enterConfirm: 'タグを入力したら、Enter / Spaceキーを押して確認します。タグは20文字以内で半角英数字、"_"、"-"のみ対応します。',
nameExit: 'データセット名が重複しています',
dataType: 'データ種類',
dataTypeNull: 'データタイプが必須項目です',
markNull: 'タグ付け類型が必須項目です',
markMethodNull: 'タグ付け方法が必須項目です',
url: 'リソースURL',
accessKey: 'Access Keyが持っている場合、入力してください',
secretKey: 'Secret Keyが持っている場合、入力してください',
pleaseUploadDataSet: 'データセットをアップロードしてください',
nameNull: 'データセット名が必須項目です',
urlNull: 'リソースURLが必須項目です',
formatError: '入力形式が不正です。もう一度入力してください',
all: 'すべて',
editDataSet: 'データセット編集',
inputDesc: '説明を入力してください',
pleaseInputDataSetName: 'データセット名を入力してください',
editSuc: 'データセットが更新しました',
ready: '準備完了',
marking: 'タグ付け中',
publishing: '公開中',
noSupportCopy: '準備中のデータセットはコピーできない。',
noUploadCopy: 'アップロードされたデータセットはコピーをサポートしていません!',
allDataSet: '全部データセット',
confirmDeleteParam: '該当項目を削除してよろしいですか?',
continueMark: 'タグを付け続ける',
uploadFor: 'アップロード',
createMarkDataSet: '新規タグ付けデータセット',
noImpact: 'タグ付け用データセットを作成します。元データセットは影響しません。',
lookProgress: '新しいタグ付きデータセットが作成されています。進捗状況は通知センターのメッセージを確認してください',
scalarValue: '1、 "1"、1.11などのスカラー値にすることができます\n複雑な構造はYAML形式で入力されます:\ncat:1 \ndog:2 \nperson:3',
downloadDesc: 'データはエクスポートされています。データ転送一覧でダウンロードしてください',
serializedDataset: 'シリアル化データセット',
originalDataset: '元のデータセット',
dataSetType: 'データ種類',
image: '画像',
text: 'テキスト',
audio: 'オーディオ',
video: 'ビデオ',
other: 'その他',
theDataSetType: 'データセット形式',
amountTo: '合計',
notAllowDownload: 'ワークスペースはデータのダウンロードをサポートしていません',
},
model: {
modelName: 'モデル名',
modelSize: 'モデルサイズ',
inputModelName: 'モデル名',
uploadModel: 'アップロード',
modelDesc: 'モデル説明',
localUpload: 'ファイルを開く',
root: '圧縮ファイルをアップロードする場合は、ディレクトリ名は「半角英数字、"_"、"-"のみ」を対応します。',
inputModelDesc: 'モデル説明',
compression: 'ファイルかディレクトリをアップロードします。圧縮ファイルは.zip、.tarと.tar.gz形式のみ対応します',
fileLook: 'ファイル表示',
file: 'ファイル',
size: 'サイズ',
updateTime: '更新時刻',
modelNameNull: 'モデル名が必須項目です',
modelNameError: 'モデル名入力エラー',
pleaseUploadModel: 'モデルをアップロードしてください',
chooseTarget: 'コピー先ワークスペースを選択してください',
},
algorithm: {
algorithmName: 'アルゴリズム名',
algorithmLabel: 'アルゴリズムラベル',
inputAlgorithmName: 'アルゴリズム名',
updateAlgorithm: 'アルゴリズム更新',
installAlgorithm: 'インストール',
algorithmDesc: '説明',
algorithmFramework: 'フレームワーク',
algorithmCodeBag: 'アルゴリズム',
uploadCode: 'ソースコードアップロード',
root: 'ディレクトリ名には「半角英数字、"_"、"-"のみ」対応します。',
compression: '.zip、.tarおよび.tar.gz形式のみをサポートしています、自動的に解凍します。',
updateNote: '更新備考',
basicInformation: '基本情報',
envParameter: '環境変数',
superParameter: 'ハイパーパラメータ',
framework: 'フレームワーク',
version: 'バージョン',
reupload: 'もう一度アップロード',
algoNameNull: 'アルゴリズム名を入力してください',
chooseUse: 'フレームワークを選択してください',
pleaseUploadCode: 'アルゴリズムソースコードをアップロードしてください',
inputUpdateNote: '更新備考を入力してください',
algoUpdateSuc: 'アルゴリズムソースコードは更新しました',
algoEditSuc: 'アルゴリズムを修正しました',
algoUploadSuc: 'アルゴリズムアップロード成功',
editAlgo: 'アルゴリズム編集',
pleaseInputAlgoName: 'アルゴリズム名を入力してください',
useSay: '使用説明',
algoInfo: 'アルゴリズム情報',
configInfo: '構成情報',
train: 'トレーニング',
test: 'テスト',
reason: 'バッチ処理',
deploy: 'API仕組み',
noFindFile: '解凍されたファイルが見つかりません',
successAnalysis: 'environment.ymlおよびparameter.ymlの構成情報が導入されました。パラメーターを設定して、アルゴリズムのインストールを進めてください。',
forceConfig: '計算能力設定',
superConfig: 'ハイパーパラメータ設定',
userControl: '操作出来るのハイパーパラメーターを設定',
pleaseUploadAlgoCode: 'アルゴリズムのリソースパッケージをアップロードしてください',
pleaseInputNote: '備考を入力してください',
anliaSuccess: 'environment.ymlおよびparameter.ymlの構成情報が導入されました。パラメーターを設定して、アルゴリズムのインストールを進めてください。',
noFindOwnFile: '解凍されたファイルが見つかりません',
compileSDK: 'SDKコンパイル',
setUpAlgoSuccess: 'アルゴリズムがインストールしました',
name: '名前',
type: '種類',
nickName: 'エイリアス',
pleaseInputParamName: 'パラメータ名を入力してください',
pleaseInputParamDesc: 'パラメータ説明を入力してください',
chooseParam: 'parameter.ymlからハイパーパラメータを選択します',
addParam: 'パラメータ追加',
paramInfor: 'パラメータ情報',
versionRecord: 'バージョン履歴',
updatePerson: '更新者',
yamlError: 'yaml解析異常',
dataError: 'データ異常',
completeConfig: '該当アルゴリズムのハイパーパラメーターは構成されていませんので、開発者に直接お問い合わせください',
saveSuc: '保存しました',
algoNameExist: 'アルゴリズム名はすでに存在します。もう一度入力してください',
fileNoFivety: '添付ファイル上限は50MBまで、もう一度アップロードしてください',
completeInfo: '足りない情報を入力してください',
pleaseUpRight: '正しいアルゴリズムパッケージをアップロードしてください',
allAlgo: '全てのアルゴリズム',
cmd: 'コマンド実行',
notPermissionCard: '【{msg}】加速カードは設定しないので、他の加速カードを選択してください',
notPermissionSsh: 'SSHの鍵ペアが設定されていません',
},
processor: {
processorName: 'プロセッサー名',
processorVersion: 'プロセッサバージョン',
updateTime: '更新日時',
inputName: 'プロセッサ名を入力してください',
},
ApiDeployment: {
apiName: 'API名',
belong: '作成先ワークフロー',
state: 'ステータス',
stopDeployment: '公開停止',
instanceNumber: 'インスタンス数',
running: '実行中',
error: '異常',
serviceError: '異常停止',
basicSet: '基本設定',
serviceCreateFrom: 'サービス開始時刻',
correspondingTaskFlow: '関連ワークフロー',
correspondingTask: '関連タスク',
configInformation: '構成情報',
instanceConfig: 'リソース',
stopPattern: '停止モード',
callUrl: '呼出API',
permissionToken: '認証Token',
copyPermissionToken: '認証Tokenコピー',
testApi: 'APIテスト',
localUploadImage: '写真アップロード',
mobileTest: 'モバイルテスト',
imageFormat: '写真ファイルは「.jpg/.png」のみサポートします。サイズは5MB以内。',
backInformation: 'ファイルをアップロードしてから、画像認識情報を表示する',
scanCodeTest: 'QRコードを携帯またはパソコンで読み込みして、APIテストを実行できます。',
onlinePlayL: 'オンラインデモ',
callPython: 'Python呼出',
confirmStopDep: 'API公開を停止してよろしいですか?',
stopSuc: '停止しました',
stopFail: 'API停止は失敗しました。しばらくもう一度お試しください!',
copySuc: 'コピーしました',
allDep: '配置詳細',
copyFail: 'コピー失敗',
stoped: '停止された',
createApiDeploy: 'APIデプロイ作成',
inputApiDeployName: 'APIデプロイ名を入力してください',
editApiDeploy: 'APIデプロイ情報編集',
apiDeployName: 'APIデプロイ名',
supportCJEN: '入力制限:2~64桁、英数字、日本語、スペース、および.:-_()[]{}',
chooseAlgo: 'アルゴリズム選択',
chooseModel: 'モデル選択',
apiDeployNameNull: 'APIデプロイ名を入力してください',
apiDeployEditSuc: 'APIデプロイ情報を修正しました',
startApi: 'API起動',
deleteNotCover: '削除後は復元できません。',
stopRestart: 'API再開することできます。',
pleaseInputApiDeployName: 'APIデプロイ名を入力してください',
pleaseChooseModel: 'モデルを選択してください',
pleaseChooseAlgo: 'アルゴリズムを選択してください',
stopApiDeploy: 'APIの公開を停止します',
apiRunTime: '稼働時間',
algoForceResource: '計算能力',
usedAlgoForceCard: '稼働済計算能力',
runInfor: '実行情報',
nodeOutPut: 'ノード出力',
onlineApiPlay: 'オンラインAPIデモ',
editAppId: 'AppID修正',
careEdit: '警告:AppIDを変更すると、使用中のプログラムが呼び出すことができなくなります。ご注意してください。',
pleaseInputAppId: 'AppIDを入力してください',
AppIdNull: 'AppIDを入力してください',
supportfourT: '入力制限:4~36桁、半角英数字、"-"、"_"',
AppIdEditSuc: 'AppIDが修正しました',
confirmDeleteApi: '{msg}を削除してもよろしいですか?',
confirmStopApi: '{msg}を止めてもよろしいですか?',
deployFormatLength: '入力制限:2〜64文字',
deployFormatSymbol: '入力制限:英数字、日本語、スペース、及び:-()[] {}',
apiNameRepeat: 'APIデプロイ名が重複しています',
appIdRepeat: 'AppIDが重複しています。もう一度入力してください',
noDesc: 'コメントなし',
function: '機能',
startFail: 'API起動失敗',
moreLookLog: '詳しく情報はログに確認してください',
noRun: '未実行',
noStart: '未起動',
},
edge: {
regEquipment: 'デバイス登録',
equipmentCode: 'デバイスID',
equipmentName: 'デバイス名',
platformInfor: 'プラットフォーム情報',
regPerson: '登録者',
state: 'ステータス',
regTime: '登録日時',
desc: '説明',
operation: '操作',
confirm: '確定',
regSomeDevice: '該当パッケージには認証情報を含まれていますので、大切に保管してください。 このパッケージは複数のデバイスを登録できますので、登録されたデバイスはこのページに表示されます。',
downAgent: '1.エージェントパッケージをダウンロードして、デバイスにコピーして解凍し、Shellコマンドで `agent`を実行して外部機器サービスを開始します。',
findInitDevice: '2.デバイス起動時に、デバイスID(device_uuid)を確認して、クラウド側に該当デバイス名と説明を編集できます。 再起動時に該当デバイスIDをもってもう一度初期化処理を行いません。',
SDKonly: 'SDKの一意の識別子は設定後に変更できません',
storageFile: 'ライブラリファイル',
uploadStorageFile: 'ライブラリアップロード',
modelFile: 'モデルファイル',
uploadModelFile: 'モデルアップロード',
modelRelyFile: 'モデル依存ファイル',
uploadModelRelyFile: 'モデル依存ファイルアップロード',
lookEvent: 'イベント詳細',
setTime: 'インストール時間',
unloadSDK: 'SDKアンインストール',
inputEquitName: 'デバイス名を入力してください',
noSetName: '未設定',
leaveLine: 'オフライン',
onLine: 'オンライン',
openEdge: 'デバイス起動',
installSDK: 'SDKインストール',
confirmDeleteDevice: 'デバイス削除確認?',
editDevice: 'デバイス編集',
inputDeviceName: 'デバイス名を入力してください',
deviceDesc: 'デバイス説明',
inputDeviceDesc: 'デバイス説明を入力してください',
updateSDK: 'SDK更新',
onlyLabel: 'SDKの一意の識別子を設定してください',
oneSix: '入力制限:1〜64文字',
EnglishNum: '入力制限:英数字、"-"、"_"',
returnResult: 'コマンドが実行されています。お待ちください。 SDKイベントで結果を表示することもできます。取得中...',
prop: '属性名を入力してください',
inputDefault: 'デフォルト値を入力してください',
identity: 'identity重複',
listSDK: 'SDKインストールリスト',
uninstall: 'アンインストール',
installIng: 'インストール中',
installFail: 'インストール失敗',
installSuc: 'インストール成功',
uninstallFail: 'アンインストール失敗',
uninstallEd: 'アンインストール済',
noRoot: 'SDKのアンインストール権限がありません',
confirmUninstall: 'SDK{msg}をアンインストールしてもよろしいですか?',
eventStatus: 'イベントステータス',
librayFileRequired: 'ライブラリファイルをアップロードしてください',
modelFileRequired: 'モデルファイルをアップロードしてください',
relySDK: 'SDKパッケージの依存',
createSdkPipeline: 'SDKパイプライン作成',
editSdkPipeline: 'SDKパイプライン編集',
deleteSdkPipeline: '删除SDK Pipeline',
checkPipeline: 'SDKパイプライン詳細',
baseTemplate: 'テンプレートに基づいて作成',
param: 'パラメータ',
instanceId: 'プロジェクトID',
instanceType: '類型',
createInstance: 'プロジェクト新規作成',
check: '詳細',
identityRequired: 'identityを入力してください',
editSuccess: 'SDKパイプラインが修正しました。',
release: '解放',
releaseInstance: '释放实例',
releaseWarning: 'プロジェクトを解放すると、呼び出し元が異常発生かもしれないので、解放よろしいでしょうか?',
releaseSuccess: '解放しました',
deletePipeline: 'SDKパイプラインを削除すると、データは回復できないので、削除よろしいでしょうか?',
sdkUpdateSuccess: 'SDK 更新成功',
deleteSdk: '卸载SDK',
deleteSdkWarning: '当前SDK已被SDK Pipeline或运行实例绑定,请解绑后再进行卸载',
sdkPipeline: 'SDKパイプライン',
runInstance: '运行实例',
operateLog: '操作日志',
waitMessage: '正在等待执行结果,超时时间30S',
dontClose: '请勿关闭窗口',
selectTemplate: '请选择模板',
inputParam: '请输入参数信息',
haveSameIdentity: '请勿包含相同identity',
parseError: '参数解析失败,请检查格式',
},
clusterforce: {
service: 'ノードHost',
free: '未稼働計算能力',
total: '総計算能力(分配可能)',
},
calPQ: {
useLimit: '使用上限',
current: '稼働中',
currentUse: '利用可能計算能力(コア・時間)',
totalGet: '累積配置計算能力(コア・時間)',
totalCost: '累積稼働計算能力(コア・時間)',
speedCard: '加速カード',
useType: '利用可能なモデルタイプ',
coefficient: '計算能力係数',
cardHour: 'カード・時間',
GBHour: 'GB*時間',
centerHour: 'コア・時間',
memory: 'メモリ',
useForce: '利用可能計算能力',
getForce: '累積配置計算能力',
costForce: '累積稼働計算能力',
card: 'カード',
ct: 'コア',
},
hashrateQuota: {
totalCost: '稼働量明細',
totalGet: '配置量明細',
time: '時間',
use: '計算能力利用量',
note: '備考',
forceHour: '計算能力時間',
getMethod: '入手方法',
takeUp: '算力占用',
hashrateLimit: '算卡力使用上限',
costHashrate: '消耗算力卡',
task: '任务',
getHashrate: '获取算力卡',
takeUpTitle: '任意时刻,您的累计算力卡使用速率不能超过该上限',
},
SSHKey: {
SSHName: 'キーペア名',
},
developer: {
tokenName: 'Token名',
authorSpace: '許可スペース',
newtoken: '新規Token',
},
myImage: {
addMirror: 'イメージ追加',
errorAdress: '错误的镜像地址,不允许创建',
},
public: {
all: 'すべて',
today: '今日',
week: '直近1週間',
oneMonth: '直近1ヶ月',
threeMonth: '直近3ヶ月',
chooseDate: '日付選択',
founder: '作成者',
createTime: '作成時刻',
operation: '操作',
confirm: '確定',
cancel: 'キャンセル',
delete: '削除',
desc: '説明',
more: 'その他',
editor: '編集',
launch: '起動',
stop: '停止',
download: 'ダウンロード',
finish: '完了',
copy: 'コピー',
noData: 'データが見つかりませんでした',
jump: 'ページ',
page: 'へ',
name: 'コンテナ名',
prompt: '確認',
member: 'ユーザー',
operationFail: '操作失敗',
fail: '失敗',
success: '成功',
inputNum: '1〜99の整数を入力してください',
allowScope: '入力範囲1〜99',
nameExit: '該当コンテナ名はすでに存在します。新しいコンテナ名を入力してください',
chooseMirror: 'イメージを選択してください',
reInput: '入力情報が正しくありません。もう一度入力してください',
userNameLength: 'ユーザー名の長さは2~64桁以内です',
passwordLength: 'パスワードの長さは8~64桁以内です',
include: '英大文字・英小文字・数字それぞれを1文字以上含む',
paramNull: '該当項目は必須項目です',
lengthNoTwo: '項目は2桁以上で入力してください',
lengthNoSixFour: '項目は64桁以内で入力してください',
emailFormat: 'メールアドレスの形式が正しくありません',
onlyInputNum: '数値を入力してください',
confirmName: '名前確認',
fileMoreThree: '最大300ファイルが表示されます',
noOpenFile: '該当ファイルを開けません',
noOpenTerminal: 'コンテナ実行しないの場合、ノードを接続できません',
overviewOf: '概要',
fileMoreFive: 'ファイルは5MBを超える',
rechooseImg: '他の画像をアップロードしてください',
formula: '稼働済計算能力 = 計算能力数量 * 計算能力係数 * 時間 ',
back: '返却',
recharge: 'チャージ',
bornToken: 'Token生成',
saveToken: 'Tokenファイルは再表示できないので、適切に保存してください',
close: '閉じる',
noFindToken: '使用可能なTokenは存在しない',
soonBornToken: '新しいTokenを生成します',
listNull: 'Tokenリストはデータ存在しない',
deleteTokenSuc: 'Tokenが削除しました',
copyBackOpen: '{type}はコピー中、転送一覧でコピー実施状況を確認できます。',
modelFile: 'モデルファイル',
editSuc: '編集成功',
editFail: '編集失敗',
deleteNoRecover: '削除後は回復不能',
return: '戻る',
fontUserLogin: '作業者ロール登録',
inputNamePassword: 'ユーザー名とパスワードを入力してください',
no: '無',
systemProcessor: 'システムプロセッサ',
adminBack: 'プラットフォーム管理の背景',
supportPng: '.png形式のみサポート',
imgSay: '注:画像サイズは140px * 140px以内にしてください。ウォーターマーク効果を明確にするので、黒、暗い、または明るい色の画像をアップロードしてください。',
waterMarkPreview: 'ウォーターマークプレビュー',
imgWaterMark: 'ウォーターマーク',
uploadWI: 'ウォーターマークをアップロードしてください',
resetSuc: 'リセットしました',
createUser: 'ユーザー作成',
normal: '正常',
password: 'パスワード',
type: 'タイプ',
uploadFile: 'ファイルアップロード',
enable: '起動',
unenable: '停止',
white: 'ホワイトリスト',
create: '作成',
deleteSuc: '正常に削除されました',
editReupload: '変更して再アップロードする',
nuclear: 'コア',
resourceO: 'リソース',
shelve: '登録',
underShelve: '却下',
newAdd: '新規追加',
speedUserTake: '加速カードのユーザー専用',
freedom: '空いた',
monitorCenter: '監視センター',
firstLogin: '初めてログインの場合、パスワードを変更してください',
confirmEdit: '変更確認',
inputNewPassword: '新しいパスワードを入力してください',
mustInclude: '「英大文字・英小文字・数字それぞれを1文字以上含む。英語記号の文字列をサポートします',
againInputPassword: '新しいパスワードをもう一度入力してください',
passwordEditF: 'パスワード変更は失敗しました',
returnSpace: 'ワークスペース戻る',
confirmChange: '現在のワークスペースに切り替えるか?',
uploadTaskStop: 'アップロードしているタスクは終了させる',
confirmUnlog: 'ログアウトしますか?',
KS3import: 'KS3インポート',
localUploadDataSet: 'データセットアップロード',
localUploadModel: 'モデルアップロード',
uploadProcessor: 'プロセッサアップロード',
saveDateSet: 'データセット保存',
saveModel: 'モデル保存',
downloadDataSet: 'データセットダウンロード',
copyDataSet: 'データセットコピー',
copyModel: 'モデルコピー',
copyAlgo: 'アルゴリズムコピー',
createMarkDataSet: 'タグ付けデータセット作成',
finishMark: 'タグ付け完成',
downloadData: 'データダウンロード',
importing: 'エクスポート中、お待ちください...',
uploading: 'アップロード中、しばらくお待ちください...',
createing: '作成中...',
search: '検索...',
systemInit: 'システム初期化設定',
initAdmin: 'システム管理者初期化',
finishInit: '初期化完了',
confirmPassword: 'パスワード確認',
confirmLeavePage: 'このサイトから離れますか?',
buildSpacConnect: 'ワークスペースリンク作成',
welcome: 'ようこそ',
platform: 'プラットフォーム',
inputRunName: '実行名を入力してください',
runUser: '実行ユーザー',
startTime: '開始時間',
finishTime: '終了時間',
noFinish: '実行中',
unknown: '不明',
stopPipeline: '実行中のワークフローを停止すると、再開できません。停止を続けますか?',
secondStop: 'タスクは数秒後に停止します...',
imageTable: 'グラブ',
besideSave: 'データセット保存',
output: '出力',
dataSetA: 'データセット属性',
runTimeLong: '実行時間',
restTime: '残り時間',
caling: '計算中',
wait: '待って',
besideS: '保存',
dataDownload: 'データダウンロード',
downloadFileType: 'ダウンロードファイルタイプ',
param: '項目',
chooseDownload: 'ダウンロードする項目を選択してください',
requestSuc: 'リクエストは成功しました。通知メッセージを確認してください',
noMoreThanThree: '入出力ノード数量は3つを超えることはできません',
templateName: 'テンプレート名',
templateDesc: 'テンプレート説明',
templateSaveSuc: 'テンプレートを保存しました',
push: '紛失',
show: '展開',
highLevel: '高級',
noCompile: 'プロセッサの内部関数を解析できません',
resetInit: 'パラメータの設定値がリセットされます。続行しますか?',
dragChange: 'ここにドラッグして、該当コンポーネントを置き換える',
noNeedSpeed: '加速カード要らない',
reStart: 'コンテナ内容修正すると、再起動する必要があります',
update: '更新',
require: '要求',
newCreateMark: 'タグ付け新規作成',
getImgData: '画像データ取得中',
dataSetMark: 'データセットタグ付け',
commitChangeUse: 'タグ付け情報コミットすると、SeeTaaS専用なデータセットに変換されます。続行しますか?',
noImg: '非画像データ',
pleaseInputLabelName: 'タグ名を入力してください',
editSave: 'タグが重複しています。もう一度入力してください',
inputError: '入力形式が正しくありません。英数字、日本語、「_」、「-」のみがサポートされています',
noImgnoMark: '画像以外のデータ、タグ付けできません',
allImg: 'すべての写真',
markLable: 'タグ付け',
difficult: '異例ですか',
clickUpload: 'クリックまたはドラッグしてプロセッサフ​​ァイルをアップロードします',
processorFile: 'プロセッサフ​​ァイル',
handleStop: '手動停止',
memberUserName: 'メンバーのユーザー名',
pleaseInputSpaceDesc: 'ワークスペースの説明を入力してください',
noMoreThirty: '項目長さは30以内にしてください',
formatCJE: '入力制限:英数字、日本語、スペース、および.:-_()[]{}',
formatTwoSix: '入力制限:2~64桁、英数字、日本語、スペース、および.:-_()[]{}',
nameInputError: '名前入力エラー',
deleteError: '削除失敗',
node: 'ノード',
cjeNoMoreThrity: '入力制限:30桁以内、英数字、日本語、"-"、"_"',
distribute: '分散処理',
open: '起動',
clusterNodeNum: 'クラスターノード数量',
pleaseInputKey: 'キーを入力してください',
nameUsed: '入力した名前はすでに使用されています。もう一度入力してください',
inputRightNum: '正しい数量を入力してください',
checkCpuNum: 'CPUの個数を確認してください。範囲は0〜999です',
inputMemoryNum: 'メモリの個数を確認してください。範囲は0〜9999です',
loadSSH: 'キーファイルをダウンロードしてください',
chooseSSH: 'キーを選択してください',
inputDataName: 'データセット名前を入力してください',
noFindeResult: '結果が見つかりません',
noOption: '選択項目は存在しません',
noFindeData: '関連するデータが見つかりません',
loadingCenter: '読み込み中',
nofindUseData: '使用可能なデータが見つかりません',
groupNoOption: '該当グループには利用可能な項目は存在しません',
handleing: '処理中...',
onlyUpload: 'アップロードのみ',
formatFile: 'ファイルフォーマット',
iKnow: '確認しました',
highLevelSet: '上位設定',
twiceDev: '二次開発設定',
onlyIndexNode: '二次開発中にノードキーとして使用されます',
regular: '*適用正規表現:[A-Za_0-9-]+',
look: '詳細',
play: '再生',
markParam: 'タグ付け',
colour: '表示方式',
imgIn: '画像内部表示',
imgBeside: '画像外部表示',
fileListNull: 'ファイルは存在しません',
permitToken: 'ライセンスToken',
confirmDeleteToken: 'API接続用Tokenを削除してよろしいですか?',
hit: '隠し',
showDisplay: '表示',
waterMark: '透かし',
createNewRole: '新しいキャラクターを作り出す',
confirmDeleteSSH: 'このキーペアを削除してよろしいですか?',
upNoMoreEight: '大小文字、数字、中線、以下8桁',
supportCJE: '日中の英文、数字、中下線のみをサポートします',
checkFile: 'ファイルをチェックしていますので、後でメッセージウィンドウでアップロードの進捗をチェックしてください',
handleData: 'データ処理',
twoSixFour: '名前の長さは2〜64以内に入力してください',
num: '第',
gNode: 'のノード',
noKnowType: '未知タイプ',
onlySupportTwo: '入力制限:2~64桁、英数字、日本語、スペース、および.:-_()[]{}',
noFindDataAttr: 'データ属性の内容は見つからなかった',
waitRunDataAttr: 'データ属性の取得が行われる',
onlyInclude: '大小文字、数字、中下線しか含まない',
noFindePage: '該当ページを見つけることができません',
youCan: 'よろしゅうございます',
returnHome: 'ホームページに戻る',
addLabelMark: 'タグを付ける必要があります',
Esc: '取消(Escキー)',
dataAttr: 'データ属性',
one: '月',
two: '火',
three: '水',
four: '木',
five: '金',
six: '土',
seven: '日',
monthOne: '1月',
twoMonth: '2月',
monthThree: '3月',
fourMonth: '4月',
fiveMonth: '5月',
sixMonth: '6月',
sevenMonth: '7月',
eightMonth: '8月',
nineMonth: '9月',
tenMonth: '10月',
elevenMonth: '11月',
twelveMonth: '12月',
pleaseInputOperator: '操作者を入力してください',
refernceApi: 'API呼び出しの例を参照して、どのようにAppIDを使用するかを調べてください',
operationTime: '作業時間',
startCon: '容器を動かす',
stopCon: '停止容器',
delCon: '容器を削除する',
updateCon: '容器を更新する',
createTemplate: 'テンプレートを作成する',
allTemplate: 'テンプレートを作成すると、テンプレート全体を1つのノードとしてタスクフローに使用することができます',
opnNumNoT: '入出力名を記入することは当該ノードを有効化することであり、入出力ノードの有効化数は3つ以下である',
threeIONode: 'テンプレートは最大3つの入出力ノードを含む',
waitCen: '待機中',
noDescContent: '説明なし',
pleaseInputInName: '入力名を入力してください',
pleaseInputOutName: '出力名を入力してください',
uploadImage: '写真アップロード',
clickUploadImage: 'ここにクリックして、写真をアップロードする',
pngJpg: '写真ファイルは「.jpg/.png」のみサポートします',
MB5: 'サイズは5MB以内',
watchNode: 'ノード監視',
deleteDataset: 'データセット削除',
dataSetNoCover: 'データセットを削除すると、データを復元できません!',
inputDeleteDataset: 'データセット名を入力してください',
deleteModel: 'モデル削除',
modelNoCover: 'モデルを削除すると、データを復元できません!',
inputDeleteModel: 'モデル名を入力してください',
deleteAlgo: 'アルゴリズム削除',
algoNoCover: 'アルゴリズムを削除すると、データを復元できません!',
inputDeleteAlgo: 'アルゴリズム名を入力してください',
nodenum: 'ノード[{num}]',
deleteDatasetName: 'データセット名',
deleteModelName: 'モデル名',
deleteAlgoName: 'アルゴリズム名',
confirmDeleteD: 'を削除してよろしいですか?',
browserPrompt: 'Chromeブラウザの互換性が優れているため、Chromeをお勧めします。',
yamlFormatError: 'yamlフォーマットが正しくありません。修正してください。',
ApiExample: 'API呼出サンプル',
allContainer: '全てのコンテナ',
proportion: '比率値の範囲は{msg1}~{msg2}となります。',
fileNameTest: '文件名只能包含字母、数字、下划线、中划线和小数点',
notRemind: '我知道了不再提示',
shareMemoryUse: 'コンテナ利用可能な共有メモリ(Shared Memory) =申請したメモリ*共有メモリの割合。一般的にはこのデフォルト値の修正は推奨されない。',
notHaveData: '暂无数据',
year: '年',
month: '月',
day: '日',
hour: '時',
minute: '分',
second: '秒',
status: 'ステータス',
edit: '修正',
upload: 'アップロード',
otherAdminUpload: '其他管理员正在上传文档,请稍后重试。',
fileTypeError: 'ファイルのタイプが間違っています、もう一度アップロードしてください',
goDownload: 'ダウンロード',
saveSuccess: '保存しました',
cmdToolTip1: 'その他コマンド',
cmdToolTip2: 'block:コンテナがスリープ状態を変更する。',
cmdToolTip3: 'resume: スリープ状態のコンテナを回復する(block:と組み合わせて使う)。',
monitor: '监控',
normalConfig: '常规配置',
customConfig: '自定义配置',
compute: '运行1小时需要{msg}算力卡',
costCalculateCard: '消耗算力卡',
startOrder: '启动命令',
},
copy: {
copyToSpace: 'コピー先',
fontAutoAdd: 'ワークスペース',
autoAddBack: 'へコピーします。名前が重複する場合、自動的にリネームします。',
},
transmission: {
missionName: 'タスク名',
missionType: '操作タイプ',
missionObj: '操作対象',
operatior: '操作者',
deleteTip: 'データを削除すると復元できません、続行しますか?',
},
//* ****************************************后台 */
spaceManage: {
createTime: '作成日時',
to: '~',
chooseDate: '日付選択',
onlyKey: 'スペースKey',
founder: '作成者',
spaceName: 'スペース名',
lookMember: 'ユーザー詳細',
userName: 'ユーザー名',
role: 'ロール',
timeInSpace: 'スペース参加日時',
member: 'ユーザー',
deleteTip1: '実行中のタスクがあるので、タスクを停止してから削除を実施してください。',
deleteTip2: 'スペースにはアップロード中のタスクがあります,削除できません',
},
taskFlowManage: {
space: 'スペース',
createTime: '作成日時',
taskFlowName: 'ワークフロー名',
spaceName: 'スペース名',
onlyKey: 'スペースKey',
},
runHistoryManage: {
space: 'スペース',
runHistoryName: '実行履歴名',
},
containerManage: {
lastRun: '最終実行日時',
containerName: 'コンテナ名',
},
algoManage: {
algoName: 'アルゴリズム名',
},
dataSetManage: {
dataSetName: 'データセット名',
dataSetSize: 'データセットサイズ',
},
modelManage: {
modelName: 'モデル名',
modelSize: 'モデルサイズ',
},
pretreatManage: {
pretreatName: 'プロセッサー名',
pretreatVersion: 'プロセッサバージョン',
updateTime: '更新日時',
},
userInterface: {
platformVersion: '現在のバージョン',
platformName: 'プラットフォーム名',
inputPlatformName: 'プラットフォーム名を入力してください',
confirm: '確定',
logo: 'プラットフォームLOGO',
recommendSize: '推奨サイズ:高さ48px *幅320px(サイズが合わない場合、Logoファイルの高さは最大48pxに設定し、幅は自動的に合わせて変更します)',
pageWaterMark: '画像ウォーターマーク',
inputWaterMark: 'ウォーターマーク文字を入力してください',
textWaterMark: '文字ウォーターマーク',
reset: 'リセット',
uploadImg: '写真をアップロードしてください',
setSuccess: '設定は完了しました',
setFail: '設定は失敗しました',
platformSuc: 'プラットフォーム名の設定は完了しました',
platformFail: 'プラットフォーム名の設定は失敗しました',
web: 'ウェブサイト',
add: '追加',
clickDragAdd: 'ここをクリックして、LOGOを変更します',
clickDragEdit: 'ここをクリック/ドラッグして、LOGOを変更します',
isDownloadDoc: '該当ファイルをダウンロードして、よろしいですか【{msg}】?',
uploadWarning: '「.zip、.tar、および.tar.gz」圧縮形式のみがサポートされており、解凍後に「doc、source」フォルダーを含める必要があります。',
manual: 'マニュアル',
menuSet: 'メニュー構成',
addMenu: 'メニュー新規',
editMenu: 'メニュー編集',
menuName: 'メニュー名',
menuAddress: 'URL',
menuJS: '处理方法',
namePlaceholder: 'メニュー名を入力してください',
addressPlaceholder: 'URLを入力してください',
deleteWarning: 'メニューを削除すると復元できません、続行しますか?',
revoke: '撤销',
compress: '解凍します...',
},
adminManage: {
regTime: '登録時間',
userName: 'ユーザー名',
spaceNum: '現在スペース数',
regOrgin: '登録サイト',
finalLog: '最終ログイン日時',
state: 'ステータス',
note: '備考',
operation: '操作',
set: 'ユーザー設定',
email: 'メール',
shareMemory: 'メモリ共有率',
configForce: '計算能力分配',
add: '追加',
delete: '削除',
configForceType: '加速カードタイプ',
speedCard: '加速カード',
useLimit: '使用制限',
center: 'コア',
memory: 'メモリ',
cancel: 'キャンセル',
rechargeForceTime: '計算能力チャージ',
addForceTime: '在用户现有算力卡基础上增加新的算力卡',
cardTime: 'カード*時間',
centerTime: 'コア・時間',
GBTime: 'GB・時間',
lookForce: '計算能力概要表示',
forbidden: 'アクセス許可',
recover: 'アクセス拒否',
confirmRecover: '該当ユーザーからのアクセスを許可しますか?',
newPassword: '新パスワード',
resetPassword: 'パスワードリセット',
inputConfirm: 'パスワード(確認)を入力してください',
confirmNew: '新パスワード(確認)',
inputPassword: 'パスワードを入力してください',
confirmForbidden: '該当ユーザーからのアクセスを拒否しますか?',
operationSuc: '操作完了',
passwordNo: 'パスワードが一致しません',
card: 'カード',
deleteUser: '用户删除后不可恢复,是否继续?',
createUser: '创建用户',
createUserFrom: '从{from}创建用户',
batchCreateUser: '批量创建用户',
batchConfigForceType: '批量配置算力型号',
batchRechargeForceTime: '批量充值算力时',
userTemplate: `(日文版本)批量创建格式说明:
1、用户名和密码为必填信息
2、用户名:支持中英日文,最长不超过32个字符
3、密码:必需包含大小写字母和数字,长度在8-64位之间
*用户名称, *密码, 邮箱, 备注
示例:张三, 实例:ZhangSan123, 实例:123456789@163.com, 这里填写用户备注信息`,
uploadFile: '上传文件',
userNumber: '用户',
startCreate: '开始创建',
downloadTemplate: '下载模板',
batchCreate: '批量创建',
fileError: '请上传csv格式文件',
remainResource: '剩余算力卡',
shareRate: '内存共享比例',
autoRecharge: '自动充值',
rechargeTime: '充值周期',
rechargeLines: '充值额度',
useNodeConfig: '使用节点配置',
usedCluster: '当前可用算力卡',
getCluster: '总获取算力卡',
consumeCluster: '总消耗算力卡',
chargeTime: '充值时间',
chargeCluster: '充值算力卡',
chargeType: '充值方式',
normalCharge: '常规充值',
residueCluster: '剩余算力',
inputLines: '请输入算力额度',
inputNote: '请输入备注信息',
isStart: '是否启用',
week: '周',
isAutoRecharge: '启用后将按照充值周期自动充值算力卡,可随时取消',
autoChargeTime: '下次将在{msg}自动充值{num}算力卡',
oneWeek: '一周',
oneMonth: '一月',
oneYear: '一年',
inputNumber: '充值额度应为正整数',
batchSetCalculate: '批量配置算力',
schedulNode: '调度节点',
nodeHost: '节点host',
chooseSchedulNode: '请先选择调度节点',
gpuNoExist: '所选节点中不存在加速卡',
noUseDevice: '暂无可用型号',
rechargeForceCard: '充值算力卡',
batchRechargeForceCard: '批量充值算力卡',
residueCard: '剩余算力卡',
isSoonRecharge: '是否立即充值',
costSpeedLimit: '算力占用上限',
calculateConfigTitle: '在任意时刻,用户累计算力卡使用速率不能超过该上限,以免单个用户过度占用集群算力资源。',
currentTakeUp: '当前算力占用',
},
safe: {
userWhite: 'ユーザーホワイトリスト',
regOrigin: '登録サイト',
isWhite: 'ホワイトリストを有効しますか?',
yes: 'はい',
no: 'いいえ',
operation: '操作',
openWhite: 'ホワイトリスト有効',
confirmOpen: 'ホワイトリストを有効にしますか?',
importWhite: 'インポート',
lastFile: '前回ファイル',
oneUserName: 'ユーザー名は一行ずつを設定してください',
lookWhite: 'ホワイトリスト',
noData: 'データが見つかりませんでした',
closeWhite: 'ホワイトリスト無効',
confirmClose: 'ホワイトリストを無効にしますか?',
mirrorWhite: 'イメージホワイトリスト',
addWhite: 'ホワイトリスト追加',
createWhite: 'ホワイトリスト作成',
express: '正規表現',
type: '種類',
exactMatch: '完全一致',
wildCard: 'ワイルドカード',
soonOpen: 'すぐ起動',
state: 'ステータス',
edit: '修正',
delete: '削除',
confirmDelete: '該当レコードを削除しますか?',
dataDic: 'データ辞書',
whiteSuc: 'ホワイトリストがインポートしました',
No2MB: '最大2MBまでのファイルをアップロードできます',
pleaseUploadFile: 'ファイルをアップロードしてください',
confirmDeleteMirror: 'コンテナイメージを削除してもよろしいですか?',
},
dict: {
algoLabel: 'アルゴリズムラベル',
addAlgoLabel: 'アルゴリズムラベル追加',
labelName: 'ラベル名',
dataSetLabel: 'データセットラベル',
addDataSetLabel: 'データセットラベル追加',
containerMirror: 'イメージリポジトリ',
addContainerMirror: 'イメージ追加',
mirrorAddress: 'イメージURL',
mirrorType: 'イメージ種類',
mlu: '寒武紀(MLU)',
mirrorDesc: 'イメージ説明',
systemSet: 'システム設定',
edit: '修正',
createAlgoLabel: 'アルゴリズムラベル新規作成',
editAlgoLabel: 'アルゴリズムラベル修正',
createDatasetLabel: 'データセットラベル新規作成',
editDatasetLabel: 'データセットラベル修正',
createContainerMirror: 'イメージリポジトリ新規作成',
editContainerMirror: 'イメージリポジトリ修正',
mirrorLabel: 'イメージラベル',
inputMirrotAdress: 'イメージのアドレスを入力してください',
descripMirror: 'イメージの簡単に説明してください',
mirrorAdressNotNull: 'イメージのアドレスを入力してください',
addImageLabel: 'イメージタグ追加',
editImageLabel: 'イメージタグ編集',
labelNameNotNull: 'ラベル名を入力してください',
labelNameNotTwenty: '标签名称在20个字符以内',
labelNameFormat: '只支持中、日、英文、数字、_和-',
confirmDeleteLabel: 'イメージのタグを削除してもよろしいですか',
labelFormat: 'ラベル名は20桁以内で、日本語、英数字、「_」、「-」のみをサポートします',
enterOrSpaceConfirm: 'ラベルを入力したら、Enter 或は Space キーを押して確認します',
labelNameRepeat: 'ラベル名が重複する',
},
system: {
threeLogin: '3rdログイン',
addThreeLogin: '3rdユーザー登録',
threeLoginName: '3rdユーザー名',
httpName: 'プロトコル名',
threeLoginIcon: '3rdアイコン',
upload: 'アップロード',
format: 'jpg、png、icon型のファイルをサポート',
http: 'プロトコル',
state: 'ステータス',
operation: '操作',
},
cluster: {
nodeNum: 'ノード総数',
cpuNode: 'CPUノード',
gpuNode: 'GPUノード',
runNum: '実行中タスク数',
cpuTask: 'CPUタスク',
gpuTask: 'GPUタスク',
takeUp: '稼働中',
total: '合計',
resource: 'リソース',
memory: 'メモリ',
resourceTakeUp: '即時計算能力監視',
nodeMonitor: '監視ノード',
computingPower: 'ノード計算能力監視',
occupationProfile: 'ユーザー計算能力監視',
nodeDetail: '节点详情',
monitor: '监控面板',
totalCluster: '総計算能力',
gpuSchedul: 'GPU调度方式',
nodeIP: '节点IP',
gpuShareTitle: '在切换调度方式前请确保该节点上无用户任务运行,否则将导致新老任务发生算力资源冲突',
wholeCard: '整卡独占',
memoryShare: '显存共享',
nodeCluster: '节点算力(剩余算力/总算力)',
nodeResource: '节点算力',
onlyOccupy: '独占',
share: '共享',
},
device: {
addDevice: '新規追加',
deviceName: 'タイプ名',
state: 'ステータス',
forceNum: '計算能力パラメータ',
key: 'K8SリソースKey',
forceType: '計算能力タイプ',
deviceNickname: '型号别名',
memoryCount: '显存大小',
inputNumber: '请输入数字',
inputCoefficient: '请输入算力系数',
inputName: '请输入规格名称',
max32: '字符不能超过32位',
onlyCJE: '只支持中、日、英文',
editDevice: '编辑算力型号',
deviceTitle: '由系统自动获取集群内所有的GPU型号等信息,您可以编辑别名和价格',
},
specifications: {
specifications: '算力规格',
specificationsName: '规格名称',
createSpecifications: '新增规格',
gpuType: '加速卡型号',
memory: '显存',
gpuNum: '加速卡数量',
calculate: '算力',
inputName: '请输入规格名称',
max32: '字符不能超过32位',
onlyCJE: '只支持中、日、英文',
inputCPU: '请输入CPU数量',
inputMemory: '请输入内存数量',
consume: '运行一小时将消耗{msg}算力卡',
confrimDelete: '确认删除该算力规格么?',
cardShelves: '{msg}未上架,算力规格不可上架',
shelvesTitle: '此规格已下架,请选择其他规格',
deleteTitle: '此规格已删除,请选择其他规格',
chooseSpecifications: '请选择规格',
calculatePrice: '算力价格',
priceUnit: '价格(算力卡/小时)',
caluculateUnit: '算力卡',
caluculateHour: '算力卡/时',
gpuMemoryTitle: '请确认加速卡所在节点已开启按显存大小调度,否则将无法调度启动。',
gpuShare: '一卡共享',
gpuMemoryFloor: '显存调度最小粒度:1GB,不足1GB时向下取整',
oneGpuShare: '1卡共享',
},
resource: {
service: 'ノードHost',
freeForce: '未稼働計算能力',
total: '総計算能力(利用可能)',
detail: '詳細',
status: 'ステータス',
operation: '操作',
warn: '警告',
normal: '正常',
disabled: '無効にしました',
ready: '準備',
error: '異常',
open: '起動',
disable: '禁止',
viewRunningTasks: '実行中のタスクを表示する',
idle: '空闲',
taskName: 'タスク名',
taskType: 'タスク類型',
user: 'ユーザー',
occupyGPU: '稼働加速カード',
createdAt: '開始時間',
runningTime: '実行時間',
},
monitor: {
autoShuffling: '自動切替',
refresh: '更新',
nodeNum: 'ノード数',
cpuTotal: 'CPU総数',
gpuTotal: 'GPU総数',
mluTotal: 'MLU総数',
storage: 'ストレージ(TB)',
utilization: 'クラスター使用率',
list: 'ランキング',
runTime: 'コンテナ実行時間',
containerName: 'コンテナ名',
fiveDay: '使用時間(過去5日)',
founder: '作成者',
forceUse: '計算能力使用',
speedCardTake: '加速カード使用数(現在)',
algoUse: 'アルゴリズム使用',
algoName: 'アルゴリズム名',
useNum: '使用回数(過去5日)',
dataSetUse: 'データセット使用',
dataSetName: 'データセット名',
dataSetTotal: 'データセット統計',
algoTotal: 'アルゴリズム統計',
modelTotal: 'モデル統計',
},
occupation: {
name: 'ユーザー名',
PPU: '現在稼働中加速カード',
CPU: '現在稼働中CPU',
memory: '現在メモリ使用量',
operation: '操作',
RunNoteBook: 'コンテナ',
RunWorkSpace: 'タスクフロー',
RunDeploy: 'APIデプロイ情報',
RunPreprocess: 'プロセッサ実行',
RunAlgorithm: 'アルゴリズム実行',
ConfirmEnableServer: 'このノードを有効にします、よろしいですか?',
ConfirmDisableServer: '該当ノードを無効にしてもよろしいですか?無効にすると、このノードはクラスターのスケジュールされなくなります。すでに実行されているタスクは影響しない。',
MemoryPressure: 'ノードメモリ容量が不足しています。ノードメモリ容量の使用量に注意してください',
DiskPressure: 'ディスク容量が不足しています。ディスク容量の使用量に注意してください',
PIDPressure: 'ノードの実行プロセス最大限に近づいていますので、ノードの実行プロセス数を確認してください',
NetworkUnavailable: 'ノードのネットワーク構成が間違っています、確認してください',
GPUDriverError: 'GPUドライバーに障害がある可能性があります。GPUドライバーが稼働いるかどうかを確認してください',
NetworkHighLaterncy: 'ノードとKubernetes Masterノード間のネットワーク通信遅延が発生しました。クラスターのネットワーク接続を確認してください。',
checkRunning: '実行中のタスクを表示する',
card: 'ード',
serviceHost: 'ノードHost',
acceleratorOccupation: 'アクセラレータカードの職業',
missionInfo: 'タスク情報',
hour: '時間',
day: '日',
minute: '分',
second: '秒',
noCard: '未稼働加速カード',
},
// 推理平台
inference: {
navigator: {
productionModel: '生产模型',
API: 'API服务',
edgeComputing: '边缘计算',
deploymentImage: '部署镜像',
modelTransScript: '模型转换脚本',
returnSpace: '返回系统',
},
productionModel: {
title: '生产模型',
modelName: '模型名称',
quantify: '量化类型',
modelType: '模型格式',
uploadModel: '上传生产模型',
editModel: '编辑生产模型',
modelFile: '模型文件',
noQuantify: 'FP32',
transform: '转换',
conversionDesc: '该模型将被转换为{type} {quantify}格式的模型',
nameRequired: '请输入模型名称',
modelFileRequired: '请选择模型文件',
quantizationRequired: '请选择量化类型',
modelTypeRequired: '请选择模型类型',
conversionModel: '转换模型',
conversionScript: '转换脚本',
targetModelName: '目标模型名称',
targetModelDesc: '目标模型描述',
deleteModelConfirm: '是否删除模型【{name}】?',
conversionScriptRequired: '请选择模型转换脚本',
targetNameRequired: '请输入目标模型名称',
conversionSuccess: '模型转换成功',
fileTypeError: '请选择{type}类型的模型文件',
conversionTip: '仅ONNX格式的模型支持转换',
},
apiService: {
title: 'API服务',
serviceName: 'API服务名称',
createService: '创建API服务',
updateService: '编辑API服务',
basicMsg: '基本信息',
runInstance: '运行实例',
deployImage: '部署镜像',
modelType: '部署模型格式',
resourceSku: '算力规格',
instanceNum: '实例数量',
nodeportTooltip: '端口范围:31000-32767,请勿与其他服务NodePort冲突',
updateStrategy: '更新策略',
minReadySeconds: '在滚动更新过程中新旧实例(Pod)交替时,等待新实例提供服务的最短时长,在此时间后旧实例将停止服务',
maxSurge: '在滚动更新过程中每一轮滚动更新的实例(Pod)数量,如共6个实例,该值设置为2,那么会分三轮更新,每次更新2个实例',
maxUnavaible: '在滚动更新过程中最多允许有多少实例(Pod)处于无法提供服务的状态',
serveTime: '服务时长',
autoScaling: '弹性伸缩',
rollingUpdate: '滚动更新',
instanceName: '实例名称',
restartNum: '重启次数',
onlineTime: '在线时长',
nameRequired: '请输入API服务名称',
imageRequired: '请选择部署镜像',
skuRequired: '请选择算力规格',
nodePortRequired: '请输入NodePort',
replicaRequired: '请输入实例数量',
createSuccess: 'API服务创建成功',
modelRequired: '请选择{name}',
restart: '重新启动',
portError: '端口号范围为 31000-32767',
portExist: '当前端口号已被占用,请重新输入',
restartConfirm: '是否确认启动API服务【{name}】',
startSuccess: 'API服务正在启动',
deleteConfirm: '是否确认删除API服务【{name}】',
stopConfirm: '是否确认停止API服务【{name}】',
scalingSuccess: '弹性伸缩操作成功',
updateContent: '更新内容',
updateSuccess: '滚动更新操作成功',
itemRequired: '请输入{name}',
skuReSelect: '原算力规格已不可用,请重新选择',
imageReSelect: '原部署镜像已不可用,请重新选择',
},
deployImage: {
title: '部署镜像',
createImage: '创建部署镜像',
editImage: '编辑部署镜像',
imageName: '名称',
deployImageName: '部署镜像名称',
deployCode: '部署代码',
nameRequired: '请输入部署镜像名称',
typeRequired: '请选择模型类型',
codeRequired: '请上传部署代码',
deleteConfirm: '是否确认删除部署镜像{name}',
},
conversionScript: {
title: '模型转换脚本',
createScript: '创建转换脚本',
updateScript: '编辑转换脚本',
scriptName: '脚本名称',
originalModelType: '源模型格式',
targetModelType: '目标模型格式',
targetModelQuantify: '目标模型量化',
scriptCode: '脚本代码',
nameRequired: '请输入脚本名称',
targetTypeRequired: '请选择目标模型类型',
targetQuantifyRequired: '请选择目标模型量化',
deleteConfirm: '是否删除转换脚本【{name}】',
codeRequired: '请上传脚本代码',
targetModelTip: '系统将仅保存输出目录中后缀名为 {type} 的文件',
},
},
platform: {
train: '训练平台',
inference: '推理平台',
admin: '管理后台',
userCenter: '用户中心',
resourceCenter: '算力中心',
},
}
module.exports = {
login: {
title: '自主 · 可控 · 全栈',
desc: '人工智能开发平台',
logTitle: '账号登录',
threePartiesLogin: '三方登录',
loginButton: '登\u0020录',
adminPlease: '管理员请至',
backLogin: '系统后台登录',
pleaseInputUsername: '请输入用户名',
pleaseInputPassword: '请输入密码',
pleaseInputCode: '请输入验证码',
format: '长度在8-64位字符之间',
noAgree: '两次密码不一致',
usernameOrPwd: '用户名或密码不正确',
parameterError: 'parameter error',
},
status: {
starting: '启动中',
running: '运行中',
succeed: '成功',
stopping: '停止中',
stopped: '终止',
failed: '失败',
unknown: '未知',
creating: '创建中',
createFailed: '创建失败',
created: '创建成功',
waitUpload: '等待上传',
uploading: '上传中',
uploadFinished: '上传完成',
uploadFailed: '上传失败',
extracting: '解压中',
generating: '生成中',
copyFinished: '拷贝完成',
waitCreate: '等待创建',
unknownError: '未知错误',
ready: '就绪',
converting: '转换中',
conversionFailed: '转换失败',
servicing: '服务中',
stopedService: '已停服',
active: '在线',
lixian: '离线',
weijihuo: '未激活',
},
validator: {
int: '请输入整数值',
minVal: '该字段必须大于{val}',
minValInclude: '该字段必须大于等于{val}',
},
mission: {
termination: '终止',
fail: '失败',
success: '成功',
running: '运行中',
},
overview: {
title: '总览',
commonUsed: '常用',
component: '组件统计',
runningTask: '运行任务统计',
containerDesc: '即开即用的AI开发环境。弹性申请算力资源,在线编写调试AI算法,支持Notebook在线IDE和SSH远程连接',
taskFlow: '任务流',
missionDesc: '通过拖拉拽的方式对数据、模型、算法进行可视化建模,完成训练可视化、模型测试可视化。帮助您简单快速完成AI模型训练及应用',
apiDesc: '一键完成AI模型部署,提供云端API服务。支持在线测试、流量监控、弹性伸缩、 GPU 共享',
more: '了解更多',
running: '运行任务',
},
index: {
hello: '您好!',
quickNavigation: '快速导航',
taskRunNumber: '任务运行数量',
algorithmRunningTime: '算法运行时长',
algorithmRunningFrequency: '算法运行频次',
newDataSet: '新增数据集',
recently: '最近15天',
taskFlow: '任务流',
algorithm: '算法',
unit: '单位:个',
modelComponents: '建模组件',
unitTime: '单位:小时',
unitNum: '单位:次',
},
navigation: {
message: '消息',
changeAdmin: '切换为管理员',
buildTasks: '构建任务',
codeDevelop: '源代码开发',
graphicalOperation: '图形拖拉拽',
toolkit: '工具箱',
modelDeployment: '模型部署',
container: '容器',
dataSet: '数据集',
model: '模型',
algorithm: '算法',
processor: '处理器',
ApiDeployment: 'API部署',
edgeComputing: '边缘计算',
terminalEquipment: '终端设备',
personalCenter: '个人中心',
calculatePowerManagement: '算力管理',
clusterForce: '集群算力',
calculatePowerQuota: '算力配额',
calculatePowerDetail: '算力明细',
accessSecurity: '访问安全',
SSHKey: 'SSH密钥',
developerToken: '开发者Token',
contentManage: '内容管理',
spaceManage: '空间管理',
taskFlowManage: '任务流管理',
runHistoryManagement: '运行历史管理',
containerManagement: '容器管理',
algorithmMangement: '算法管理',
dataSetManagement: '数据集管理',
modelManagement: '模型管理',
processorManagement: '处理器管理',
systemManagement: '系统管理',
userInterface: '用户界面配置',
userManagement: '用户管理',
platformSave: '平台安全',
userWhite: '用户白名单',
mirror: '镜像白名单',
dataDic: '数据字典',
systemSet: '系统设置',
algoForceManage: '算力管理',
overviewCluster: '算力监控',
algoForceType: '算力型号',
clusterAlgoForce: '集群算力',
watchCenter: '监控中心',
logout: '退出登录',
changeFront: '切换前台用户',
userFront: '用户前台',
manageBack: '管理后台',
document: '使用文档',
transmission: '数据传输',
systemConfig: '系统配置',
basicConfig: '基本配置',
userInfo: '用户信息',
myImage: '我的镜像',
deployManage: 'API部署管理',
clusterMonitor: '集群算力监控',
},
space: {
spaceSet: '空间设置',
spaceMember: '空间成员',
mySpace: '我的空间',
createSpace: '创建新空间',
spaceName: '空间名称',
spaceUserName: '用户名称',
tip: '通过创建空间,邀请伙伴一起协作开发算法等',
spaceManagement: '空间管理',
onlyKey: '空间唯一Key',
basicInformation: '基本信息',
spaceDescription: '空间描述',
memberManagement: '成员管理',
userName: '用户名',
memberRole: '成员角色',
edit: '修改',
removeMember: '移除成员',
permissionsManagement: '权限管理',
copy: '允许成员拷贝内容到其他Space',
download: '允许下载数据',
deleteSpace: '删除空间',
confirm: '确定',
cancel: '取消',
delete: '删除',
operation: '操作',
addMember: '添加成员',
normalMem: '普通成员',
editMember: '修改成员',
adminMember: '管理员',
chooseRole: '请选择成员角色',
pleaseAddMember: '请添加成员',
noMoreEight: '字段长度不能超过8',
confirmDeleteMem: '确认移除该成员?',
lookUp: '查找中...',
inputLookUp: '输入以查找用户',
noFind: '未发现匹配用户',
addNewMember: '添加新成员',
confirmDeleteSpace: '确认删除空间?',
noRecover: '空间删除后数据不可恢复!',
searchPlaceholder: '请输入空间名称',
},
pipeline: {
createPipeline: '创建任务流',
pipelineName: '任务流名称',
runHistory: '运行历史',
searchKey: '搜索组件关键词',
workSpace: '工作区',
runPipeline: '运行任务流',
saveTemplate: '保存模板',
createProcessorTemplate: '创建处理器模板',
runName: '运行名称',
startRun: '开始运行',
removeComponent: '删除组件',
copyComponent: '复制组件',
pasteComponent: '粘贴组件',
tip: '填写输入/输出名称即代表启用该节点,输入/输出节点启用数量均不能多余3个',
inputPipelineName: '输入任务流名称',
confirmDelete: '确认删除?',
clear: '删除后,所有此任务流相关的运行数据都将清空',
pipelineDesc: '任务流描述',
confirmDeleteTask: '确认删除任务?',
confirmStopTask: '确认停止正在运行的任务?',
stopPipeline: '停止任务流',
copy: '复制',
que: '排队中',
ongo: '进行中',
opening: '启动中',
clearDataConfirmD: '删除任务流运行历史后,该任务流的节点数据将被清空,确认删除?',
copyPipeline: '复制任务流',
saveModel: '另存模型',
outputFile: '输出文件',
log: '日志',
dataHandle: '数据处理',
lookAllLog: '当前仅显示最新200行日志,若需查看全部日志,请点击',
downloadAllLog: '下载所有日志',
loading: '正在加载...',
noLog: '暂无日志',
noImgTableData: '没有相关图表数据',
save: '保存',
noInclude: '创建模版时,空间中不能包含其他模版',
template: '模板',
lookMore: '查看更多',
packup: '收起',
fromToSame: '节点的输出不能作为同节点的输入',
runOverview: '运行概述',
nodeName: '节点名称',
startTime: '启动时间',
basicInformation: '基本信息',
runTiming: '运行信息',
localUpload: '本地上传',
apiDemo: 'API部署',
apiDemoTip1: '如果您期望以高可用、多实例、弹性扩容的API部署落地生产应用,请使用',
apiDemoTip2: '对模型进行高可用部署',
apiDemoTip: '如果您期望以高可用、多实例、弹性扩容的API部署落地生产应用,请使用API部署对模型进行高可用部署',
remainTimeTip1: '您的API部署将在',
remainTimeTip2: '后自动停止',
savaData: '另存数据',
stopPipelineName: '确认停止任务流【{name}】吗',
},
container: {
name: '名称',
mirror: '镜像',
dataSet: '数据集',
model: '模型',
connectMethod: '连接方式',
connectNotebook: '连接Notebook',
sshLogin: 'SSH登录',
inputContainerName: '输入容器名称',
createContainer: '创建容器',
state: '状态',
unmountDataSet: '未挂载数据集',
unmountModel: '未挂载模型',
launchLog: '启动日志',
event: '事件',
nodeInformation: '节点信息',
launchHistory: '启动历史',
operatior: '操作人',
operatingContent: '操作内容',
result: '结果',
basicNode: '如为分布式多节点任务,以下展示的为连接“主”节点的状态',
lookMetric: '请将events文件写入/kpl/tensorboard目录后在此查看metric',
nodeInstanceNumber: '节点实例数量',
calculateForce: '算力',
assignPermissions: '分配sudo权限',
containerDesc: '容器描述',
noLonger: '如果通过sudo对系统目录进行了修改,容器重启后将无法持久化',
nodeDefined: '节点定义',
acceleratorCard: '加速卡',
memory: '内存',
addDataSet: '添加数据集',
addModel: '添加模型',
mountLocalDisk: '挂载本地磁盘',
mountPath: '挂载路径/kpl/cache',
notice: '在该路径下读取数据可以优化IO。注意:该目录下的数据在容器停止后不会持久化',
addNewNodeInstance: '增加一组新的节点实例',
lookFree: '查看集群空闲算力',
openPort: '开启5050端口',
watchPort: '端口开启后可从外网访问容器中监听5050端口的服务',
pleaseInput: '请输入',
pleaseChoose: '请选择',
compileMirror: '编译镜像',
schedulingMachine: '调度机器',
schedulingSuc: '调度成功',
containerInit: '容器初始化',
pullMirror: '节点拉取镜像',
nowRunning: '正在运行',
fail: '失败',
stoping: '停止中',
openContainer: '启动容器?',
confirmStopContainer: '确认停止容器',
confirmDeleteContainer: '确认删除容器',
noEvent: '暂无事件',
evetnGetting: '事件获取中...',
secKey: '密钥',
remoteAccess: '远程访问',
containerNoOpen: '容器未启动',
linux: 'Linux和Mac用户需先修改密钥文件权限',
remoteCopy: '远程拷贝',
perform: '执行',
data: '数据',
noKnowCard: '未知卡类型',
editContainer: '编辑容器',
pleaseInputContainerName: '请输入容器名称',
inputKeyName: '输入密钥名称',
createDownloadKey: '创建并下载密钥',
inputNodeNum: '请输入节点实例数量',
clusterFree: '集群空闲算力',
createKey: '创建新的密钥对',
chooseKey: '选择已有密钥对',
inputNewKeyName: '请输入新的密钥名称',
noUseSpeed: '不使用加速卡',
keyRepeat: '密钥名称重复,请修改名称',
autoCreateKey: '已为您自动创建并下载密钥,请查收',
createSuc: '容器创建成功',
createFail: '容器创建失败,请稍后重试',
updateSuc: '容器更新成功',
noDesc: '暂无描述',
maxTwo: '最多可添加2个数据集',
beyond: '您申请的算力总量可能超出了当前集群空闲算力数量',
cpuRequire: 'CPU需求',
clusterLeisure: '集群空闲',
memoryRequire: '内存需求',
iscontinue: '仍然继续?',
continueSubmit: '继续提交',
startImmediate: '立即启动',
proxyPort: '代理端口',
containerProxyPort: '暴露容器代理端口',
exposePort: '暴露端口号',
portPlaceholder: '请输入要暴露的端口号',
proxyPortError: '请输入正确的端口号,端口号范围1000-50000',
proxyPortStep1: '在本地Shell中执行以下命令',
proxyPortStep2: '本地浏览器打开',
dataTips: '代码和数据请放在HOME(/home/kpl/)目录下,否则容器重启后数据将会丢失!',
startTime: '启动时间',
stopTime: '停止时间',
startUser: '启动人',
stopUser: '停止人',
stopMethod: '停止方式',
customStop: '手动停止',
errorStop: '异常停止',
usedGpu: '消耗算力时',
errorMsg: '异常信息',
batchCopyFail: '创建拷贝容器任务{total}个,失败{failed}个,您可以到<span style="color: #409EFF; cursor: pointer" onclick="lookList()">传输列表</span>查看拷贝进度。',
batchCopySuc: '创建拷贝容器任务{total}个,您可以到<span style="color: #409EFF; cursor: pointer" onclick="lookList()">传输列表</span>查看拷贝进度。',
copyContainer: '容器拷贝中,您可以到<span style="color: #409EFF; cursor: pointer" onclick="lookList()">传输列表</span>查看拷贝进度。',
runningContainerNoCopy: '正在运行的容器不支持拷贝',
sshusername: '密钥所属',
chooseMirrorList: '选择镜像',
resetChoose: '重新选择',
custom: '自定义',
confirmRunContainer: '确认启动容器【{msg}】?',
chooseNode: '选择调度节点',
nodeHost: '节点host',
allocateNoEnough: '您申请的算力总量可能超出了选择节点空闲算力数量',
keepDefault: '如无特殊需要,保持默认即可。',
dataDelete: '数据已被删除',
distributeContainer: '分布式容器暂不支持按显存调度,请重新配置第{msg}个节点',
},
dataSet: {
dataSetName: '数据集名称',
dataSetSize: '大小',
state: '状态',
dataSetLabel: '标签',
uploadDataSet: '上传数据集',
inputDataSetName: '输入数据集名称',
createMark: '创建标注',
dataSetDesc: '数据集描述',
isMarkDataSet: '标注数据集',
importMethod: '导入方式',
localUpload: '本地上传',
KS3: '网络URL导入',
root: '请确保数据集压缩包的根目录仅包含大小写字母、数字、中下划线',
pleaseInput: '请输入',
pleaseChoose: '请选择',
compression: '只支持.zip、.tar 和 .tar.gz压缩格式,系统将自动解压',
dataField: '数据字段',
metadata: '元数据',
key: '键(key)',
value: '值(value)',
example: '元数据一般由处理器或算法生成。可供算法代码等根据键读取元数据的值。如:将数据集的标签类别名称记录在元数据中',
handleAddRecord: '手动添加记录',
exist: 'key如果已经存在,会覆盖原来的value',
allImage: '全部图片',
marked: '已标注',
marking: '标注中',
publishing: '发布中',
noMark: '未标注',
markType: '标注类型',
markMethod: '标注方式',
commitMark: '提交标注',
continue: '标注提交后将转换为可用数据集,是否继续?',
deleteMark: '删除标注',
editLabel: '编辑标签',
editMarkLabel: '在下方输入框中修改标注标签',
enterConfirm: '每输入一个标签后按回车/空格键确认,标签在20个字符以内,只支持字母、数字、"_"和"-"',
nameExit: '数据集名称已重复',
dataType: '数据类型',
dataTypeNull: '数据类型不能为空',
markNull: '标注类型不能为空',
markMethodNull: '标注方式不能为空',
url: '资源URL',
accessKey: '如果有,请输入您的Access Key',
secretKey: '如果有,请输入您的Secret Key',
pleaseUploadDataSet: '请上传数据集',
nameNull: '数据集名称不能为空',
urlNull: '资源Url不能为空',
formatError: '您的格式不正确,请重新输入',
all: '全部',
editDataSet: '编辑数据集',
inputDesc: '请输入描述',
pleaseInputDataSetName: '请输入数据集名称',
editSuc: '数据集编辑成功',
ready: '就绪',
uploading: '上传中',
uploadFailed: '上传失败',
copyFailed: '拷贝失败',
noSupportCopy: '未就绪状态的数据集不支持拷贝!',
noUploadCopy: '正在上传中的数据集不支持拷贝!',
allDataSet: '所有数据集',
confirmDeleteParam: '确认删除该字段么?',
continueMark: '继续标注',
uploadFor: '上传于',
createMarkDataSet: '新建标注数据集',
noImpact: '会新建一个数据集用于标注,不影响原数据集内容',
lookProgress: '新的标注数据集在创建中,请在消息通知窗口中查看进度',
scalarValue: '可以为标量值,如:1,“1”,1.11\n复杂结构以YAML格式填写:如:\ncat: 1\ndog: 2\nperson: 3',
downloadDesc: '数据正在导出,请到数据传输列表下载数据',
serializedDataset: '序列化数据集',
originalDataset: '原始数据集',
dataSetType: '类型',
image: '图片',
text: '文本',
audio: '音频',
video: '视频',
other: '其他',
theDataSetType: '数据集格式',
amountTo: '共计',
notAllowDownload: '空间不支持下载数据',
},
model: {
modelName: '模型名称',
modelSize: '大小',
inputModelName: '输入模型名称',
uploadModel: '上传模型',
modelDesc: '模型描述',
localUpload: '本地上传',
root: '如上传压缩包,请确保压缩包的根目录只包含大小写字母,数字及中下划线',
inputModelDesc: '请输入模型描述',
compression: '上传单个文件或压缩包,压缩包格式支持.zip、.tar 和 .tar.gz,系统将自动解压',
fileLook: '文件浏览',
file: '文件',
size: '大小',
updateTime: '更新时间',
modelNameNull: '模型名称不能为空',
modelNameError: '模型名称输入错误',
pleaseUploadModel: '请上传模型',
chooseTarget: '请选择拷贝的目标空间',
},
algorithm: {
algorithmName: '算法名称',
algorithmLabel: '算法标签',
inputAlgorithmName: '输入算法名称',
updateAlgorithm: '更新算法',
installAlgorithm: '安装算法',
algorithmDesc: '算法描述',
algorithmFramework: '算法框架',
algorithmCodeBag: '算法代码包',
uploadCode: '上传代码',
root: '请确保算法代码包的根目录仅包含大小写字母、数字、中下划线',
compression: '只支持.zip、.tar和.tar.gz压缩格式,系统将自动解压',
updateNote: '更新备注',
basicInformation: '基本信息',
envParameter: '环境参数',
superParameter: '超参数',
framework: '框架',
version: '版本',
reupload: '重新上传',
algoNameNull: '算法名称不能为空',
chooseUse: '请选择使用的框架',
pleaseUploadCode: '请上传代码',
inputUpdateNote: '请输入更新备注',
algoUpdateSuc: '算法更新成功',
algoEditSuc: '算法编辑成功',
algoUploadSuc: '算法上传成功',
editAlgo: '编辑算法',
pleaseInputAlgoName: '请输入算法名称',
useSay: '使用说明',
algoInfo: '算法信息',
configInfo: '配置信息',
train: '训练',
test: '测试',
reason: '批量推理',
deploy: 'API部署',
noFindFile: '解压后未找到文件',
successAnalysis: '成功解析代码中的environment.yml和parameter.yml配置信息,请继续参数配置完成算法安装',
forceConfig: '算力配置',
superConfig: '超参数配置',
userControl: '配置用户可调的超参数',
pleaseUploadAlgoCode: '请上传算法代码包',
pleaseInputNote: '请输入备注',
anliaSuccess: '成功解析代码中的environment.yml和parameter.yml配置信息,请继续参数配置完成算法安装',
noFindOwnFile: '解压后未找到文件',
compileSDK: '编译SDK',
setUpAlgoSuccess: '安装算法成功',
name: '名称',
type: '类型',
nickName: '别名',
pleaseInputParamName: '请输入参数名称',
pleaseInputParamDesc: '请输入对参数的描述',
chooseParam: '从parameter.yml选择超参数字段',
addParam: '添加参数',
paramInfor: '参数信息',
versionRecord: '版本记录',
updatePerson: '更新人',
yamlError: 'yaml解析异常',
dataError: '数据异常',
completeConfig: '该算法未配置任何可调超参数,如有需要请联系算法作者进行配置',
saveSuc: '保存成功',
algoNameExist: '算法名称已存在,请重新输入',
fileNoFivety: '文件大小不能超过50MB,请重新上传',
completeInfo: '请完善信息',
pleaseUpRight: '请上传正确的算法代码包',
allAlgo: '所有算法',
cmd: '执行命令',
notPermissionCard: '您未配置【{msg}】型号的加速卡,请选择其他加速卡',
notPermissionSsh: '您未配置SSH的密钥对',
},
processor: {
processorName: '处理器名称',
processorVersion: '处理器版本',
updateTime: '更新时间',
inputName: '输入处理器名称',
},
ApiDeployment: {
apiName: 'API名称',
belong: '所属任务流',
state: '状态',
stopDeployment: '停止部署',
instanceNumber: '实例数量',
running: '运行中',
error: '异常',
serviceError: '服务异常',
basicSet: '基本设置',
serviceCreateFrom: '服务创建于',
correspondingTaskFlow: '对应任务流',
correspondingTask: '对应任务',
configInformation: '配置信息',
instanceConfig: '实例配置',
stopPattern: '停止模式',
callUrl: '调用URL',
permissionToken: '鉴权token',
copyPermissionToken: '复制鉴权token',
testApi: 'API测试',
localUploadImage: '本地上传图片',
mobileTest: '移动端测试',
imageFormat: '只能上传.jpg 和 .png格式的图片,文件大小不超过5MB。',
backInformation: '上传图片获取反馈信息',
scanCodeTest: '使用手机微信、浏览器等扫码后,可通过手机端进行API测试',
onlinePlayL: '在线演示',
callPython: 'Python调用',
confirmStopDep: '确认停止API部署?',
stopSuc: '停止成功',
stopFail: '停止部署失败,请稍后再试!',
copySuc: '复制成功',
allDep: '所有部署',
copyFail: '复制失败',
stoped: '已停止',
createApiDeploy: '创建API部署',
inputApiDeployName: '输入API部署名称',
editApiDeploy: '编辑API部署',
apiDeployName: 'API部署名称',
supportCJEN: '仅支持2-64个字符,允许中日英文数字空格.-: ()[]{}',
chooseAlgo: '选择算法',
chooseModel: '选择模型',
apiDeployNameNull: 'API部署名称不能为空',
apiDeployEditSuc: 'API部署编辑成功',
startApi: '启动API',
deleteNotCover: '删除后将不可恢复',
stopRestart: '停止后您还可以重启恢复该API部署',
pleaseInputApiDeployName: '请输入API部署名称',
pleaseChooseModel: '请选择模型',
pleaseChooseAlgo: '请选择算法',
stopApiDeploy: '停止API部署',
apiRunTime: '运行时间',
algoForceResource: '算力资源',
usedAlgoForceCard: '消耗算力时',
runInfor: '运行信息',
nodeOutPut: '节点输出',
onlineApiPlay: '在线API演示',
editAppId: '修改AppID',
careEdit: '警告:修改AppID会对正在使用该API的程序造成无法正常调用,请谨慎修改。',
pleaseInputAppId: '请输入AppID',
AppIdNull: 'AppID不能为空',
supportfourT: '仅支持4-36个字符,允许英文数字-_',
AppIdEditSuc: 'AppID修改成功',
confirmDeleteApi: '确认删除{msg}吗?',
confirmStopApi: '确认停止{msg}吗?',
deployFormatLength: '仅支持2-64个字符',
deployFormatSymbol: '只支持中日英文、数字、空格和.:-_()[]{}',
apiNameRepeat: 'API部署名称已重复',
appIdRepeat: 'AppID已重复,请重新输入',
noDesc: '无描述',
function: '功能',
startFail: 'API启动失败',
moreLookLog: '更多信息请查看日志',
noRun: '未运行',
noStart: '未启动',
},
edge: {
regEquipment: '注册设备',
equipmentCode: '设备码',
equipmentName: '设备名称',
platformInfor: '平台信息',
regPerson: '注册人',
state: '状态',
regTime: '注册时间',
desc: '描述',
operation: '操作',
confirm: '确定',
regSomeDevice: '程序包中有您的授权信息,请不要拷贝给其他人。该程序包可复用于注册若干设备,注册的设备在当前空间的设备列表中可见。',
downAgent: '1. 下载agent程序包,拷贝到设备上解压后,在shell中执行`agent`启动边缘端服务。',
findInitDevice: '2. 在启动输出中找到初始化设备码(device_uuid),您可以据此设备码在云端找到对应设备,并维护该设备的名称和描述。再次启动时设备码不会重复初始化。',
SDKonly: 'SDK唯一标识设置后将不可更改',
storageFile: '库文件',
uploadStorageFile: '上传库文件',
modelFile: '模型文件',
modelRelyFile: '模型依赖文件',
uploadModelRelyFile: '上传模型依赖文件',
uploadModelFile: '上传模型文件',
lookEvent: '查看事件',
setTime: '安装时间',
unloadSDK: '卸载SDK',
inputEquitName: '输入设备名称',
noSetName: '未设置名称',
leaveLine: '离线',
onLine: '在线',
openEdge: '打开终端',
installSDK: '安装SDK',
confirmDeleteDevice: '确认删除设备?',
editDevice: '编辑设备',
inputDeviceName: '请输入设备名称',
deviceDesc: '设备描述',
inputDeviceDesc: '请输入设备描述',
updateSDK: '更新SDK',
onlyLabel: '请设置SDK唯一标识',
oneSix: '仅支持1-64个字符',
EnglishNum: '允许英文数字中划线、下划线',
returnResult: '正在执行指令,请等待返回。您也可以在SDK事件中查看返回结果。',
prop: '请输入属性名',
inputDefault: '请输入默认值',
identity: 'identity重复',
listSDK: 'SDK安装列表',
uninstall: '卸载',
installIng: '安装中',
installFail: '安装失败',
installSuc: '安装成功',
uninstallFail: '卸载失败',
uninstallEd: '已卸载',
noRoot: '您没有SDK卸载权限',
confirmUninstall: '确认卸载SDK【{msg}】吗?',
eventStatus: '事件状态',
librayFileRequired: '请上传库文件',
modelFileRequired: '请上传模型文件',
relySDK: '依赖SDK',
createSdkPipeline: '创建SDK Pipeline',
editSdkPipeline: '编辑SDK Pipeline',
deleteSdkPipeline: '删除SDK Pipeline',
checkPipeline: '查看SDK Pipeline',
baseTemplate: '基于模板创建',
param: '参数',
instanceId: '实例ID',
instanceType: '类型',
createInstance: '创建运行实例',
check: '查看',
identityRequired: '请输入identity',
editSuccess: 'SDK Pipeline修改成功',
release: '释放',
releaseInstance: '释放实例',
releaseWarning: '释放实例将导致正在调用该实例的应用出现异常,请谨慎释放实例',
releaseSuccess: '释放成功',
deletePipeline: '删除SDK Pipeline后数据不可恢复,是否继续?',
pipelineWarning: '当前Pipeline有运行实例正在使用,请释放后再执行操作',
sdkUpdateSuccess: 'SDK 更新成功',
deleteSdk: '卸载SDK',
deleteSdkWarning: '当前SDK已被SDK Pipeline或运行实例绑定,请解绑后再进行卸载',
sdkPipeline: 'SDK Pipeline',
runInstance: '运行实例',
operateLog: '操作日志',
waitMessage: '正在等待执行结果,超时时间30S',
dontClose: '请勿关闭窗口',
selectTemplate: '请选择模板',
inputParam: '请输入参数信息',
haveSameIdentity: '请勿包含相同identity',
parseError: '参数解析失败,请检查格式',
},
clusterforce: {
service: '节点Host',
free: '当前空闲算力',
total: '总算力(可被调度部分)',
},
calPQ: {
useLimit: '使用上限',
current: '当前占用',
currentUse: '当前可用算力时(核*时)',
totalGet: '累计获取算力时(核*时)',
totalCost: '累计消耗算力时(核*时)',
speedCard: '加速卡',
useType: '可用型号',
coefficient: '算力系数',
cardHour: '卡*时',
GBHour: 'GB*时',
centerHour: '核*时',
memory: '内存',
useForce: '当前可用算力时',
getForce: '累计获取算力时',
costForce: '累计消耗算力时',
card: '卡',
ct: '核',
},
hashrateQuota: {
totalCost: '总消耗明细',
totalGet: '总获取明细',
time: '时间',
use: '算力用量',
note: '备注',
forceHour: '算力时',
getMethod: '获取方式',
takeUp: '算力占用',
hashrateLimit: '算力卡使用上限',
costHashrate: '消耗算力卡',
task: '任务',
getHashrate: '获取算力卡',
takeUpTitle: '任意时刻,您的累计算力卡使用速率不能超过该上限',
},
SSHKey: {
SSHName: '密钥对名称',
},
developer: {
tokenName: 'Token名称',
authorSpace: '授权空间',
newtoken: '生成新Token',
},
myImage: {
addMirror: '添加镜像',
errorAdress: '错误的镜像地址,不允许创建',
},
public: {
all: '全部',
today: '今天',
week: '近1周',
oneMonth: '近1个月',
threeMonth: '近3个月',
chooseDate: '选择日期',
founder: '创建人',
createTime: '创建时间',
operation: '操作',
confirm: '确定',
cancel: '取消',
delete: '删除',
desc: '描述',
more: '更多',
editor: '编辑',
launch: '启动',
stop: '停止',
download: '下载',
finish: '完成',
copy: '拷贝',
noData: '暂未搜索到相关数据',
jump: '前往',
page: '页',
name: '名称',
prompt: '提示',
member: '成员',
operationFail: '操作失败',
fail: '失败',
loadData: '下载数据',
success: '成功',
inputNum: '请输入1-99之间的整数',
allowScope: '允许数量范围1-99',
nameExit: '名称已存在,请输入新名称',
chooseMirror: '请选择镜像',
reInput: '您输入的信息有误,请重新输入',
userNameLength: '用户名长度在2-64位字符之间',
passwordLength: '密码长度在8-64位字符之间',
include: '必须包含大写字母,小写字母和数字',
paramNull: '该字段不能为空',
lengthNoTwo: '字段长度不能少于2位',
lengthNoSixFour: '字段长度不能超过64位',
emailFormat: '邮箱格式输入有误,请重新输入',
onlyInputNum: '只能输入数字类型的值,请重新输入',
confirmName: '确认名称',
fileMoreThree: '文件数量可能超出300个,最多显示300个文件',
noOpenFile: '无法打开此类型文件',
noOpenTerminal: '仅运行中的节点可打开终端',
overviewOf: '概览',
fileMoreFive: '文件大于5MB',
rechooseImg: '请重新选择图片上传',
formula: '消耗算力时 = 算力数量 * 算力系数 * 时间',
back: '退还',
recharge: '充值',
bornToken: '生成Token',
saveToken: '请妥善保存Token,关闭后将不再可见',
close: '关闭',
noFindToken: '未找到可用Token',
soonBornToken: '立即生成新Token',
listNull: 'token列表为空',
deleteTokenSuc: '删除token成功',
copyBackOpen: '{type}拷贝中,您可以到传输列表查看拷贝进度',
modelFile: '模型文件',
editSuc: '编辑成功',
editFail: '编辑失败',
deleteNoRecover: '删除后不可恢复',
return: '返回',
fontUserLogin: '前台用户登录',
inputNamePassword: '请输入用户名和密码',
no: '无',
systemProcessor: '系统处理器',
adminBack: '平台管理后台',
supportPng: '支持.png格式',
imgSay: '说明:图片尺寸不超过140px*140px;为保证水印效果,请上传黑色、深色、或颜色鲜艳的图片',
waterMarkPreview: '水印预览',
imgWaterMark: '图片水印',
uploadWI: '请上传水印图片',
resetSuc: '重置成功',
createUser: '创建用户',
normal: '正常',
password: '密码',
type: '型号',
uploadFile: '上传文件',
enable: '启用',
unenable: '停用',
white: '白名单',
create: '创建',
deleteSuc: '删除成功',
editReupload: '修改并重新上传',
nuclear: '核',
resourceO: '资源',
shelve: '上架',
underShelve: '下架',
newAdd: '新增',
speedUserTake: '加速卡用户占用',
freedom: '空闲',
monitorCenter: '监控中心',
firstLogin: '这是您首次登录,请修改密码',
confirmEdit: '确认修改',
inputNewPassword: '请输入新密码',
mustInclude: '必须包含大写字母,小写字母和数字,只支持英文特殊符号及中划线下划线',
againInputPassword: '请再次输入新密码',
passwordEditF: '密码修改失败',
returnSpace: '返回空间',
confirmChange: '确认切换当前所在空间?',
uploadTaskStop: '您正在上传的任务将会被终止',
confirmUnlog: '确认退出登录么?',
KS3import: 'KS3导入数据集',
localUploadDataSet: '本地上传数据集',
localUploadModel: '本地上传模型',
uploadProcessor: '上传处理器',
saveDateSet: '保存数据集',
saveModel: '保存模型',
downloadDataSet: '下载数据集',
copyDataSet: '拷贝数据集',
copyModel: '拷贝模型',
copyAlgo: '拷贝算法',
createMarkDataSet: '创建标注数据集',
finishMark: '完成标注',
downloadData: '下载数据',
importing: '正在导出,请稍候...',
uploading: '正在上传,请耐心等候...',
createing: '创建中...',
search: '搜索...',
systemInit: '系统初始化设置',
initAdmin: '初始化超级管理员',
finishInit: '完成初始化',
confirmPassword: '确认密码',
confirmLeavePage: '确认离开当前页面么',
buildSpacConnect: '正在建立空间链接',
welcome: '欢迎回到',
platform: '平台',
inputRunName: '输入运行名称',
runUser: '运行用户',
startTime: '开始时间',
finishTime: '结束时间',
noFinish: '未结束',
unknown: '未知',
stopPipeline: '停止任务流后不可恢复运行,继续停止?',
secondStop: '任务会在几秒后停止...',
imageTable: '图表',
besideSave: '另存数据集',
output: '输出',
dataSetA: '数据集属性',
runTimeLong: '运行时长',
restTime: '剩余时长',
caling: '正在计算',
wait: '等待',
besideS: '另存',
dataDownload: '数据下载',
downloadFileType: '下载文件类型',
param: '字段',
chooseDownload: '请选择要下载的字段',
requestSuc: '请求成功,请在消息中查看下载',
noMoreThanThree: '输入/输出节点数量不能多于3个',
templateName: '模板名称',
templateDesc: '模板描述',
templateSaveSuc: '模板保存成功',
push: '丢失',
show: '展开',
highLevel: '高级',
noCompile: '处理器内部函数无法解析',
resetInit: '参数将全部重置为初始值,是否继续?',
dragChange: '拖至此处以替换此组件',
noNeedSpeed: '不需要加速卡',
reStart: '编辑后需要重启容器生效',
update: '更新',
require: '需求',
newCreateMark: '新建标注',
getImgData: '正在获取图像数据',
dataSetMark: '数据集标注',
commitChangeUse: '标注提交后将转换为可用数据集,是否继续?',
noImg: '非图片数据',
pleaseInputLabelName: '请输入标签名称',
editSave: '编辑的标签有重复,请先修改再保存',
inputError: '输入格式不正确,只支持字母、数字、日语、"_"和"-"',
noImgnoMark: '非图片数据,无法标注',
allImg: '全部图片',
markLable: '标注标签',
difficult: '是否为难例',
clickUpload: '点击或拖拽上传处理器文件',
processorFile: '处理器文件',
handleStop: '手动停止',
memberUserName: '成员用户名',
pleaseInputSpaceDesc: '请输入空间描述',
noMoreThirty: '字段长度不能超过30',
formatCJE: '只支持中日英文、数字、空格和.:-_()[]{}',
formatTwoSix: '仅支持2-64个字符,允许中日英文数字空格.-:()[]{}',
nameInputError: '名称输入错误',
deleteError: '删除失败',
node: '节点',
cjeNoMoreThrity: '中日英文、数字、中下划线,长度不超过30',
distribute: '分布式计算',
open: '开启',
clusterNodeNum: '集群节点数量',
pleaseInputKey: '请输入密钥',
nameUsed: '您输入的名称已被使用,请重新输入',
inputRightNum: '请输入正确的数量',
checkCpuNum: '请检查CPU数量,数量范围0-999',
inputMemoryNum: '请输入内存数量,数量范围0-9999',
loadSSH: '请先下载密钥',
chooseSSH: '请选择密钥',
inputDataName: '输入数据名称',
noFindeResult: '找不到任何结果',
noOption: '没有可选选项',
noFindeData: '没有找到相关数据',
loadingCenter: '加载中',
nofindUseData: '未发现可使用数据',
groupNoOption: '该组内没有任何可选项',
handleing: '处理中...',
onlyUpload: '只能上传',
formatFile: '格式文件',
iKnow: '我知道了',
highLevelSet: '高级设置',
twiceDev: '二次开发设置',
onlyIndexNode: '二次开发时用于唯一索引节点',
regular: '*满足正则[A-Za_0-9-]+',
look: '查看',
play: '播放',
markParam: '标注字段',
colour: '渲染形式',
imgIn: '图内注释',
imgBeside: '图外注释',
fileListNull: '该文件列表为空',
permitToken: '授权Token',
confirmDeleteToken: '确认删除API授权Token',
hit: '隐藏',
showDisplay: '显示',
waterMark: '水印',
createNewRole: '创建新角色',
confirmDeleteSSH: '确认删除该密钥吗',
upNoMoreEight: '大小写字母、数字、中划线,不超过8位',
supportCJE: '只支持中日英文、数字、中下划线',
checkFile: '正在校验文件,请稍后在消息窗口查看上传进度',
handleData: '处理数据',
twoSixFour: '名称长度需在2-64位之间',
num: '第',
gNode: '个节点',
noKnowType: '未知类型',
onlySupportTwo: '仅支持2-64个字符,允许中日英文数字空格.-: ()[]{}',
noFindDataAttr: '未发现相关数据属性内容',
waitRunDataAttr: '待运行获取数据属性',
onlyInclude: '只能包含大小写字母、数字、中下划线',
noFindePage: '无法找到该页面',
youCan: '您可以',
returnHome: '回到主页',
addLabelMark: '您需要添加标签后,才能进行标注',
Esc: '按 ESC 取消绘制',
dataAttr: '数据属性',
one: '一',
two: '二',
three: '三',
four: '四',
five: '五',
six: '六',
seven: '日',
monthOne: '一月',
twoMonth: '二月',
monthThree: '三月',
fourMonth: '四月',
fiveMonth: '五月',
sixMonth: '六月',
sevenMonth: '七月',
eightMonth: '八月',
nineMonth: '九月',
tenMonth: '十月',
elevenMonth: '十一月',
twelveMonth: '十二月',
pleaseInputOperator: '请输入操作人',
refernceApi: '请参考API调用示例查看如何使用AppID',
operationTime: '操作时间',
startCon: '启动容器',
stopCon: '停止容器',
delCon: '删除容器',
updateCon: '更新容器',
createTemplate: '创建模版',
allTemplate: '创建模板后,您可以将整个模板当做一个节点在任务流中使用',
opnNumNoT: '填写输入输出名称即代表启用该节点,输入/输出节点启用数量均不多于3个',
threeIONode: '模板最多包含三个输入输出节点',
waitCen: '等待中',
shareMemoryUse: '容器可用共享内存(Shared Memory)= 申请的内存 * 共享内存比例。一般情况下不推荐修改该默认值。',
noDescContent: '无描述内容',
pleaseInputInName: '请填写输入名称',
pleaseInputOutName: '请填写输出名称',
uploadImage: '上传图片',
clickUploadImage: '点击上传图片',
pngJpg: '只支持上传.jpg 和 .png格式的图片',
MB5: '文件大小不超过5MB',
watchNode: '监控节点',
deleteDataset: '删除数据集',
dataSetNoCover: '数据集删除后不可恢复!',
inputDeleteDataset: '请输入数据集名称',
deleteModel: '删除模型',
modelNoCover: '模型删除后不可恢复!',
inputDeleteModel: '请输入模型名称',
deleteAlgo: '删除算法',
algoNoCover: '算法删除后不可恢复',
inputDeleteAlgo: '请输入算法名称',
nodenum: '第[{num}]个节点',
deleteDatasetName: '请输入数据集名称:',
deleteModelName: '请输入模型名称:',
deleteAlgoName: '请输入算法名称:',
confirmDeleteD: '确认删除?',
browserPrompt: 'Chrome浏览器产品兼容性及浏览体验更好,推荐使用 Chrome 打开',
yamlFormatError: 'yaml格式错误,请正确填写',
ApiExample: 'API调用示例',
allContainer: '所有容器',
proportion: '比例值必须大于{msg1},小于{msg2}',
fileNameTest: '文件名只能包含字母、数字、下划线、中划线和小数点',
notRemind: '我知道了不再提示',
notHaveData: '暂无数据',
year: '年',
month: '月',
day: '天',
hour: '小时',
minute: '分钟',
second: '秒',
status: '状态',
edit: '修改',
fileTypeError: '文件类型错误,请重新上传',
goDownload: '去下载',
upload: '上传',
saveSuccess: '保存成功',
otherAdminUpload: '其他管理员正在上传文档,请等待。',
cmdToolTip1: '用于调试的内置命令',
cmdToolTip2: 'block:类似sleep的阻塞命令,使用方法为`block && <原启动命令>`',
cmdToolTip3: 'resume:结束block。一般在完成容器调试后在terminal中使用',
monitor: '监控',
normalConfig: '常规配置',
customConfig: '自定义配置',
compute: '运行1小时需要{msg}算力卡',
costCalculateCard: '消耗算力卡',
startOrder: '启动命令',
},
copy: {
copyToSpace: '拷贝到空间',
fontAutoAdd: '拷贝',
autoAddBack: '到空间,如名称已存在会自动添加后缀',
},
transmission: {
missionName: '任务名称',
missionType: '操作类型',
missionObj: '操作对象',
operatior: '操作人',
deleteTip: '数据删除后将不可恢复,是否继续?',
},
//* ****************************************后台 */
spaceManage: {
createTime: '创建时间',
to: '至',
chooseDate: '选择日期',
onlyKey: '空间唯一Key',
founder: '创建人',
spaceName: '空间名称',
lookMember: '查看成员',
userName: '用户名',
role: '角色',
timeInSpace: '加入空间时间',
member: '成员',
deleteTip1: '空间存在正在运行的任务,请先停止后再操作删除',
deleteTip2: '空间存在正在进行的上传任务,无法删除',
},
taskFlowManage: {
space: '空间',
createTime: '创建时间',
taskFlowName: '任务流名称',
spaceName: '空间名称',
onlyKey: '空间唯一Key',
},
runHistoryManage: {
space: '空间',
runHistoryName: '运行历史名称',
},
containerManage: {
lastRun: '上次运行时间',
containerName: '容器名称',
},
algoManage: {
algoName: '算法名称',
},
dataSetManage: {
dataSetName: '数据集名称',
dataSetSize: '数据集大小',
},
modelManage: {
modelName: '模型名称',
modelSize: '模型大小',
},
pretreatManage: {
pretreatName: '处理器名称',
pretreatVersion: '处理器版本',
updateTime: '更新时间',
},
userInterface: {
platformVersion: '当前版本',
platformName: '平台名称',
inputPlatformName: '请输入平台名称',
confirm: '确定',
logo: '平台LOGO',
recommendSize: '推荐尺寸:高48px*宽320px(如尺寸为非推荐尺寸会自适应显示,LOGO最高显示48px,宽度自适应)',
pageWaterMark: '页面水印',
inputWaterMark: '请输入水印文字',
textWaterMark: '文字水印',
reset: '重置',
uploadImg: '请先上传图片',
setSuccess: '设置成功',
setFail: '设置失败',
platformSuc: '平台名称设置成功',
platformFail: '平台名称设置失败',
web: '网站',
add: '添加',
clickDragAdd: '点击/拖拽至此添加水印LOGO',
clickDragEdit: '点击/拖拽至此修改网站LOGO',
manual: '使用手册',
menuSet: '菜单配置',
addMenu: '新增菜单',
editMenu: '编辑菜单',
menuName: '菜单名称',
menuAddress: '网页地址',
menuJS: '处理方法',
namePlaceholder: '请输入菜单名称',
addressPlaceholder: '请输入网页地址',
deleteWarning: '菜单删除后不可恢复,是否继续?',
revoke: '撤销',
isDownloadDoc: '确认下载使用文档【{msg}】?',
uploadWarning: '仅支持.zip、.tar和.tar.gz压缩格式,且解压后须包含doc和source文件夹。',
compress: '解压中...',
},
adminManage: {
regTime: '注册时间',
userName: '用户名',
spaceNum: '空间数量',
regOrgin: '注册来源',
finalLog: '最后登录时间',
state: '状态',
note: '备注',
operation: '操作',
set: '设置',
email: '邮箱',
shareMemory: '共享内存比例',
configForce: '配置算力',
add: '添加',
delete: '删除',
configForceType: '配置算力型号',
speedCard: '加速卡',
useLimit: '使用上限',
center: '核',
memory: '内存',
cancel: '取消',
rechargeForceTime: '充值算力时',
addForceTime: '在用户现有算力卡基础上增加新的算力卡',
cardTime: '卡*时',
centerTime: '核*时',
GBTime: 'GB*时',
lookForce: '查看算力概要',
forbidden: '禁止访问',
recover: '恢复访问',
confirmRecover: '确认恢复访问么?',
newPassword: '新密码',
resetPassword: '重置密码',
inputConfirm: '请输入确认密码',
confirmNew: '确认新密码',
inputPassword: '请输入密码',
confirmForbidden: '确认禁止访问吗?',
operationSuc: '操作成功',
passwordNo: '两次密码不一致',
card: '卡',
deleteUser: '用户删除后不可恢复,是否继续?',
createUser: '创建用户',
createUserFrom: '从{from}创建用户',
batchCreateUser: '批量创建用户',
batchConfigForceType: '批量配置算力型号',
batchRechargeForceTime: '批量充值算力时',
userTemplate: `批量创建格式说明:
1、用户名和密码为必填信息
2、用户名:支持中英日文,最长不超过32个字符
3、密码:必需包含大小写字母和数字,长度在8-64位之间
注:请勿修改模板内容,否则会导致信息读取错误
*用户名称, *密码, 邮箱, 备注
示例:张三, 实例:ZhangSan123, 实例:123456789@163.com, 这里填写用户备注信息`,
uploadFile: '上传文件',
userNumber: '用户',
startCreate: '开始创建',
downloadTemplate: '下载模板',
batchCreate: '批量创建',
fileError: '请上传csv格式文件',
remainResource: '剩余算力时',
shareRate: '内存共享比例',
autoRecharge: '自动充值',
rechargeTime: '充值周期',
rechargeLines: '充值额度',
useNodeConfig: '使用节点配置',
usedCluster: '当前可用算力卡',
getCluster: '总获取算力卡',
consumeCluster: '总消耗算力卡',
chargeTime: '充值时间',
chargeCluster: '充值算力卡',
chargeType: '充值方式',
normalCharge: '常规充值',
residueCluster: '剩余算力',
inputLines: '请输入算力额度',
inputNote: '请输入备注信息',
isStart: '是否启用',
week: '周',
isAutoRecharge: '启用后将按照充值周期自动充值算力卡,可随时取消',
autoChargeTime: '下次将在{msg}自动充值{num}算力卡',
oneWeek: '一周',
oneMonth: '一月',
oneYear: '一年',
inputNumber: '充值额度应为正整数',
batchSetCalculate: '批量配置算力',
schedulNode: '调度节点',
nodeHost: '节点host',
chooseSchedulNode: '请先选择调度节点',
gpuNoExist: '所选节点中不存在加速卡',
noUseDevice: '暂无可用型号',
rechargeForceCard: '充值算力卡',
batchRechargeForceCard: '批量充值算力卡',
residueCard: '剩余算力卡',
isSoonRecharge: '是否立即充值',
costSpeedLimit: '算力占用上限',
calculateConfigTitle: '在任意时刻,用户累计算力卡使用速率不能超过该上限,以免单个用户过度占用集群算力资源。',
currentTakeUp: '当前算力占用',
},
safe: {
userWhite: '用户白名单',
regOrigin: '注册来源',
isWhite: '是否开启白名单',
yes: '是',
no: '否',
operation: '操作',
openWhite: '开启白名单',
confirmOpen: '确认开启白名单?',
importWhite: '导入白名单',
lastFile: '上次文件',
oneUserName: '文件内容请以每行一个用户名存放',
lookWhite: '查看白名单',
noData: '没有找到亲要的数据哦',
closeWhite: '关闭白名单',
confirmClose: '确认关闭白名单?',
mirrorWhite: '镜像白名单',
addWhite: '添加白名单',
createWhite: '创建白名单',
express: '表达式',
type: '类型',
exactMatch: '精确匹配',
wildCard: '通配符表达式',
soonOpen: '立即启用',
state: '状态',
edit: '修改',
delete: '删除',
confirmDelete: '确认删除吗?',
dataDic: '数据字典',
whiteSuc: '白名单导入成功',
No2MB: '文件大小不超过2MB',
pleaseUploadFile: '请上传文件',
confirmDeleteMirror: '确认删除该容器镜像么?',
},
dict: {
algoLabel: '算法标签',
addAlgoLabel: '添加算法标签',
labelName: '标签名称',
dataSetLabel: '数据集标签',
addDataSetLabel: '添加数据集标签',
containerMirror: '容器镜像',
addContainerMirror: '添加容器镜像',
mirrorAddress: '镜像地址',
mirrorType: '镜像类型',
mlu: '寒武纪',
mirrorDesc: '镜像描述',
systemSet: '系统设置',
edit: '修改',
createAlgoLabel: '创建算法标签',
editAlgoLabel: '编辑算法标签',
createDatasetLabel: '创建数据集标签',
editDatasetLabel: '编辑数据集标签',
createContainerMirror: '创建容器镜像',
editContainerMirror: '编辑容器镜像',
mirrorLabel: '镜像标签',
inputMirrotAdress: '请输入镜像地址',
descripMirror: '请简要描述镜像',
mirrorAdressNotNull: '镜像地址不能为空',
addImageLabel: '添加镜像标签',
editImageLabel: '编辑镜像标签',
labelNameNotNull: '标签名称不能为空',
labelNameNotTwenty: '标签名称在20个字符以内',
labelNameFormat: '只支持中、日、英文、数字、_和-',
confirmDeleteLabel: '确认删除该镜像标签吗',
labelFormat: '标签名称在20个字符以内,只支持中、日、英文、数字、"_"和"-"',
enterOrSpaceConfirm: '每输入一个标签后按回车/空格键确认',
labelNameRepeat: '标签名称重复',
},
system: {
threeLogin: '三方登录',
addThreeLogin: '添加三方登录',
threeLoginName: '第三方登录名称',
httpName: '协议名称',
threeLoginIcon: '第三方登录ICON',
upload: '上传',
format: '只支持jpg、png、icon格式文件',
http: '协议',
state: '状态',
operation: '操作',
},
cluster: {
nodeNum: '节点数量',
cpuNode: 'CPU节点',
gpuNode: 'GPU节点',
runNum: '运行数量',
cpuTask: 'CPU型任务',
gpuTask: 'GPU型任务',
takeUp: '占用',
total: '总共',
resource: '实时资源',
memory: '内存',
resourceTakeUp: '实时算力监控',
nodeMonitor: '监控节点',
computingPower: '节点算力监控',
occupationProfile: '用户算力监控',
nodeDetail: '节点详情',
monitor: '监控面板',
totalCluster: '总算力',
gpuSchedul: 'GPU调度方式',
nodeIP: '节点IP',
gpuShareTitle: '在切换调度方式前请确保该节点上无用户任务运行,否则将导致新老任务发生算力资源冲突',
wholeCard: '整卡独占',
memoryShare: '显存共享',
nodeCluster: '节点算力(剩余算力/总算力)',
nodeResource: '节点算力',
onlyOccupy: '独占',
share: '共享',
},
device: {
addDevice: '新增型号',
deviceName: '型号名称',
state: '状态',
forceNum: '算力系数',
key: 'K8S资源key',
forceType: '算力类型',
deviceNickname: '型号别名',
memoryCount: '显存大小',
inputNumber: '请输入数字',
inputCoefficient: '请输入算力系数',
editDevice: '编辑算力型号',
deviceTitle: '由系统自动获取集群内所有的GPU型号等信息,您可以编辑别名和价格',
},
specifications: {
specifications: '算力规格',
specificationsName: '规格名称',
createSpecifications: '新增规格',
editSpecifications: '编辑规格',
gpuType: '加速卡型号',
memory: '显存',
gpuNum: '加速卡数量',
calculate: '算力',
inputName: '请输入规格名称',
max32: '字符不能超过32位',
onlyCJE: '只支持中、日、英文',
inputCPU: '请输入CPU数量',
inputMemory: '请输入内存数量',
consume: '运行一小时将消耗{msg}算力卡',
confrimDelete: '确认删除该算力规格么?',
cardShelves: '{msg}未上架,算力规格不可上架',
shelvesTitle: '此规格已下架,请选择其他规格',
deleteTitle: '此规格已删除,请选择其他规格',
chooseSpecifications: '请选择规格',
calculatePrice: '算力价格',
priceUnit: '价格(算力卡/小时)',
caluculateUnit: '算力卡',
caluculateHour: '算力卡/时',
gpuMemoryTitle: '请确认加速卡所在节点已开启按显存大小调度,否则将无法调度启动。',
gpuShare: '一卡共享',
gpuMemoryFloor: '显存调度最小粒度:1GB,不足1GB时向下取整',
oneGpuShare: '1卡共享',
},
resource: {
service: '节点Host',
freeForce: '当前空闲算力',
total: '总算力(可被调度部分)',
detail: '详情',
status: '状态',
operation: '操作',
warn: '预警',
normal: '正常',
disabled: '已禁用',
ready: '准备',
error: '异常',
open: '启用',
disable: '禁用',
viewRunningTasks: '查看运行任务',
idle: '空闲',
taskName: '任务名称',
taskType: '任务类型',
user: '用户',
occupyGPU: '占用加速卡',
createdAt: '开始时间',
runningTime: '运行时长',
},
occupation: {
name: '用户名',
PPU: '当前占用加速卡',
CPU: '当前占用CPU',
memory: '当前占用内存',
operation: '操作',
RunNoteBook: '容器',
RunWorkSpace: '任务流',
RunDeploy: 'API部署',
RunPreprocess: '运行预处理器',
RunAlgorithm: '运行算法',
ConfirmEnableServer: '确认启用该节点?',
ConfirmDisableServer: '确认禁用该节点?禁用后新任务将不再调度到该节点,已经运行的任务不受影响',
MemoryPressure: '节点内存存在压力,请注意内存使用',
DiskPressure: '磁盘空间存在压力请注意磁盘空间使用',
PIDPressure: '节点上的进程数量接近操作系统设置的进程数量限制,请检查节点上的进程数量',
NetworkUnavailable: '节点网络可能没有被正确配置,请检查网络配置',
GPUDriverError: '节点GPU驱动可能出现故障,请检查GPU驱动是否正常工作',
NetworkHighLaterncy: '节点与Kubernetes Master节点间网络通信延迟较高,请检查集群内部网络是否畅通',
checkRunning: '查看运行任务',
card: '卡',
serviceHost: '节点Host',
acceleratorOccupation: '加速卡占用',
missionInfo: '任务信息',
hour: '小时',
day: '天',
minute: '分',
second: '秒',
noCard: '未使用加速卡',
},
monitor: {
autoShuffling: '自动轮播',
refresh: '刷新',
nodeNum: '节点数量',
cpuTotal: 'CPU总数',
gpuTotal: 'GPU总数',
mluTotal: 'MLU总数',
storage: '存储(TB)',
utilization: '集群利用率',
list: '排行榜',
runTime: '容器运行时长',
containerName: '容器名称',
fiveDay: '使用时长/小时(最近5天累计)',
founder: '创建人',
forceUse: '算力使用',
speedCardTake: '加速卡占用量/卡(实时)',
algoUse: '算法使用',
algoName: '算法名称',
useNum: '使用次数(最近5天累计)',
dataSetUse: '数据集使用',
dataSetName: '数据集名称',
dataSetTotal: '数据集统计',
algoTotal: '算法统计',
modelTotal: '模型统计',
},
// 推理平台
inference: {
navigator: {
productionModel: '生产模型',
API: 'API服务',
edgeComputing: '边缘计算',
deploymentImage: 'API服务脚本',
modelTransScript: '模型转换脚本',
returnSpace: '返回系统',
},
productionModel: {
title: '生产模型',
modelName: '模型名称',
quantify: '量化类型',
modelType: '模型格式',
uploadModel: '上传生产模型',
editModel: '编辑生产模型',
modelFile: '模型文件',
noQuantify: 'FP32',
transform: '转换',
conversionDesc: '该模型将被转换为{type} {quantify}格式的模型',
nameRequired: '请输入模型名称',
modelFileRequired: '请选择模型文件',
quantizationRequired: '请选择量化类型',
modelTypeRequired: '请选择模型类型',
conversionModel: '转换模型',
conversionScript: '转换脚本',
targetModelName: '目标模型名称',
targetModelDesc: '目标模型描述',
deleteModelConfirm: '是否删除模型【{name}】?',
conversionScriptRequired: '请选择模型转换脚本',
targetNameRequired: '请输入目标模型名称',
conversionSuccess: '模型转换成功',
fileTypeError: '请选择{type}类型的模型文件',
conversionTip: '仅ONNX格式的模型支持转换',
},
apiService: {
title: 'API服务',
serviceName: 'API服务名称',
createService: '创建API服务',
updateService: '编辑API服务',
basicMsg: '基本信息',
runInstance: '运行实例',
deployImage: 'API服务脚本',
modelType: '部署模型格式',
resourceSku: '算力规格',
instanceNum: '实例数量',
nodeportTooltip: '端口范围:31000-32767,请勿与其他服务NodePort冲突',
updateStrategy: '更新策略',
minReadySeconds: '在滚动更新过程中新旧实例(Pod)交替时,等待新实例提供服务的最短时长,在此时间后旧实例将停止服务',
maxSurge: '在滚动更新过程中每一轮滚动更新的实例(Pod)数量,如共6个实例,该值设置为2,那么会分三轮更新,每次更新2个实例',
maxUnavaible: '在滚动更新过程中最多允许有多少实例(Pod)处于无法提供服务的状态',
serveTime: '服务时长',
autoScaling: '弹性伸缩',
rollingUpdate: '滚动更新',
instanceName: '实例名称',
restartNum: '重启次数',
onlineTime: '在线时长',
nameRequired: '请输入API服务名称',
imageRequired: '请选择API服务脚本',
skuRequired: '请选择算力规格',
nodePortRequired: '请输入NodePort',
replicaRequired: '请输入实例数量',
createSuccess: 'API服务创建成功',
modelRequired: '请选择{name}',
restart: '启动服务',
portError: '端口号范围为 31000-32767',
portExist: '当前端口号已被占用,请重新输入',
restartConfirm: '是否确认启动API服务【{name}】',
startSuccess: 'API服务正在启动',
deleteConfirm: '是否确认删除API服务【{name}】',
stopConfirm: '是否确认停止API服务【{name}】',
scalingSuccess: '弹性伸缩操作成功',
updateContent: '更新内容',
updateSuccess: '滚动更新操作成功',
itemRequired: '请输入{name}',
skuReSelect: '原算力规格已不可用,请重新选择',
imageReSelect: '原API服务脚本已不可用,请重新选择',
},
deployImage: {
title: 'API服务脚本',
createImage: '创建API服务脚本',
editImage: '编辑API服务脚本',
imageName: '名称',
deployImageName: 'API服务脚本名称',
deployCode: '部署代码',
nameRequired: '请输入API服务脚本名称',
typeRequired: '请选择模型类型',
codeRequired: '请上传部署代码',
deleteConfirm: '是否确认删除API服务脚本{name}',
},
conversionScript: {
title: '模型转换脚本',
createScript: '创建转换脚本',
updateScript: '编辑转换脚本',
scriptName: '脚本名称',
originalModelType: '源模型格式',
targetModelType: '目标模型格式',
targetModelQuantify: '目标模型量化',
scriptCode: '脚本代码',
nameRequired: '请输入脚本名称',
targetTypeRequired: '请选择目标模型类型',
targetQuantifyRequired: '请选择目标模型量化',
deleteConfirm: '是否删除转换脚本【{name}】',
codeRequired: '请上传脚本代码',
targetModelTip: '系统将仅保存输出目录中后缀名为 {type} 的文件',
},
},
platform: {
train: '训练平台',
inference: '推理平台',
admin: '管理后台',
userCenter: '用户中心',
resourceCenter: '算力中心',
},
}
// 可选语言列表
export const langList: string[] = [
'zh-CN',
'ja',
]
<template>
<div class="layout-wrap">
<navigator><span slot="back" class="back-btn" @click="$router.push({name: 'apply'})" v-if="$store.getters.routerStatus"><i class="iconfont icon-fanhui"></i>返回</span></navigator>
<div class="layout">
<sidebar></sidebar>
<div class="router-view">
<router-view></router-view>
</div>
</div>
</div>
</template>
<script>
import navigator from './components/navigator.vue'
import sidebar from './components/sidebar.vue'
export default {
components: {
navigator,
sidebar,
},
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
.layout-wrap
height: 100%
display: flex
flex-direction: column
-webkit-box-orient: vertical
-webkit-box-direction: normal
width: 100%
min-width: 1300px
overflow: hidden
flex: 1
.back-btn
color: #fff
font-size: 14px
margin-left: 20px
cursor: pointer
.icon-fanhui
margin-right: 4px
.layout
display: flex
height: calc(100% - 50px)
overflow: hidden
flex-direction: row
-webkit-box-flex: 1
-webkit-box-orient: horizontal
-webkit-box-direction: normal
.router-view
flex: 1
overflow-y: auto
-webkit-box-orient: vertical
-webkit-box-direction: normal
-ms-flex-direction: column
flex-direction: column
</style>
<template>
<div class="breadcrumb">
<st-crumb :crumbs="breadcrumbs"></st-crumb>
</div>
</template>
<script>
export default {
data() {
return {
crumbList: [],
routerTemp: []
}
},
computed: {
breadcrumbs() {
return this.createCrumbs(this.routerTemp)
}
},
mounted() {
const routerList = JSON.parse(JSON.stringify(this.$router.options.routes.filter(item => item.children)))
routerList.map(item => {
item.children.map(ite => {
this.routerTemp.push({ title: ite.meta.title, path: ite.path, ptitle: item.meta.title, pPath: item.path })
})
})
},
methods: {
createCrumbs(routerTemp) {
let temp = {}
routerTemp.length && routerTemp.map(item => {
if (item.path === vm.$store.state.breadcrumbs) {
temp = item
}
})
this.crumbList = [
{ title: 'SeetaAIoT' },
{ title: '智慧园区' },
{ title: temp.ptitle, path: temp.path },
{ title: temp.title, path: temp.path }
]
return this.crumbList
}
}
}
</script>
<style lang="sass" scoped>
.breadcrumb
padding: 10px
</style>
<!-- 头部导航条 -->
<template>
<div class="navigator">
<div class="head">
<div class="logo">
<img src="@assets/logo/logoa.png" alt="">
</div>
</div>
<div class="title">|<span style="display:inline-block;width:15px"></span>设备管理后台</div>
<slot name="back"></slot>
<div class="right-content flex right">
<slot name="right"></slot>
<!-- 暂时隐藏 -->
<!-- <div class="lang">
<seeta-popover
trigger="hover"
placement="bottom"
dark="true"
v-model="showLangePopover">
<ul class="lang-list">
<li
v-for="item in langList"
:key="item.value"
@click="changeLang(item)"
:class="{'is-active': item === currentLang}">
{{item === 'zh-CN' ? '简体中文' : '日本語'}}
</li>
</ul>
<template v-slot:reference>
<span class="currentLang">{{currentLang === 'zh-CN' ? '简体中文' : '日本語'}}</span>
</template>
</seeta-popover>
</div> -->
<!-- <div class="document" v-if="!isAdmin && $store.getters.document">
<span @click="document" v-if="$store.getters.document">{{$t('navigation.document')}}</span>
</div> -->
<user-info></user-info>
<!-- <span v-else class="logout pointer" @click="logout">{{$t('navigation.logout')}}</span> -->
</div>
</div>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import { getUser, removeUser } from '@/utils/user'
import seetaPopover from '@/components/seeta-ui/seeta-popover.vue'
import { langList } from '@/i18n/utils'
import userInfo from './user-info.vue'
// import { systemList } from './system-list'
// import http from '@/http'
@Component({
components: {
userInfo,
seetaPopover,
},
})
export default class navigator extends Vue {
langList:string[] = langList
showLangePopover:boolean = false
// 切换语言
changeLang(item) {
this.$store.commit('setLang', {
lang: item
})
this.$i18n.locale = item
// 更新路由
// this.$router.push('/control/deviceLogs')
this.showLangePopover = false
}
get currentLang() {
return this.$store.getters.lang
}
}
</script>
<style lang="sass" scoped>
.navigator
width: 100%
height: 50px
min-height: 50px
line-height: 50px
padding: 0 20px
background-color: #161A1D
position: relative
z-index: 600
font-weight: normal
display: flex
align-items: center
.title
color: #fff
font-size: 18px
letter-spacing: 3px
.head
width: 130px
height: 50px
// line-height: 50px
background-color: #161A1D
display: flex
align-items: center
.logo
// cursor: pointer
// height: 50px
// line-height: 50px
// background-image: url('~@/assets/logo/kpl.png')
// background-position: center left
// background-repeat: no-repeat
// background-size: contain
display: flex
align-items: center
img
height: 28px
max-width: 110px
position: relative
// top: 50%
// transform: translateY(-50%)
.admin-title
color: #FFF
font-size: 18px
margin-left: 10px
vertical-align: bottom
.slot-operate
margin-left: 20px
color: #FFF
div
display: inline-block
.right-content
flex: 1
color: #FFF
.to-admin
margin-right: 40px
cursor: pointer
&:hover
color: #409EFF
.lang
margin-right: 40px
.el-popover__reference
cursor: pointer
font-size: 14px
&:hover
color: #409EFF
.document
margin-right: 40px
font-size: 14px
color: #FFFFFF
cursor: pointer
&:hover
color: #409EFF
.logout
&:hover
color: #409EFF
.content
height: 100%
margin: 0 auto
width: calc(100% - 215px)
.right-content
height: 100%
color: #F2F2F2
padding-right: 20px
.el-head
.change-admin
margin-right: 40px
font-size: 14px
color: #FFFFFF
cursor: pointer
&:hover
color: #409EFF
.left-content
.token
color: #F2F2F2
font-size: 14px
margin-left: 15px
.back
margin-left: 2px
font-size: 14px
position: absolute
top: 14px
.token:hover
color: #409EFF
cursor: pointer
.icon-fanhui1
font-size: 20px
</style>
<template>
<div class="sidebar flex column" :class="{ 'collapse': isCollapse }">
<div class="menu flex column flex-1">
<slot :collapse="isCollapse"></slot>
<st-menu
:menus="menuList"
:default-active="defaultActive"
:collapse="isCollapse"></st-menu>
</div>
<div class="footer">
<span class="iconfont collapse-btn"
@click="isCollapse = !isCollapse;$store.commit('CHANGE_ISCOLLAPSE', isCollapse)"
:class="[ isCollapse ? 'icon-caidanzhankai' : 'icon-caidanshouqi']"></span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isCollapse: false,
}
},
computed: {
defaultActive() {
return this.$route.name
},
menuList() {
const routerList = JSON.parse(JSON.stringify(this.$router.options.routes.filter(item => item.children)))
const result = []
routerList.map(item => {
const children = []
item.children && item.children.map(ite => {
children.push({ key: ite.name, label: ite.meta.title, group: item.name, router: { name: ite.name } })
})
result.push({ key: item.name, label: item.meta.title, icon: item.meta.icon, router: { name: item.children[0].name } })
})
return result
}
},
mounted() {
}
}
</script>
<style lang="sass" scoped>
.sidebar
background-color: #222C38
box-shadow: 0 0 6px rgba(0,0,0,0.1)
width: 215px
height: 100%
position: relative
transition: width 0.3s ease
-webkit-box-orient: vertical
-webkit-box-direction: normal
-ms-flex-direction: column
flex-direction: column
display: flex
.menu
overflow-y: auto
overflow-x: hidden
margin-bottom: 50px
&::-webkit-scrollbar-track
background: #222C38
border-radius: 0
&.collapse
width: 64px
.footer
color: #fff
position: absolute
padding-bottom: 20px
bottom: 0
text-align: center
width: 100%
background: #222C38
.collapse-btn
font-size: 20px
cursor: pointer
</style>
<template>
<div class="user-area">
<seeta-popover
trigger="hover"
placement="bottom"
width="100"
dark="true"
v-model="showInfo">
<ul class="select-list">
<li class="option-item pointer" @click="toPersonal">
{{$t('navigation.personalCenter')}}
</li>
<li class="option-item logout pointer" @click="logout">
{{$t('navigation.logout')}}
</li>
</ul>
<template v-slot:reference>
<span class="user-info flex right">
<span v-if="userData.info">{{ userData.info.username }}</span>
<i class="iconfont icon-mianxingxiala"
:class="{
'expand': showInfo,
}"></i>
</span>
</template>
</seeta-popover>
</div>
</template>
<script lang="ts">
import { Vue, Prop, Component, Watch } from 'vue-property-decorator'
import { getUser, removeUser } from '@/utils/user'
import Dialog from '@/helpers/dialog'
import seetaPopover from '@/components/seeta-ui/seeta-popover.vue'
@Component({
components: {
seetaPopover,
},
})
export default class userInfo extends Vue {
showInfo: boolean = false
get userData() { return getUser() }
get shouldConfirmBeforeLeave(): boolean {
return this.$store.getters.isUpdating
}
toPersonal() {
const routeUrl = this.$router.resolve({ name: 'personal' })
window.open(routeUrl.href, '_blank')
// this.$router.push({ name: 'personal' })
}
async logout() {
removeUser()
this.$router.replace({ name: 'login' })
}
async changeConfirm(): Promise<boolean> {
if (!this.shouldConfirmBeforeLeave) return true
const confirmed = await Dialog.confirm(
this.$t('public.confirmUnlog').toString(),
{ message: this.$t('public.uploadTaskStop') },
)
if (confirmed) this.$store.commit('setIntercept', false)
return confirmed
}
// 跳转到第三方登出地址
linkToOidcLogout(param) {
const randomState = _.pad(String(_.random(1, 999999)), 6, 'a')
const redirectUrl = encodeURIComponent(`${location.origin}/`)
const url = `${param.url}?id_token_hint=${param.token}&post_logout_redirect_uri=${redirectUrl}&state=${randomState}`
location.href = url
}
}
</script>
<style lang="sass" scoped>
.user-area
.user-info
font-size: 14px
color: #FFF
cursor: pointer
&:hover
color: #409EFF
.iconfont
font-size: 12px
transition: transform 0.3s
.expand
transform: rotateZ(180deg)
</style>
import Vue from 'vue'
import App from './App.vue'
import '@/components'
import '@/globals'
import '@/styles/element-theme.sass'
import '@/styles/fonts/iconfont.css'
import '@/styles/index.sass'
import '@fortawesome/fontawesome-free/css/all.min.css'
import VueI18n from 'vue-i18n'
import i18n from '@/i18n'
import router from './router'
import store from './store'
import Element, { Notification } from 'element-ui'
import editorI18n from '@/i18n/json-editor'
import editorI18nJP from '@/i18n/json-editor-jp'
import VueRouter from 'vue-router'
import preventReClick from '@/utils/preventReClick'
import CodeEditor from 'bin-code-editor'
Vue.use(VueRouter)
Vue.use(preventReClick)
Vue.use(CodeEditor)
Vue.config.productionTip = false
// JSONEditor.defaults.languages.zh = editorI18n
// JSONEditor.defaults.languages.jp = editorI18nJP
// JSONEditor.defaults.language = 'zh'
// JSONEditor.defaults.custom_validators.push(function(schema, value, path) {
// const errors = []
// if (schema.errors && schema.errors.length) {
// _.forEach(schema.errors, error => {
// errors.push({
// path: path,
// property: 'format',
// message: error,
// })
// })
// }
// return errors
// })
Vue.use(VueI18n)
Vue.use(Element, {
i18n: (key, value) => i18n.t(key, value),
})
Vue.mixin({
data() {
return {
// eslint-disable-next-line
formatSearchName: /[^A-Za-z0-9\u4e00-\u9fa5\u0800-\u4e00_\s\.\-\:\(\)\[\]\{\}]/g,
// eslint-disable-next-line
formatSearchCode: /[^A-Za-z0-9_\s\.\-\:\(\)\[\]\{\}]/g,
formatSearchVersion: /^([0-9]\d|[0-9])(\.([0-9]\d|\d)){0,2}$/g
}
},
methods: {
/**
* 混入 去除首位两端空格
* @param {string} item 传入的值 require
* @param {string} form 表单对象
* @param {string} formName 表单项
*/
setTrim(item, form, formName) {
if (item === undefined) {
return ''
}
const target = item.replace(/^\s*|\s*$/g, '')
// 修改值 + 视图上一起更新
if (form && formName) {
this[form][formName] = target
} else {
// 只修改值
return target
}
},
}
})
const vm:Vue = new Vue({
store,
router,
i18n,
render: h => h(App),
})
// 将vue实例挂载到全局
declare const window: Window & { vm: Vue }
window.vm = vm
vm.$mount('#app')
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import store from '../store'
import { Notification } from 'element-ui'
// 兼容浏览器
import browserStorage from '@/services/local-storage'
// 页面加载进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
function notificationError(title, msg, duration = 1500) {
Notification.error({
title: title,
message: msg,
duration: duration
})
}
Vue.use(VueRouter)
const router = new VueRouter({
routes: routes,
})
// 消除点击相同菜单栏 控制台报错的影响
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
// 取消转圈圈
NProgress.configure({ showSpinner: false })
router.beforeEach((to, from, next) => {
// if ((!browserStorage.getItem('id') || !browserStorage.getItem('userId')) && to.path !== '/login' && to.path !== '/register') {
// notificationError('提示', 'token无效或过期')
// next({ name: 'login' })
// return
// }
// NProgress.start()
// store.commit('CHNAGE_BREADCRUMB', to.path)
next()
})
router.afterEach((to, from) => {
NProgress.done()
const tableWrap = document.getElementsByClassName('el-table__body-wrapper')[0]
const chartWrap = document.getElementsByClassName('chart-flow')[0]
if (tableWrap) tableWrap.scrollTop = 0
if (chartWrap) chartWrap.scrollTop = 0
// 跳转其他页面后,之前页面请求未结束的则取消请求
store.getters.axiosCancelArr.forEach(ele => {
ele.cancel()
})
store.commit('resetAxiosCancelArr')
})
// 遇到异步组件加载不出来的时候,进行处理
router.onError(error => {
const pattern = /Loading chunk (\d)+ failed/g
const isChunkLoadFailed = error.message.match(pattern)
const targetPath = router.history.pending.fullPath
if (isChunkLoadFailed) {
router.replace(targetPath)
}
})
export default router
export default [
{
path: '/',
redirect: '/device'
},
{
path: '/login',
name: 'login',
component: () => import('@views/login')
},
{
path: '/register',
name: 'register',
component: () => import('@views/register')
},
{
path: '/device',
name: 'device',
meta: { title: '设备列表', icon: 'icon-yingyongguanli' },
component: () => import('@layouts/basicLayout'),
children: [{
path: '/device',
name: 'device',
meta: { title: '设备列表' },
component: () => import('@views/DeviceList')
}]
},
{
path: '/service',
name: 'service',
meta: { title: '服务列表', icon: 'icon-jiankongzhongxin' },
component: () => import('@layouts/basicLayout'),
children: [{
path: '/service',
name: 'service',
meta: { title: '服务列表' },
component: () => import('@views/ServiceList')
}]
},
{
path: '/params',
name: 'params',
meta: { title: '参数模板', icon: 'icon-shebeiguanli' },
component: () => import('@layouts/basicLayout'),
children: [{
path: '/params',
name: 'params',
meta: { title: '参数模板' },
component: () => import('@views/ParamsModel')
}]
},
{
path: '/data',
name: 'data',
meta: { title: '数据列表', icon: 'icon-OTA' },
component: () => import('@layouts/basicLayout'),
children: [{
path: '/data',
name: 'data',
meta: { title: '数据列表' },
component: () => import('@views/DataList')
}]
},
{
path: '/apply',
name: 'apply',
meta: { title: '应用中心', icon: 'icon-wendanggongju' },
component: () => import('@layouts/basicLayout'),
children: [{
path: '/apply',
name: 'apply',
meta: { title: '应用中心' },
component: () => import('@views/Apply')
}]
},
{
path: '/setting',
name: 'setting',
meta: { title: '设置中心', icon: 'icon-wendanggongju' },
component: () => import('@layouts/basicLayout'),
children: [{
path: '/setting',
name: 'setting',
meta: { title: '设置中心' },
component: () => import('@views/Setting')
}]
},
{
path: '/account',
name: 'account',
meta: { title: '账户中心', icon: 'icon-wendanggongju' },
component: () => import('@layouts/basicLayout'),
children: [{
path: '/account',
name: 'account',
meta: { title: '账户中心' },
component: () => import('@views/Account')
}]
},
// 匹配不到,展示404
{
path: '/*',
name: 'Exception',
component: () => import('@views/Exception/Exception')
}
]
/**
* 为不支持 localStorage 或处于私密模式的浏览器添加简单的 localStorage 支持
* export 统一的 localStorage 接口
*/
try {
window.localStorage.setItem('_test_key_', '1')
window.localStorage.removeItem('_test_key_')
console.info('[AIOT] using native localStorage.')
module.exports = window.localStorage
} catch (error) {
console.info('[AIOT] using in-memory localStorage polyfill.')
module.exports = {
_data: {},
setItem(id, val) { this._data[id] = String(val) },
getItem(id) { return this._data.hasOwnProperty(id) ? this._data[id] : undefined },
removeItem(id) { return delete this._data[id] },
clear() { this._data = {} },
}
}
import Vue from 'vue'
import Vuex from 'vuex'
// import createPersistedState from 'vuex-persistedstate'
import userStore from './userStore'
import networkStore from './networkStore'
import systemStore from './systemStore'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
breadcrumbs: [],
isCollapse: false,
uploadType: ''
},
mutations: {
CHNAGE_BREADCRUMB: (state, toPath) => {
state.breadcrumbs = toPath
},
CHANGE_ISCOLLAPSE: (state, value) => {
state.isCollapse = value
},
setUploadType(state, type) {
state.uploadType = type
},
clearUploadType(state) {
state.uploadType = ''
}
},
getters: {
breadcrumbs: state => state.breadcrumbs,
},
// strict: true,
// plugins: [createPersistedState({
// storage: window.localStorage,
// })], // 持久化 vuex
modules: {
userStore,
networkStore,
systemStore
},
})
import Axios from 'axios'
const state = {
axiosCancel: null,
allRequestCount: 0,
completeRequestCount: 0,
uploadPercent: 0, // 上传文件的进度
axiosCancelArr: [], // 设置可能要取消的请求列表
}
const getters = {
axiosCancel: state => state.axiosCancel,
uploadPercent: state => state.uploadPercent,
axiosCancelArr: state => state.axiosCancelArr,
// ifUpload: state => state.ifUpload,
}
const mutations = {
incRequestCount(state) {
state.allRequestCount++
},
finishRequestCount(state) {
state.completeRequestCount++
},
cancelAxios(state, cancelReason) {
const axiosCancel = state.axiosCancel
if (axiosCancel) axiosCancel.cancel(cancelReason)
state.axiosCancel = Axios.CancelToken.source()
},
/* 上传文件进度 */
changeUploadPercent: (state, percent) => {
state.uploadPercent = percent
},
// 重置请求列表
resetAxiosCancelArr(state) {
state.axiosCancelArr = []
},
// 设置可能要取消的请求列表
addAxiosCancelArr(state, param) {
state.axiosCancelArr.push(param)
},
removeAxiosCancelArr(state, index) {
state.axiosCancelArr.splice(index, 1)
}
// 设置是否是上传文件请求
// changeIfUpload: (state, item) => {
// state.ifUpload = item
// },
}
const actions = {
// 设置上传文件进度
setChangeUploadPercent: ({ commit }, percent) => {
commit('changeUploadPercent', percent)
},
}
export default {
state,
getters,
mutations,
actions
}
// 兼容浏览器
import browserStorage from '@/services/local-storage'
const state = () => ({
lang: browserStorage.getItem('lang') || 'zh-CN',
routerStatus: 0,
currentProduct: {}
})
const mutations = {
setLang(state, item) {
state.lang = item.lang
browserStorage.setItem('lang', item.lang)
},
setRouterStatus(state, item) {
state.routerStatus = item.routerStatus
},
changeCurrentProduct(state, item) {
state.currentProduct = JSON.parse(JSON.stringify(item))
}
}
const actions = {
}
const getters = {
lang: state => state.lang,
routerStatus: state => state.routerStatus,
currentProduct: state => state.currentProduct
}
export default {
state,
mutations,
actions,
getters,
}
const state = () => ({
userInfo: {},
// 用户登录失败的错误信息
errorInfo: {
msg: ''
}
})
const mutations = {
updateUserInfo: () => {
},
updateErrorInfo: (state, info) => {
state.errorInfo.msg = info.msg
},
removeUser(state) {
state.userInfo = null
},
}
const actions = {
}
const getters = {
userInfo: state => state.userInfo,
errorInfo: state => state.errorInfo,
}
export default {
state,
mutations,
actions,
getters,
}
// fade
.fade-enter, .fade-leave-to
opacity: 0
.fade-enter-to, .fade-leave
opacity: 1
.fade-enter-active, .fade-leave-active
transition: all .5s
// fade-bottom
.fade-bottom-enter, .fade-bottom-leave-to
opacity: 0
margin-top: 300px
.fade-bottom-enter-to, .fade-bottom-leave
opacity: 1
margin-top: 0
.fade-bottom-enter-active, .fade-bottom-leave-active
transition: all .5s
$font-family: "メイリオ", '-apple-system', "Helvetica Neue", "Roboto", "Arial", "PingFang SC", "Source Han Sans SC", "Microsoft YaHei", sans-serif
body, html
width: 100%
height: 100%
line-height: 1.5
font-family: $font-family
font-size: 14px
-webkit-tap-highlight-color: transparent
background: #EBEEF5
color: #4C4C4C
box-sizing: border-box
word-break: break-all
.el-button
font-weight: 400
*,
*::before,
*::after
box-sizing: inherit
// chrome浏览器不明原因添加的元素
#trans-tooltip, #tip-arrow-bottom, #tip-arrow-top
display: none
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar
width: 5px
height: 5px
background-color: #F5F5F5
/*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-track
// -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0)
border-radius: 10px
background-color: #F5F5F5
/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb
border-radius: 10px
// -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3)
background-color: #B9B9B9
// tooltip新增主题
.tippy-tooltip.light-custom-theme
background: #878783
box-shadow: 0 1px 8px 0 rgba(0,0,0,0.30)
color: #FFF
// loading样式
.el-loading-spinner
background: url(~@/assets/vloading.gif) no-repeat !important
background-size: 28px 28px !important
background-position: center !important
width: 100px !important
height: 100px !important
position: absolute !important
top: 40% !important
left: 45% !important
.el-loading-spinner .circular
display: none !important
.el-loading-spinner .el-loading-text
text-align: center !important
margin: 85px 0 !important
// 运行时间 动态时间样式
.years-color
color: #409EFF
.months-color
color: #409EFF
.days-color
color: #409EFF
.hours-color
color: #409EFF
.minutes-color
color: #409EFF
.seconds-color
color: #409EFF
#raw-input
height: 32px
line-height: 32px
width: 240px
font-size: 14px
#raw-input::-webkit-input-placeholder
font-size: 14px
color: #999
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
// 一些对元素进行修饰的样式
// 铺满当前区域
.full
width: 100%
height: 100%
// 水印样式
#waterMarker
position: fixed
z-index: 9999
top: 0
right: 0
bottom: 0
left: 0
pointer-events: none
opacity: 0.05
// 不换行 超出使用 ...
.no-wrap
text-overflow: ellipsis
overflow: hidden
white-space: nowrap
// 文本不超过两行
.two-line
overflow: hidden
text-overflow: ellipsis
display: -webkit-box
-webkit-line-clamp: 2
-webkit-box-orient: vertical
.wait-loading
width: 100%
height: 100%
position: relative
&::before
content: ''
position: absolute
width: 14px
height: 14px
background: url(~@/assets/loading.gif) no-repeat center/100%
top: 50%
left: 50%
transform: translate(-50%, -50%)
margin-top: -14px
&::after
content: '加载中...'
color: #ccc
position: absolute
top: 50%
left: 50%
transform: translate(-50%, -50%)
margin-top: 10px
// 标题左侧带有蓝色方块
.caption-mark
font-size: 16px
font-weight: 600
color: #333
padding-left: 25px
position: relative
&::before
content: ''
position: absolute
width: 6px
height: 14px
left: 0
top: 50%
transform: translateY(-50%)
background-color: #409EFF
border-radius: 1px
// .active-bg
// background-image: $gradient-color
// hover手型
.pointer
cursor: pointer
// inline&inline-block垂直对齐方向
// 利用inline-block布局时,顶部对齐可保证规整
.v-top
vertical-align: top
// 垂直方向居中,图标及table-cell内强烈推荐
.v-mid
vertical-align: middle
// 用处较少
.v-btm
vertical-align: bottom
.i-block
display: inline-block
@charset "UTF-8";
body, html {
width: 100%;
height: 100%;
line-height: 1.5;
font-family: "メイリオ", "-apple-system", "Helvetica Neue", "Roboto", "Arial", "PingFang SC", "Source Han Sans SC", "Microsoft YaHei", sans-serif;
font-size: 14px;
-webkit-tap-highlight-color: transparent;
background: #EBEEF5;
color: #4C4C4C;
box-sizing: border-box;
word-break: break-all;
}
body .el-button, html .el-button {
font-weight: 400;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
#trans-tooltip, #tip-arrow-bottom, #tip-arrow-top {
display: none;
}
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar {
width: 5px;
height: 5px;
background-color: #F5F5F5;
}
/*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-track {
border-radius: 10px;
background-color: #F5F5F5;
}
/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb {
border-radius: 10px;
background-color: #B9B9B9;
}
.tippy-tooltip.light-custom-theme {
background: #878783;
box-shadow: 0 1px 8px 0 rgba(0, 0, 0, 0.3);
color: #FFF;
}
.el-loading-spinner {
background: url(~@/assets/vloading.gif) no-repeat !important;
background-size: 28px 28px !important;
background-position: center !important;
width: 100px !important;
height: 100px !important;
position: absolute !important;
top: 40% !important;
left: 45% !important;
}
.el-loading-spinner .circular {
display: none !important;
}
.el-loading-spinner .el-loading-text {
text-align: center !important;
margin: 85px 0 !important;
}
\ No newline at end of file
@import "./theme.sass"
$--font-path: '~element-ui/lib/theme-chalk/fonts'
@import "~element-ui/packages/theme-chalk/src/index"
\ No newline at end of file
//flex存在9个方向的布局, 以及1个两端对齐
.flex
display: flex
flex-direction: row
// 纵向居 中 组
&.left
justify-content: flex-start
align-items: center
&.center
justify-content: center
align-items: center
&.right
justify-content: flex-end
align-items: center
&.justify
justify-content: space-between
align-items: center
// 纵向居 上 组
&.left-top
justify-content: flex-start
align-items: flex-start
&.center-top
justify-content: center
align-items: flex-start
&.right-top
justify-content: flex-end
align-items: flex-start
&.justify-top
justify-content: space-between
align-items: flex-start
// 纵向居 下 组
&.left-bottom
justify-content: flex-start
align-items: flex-end
&.center-bottom
justify-content: center
align-items: flex-end
&.right-bottom
justify-content: flex-end
align-items: flex-end
&.justify-bottom
justify-content: space-between
align-items: flex-end
// 排列相关样式
&.break
flex-wrap: wrap
&.column
flex-direction: column
// 子元素比例分布样式
&>.flex-1
flex: 1
&>.flex-2
flex: 2
&>.flex-3
flex: 3
&>.flex-4
flex: 4
&>.flex-5
flex: 5
&>.flex-6
flex: 6
&>.flex-7
flex: 7
&>.flex-8
flex: 8
&>.flex-9
flex: 9
&>.flex-10
flex: 10
&>.flex-11
flex: 11
&>.flex-12
flex: 12
@font-face {
font-family: "iconfont"; /* Project id 2598158 */
src: url('iconfont.woff2?t=1623308852405') format('woff2'),
url('iconfont.woff?t=1623308852405') format('woff'),
url('iconfont.ttf?t=1623308852405') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-tupianzhanshi:before {
content: "\e786";
}
.icon-liebiaozhanshi:before {
content: "\e78d";
}
.icon-duihao:before {
content: "\e77f";
}
.icon-guanbi:before {
content: "\e780";
}
.icon-shanchu:before {
content: "\e781";
}
.icon-shangchuan:before {
content: "\e782";
}
.icon-fuzhi:before {
content: "\e783";
}
.icon-fanhui:before {
content: "\e784";
}
.icon-right1:before {
content: "\e785";
}
.icon-xiazai:before {
content: "\e787";
}
.icon-fujian:before {
content: "\e788";
}
.icon-riqi:before {
content: "\e789";
}
.icon-sousuo:before {
content: "\e78a";
}
.icon-left:before {
content: "\e78b";
}
.icon-tianjia:before {
content: "\e78c";
}
.icon-jinggao:before {
content: "\e77c";
}
.icon-cuowu:before {
content: "\e77d";
}
.icon-zhengque:before {
content: "\e77e";
}
.icon-mianxingxiala:before {
content: "\e777";
}
.icon-mianxingshangla:before {
content: "\e778";
}
.icon-unfold:before {
content: "\e779";
}
.icon-right:before {
content: "\e77a";
}
.icon-fold:before {
content: "\e77b";
}
.icon-guanyuwomen:before {
content: "\e76e";
}
.icon-caidanzhankai:before {
content: "\e76f";
}
.icon-chanpinwendang:before {
content: "\e770";
}
.icon-caidanshouqi:before {
content: "\e771";
}
.icon-yingyongguanli:before {
content: "\e772";
}
.icon-wendanggongju:before {
content: "\e773";
}
.icon-OTA:before {
content: "\e774";
}
.icon-jiankongzhongxin:before {
content: "\e775";
}
.icon-shebeiguanli:before {
content: "\e776";
}
No preview for this file type
!function(a){var h,l,o,i,t,e,n='<svg><symbol id="icon-tupianzhanshi" viewBox="0 0 1024 1024"><path d="M928 576a96 96 0 0 1 96 96v256a96 96 0 0 1-96 96h-256A96 96 0 0 1 576 928v-256A96 96 0 0 1 672 576z m-576 0A96 96 0 0 1 448 672v256A96 96 0 0 1 352 1024h-256A96 96 0 0 1 0 928v-256A96 96 0 0 1 96 576z m576 64h-256a32 32 0 0 0-32 32v256a32 32 0 0 0 32 32h256a32 32 0 0 0 32-32v-256a32 32 0 0 0-32-32z m-576 0h-256a32 32 0 0 0-32 32v256a32 32 0 0 0 32 32h256a32 32 0 0 0 32-32v-256a32 32 0 0 0-32-32z m0-640A96 96 0 0 1 448 96v256A96 96 0 0 1 352 448h-256A96 96 0 0 1 0 352v-256A96 96 0 0 1 96 0z m576 0A96 96 0 0 1 1024 96v256A96 96 0 0 1 928 448h-256A96 96 0 0 1 576 352v-256A96 96 0 0 1 672 0z m-576 64h-256a32 32 0 0 0-32 32v256a32 32 0 0 0 32 32h256a32 32 0 0 0 32-32v-256a32 32 0 0 0-32-32z m576 0h-256a32 32 0 0 0-32 32v256a32 32 0 0 0 32 32h256a32 32 0 0 0 32-32v-256a32 32 0 0 0-32-32z" ></path></symbol><symbol id="icon-liebiaozhanshi" viewBox="0 0 1170 1024"><path d="M1133.714286 950.857143a36.571429 36.571429 0 0 1 0 73.142857H36.571429a36.571429 36.571429 0 0 1 0-73.142857h1097.142857z m0-475.428572a36.571429 36.571429 0 0 1 0 73.142858H36.571429a36.571429 36.571429 0 0 1 0-73.142858h1097.142857z m0-475.428571a36.571429 36.571429 0 0 1 0 73.142857H36.571429a36.571429 36.571429 0 0 1 0-73.142857h1097.142857z" ></path></symbol><symbol id="icon-duihao" viewBox="0 0 1464 1024"><path d="M1314.187609 25.878835a87.72982 87.72982 0 0 1 133.787974 112.586601l-10.235145 12.135959-852.002765 843.668431a102.351456 102.351456 0 0 1-125.161209 14.91407l-12.720824-9.065415L33.03981 652.562179a87.72982 87.72982 0 0 1 99.719562-143.730688l13.013256 9.065415 363.640102 304.56869L1314.187609 25.732618z" ></path></symbol><symbol id="icon-guanbi" viewBox="0 0 1024 1024"><path d="M1006.01344 18.0224a61.44 61.44 0 0 1 0 86.8352L598.66624 512l407.2448 407.2448a61.44 61.44 0 0 1-86.8352 86.8352L511.83104 598.7328 104.89344 1005.7728a61.44 61.44 0 1 1-86.8352-86.9376L424.99584 512 18.26304 105.2672a61.44 61.44 0 0 1 86.8352-86.9376l406.7328 406.7328L919.07584 18.0224a61.44 61.44 0 0 1 86.9376 0z" ></path></symbol><symbol id="icon-shanchu" viewBox="0 0 1026 1024"><path d="M121.479021 14.714262l10.727288 8.939406L512.003351 403.45071 891.800394 23.653668a76.623479 76.623479 0 0 1 117.489334 97.822641l-8.939406 10.599581L620.553279 512.000639l379.797043 379.924748a76.623479 76.623479 0 0 1-97.822641 117.361628l-10.727287-8.939406L512.003351 620.550567 132.206309 1000.347609a76.623479 76.623479 0 0 1-117.489334-97.822641l8.939405-10.599581L403.453423 512.000639 23.65638 132.07589A76.623479 76.623479 0 0 1 121.479021 14.714262z" ></path></symbol><symbol id="icon-shangchuan" viewBox="0 0 1024 1024"><path d="M972.8 503.381333a51.2 51.2 0 0 1 50.517333 42.922667l0.682667 8.277333V930.133333a93.866667 93.866667 0 0 1-83.626667 93.354667L930.133333 1024H93.866667a93.866667 93.866667 0 0 1-93.354667-83.626667L0 930.133333V554.581333a51.2 51.2 0 0 1 101.717333-8.277333l0.682667 8.277333v366.933334h819.2V554.666667a51.2 51.2 0 0 1 42.922667-50.517334l8.277333-0.682666zM545.28 8.789333l8.533333 5.717334 202.837334 158.378666a51.2 51.2 0 0 1-56.064 85.333334l-6.997334-4.608-130.645333-102.144v445.781333a51.2 51.2 0 0 1-101.632 8.277333L460.629333 597.333333l-0.085333-445.781333-130.56 102.144a51.2 51.2 0 0 1-66.218667-2.730667l-5.632-6.144a51.2 51.2 0 0 1 2.730667-66.218666l6.144-5.632L469.76 14.506667A68.266667 68.266667 0 0 1 545.28 8.789333z" ></path></symbol><symbol id="icon-fuzhi" viewBox="0 0 1024 1024"><path d="M673.962667 256.426667a93.866667 93.866667 0 0 1 93.866666 93.866666V930.133333A93.866667 93.866667 0 0 1 674.048 1024H93.866667A93.866667 93.866667 0 0 1 0 930.133333V350.293333a93.866667 93.866667 0 0 1 93.866667-93.952z m-8.533334 102.4H102.4v562.602666h563.029333V358.912zM930.133333 0a93.866667 93.866667 0 0 1 93.354667 83.626667L1024 93.866667v589.141333a93.866667 93.866667 0 0 1-83.626667 93.44l-10.24 0.512h-34.389333a51.2 51.2 0 0 1-8.362667-101.802667l8.362667-0.682666h25.770667V102.4H358.4l0.085333 25.685333a51.2 51.2 0 0 1-42.922666 50.602667l-8.277334 0.597333a51.2 51.2 0 0 1-50.517333-42.922666L256 128.085333v-34.133333A93.866667 93.866667 0 0 1 339.626667 0.512L349.952 0H930.133333z" ></path></symbol><symbol id="icon-fanhui" viewBox="0 0 1024 1024"><path d="M770.549646 10.975569a51.180082 51.180082 0 0 1 68.496011 75.746522l-6.226911 5.544509-548.821083 419.676675 548.821083 420.188477a51.180082 51.180082 0 0 1 14.074523 64.828104l-4.520907 6.909312a51.180082 51.180082 0 0 1-64.828105 14.074522l-6.994611-4.520907L204.071434 579.927485a85.300137 85.300137 0 0 1-8.103513-128.547307l8.103513-7.079912L770.549646 10.975569z" ></path></symbol><symbol id="icon-right1" viewBox="0 0 1024 1024"><path d="M256 0l512 512-512 512z" ></path></symbol><symbol id="icon-xiazai" viewBox="0 0 1024 1024"><path d="M972.8 512.256a51.2 51.2 0 0 1 50.517333 42.922667l0.682667 8.362666v323.84c0 71.253333-54.613333 129.706667-124.16 136.021334L887.466667 1024H136.533333a136.533333 136.533333 0 0 1-135.936-124.16L0 887.381333V563.541333a51.2 51.2 0 0 1 101.717333-8.362666l0.682667 8.362666v323.84a34.133333 34.133333 0 0 0 27.306667 33.450667l6.826666 0.682667h750.933334a34.133333 34.133333 0 0 0 33.450666-27.306667l0.682667-6.826667V563.541333a51.2 51.2 0 0 1 51.2-51.2zM512 0a51.2 51.2 0 0 1 50.602667 42.922667L563.2 51.2 563.2 633.173333l165.973333-186.368a51.2 51.2 0 0 1 82.005334 60.757334l-5.461334 7.424-223.573333 251.221333c-3.669333 4.010667-3.669333 4.010667-7.68 7.68a93.866667 93.866667 0 0 1-124.757333 0.170667l-7.765334-7.765334-223.914666-251.306666a51.2 51.2 0 0 1 69.717333-74.496l6.741333 6.314666L460.8 633.344V51.2A51.2 51.2 0 0 1 512 0z" ></path></symbol><symbol id="icon-fujian" viewBox="0 0 1024 1024"><path d="M329.376183 1024c-133.12 0-253.147429-83.456-304.201143-211.309714-50.980571-127.926857-23.04-275.163429 70.948571-373.248L512.013897 11.556571a37.156571 37.156571 0 0 1 53.76 0 38.546286 38.546286 0 0 1 0 55.296L149.883611 495.323429c-98.962286 104.009143-98.084571 271.725714 1.828572 374.637714A247.808 247.808 0 0 0 512.013897 867.986286l391.753143-406.454857a177.737143 177.737143 0 0 0 48.420571-122.221715 175.250286 175.250286 0 0 0-48.420571-122.002285 159.012571 159.012571 0 0 0-117.540571-50.468572 160.987429 160.987429 0 0 0-122.660572 49.590857L273.348754 623.908571a85.065143 85.065143 0 0 0 0 115.785143c14.482286 15.506286 34.816 24.137143 56.027429 23.698286 20.992 0.219429 41.106286-8.338286 55.369143-23.698286l412.16-428.470857a37.010286 37.010286 0 0 1 53.76 0 40.667429 40.667429 0 0 1 0 55.954286l-414.427429 428.470857a152.137143 152.137143 0 0 1-109.056 46.518857c-63.268571 2.194286-121.197714-36.864-145.188571-97.865143a162.011429 162.011429 0 0 1 37.595428-175.542857l391.533715-407.405714a235.52 235.52 0 0 1 171.300571-73.142857c97.572571 0 185.563429 61.074286 223.012571 154.843428a258.706286 258.706286 0 0 1-51.785142 273.627429l-391.753143 407.332571a321.097143 321.097143 0 0 1-232.594286 99.986286l0.073143 0.073143z" ></path></symbol><symbol id="icon-riqi" viewBox="0 0 1024 1024"><path d="M731.428571 0a36.571429 36.571429 0 0 1 36.571429 36.571429V146.285714h146.285714A109.714286 109.714286 0 0 1 1024 256v658.285714a109.714286 109.714286 0 0 1-109.714286 109.714286h-804.571428A109.714286 109.714286 0 0 1 0 914.285714v-658.285714A109.714286 109.714286 0 0 1 109.714286 146.285714h146.285714V36.571429a36.571429 36.571429 0 0 1 73.142857 0V146.285714h365.714286V36.571429A36.571429 36.571429 0 0 1 731.428571 0z m219.428572 438.857143H73.142857v475.428571a36.571429 36.571429 0 0 0 36.571429 36.571429h804.571428a36.571429 36.571429 0 0 0 36.571429-36.571429V438.857143z m-658.285714 365.714286a36.571429 36.571429 0 0 1 0 73.142857H219.428571a36.571429 36.571429 0 0 1 0-73.142857h73.142858z m256 0a36.571429 36.571429 0 0 1 0 73.142857h-73.142858a36.571429 36.571429 0 0 1 0-73.142857h73.142858z m256 0a36.571429 36.571429 0 0 1 0 73.142857h-73.142858a36.571429 36.571429 0 0 1 0-73.142857h73.142858zM292.571429 658.285714a36.571429 36.571429 0 0 1 0 73.142857H219.428571a36.571429 36.571429 0 0 1 0-73.142857h73.142858z m256 0a36.571429 36.571429 0 0 1 0 73.142857h-73.142858a36.571429 36.571429 0 0 1 0-73.142857h73.142858zM804.571429 658.285714a36.571429 36.571429 0 0 1 0 73.142857h-73.142858a36.571429 36.571429 0 0 1 0-73.142857h73.142858zM292.571429 512a36.571429 36.571429 0 0 1 0 73.142857H219.428571a36.571429 36.571429 0 0 1 0-73.142857h73.142858z m256 0a36.571429 36.571429 0 0 1 0 73.142857h-73.142858a36.571429 36.571429 0 0 1 0-73.142857h73.142858zM804.571429 512a36.571429 36.571429 0 0 1 0 73.142857h-73.142858a36.571429 36.571429 0 0 1 0-73.142857h73.142858zM256 219.428571h-146.285714a36.571429 36.571429 0 0 0-36.571429 36.571429V365.714286h877.714286V256a36.571429 36.571429 0 0 0-36.571429-36.571429h-146.285714v36.571429a36.571429 36.571429 0 0 1-73.142857 0V219.428571h-365.714286v36.571429a36.571429 36.571429 0 0 1-73.142857 0V219.428571z" ></path></symbol><symbol id="icon-sousuo" viewBox="0 0 1024 1024"><path d="M475.424836 0a475.424836 475.424836 0 0 1 351.375525 795.714891l184.90369 164.350708a36.571141 36.571141 0 0 1-48.566476 54.710428l-189.877365-168.739246A475.424836 475.424836 0 1 1 475.424836 0z m0 73.142282a402.282553 402.282553 0 1 0 0 804.565107 402.282553 402.282553 0 0 0 0-804.565107z" ></path></symbol><symbol id="icon-left" viewBox="0 0 1024 1024"><path d="M768 0L256 512l512 512z" ></path></symbol><symbol id="icon-tianjia" viewBox="0 0 1024 1024"><path d="M511.914669 0a51.198421 51.198421 0 0 1 50.515776 42.836013L563.198421 51.198421l-0.08533 409.587371h409.587371a51.198421 51.198421 0 0 1 8.277078 101.714198l-8.277078 0.682645-409.587371-0.085331V972.770006a51.198421 51.198421 0 0 1-101.628867 8.362409l-0.682645-8.362409L460.630917 563.182635H51.214208a51.198421 51.198421 0 0 1-8.277079-101.543536L51.214208 460.785792h409.416709V51.198421a51.198421 51.198421 0 0 1 51.198422-51.198421z" ></path></symbol><symbol id="icon-jinggao" viewBox="0 0 1024 1024"><path d="M512 0c282.763636 0 512 229.236364 512 512s-229.236364 512-512 512S0 794.763636 0 512 229.236364 0 512 0z m0 698.181818a46.545455 46.545455 0 1 0 0 93.090909 46.545455 46.545455 0 0 0 0-93.090909z m0-465.454545a46.545455 46.545455 0 0 0-46.545455 46.545454v279.272728a46.545455 46.545455 0 1 0 93.09091 0V279.272727a46.545455 46.545455 0 0 0-46.545455-46.545454z" ></path></symbol><symbol id="icon-cuowu" viewBox="0 0 1024 1024"><path d="M512 0c282.763636 0 512 229.236364 512 512s-229.236364 512-512 512S0 794.763636 0 512 229.236364 0 512 0zM400.896 335.592727a46.545455 46.545455 0 0 0-61.44 69.678546L446.138182 512l-106.682182 106.728727-3.863273 4.375273a46.545455 46.545455 0 0 0 69.678546 61.44L512 577.861818l106.728727 106.682182 4.375273 3.863273a46.545455 46.545455 0 0 0 61.44-69.678546L577.861818 512l106.682182-106.728727 3.863273-4.375273a46.545455 46.545455 0 0 0-69.678546-61.44L512 446.138182 405.271273 339.456z" ></path></symbol><symbol id="icon-zhengque" viewBox="0 0 1024 1024"><path d="M512 0c282.763636 0 512 229.236364 512 512s-229.236364 512-512 512S0 794.763636 0 512 229.236364 0 512 0z m265.634909 339.316364a46.917818 46.917818 0 0 0-65.815273 0L442.181818 606.021818l-106.728727-105.565091-4.375273-3.863272a46.917818 46.917818 0 0 0-61.44 3.863272 45.707636 45.707636 0 0 0 0 65.117091l106.728727 105.565091 5.911273 5.399273a93.835636 93.835636 0 0 0 125.719273-5.399273l269.637818-266.752 3.863273-4.328727a45.707636 45.707636 0 0 0-3.863273-60.788364z" ></path></symbol><symbol id="icon-mianxingxiala" viewBox="0 0 2048 1024"><path d="M516.04022194 302.92563864l503.48205605 503.48205604 503.48205604-503.48205605z" ></path></symbol><symbol id="icon-mianxingshangla" viewBox="0 0 2048 1024"><path d="M1039.65213909 174.92563866L536.17008305 678.4076947h1006.96411209z" ></path></symbol><symbol id="icon-unfold" viewBox="0 0 1639 1024"><path d="M1050.0755654 334.35931574a46.66864151 46.66864151 0 0 1 76.45879113 52.89112714l-4.82242607 6.8447342-234.74326783 281.56747137a85.55917654 85.55917654 0 0 1-124.60527286 7.31142033l-6.84473418-7.31142033L520.93095017 394.09517708A46.66864151 46.66864151 0 0 1 586.73373472 328.37017354l5.91136154 5.9891422L821.2436591 608.77092844 1050.0755654 334.35931574z" ></path></symbol><symbol id="icon-right" viewBox="0 0 1024 1024"><path d="M389.6208716 315.73265759a31.21704903 31.21704903 0 0 1 39.30651646-7.10421218l4.66700075 3.21504497 187.56157129 156.60380025c24.21654772 20.22366963 27.43159268 56.21143025 7.15606762 80.37612252l-3.42246711 3.73360051-3.78545594 3.42246711L433.54253338 712.16843634a31.21704903 31.21704903 0 0 1-43.92166178-3.94102265 31.11333774 31.11333774 0 0 1 0-39.82507242l3.94102265-3.99287849 182.79085928-152.24793251L393.51003882 359.55060811A31.11333774 31.11333774 0 0 1 386.40582664 320.3478025L389.6208716 315.73265759z" ></path></symbol><symbol id="icon-fold" viewBox="0 0 1637 1024"><path d="M756.090845 348.32879171A85.45763938 85.45763938 0 0 1 876.46247887 337.36470901l5.67643998 5.20988337 5.20988374 5.75419933 234.67803047 281.48922205a46.65567203 46.65567203 0 0 1-65.70673797 65.78449772l-5.90971847-5.98747823L821.79758298 415.12416243l-228.61279327 274.49087082a46.65567203 46.65567203 0 0 1-58.70838749 10.80856434l-6.99835087-4.82108611a46.65567203 46.65567203 0 0 1-10.73080458-58.78614687l4.82108611-6.92059148L756.090845 348.32879171z" ></path></symbol><symbol id="icon-guanyuwomen" viewBox="0 0 1024 1024"><path d="M510.942633 0a283.857018 283.857018 0 0 1 145.107707 527.860511c194.498829 48.823407 317.238603 203.752568 365.323983 460.416083a28.385702 28.385702 0 1 1-55.749519 10.445939C911.181028 708.734203 761.418065 567.714036 510.942633 567.714036c-250.475433 0-400.238396 141.020167-454.682172 431.008497a28.385702 28.385702 0 0 1-55.749518-10.445939c48.085379-256.663516 170.825154-411.592676 365.323982-460.472855A283.857018 283.857018 0 0 1 510.942633 0z m0 56.771404a227.085614 227.085614 0 1 0 0 454.171229 227.085614 227.085614 0 0 0 0-454.171229z" ></path></symbol><symbol id="icon-caidanzhankai" viewBox="0 0 1024 1024"><path d="M995.555556 967.111111a28.444444 28.444444 0 0 1 0 56.888889H28.444444a28.444444 28.444444 0 0 1 0-56.888889h967.111112zM6.485333 320.568889a28.444444 28.444444 0 0 1 39.196445-8.988445l282.168889 176.64a28.444444 28.444444 0 0 1-0.056889 48.241778l-282.168889 175.843556a28.444444 28.444444 0 0 1-43.52-24.120889V335.701333a28.444444 28.444444 0 0 1 4.380444-15.132444zM995.555556 654.222222a28.444444 28.444444 0 0 1 0 56.888889h-512a28.444444 28.444444 0 0 1 0-56.888889h512z m0-341.333333a28.444444 28.444444 0 0 1 0 56.888889h-512a28.444444 28.444444 0 0 1 0-56.888889h512z m0-312.888889a28.444444 28.444444 0 0 1 0 56.888889H28.444444a28.444444 28.444444 0 0 1 0-56.888889h967.111112z" ></path></symbol><symbol id="icon-chanpinwendang" viewBox="0 0 1024 1024"><path d="M881.777778 0a85.333333 85.333333 0 0 1 84.935111 77.141333L967.111111 85.333333V625.777778c27.591111 0 51.086222 19.797333 56.32 49.208889L1024 682.666667v256c0 43.406222-32.597333 79.815111-77.084444 84.878222L938.666667 1024h-853.333334a85.674667 85.674667 0 0 1-84.878222-77.084444L0 938.666667V682.666667c0-27.591111 19.797333-51.086222 49.208889-56.32L56.888889 625.777778V85.333333A85.333333 85.333333 0 0 1 134.030222 0.398222L142.222222 0h739.555556z m85.276444 682.609778L702.805333 682.666667l-2.161777 7.054222a199.281778 199.281778 0 0 1-177.834667 134.826667L512 824.888889a199.224889 199.224889 0 0 1-188.643556-135.168L321.137778 682.666667l-261.688889-0.113778L56.888889 682.666667v254.350222l0.170667 5.006222A28.444444 28.444444 0 0 0 85.333333 967.111111h851.683556l5.006222-0.170667A28.444444 28.444444 0 0 0 967.111111 938.666667l0.113778-253.44-0.170667-2.616889zM881.777778 56.888889h-739.555556a28.444444 28.444444 0 0 0-27.989333 23.324444L113.777778 85.333333V625.777778h254.008889l3.982222 23.779555a142.222222 142.222222 0 0 0 280.462222 0l3.982222-23.722666L910.222222 625.777778V85.333333a28.444444 28.444444 0 0 0-23.324444-27.989333L881.777778 56.888889z m-113.777778 341.333333a28.444444 28.444444 0 1 1 0 56.888889h-512a28.444444 28.444444 0 1 1 0-56.888889h512z m0-170.666666a28.444444 28.444444 0 1 1 0 56.888888h-512a28.444444 28.444444 0 1 1 0-56.888888h512z" ></path></symbol><symbol id="icon-caidanshouqi" viewBox="0 0 1024 1024"><path d="M995.555556 967.111111a28.444444 28.444444 0 0 1 0 56.888889H28.444444a28.444444 28.444444 0 0 1 0-56.888889h967.111112zM337.009778 320.682667A28.444444 28.444444 0 0 1 341.333333 335.758222v352.483556a28.444444 28.444444 0 0 1-43.52 24.177778L15.473778 536.120889a28.444444 28.444444 0 0 1 0-48.241778l282.339555-176.298667a28.444444 28.444444 0 0 1 39.253334 9.102223z m658.773333 333.539555c15.587556 0 28.216889 12.743111 28.216889 28.444445s-12.629333 28.444444-28.216889 28.444444H484.067556a28.330667 28.330667 0 0 1-28.216889-28.444444c0-15.701333 12.629333-28.444444 28.216889-28.444445h511.715555z m0-341.333333c15.587556 0 28.216889 12.743111 28.216889 28.444444s-12.629333 28.444444-28.216889 28.444445H484.067556a28.330667 28.330667 0 0 1-28.216889-28.444445c0-15.701333 12.629333-28.444444 28.216889-28.444444h511.715555zM995.555556 0a28.444444 28.444444 0 0 1 0 56.888889H28.444444a28.444444 28.444444 0 0 1 0-56.888889h967.111112z" ></path></symbol><symbol id="icon-yingyongguanli" viewBox="0 0 1024 1024"><path d="M369.777778 568.888889A85.333333 85.333333 0 0 1 455.111111 654.222222v284.444445A85.333333 85.333333 0 0 1 369.777778 1024h-284.444445A85.333333 85.333333 0 0 1 0 938.666667v-284.444445A85.333333 85.333333 0 0 1 85.333333 568.888889z m568.888889 0a85.333333 85.333333 0 0 1 85.333333 85.333333v284.444445a85.333333 85.333333 0 0 1-85.333333 85.333333h-284.444445a85.333333 85.333333 0 0 1-85.333333-85.333333v-284.444445a85.333333 85.333333 0 0 1 85.333333-85.333333z m-568.888889 56.888889h-284.444445a28.444444 28.444444 0 0 0-28.444444 28.444444v284.444445a28.444444 28.444444 0 0 0 28.444444 28.444444h284.444445a28.444444 28.444444 0 0 0 28.444444-28.444444v-284.444445a28.444444 28.444444 0 0 0-28.444444-28.444444z m568.888889 0h-284.444445a28.444444 28.444444 0 0 0-28.444444 28.444444v284.444445a28.444444 28.444444 0 0 0 28.444444 28.444444h284.444445a28.444444 28.444444 0 0 0 28.444444-28.444444v-284.444445a28.444444 28.444444 0 0 0-28.444444-28.444444zM369.777778 0A85.333333 85.333333 0 0 1 455.111111 85.333333v284.444445A85.333333 85.333333 0 0 1 369.777778 455.111111h-284.444445A85.333333 85.333333 0 0 1 0 369.777778v-284.444445A85.333333 85.333333 0 0 1 85.333333 0z m568.888889 0A85.333333 85.333333 0 0 1 1024 85.333333v284.444445A85.333333 85.333333 0 0 1 938.666667 455.111111h-284.444445A85.333333 85.333333 0 0 1 568.888889 369.777778v-284.444445A85.333333 85.333333 0 0 1 654.222222 0z m-568.888889 56.888889h-284.444445a28.444444 28.444444 0 0 0-28.444444 28.444444v284.444445a28.444444 28.444444 0 0 0 28.444444 28.444444h284.444445a28.444444 28.444444 0 0 0 28.444444-28.444444v-284.444445a28.444444 28.444444 0 0 0-28.444444-28.444444z m568.888889 0h-284.444445a28.444444 28.444444 0 0 0-28.444444 28.444444v284.444445a28.444444 28.444444 0 0 0 28.444444 28.444444h284.444445a28.444444 28.444444 0 0 0 28.444444-28.444444v-284.444445a28.444444 28.444444 0 0 0-28.444444-28.444444z" ></path></symbol><symbol id="icon-wendanggongju" viewBox="0 0 1024 1024"><path d="M938.666667 0a85.333333 85.333333 0 0 1 84.935111 77.141333L1024 85.333333V796.444444a85.333333 85.333333 0 0 1-77.141333 84.935112l-8.192 0.398222h-56.888889v56.888889A85.333333 85.333333 0 0 1 796.444444 1024H85.333333A85.333333 85.333333 0 0 1 0 938.666667V227.555556a85.333333 85.333333 0 0 1 85.333333-85.333334h56.888889v-56.888889A85.333333 85.333333 0 0 1 219.363556 0.398222L227.555556 0h711.111111zM796.444444 199.111111H85.333333A28.444444 28.444444 0 0 0 56.888889 227.555556v711.111111a28.444444 28.444444 0 0 0 28.444444 28.444444H796.444444a28.444444 28.444444 0 0 0 28.444445-28.444444V227.555556a28.444444 28.444444 0 0 0-28.444445-28.444445zM938.666667 56.888889H227.555556a28.444444 28.444444 0 0 0-27.989334 23.324444L199.111111 85.333333v56.888889H796.444444A85.333333 85.333333 0 0 1 881.777778 227.555556v597.333333h56.888889a28.444444 28.444444 0 0 0 27.989333-23.324445L967.111111 796.444444V85.333333a28.444444 28.444444 0 0 0-23.324444-27.989333L938.666667 56.888889z m-284.444445 682.666667a28.444444 28.444444 0 0 1 0 56.888888h-398.222222a28.444444 28.444444 0 0 1 0-56.888888h398.222222z m0-199.111112a28.444444 28.444444 0 0 1 0 56.888889h-398.222222a28.444444 28.444444 0 0 1 0-56.888889h398.222222z m0-199.111111a28.444444 28.444444 0 0 1 0 56.888889h-398.222222a28.444444 28.444444 0 0 1 0-56.888889h398.222222z" ></path></symbol><symbol id="icon-OTA" viewBox="0 0 1024 1024"><path d="M938.666667 0A85.333333 85.333333 0 0 1 1024 85.333333v853.333334a85.333333 85.333333 0 0 1-85.333333 85.333333h-853.333334A85.333333 85.333333 0 0 1 0 938.666667v-853.333334A85.333333 85.333333 0 0 1 85.333333 0z m0 56.888889h-853.333334a28.444444 28.444444 0 0 0-28.444444 28.444444v853.333334a28.444444 28.444444 0 0 0 28.444444 28.444444h853.333334a28.444444 28.444444 0 0 0 28.444444-28.444444v-853.333334a28.444444 28.444444 0 0 0-28.444444-28.444444zM246.272 369.777778c43.52 0 77.767111 14.051556 102.741333 42.211555 23.893333 26.567111 35.84 61.838222 35.84 105.927111 0 43.52-11.946667 78.734222-35.84 105.528889-24.974222 27.875556-59.164444 41.813333-102.741333 41.813334-43.52 0-77.767111-14.051556-102.741333-42.211556-23.608889-26.794667-35.441778-61.838222-35.441778-105.130667 0-43.52 11.832889-78.734222 35.441778-105.528888 24.462222-28.444444 58.652444-42.609778 102.741333-42.609778z m393.443556 5.575111v39.822222H546.531556v244.508445h-46.592V415.175111H406.755556v-39.822222h232.96z m167.651555 0l108.714667 284.330667h-49.777778l-25.884444-71.281778H721.351111l-25.884444 71.281778h-49.777778l108.714667-284.330667h52.963555z m-561.095111 35.441778c-29.184 0-52.053333 9.955556-68.494222 29.866666-15.36 18.830222-23.096889 44.600889-23.096889 77.255111 0 32.426667 7.68 58.026667 23.096889 76.856889 15.928889 19.626667 38.741333 29.468444 68.494222 29.468445 29.468444 0 52.167111-9.443556 68.096-28.273778 15.644444-18.830222 23.495111-44.885333 23.495111-78.051556 0-33.166222-7.850667-59.448889-23.495111-78.848-15.644444-18.830222-38.343111-28.273778-68.096-28.273777z m535.608889 14.734222h-1.592889l-44.999111 124.643555h91.192889l-44.600889-124.643555z" ></path></symbol><symbol id="icon-jiankongzhongxin" viewBox="0 0 1024 1024"><path d="M824.888889 967.111111a28.444444 28.444444 0 0 1 0 56.888889h-625.777778a28.444444 28.444444 0 0 1 0-56.888889h625.777778z m113.777778-967.111111A85.333333 85.333333 0 0 1 1024 85.333333v682.666667a85.333333 85.333333 0 0 1-85.333333 85.333333h-853.333334A85.333333 85.333333 0 0 1 0 768v-682.666667A85.333333 85.333333 0 0 1 85.333333 0z m0 56.888889h-853.333334a28.444444 28.444444 0 0 0-28.444444 28.444444v682.666667a28.444444 28.444444 0 0 0 28.444444 28.444444h853.333334a28.444444 28.444444 0 0 0 28.444444-28.444444v-682.666667a28.444444 28.444444 0 0 0-28.444444-28.444444zM522.808889 241.607111a34.133333 34.133333 0 0 1 19.512889 16.668445l2.048 4.892444 83.000889 248.888889 55.751111-148.593778a34.133333 34.133333 0 0 1 26.680889-21.731555L715.036444 341.333333H881.777778a28.444444 28.444444 0 0 1 5.12 56.433778L881.777778 398.222222h-150.983111l-72.760889 194.048a34.133333 34.133333 0 0 1-15.530667 17.976889l-5.632 2.446222a34.133333 34.133333 0 0 1-40.96-16.497777l-2.218667-5.12L512 345.941333l-82.488889 247.352889a34.133333 34.133333 0 0 1-12.515555 16.952889l-4.551112 2.787556a34.133333 34.133333 0 0 1-42.951111-10.524445l-2.844444-4.721778L266.808889 398.222222H142.222222a28.444444 28.444444 0 0 1-27.989333-23.324444L113.777778 369.777778a28.444444 28.444444 0 0 1 23.324444-27.989334L142.222222 341.333333h138.695111a34.133333 34.133333 0 0 1 27.704889 14.222223l2.844445 4.664888 81.464889 162.929778 86.698666-259.982222a34.133333 34.133333 0 0 1 43.178667-21.560889z" ></path></symbol><symbol id="icon-shebeiguanli" viewBox="0 0 1024 1024"><path d="M706.204113 10.974008l149.997057 84.380452c32.978883 18.536407 49.752625 56.575842 41.280464 93.421215-9.438784 40.939303-9.495644 76.363172-0.568602 106.385327 8.187861 27.463449 31.273079 48.956583 71.984941 64.706843A85.290214 85.290214 0 0 1 1023.48371 439.358324v144.140463a85.290214 85.290214 0 0 1-52.425051 78.694438 119.974902 119.974902 0 0 0-64.138242 60.612912c-14.613057 30.135876-17.626644 67.49299-8.24472 112.867384a85.233354 85.233354 0 0 1-41.678485 91.54483l-151.646001 85.290214a85.290214 85.290214 0 0 1-97.230845-9.438784c-29.112393-24.847882-60.840353-36.959093-96.377942-36.959093-35.480729 0-67.265549 12.11121-96.377942 36.959093a85.290214 85.290214 0 0 1-97.230845 9.438784l-150.736238-84.835333a85.233354 85.233354 0 0 1-41.280464-93.364355c9.950525-43.213709 8.415301-78.580718-3.695909-106.783348-11.82691-27.520309-34.855268-48.786003-70.734018-64.138241A85.290214 85.290214 0 0 1 0.001138 585.034011V440.097506a85.290214 85.290214 0 0 1 52.538772-78.751298c27.463449-11.372029 48.729142-31.6711 64.365682-61.863835 16.262001-31.443659 19.673609-68.061591 9.723084-111.047859a85.233354 85.233354 0 0 1 41.280464-93.478075L317.280735 10.974008A85.290214 85.290214 0 0 1 415.193901 21.038253C442.714211 45.033233 474.44217 56.860143 511.742424 56.860143c37.243394 0 69.028214-11.82691 96.548523-35.82189A85.290214 85.290214 0 0 1 706.204113 10.974008z m-60.499192 52.879933A198.100738 198.100738 0 0 1 511.742424 113.663426a198.100738 198.100738 0 0 1-133.962497-49.809485 28.430071 28.430071 0 0 0-32.637722-3.411609L195.77061 144.595343a28.430071 28.430071 0 0 0-13.760155 31.159359c12.907252 55.55236 8.187861 105.930446-14.613056 149.940197-21.606854 41.792205-52.879933 71.58692-93.023194 88.246942A28.430071 28.430071 0 0 0 56.861281 440.154366v144.879645c0 11.372029 6.823217 21.606854 17.228623 26.098805 48.615422 20.867672 82.674648 52.311331 100.585593 93.989816 17.285483 40.256981 19.332449 87.735201 6.823217 141.922917a28.430071 28.430071 0 0 0 13.760155 31.102498l150.793099 84.835334a28.430071 28.430071 0 0 0 32.410281-3.127308c39.233499-33.490624 84.039291-50.548667 133.280175-50.548667 49.240884 0 94.046676 17.058043 133.280175 50.548667a28.430071 28.430071 0 0 0 32.410282 3.127308l151.646001-85.290215a28.430071 28.430071 0 0 0 13.930735-30.533897c-11.77005-56.860143-7.78984-106.897069 12.736672-149.144154 19.90105-40.939303 51.344709-70.734018 93.421215-88.303802a28.430071 28.430071 0 0 0 17.456064-26.155666V439.301464a28.430071 28.430071 0 0 0-18.195246-26.496826c-56.007241-21.606854-92.284012-55.495499-105.987307-101.495355-11.94063-40.143261-11.94063-85.347075-0.398021-135.327141a28.430071 28.430071 0 0 0-13.760154-31.159358L678.342643 60.499192a28.430071 28.430071 0 0 0-32.637722 3.354749zM511.742424 284.186994a227.383712 227.383712 0 1 1-227.440572 227.326852 227.383712 227.383712 0 0 1 227.440572-227.326852z m0 56.860143a170.580429 170.580429 0 1 0-0.05686 341.047138A170.580429 170.580429 0 0 0 511.742424 340.990277z" ></path></symbol></svg>',m=(m=document.getElementsByTagName("script"))[m.length-1].getAttribute("data-injectcss");if(m&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(a){console&&console.log(a)}}function s(){t||(t=!0,o())}h=function(){var a,h,l;(l=document.createElement("div")).innerHTML=n,n=null,(h=l.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",a=h,(l=document.body).firstChild?(h=l.firstChild).parentNode.insertBefore(a,h):l.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()},document.addEventListener("DOMContentLoaded",l,!1)):document.attachEvent&&(o=h,i=a.document,t=!1,(e=function(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(e,50)}s()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,s())})}(window);
\ No newline at end of file
{
"id": "2598158",
"name": "SeetaAIOT",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "22178639",
"name": "图片展示",
"font_class": "tupianzhanshi",
"unicode": "e786",
"unicode_decimal": 59270
},
{
"icon_id": "22178640",
"name": "列表展示",
"font_class": "liebiaozhanshi",
"unicode": "e78d",
"unicode_decimal": 59277
},
{
"icon_id": "22096432",
"name": "对号",
"font_class": "duihao",
"unicode": "e77f",
"unicode_decimal": 59263
},
{
"icon_id": "22096433",
"name": "关闭",
"font_class": "guanbi",
"unicode": "e780",
"unicode_decimal": 59264
},
{
"icon_id": "22096434",
"name": "删除",
"font_class": "shanchu",
"unicode": "e781",
"unicode_decimal": 59265
},
{
"icon_id": "22096435",
"name": "上传",
"font_class": "shangchuan",
"unicode": "e782",
"unicode_decimal": 59266
},
{
"icon_id": "22096436",
"name": "复制",
"font_class": "fuzhi",
"unicode": "e783",
"unicode_decimal": 59267
},
{
"icon_id": "22096437",
"name": "返回",
"font_class": "fanhui",
"unicode": "e784",
"unicode_decimal": 59268
},
{
"icon_id": "22096438",
"name": "right",
"font_class": "right1",
"unicode": "e785",
"unicode_decimal": 59269
},
{
"icon_id": "22096440",
"name": "下载",
"font_class": "xiazai",
"unicode": "e787",
"unicode_decimal": 59271
},
{
"icon_id": "22096441",
"name": "附件",
"font_class": "fujian",
"unicode": "e788",
"unicode_decimal": 59272
},
{
"icon_id": "22096442",
"name": "日期",
"font_class": "riqi",
"unicode": "e789",
"unicode_decimal": 59273
},
{
"icon_id": "22096443",
"name": "搜索",
"font_class": "sousuo",
"unicode": "e78a",
"unicode_decimal": 59274
},
{
"icon_id": "22096444",
"name": "left",
"font_class": "left",
"unicode": "e78b",
"unicode_decimal": 59275
},
{
"icon_id": "22096445",
"name": "添加",
"font_class": "tianjia",
"unicode": "e78c",
"unicode_decimal": 59276
},
{
"icon_id": "22096387",
"name": "警告",
"font_class": "jinggao",
"unicode": "e77c",
"unicode_decimal": 59260
},
{
"icon_id": "22096388",
"name": "错误",
"font_class": "cuowu",
"unicode": "e77d",
"unicode_decimal": 59261
},
{
"icon_id": "22096389",
"name": "正确",
"font_class": "zhengque",
"unicode": "e77e",
"unicode_decimal": 59262
},
{
"icon_id": "22095902",
"name": "面性下拉",
"font_class": "mianxingxiala",
"unicode": "e777",
"unicode_decimal": 59255
},
{
"icon_id": "22095903",
"name": "面性上拉",
"font_class": "mianxingshangla",
"unicode": "e778",
"unicode_decimal": 59256
},
{
"icon_id": "22095904",
"name": "unfold",
"font_class": "unfold",
"unicode": "e779",
"unicode_decimal": 59257
},
{
"icon_id": "22095905",
"name": "right",
"font_class": "right",
"unicode": "e77a",
"unicode_decimal": 59258
},
{
"icon_id": "22095906",
"name": "fold",
"font_class": "fold",
"unicode": "e77b",
"unicode_decimal": 59259
},
{
"icon_id": "22095875",
"name": "关于我们",
"font_class": "guanyuwomen",
"unicode": "e76e",
"unicode_decimal": 59246
},
{
"icon_id": "22095876",
"name": "菜单展开",
"font_class": "caidanzhankai",
"unicode": "e76f",
"unicode_decimal": 59247
},
{
"icon_id": "22095877",
"name": "产品文档",
"font_class": "chanpinwendang",
"unicode": "e770",
"unicode_decimal": 59248
},
{
"icon_id": "22095878",
"name": "菜单收起",
"font_class": "caidanshouqi",
"unicode": "e771",
"unicode_decimal": 59249
},
{
"icon_id": "22095879",
"name": "应用管理",
"font_class": "yingyongguanli",
"unicode": "e772",
"unicode_decimal": 59250
},
{
"icon_id": "22095880",
"name": "文档&工具",
"font_class": "wendanggongju",
"unicode": "e773",
"unicode_decimal": 59251
},
{
"icon_id": "22095881",
"name": "OTA",
"font_class": "OTA",
"unicode": "e774",
"unicode_decimal": 59252
},
{
"icon_id": "22095882",
"name": "监控中心",
"font_class": "jiankongzhongxin",
"unicode": "e775",
"unicode_decimal": 59253
},
{
"icon_id": "22095883",
"name": "设备管理",
"font_class": "shebeiguanli",
"unicode": "e776",
"unicode_decimal": 59254
}
]
}
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
No preview for this file type
// 我不太喜欢这个样式的方案
// @author cui
.btn-group
display: flex
justify-content: space-around
position: relative
& > .item
border-radius: 0
text-align: center
border: 1px solid #ccc
padding: 9px 16px
line-height: 1
font-size: 12px
cursor: pointer
margin-left: -1px
z-index: 200
color: #4C4C4C
transition: all .25s ease-in-out
&:hover
color: #409EFF
border: 1px solid #0079C9
z-index: 202
&.checked
z-index: 202
background: #409EFF
border: 1px solid #0079C9
color: #FFF
&:first-child
border-top-left-radius: 2px
border-bottom-left-radius: 2px
&:last-child
border-top-right-radius: 2px
border-bottom-right-radius: 2px
& > .btn
border-radius: 0
text-align: center
font-size: 12px
cursor: pointer
margin-left: -1px
z-index: 200
&:hover, &.active
z-index: 202
&:first-child
border-top-left-radius: 2px
border-bottom-left-radius: 2px
&:last-child
border-top-right-radius: 2px
border-bottom-right-radius: 2px
.check-group
display: inline-block
border: 1px solid #BECAD6
border-radius: 2px
font-size: 13px
.check-item
display: inline-block
height: 34px
width: 64px
padding: 7px 10px
text-align: center
cursor: pointer
color: #666
&.active
background: #409EFF
color: #FFF
\ No newline at end of file
@mixin button-variant($color, $background, $border, $shadow: none)
color: $color
background: $background
border: $border
box-shadow: $shadow
@mixin hover ($btn-hover-color, $btn-hover-bg, $btn-hover-border, $shadow: none)
&:hover,
&.hover
color: $btn-hover-color
background: $btn-hover-bg
border: $btn-hover-border
box-shadow: $shadow
outline: none
@mixin active ($btn-active-color, $btn-active-bg, $btn-active-border)
&:active,
&.active
color: $btn-active-color
background: $btn-active-bg
border: $btn-active-border
outline: none
box-shadow: none
@mixin disabled ($btn-disabled-color, $btn-disabled-bg, $btn-disabled-border)
&:disabled,
&.disabled,
&[disabled],
fieldset[disabled]
color: $btn-disabled-color
background: $btn-disabled-bg
border: $btn-disabled-border
cursor: not-allowed
text-decoration: none
box-shadow: none
@include hover($btn-disabled-color, $btn-disabled-bg, $btn-disabled-border, none)
@include active($btn-disabled-color, $btn-disabled-bg, $btn-disabled-border)
.btn
display: inline-block
padding: 0 16px
font-size: 12px
font-weight: 400
height: 32px
line-height: 32px
vertical-align: middle
cursor: pointer
user-select: none
box-sizing: border-box
text-align: center
border-radius: 2px
white-space: nowrap
transition: all .25s ease-in-out
&.focus
text-decoration: none
&:focus
outline: none
.btn-important
@include button-variant(#FFF, #409EFF, 1px solid #409EFF)
@include hover(#FFF, #66B1FF, 1px solid #66B1FF)
@include active(#FFF, #4092EF, 1px solid #4092EF)
@include disabled(#FFF, #9FCEFF, 1px solid #9FCEFF)
.btn-primary
@include button-variant(#333333, #FFF, 1px solid #D7DAE0)
@include hover(#409EFF, #EDF5FF, 1px solid #C6E1FF)
@include active(#409EFF , #EDF5FF, 1px solid #4092EF)
@include disabled(#999999, #F5F7FA, 1px solid #D7DAE0)
.btn-danger
@include button-variant(#FFF, #FF4433, 1px solid #FF4433)
@include hover(#FFF, #FF6A60, 1px solid #FF6A60)
@include active(#FFF, #D93321, 1px solid #D93321)
@include disabled(#CCC, #F2F2F2, 1px solid #CCC)
.btn-yellow
@include button-variant(#FFF, #FF9800, 1px solid #FF9800)
@include hover(#FFF, #FFAC39, 1px solid #FFAC39)
@include active(#FFF, #D98500, 1px solid #D98500)
@include disabled(#CCC, #F2F2F2, 1px solid #CCC)
.btn-gray
@include button-variant(#333333, #FFF, 1px solid #D7DAE0)
@include hover(#409EFF, #EDF5FF, 1px solid #C6E1FF)
@include active(#409EFF , #EDF5FF, 1px solid #4092EF)
@include disabled(#999999, #F5F7FA, 1px solid #D7DAE0)
.btn-text
display: inline-block
cursor: pointer
color: #409EFF
white-space: nowrap
&:hover
color: #0079C9
// text-decoration: underline
&:disabled,
&.disabled
color: #CCC
cursor: not-allowed
text-decoration: none
&.red
color: #FF6459
&:hover
color: #E63622
input[type="checkbox"], .checkbox
position: relative
display: inline-block
height: 14px
width: 14px
margin: 0
background-color: #FFF
border: 1px solid #CCC
border-radius: 2px
outline: none
cursor: pointer
vertical-align: middle
-webkit-appearance: none
&::before
content: ''
position: absolute
display: inline-block
height: 12px
width: 0px
top: 2px
left: 2px
transition: width 0.22s
background-repeat: no-repeat
background-image: url('data:image/svg+xml;charset=utf-8,<svg width="10" height="10" viewBox="2 4 14 10" xmlns="http://www.w3.org/2000/svg"><path d="M2.716 9.881a.951.951 0 0 1 0-1.378l-.032.032a1.042 1.042 0 0 1 1.436.003L7 11.308l6.885-6.62a1.045 1.045 0 0 1 1.431 0l-.032-.03a.949.949 0 0 1-.005 1.382L7.72 13.306a1.053 1.053 0 0 1-1.437.005l-3.568-3.43z" fill="%23FFF" fill-rule="evenodd"/></svg>')
&:checked, &.checked
border: none
background-color: #409EFF
&:checked::before,
&.checked::before,
&:disabled::before
width: 12px
&:hover
border-color: #AAA
&[disabled="true"],
&:disabled,
&.disabled
color: rgba(0,0,0,0.1)
border-color: rgba(0,0,0,0.1)
background: rgba(0,0,0,0.05)
user-select: none
cursor: not-allowed
&::before
background: none
&:checked,
&.checked
background-image: none
background-color: #CCC
&:checked::before,
&.checked::before
background-repeat: no-repeat
background-image: url('data:image/svg+xml;charset=utf-8,<svg width="10" height="10" viewBox="2 4 14 10" xmlns="http://www.w3.org/2000/svg"><path d="M2.716 9.881a.951.951 0 0 1 0-1.378l-.032.032a1.042 1.042 0 0 1 1.436.003L7 11.308l6.885-6.62a1.045 1.045 0 0 1 1.431 0l-.032-.03a.949.949 0 0 1-.005 1.382L7.72 13.306a1.053 1.053 0 0 1-1.437.005l-3.568-3.43z" fill="%23FFF" fill-rule="evenodd"/></svg>')
table.form
width: 100%
table-layout: auto
tbody
tr
td
padding: 10px
vertical-align: top
// position: relative
td:first-child
text-align: right
white-space: nowrap
// color: #9B9EA0
width: 80px
td:not(:first-child)
text-align: left
width: auto
.card
width: 600px
padding: 20px
background: #FAFBFB
border: 1px solid #EDF0F0
border-radius: 2px
&.compact
padding: 10px
&.required
& > td:first-child::before
content: '*'
color: #DC1818
margin-right: 0px
input[type="text"], input[type="password"], input[type="number"], textarea
padding: 8px 12px
line-height: 14px
font-size: 12px
color: #404040
background: #FFF
border: 1px solid #CCC
border-radius: 2px
outline: none
min-width: 0
&:hover
border-color: #B2B2B2
&:focus
border-color: #409EFF
&.error
border-color: #FF4433
input, textarea
&::-webkit-input-placeholder
color: #D7DDE4
&:-ms-input-placeholder
color: #D7DDE4
&::-moz-placeholder
color: #D7DDE4
input::-webkit-outer-spin-button, input::-webkit-inner-spin-button
-webkit-appearance: none
input[type="number"]
-moz-appearance: textfield
input[type="radio"]
position: relative
display: inline-block
height: 12px
width: 12px
margin: 0
background-color: #FFF
border: 1px solid #CCC
border-radius: 50%
outline: none
cursor: pointer
vertical-align: middle
-webkit-appearance: none
&:checked, &.checked
border: solid 1px #409EFF
&:checked::before,
&.checked::before
content: ''
width: 8px
height: 8px
background: #409EFF
border-radius: 50%
display: inline-block
position: absolute
left: 50%
top: 50%
transform: translate(-50%, -50%)
&:hover
border-color: #AAA
&:checked:hover,
&.checked:hover
border-color: #409EFF
&[disabled="true"],
&:disabled
color: #CCC
border-color: #CCC
background: none
pointer: not-allowed
&::before
background: none
&:checked,
&.checked
background-image: none
background-color: #CCC
&:checked::before,
&.checked::before
// background-repeat: no-repeat
// background-image: url('data:image/svg+xml;charset=utf-8,<svg width="10" height="10" viewBox="2 4 14 10" xmlns="http://www.w3.org/2000/svg"><path d="M2.716 9.881a.951.951 0 0 1 0-1.378l-.032.032a1.042 1.042 0 0 1 1.436.003L7 11.308l6.885-6.62a1.045 1.045 0 0 1 1.431 0l-.032-.03a.949.949 0 0 1-.005 1.382L7.72 13.306a1.053 1.053 0 0 1-1.437.005l-3.568-3.43z" fill="%23FFF" fill-rule="evenodd"/></svg>')
@charset "UTF-8"
// 底层全局基本样式 (影响范围最大,一般不需要修改)
@import "./reset.sass"
@import "./base.sass"
// iconfont相关图标样式 (一般情况只添加勿删除)
// @import "./fonts/iconfont.css"
.iconfont
font-size: 12px
// 设置关闭图标为可点击
.icon-guanbi:before
cursor: pointer
// 标签添加时不符合校验禁止点击
.label-disable
color: #c0c4cc !important
pointer-events: none !important
// 布局样式 (非必要勿改)
@import "./position.sass"
@import "./flex.sass"
@import "./layout.sass"
// 表单样式 (相对独立但使用较多, 修改需谨慎)
@import "./form/button.sass"
@import "./form/checkbox.sass"
@import "./form/radio.sass"
@import "./form/input.sass"
@import "./form/form-table.sass"
@import "./form/btn-group.sass"
@import "./module/label.sass"
@import "./module/toast.sass"
@import "./module/switch.sass"
@import "./module/tooltip.sass"
@import "./module/table.sass"
@import "./json-editor.sass"
// @import "../../base/simditor/simditor.css"
// @import "~base/simditor/simditor-content.sass"
// 修饰类样式 (辨明影响后可修改,归类不明样式)
@import "./decoration.sass"
@import "./animation.sass"
@import "./markdown.sass"
.json-form
margin-top: 10px
box-sizing: border-box
padding: 5px 0
h3
display: none
h3 .btn-group
margin-left: 0 !important
h3 label
padding-right: 10px
.card.card-body .card.card-body
border: none
padding: 0
.row
&:not(:last-child)
margin-bottom: 10px
select
height: 34px!important
input[type=text]
width: calc(100% - 120px)
.form-group
margin-top: 5px
&:before
display: table
content: ''
&:after
clear: both
.form-control-label
width: 110px
text-align: left
vertical-align: middle
font-size: 14px
color: #606266
line-height: 33px
padding-right: 10px
box-sizing: border-box
float: left
text-overflow: ellipsis
overflow: hidden
white-space: nowrap
textarea
width: 300px
height: 400px
select
.option
color: #606266
height: 36px
.option select
background: #F5F7FA
padding: 8px 15px
color: #657180
font-size: inherit
background: #FFF
border: 1px solid #C0C4CC
border-radius: 2px
outline: none
width: calc(100% - 120px)
// appearance: none
// background: url("https://raw.githubusercontent.com/ourjs/static/gh-pages/2015/arrow.png") no-repeat scroll 170px center transparent
select.form-control:hover
border: 1px solid #409EFF
.card.card-body
border: none
padding: 0
margin-bottom: 10px
h3
display: inline-block
margin-bottom: 10px
.card.card-body
padding: 10px
border: 1px solid #ebebeb
.btn-group
display: inline-block
margin-top: 5px
.btn
padding: 0 5px
min-width: 22px
font-size: 12px
height: 22px
line-height: 22px
&.json-editor-btn-collapse, &.json-editor-btn-add
@extend .btn-important
&.json-editor-btn-delete
@extend .btn-gray
&.json-editor-btn-movedown, &.json-editor-btn-moveup
@extend .btn-gray
&:not(:first-child)
margin-left: 10px
i.fas
font-size: 13px
.form-text.invalid-feedback
color: #FA3C30
// 列表页公共样式
.data-list-common
padding: 14px 20px 20px
display: flex
flex-direction: column
overflow-y: auto
height: 100%
& > .header
height: 20px
display: flex
align-items: center
justify-content: space-between
.title
font-size: 14px
color: #333
font-weight: bold
& > .list-area
flex: 1
&.card-type
margin: 5px -10px 0
.card
display: inline-block
vertical-align: top
margin: 10px
&.table-type
margin-top: 15px
background: #FFF
// padding: 20px
// 新版样式
// 页面头部--搜索栏
& > .page-nav
padding: 20px
background-color: #FFF
margin-top: 14px
display: flex
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
// align-items: center
align-items: flex-start
& > .right-operation
margin-left: auto
button
vertical-align: bottom
margin-left: 10px
& > .search-fields
display: inline-block
vertical-align: middle
.el-input__inner::placeholder
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
line-height: 14px
color:#999999
width: 300px
& .fields
display: inline-block
height: 20px
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #666666
line-height: 20px
margin-right: 10px
& .contents
margin-right: 20px
// 页面内容
& > .page-content
flex: 1
padding: 14px 20px
background-color: #FFF
margin-top: 20px
flex-direction: column
display: flex
overflow: hidden
// 内容头部--按钮操作区域
& > .content-header
margin-bottom: 14px
text-align: left
.el-button
margin-left: 0px
margin-right: 10px
height: 32px
background: #409EFF
border-radius: 2px
width: 98px !important
span.text
display: inline-block
width: 56px
height: 18px
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #FFFFFF
i.iconfont::before
display: inline-block
width: 12px
height: 12px
// 内容--列表
& > .table-list
flex: 1
overflow: auto
& > .list-content
height: 100%
.el-range-input
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
.el-date-editor .el-range__close-icon
line-height: 24px
// 新建页公共样式
.common-create
display: flex
flex-direction: column
& > .page-header
padding: 0 20px
height: 48px
line-height: 48px
background: #FFF
box-shadow: 0px 2px 8px 0px rgba(37, 38, 94, 0.1)
z-index: 100
& > .title
cursor: pointer
color: #333
.iconfont
color: #666
&:hover
.iconfont
color: #409EFF
& > .page-content
padding: 20px
flex: 1
overflow-y: auto
& > .content-card
background: #FFF
& > .header
height: 48px
line-height: 48px
padding: 0 20px
font-weight: 400
font-size: 16px
border-bottom: 1px solid #E4E7ED
&::before
content: ''
display: inline-block
width: 4px
height: 16px
background: #409EFF
vertical-align: middle
border-radius: 10px
margin-right: 10px
margin-bottom: 3px
& > .content
padding: 24px 20px
& > .content-has-button
padding: 14px 20px 24px 20px
& > .el-button + .el-button
margin-left: 10px
& + .content-card
margin-top: 20px
& > .page-footer
height: 64px
line-height: 64px
background: #FFF
padding: 0 20px
box-shadow: 0px -2px 8px 0px rgba(37, 38, 94, 0.1)
z-index: 100
// 顶栏选择框
.lang-list, .select-list
column-count: 1
column-width: auto
li
cursor: pointer
font-size: 14px
&:hover
color: #409EFF
+ li
margin-top: 16px
.is-active
color: #409EFF
.operate
font-size: 14px
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
color: #409EFF
line-height: 20px
margin-right: 20px
cursor: pointer
.operate-delete
color: #F56C6C
// 搜索栏禁止输入校验规则之外的字符
.error-border .el-input__inner
border: 1px solid red !important
No preview for this file type
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg>
<metadata>
Created by FontForge 20110222 at Mon Mar 7 13:35:43 2011
By www-data
Created by Sizenko Alexander. (c) 2008 Style-7. All rights reserved.
</metadata>
<defs>
<font id="http:" horiz-adv-x="455" >
<font-face
font-family="Digital-7 Mono"
font-weight="400"
font-stretch="normal"
units-per-em="1000"
panose-1="2 0 5 9 0 0 0 0 0 0"
ascent="800"
descent="-200"
x-height="645"
cap-height="655"
bbox="0 -109 455 764"
underline-thickness="64"
underline-position="-141"
unicode-range="U+0020-2030"
/>
<missing-glyph />
<glyph glyph-name="space" unicode=" "
/>
<glyph glyph-name="exclam" unicode="!"
d="M245 318l19 -18v-155h-73v119zM191 391v191l27 73c24 -7 40 -22 46 -46v-254l-19 -19zM264 0h-73v73h73v-73z" />
<glyph glyph-name="quotedbl" unicode="&#x22;"
d="M200 509l-36 -36l-37 36v146h73v-146zM346 510l-36 -36l-36 36v145h72v-145z" />
<glyph glyph-name="numbersign" unicode="#"
d="M245 436l37 -36l-37 -36h-36l-36 36l36 36h36zM245 291l37 -36l-37 -37h-36l-36 37l36 36h36zM118 345l37 37l36 -37v-36l-36 -36l-37 36v36zM264 345l36 37l36 -37v-36l-36 -36l-36 36v36zM118 509l37 36l36 -36v-54l-36 -37l-37 37v54zM264 509l36 36l36 -36v-54
l-36 -37l-36 37v54zM264 201l36 36l36 -36v-56l-36 -36l-36 36v56zM118 200l37 36l36 -36v-55l-36 -37l-37 37v55zM100 291l36 -36l-36 -37h-36l-37 37l37 36h36zM391 290l36 -36l-36 -37h-36l-37 37l37 36h36zM391 436l36 -36l-36 -36h-36l-37 36l37 36h36zM100 435l36 -36
l-36 -36h-36l-37 36l37 36h36z" />
<glyph glyph-name="dollar" unicode="$"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM109 564v-173l-54 -55l-19 19v236zM110 582l-73 27c6 24 21 39 46 46h290c24 -7 39 -22 45 -46l-73 -27h-235z
M200 682v45l36 37l37 -37v-45h-73zM200 391v164h73v-164h-73zM200 100v164h73v-164h-73zM273 -27v-46l-37 -36l-36 36v46h73z" />
<glyph glyph-name="percent" unicode="%"
d="M237 435l108 220c37 0 61 -13 73 -37l-140 -282h-41v99zM217 220l-108 -220c-36 0 -61 12 -73 36l140 282h41v-98zM127 582h-54l-73 27c6 24 21 39 45 46h110zM73 564v-55l-28 -73c-24 6 -39 22 -45 46v109zM91 509h54l73 -27c-6 -24 -21 -40 -45 -46h-109zM145 527v55
l28 73c24 -7 39 -22 45 -46v-109zM382 91v54l27 73c24 -6 39 -21 46 -45v-109zM364 145h-55l-73 28c6 24 22 39 46 45h109zM309 127v-54l-27 -73c-24 6 -40 21 -46 45v110zM327 73h55l73 -28c-7 -24 -22 -39 -46 -45h-109z" />
<glyph glyph-name="ampersand" unicode="&#x26;"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-209h-45l-28 27v146zM436 0h-354c-24 6 -40 21 -46 45l73 28h291l55 -55zM36 64v236l19 18l54 -54v-173zM291 545h-146l-72 28c6 24 21 39 45 45h200zM145 527v-100l-54 -54l-18 18v164zM309 427v118
l27 73c25 -6 40 -21 46 -45v-182l-18 -18zM418 -18v-46l-18 -18l-55 55v9h73z" />
<glyph glyph-name="quotesingle" unicode="'"
d="M273 509l-37 -36l-36 36v146h73v-146z" />
<glyph glyph-name="parenleft" unicode="("
d="M227 582h-100l-36 36l36 37h100l37 -37zM55 336l-19 19v209l46 45l27 -27v-191zM264 36l-37 -36h-100l-36 36l36 37h100zM109 264v-191l-27 -28l-46 46v209l19 18z" />
<glyph glyph-name="parenright" unicode=")"
d="M209 73h100l36 -37l-36 -36h-100l-36 36zM382 318l18 -18v-209l-45 -46l-28 28v191zM173 618l36 37h100l36 -37l-36 -36h-100zM327 391v191l28 27l45 -45v-209l-18 -19z" />
<glyph glyph-name="asterisk" unicode="*"
d="M191 391v73l36 36l37 -36v-73l63 36l50 -13l-13 -50l-63 -37l63 -36l13 -50l-50 -14l-63 37v-73l-37 -36l-36 36v73l-64 -37l-50 14l14 50l63 36l-63 37l-14 50l50 13z" />
<glyph glyph-name="plus" unicode="+"
d="M191 364v81l36 37l37 -37v-81h81l37 -37l-37 -36h-81v-82l-37 -36l-36 36v82h-82l-36 36l36 37h82z" />
<glyph glyph-name="comma" unicode=","
d="M264 -73l-37 -36l-36 36v146h73v-146z" />
<glyph glyph-name="hyphen" unicode="-"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236z" />
<glyph glyph-name="period" unicode="."
d="M264 0h-73v73h73v-73z" />
<glyph glyph-name="slash" unicode="/"
d="M237 435l108 220c37 0 61 -13 73 -37l-140 -282h-41v99zM217 220l-108 -220c-36 0 -61 12 -73 36l140 282h41v-98z" />
<glyph glyph-name="zero" unicode="0"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254
l-18 -19z" />
<glyph glyph-name="one" unicode="1"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="two" unicode="2"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM382 0h-300c-24 6 -40 21 -46 45l73 28h246zM36 64v236l19 18l54 -54v-173zM327 582h-217l-73 27c6 24 21 39 46 46h272zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="three" unicode="3"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM327 582h-217l-73 27c6 24 21 39 46 46h272zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="four" unicode="4"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM109 591v-200l-54 -55l-19 19v263zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="five" unicode="5"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="six" unicode="6"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="seven" unicode="7"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="eight" unicode="8"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236z
M345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="nine" unicode="9"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73
c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="colon" unicode=":"
d="M264 145h-73v73h73v-73zM264 436h-73v73h73v-73z" />
<glyph glyph-name="semicolon" unicode=";"
d="M264 436h-73v73h73v-73zM264 -73l-37 -36l-36 36v146h73v-146z" />
<glyph glyph-name="less" unicode="&#x3c;"
d="M191 336h-100l182 182h36l27 -35zM336 172l-27 -36h-36l-182 182h100z" />
<glyph glyph-name="equal" unicode="="
d="M345 436l37 -36l-37 -36h-236l-36 36l36 36h236zM345 290l37 -36l-37 -37h-236l-36 37l36 36h236z" />
<glyph glyph-name="greater" unicode="&#x3e;"
d="M91 483l27 35h37l181 -182h-100zM236 318h100l-181 -182h-37l-27 36z" />
<glyph glyph-name="question" unicode="?"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM36 145v155l19 18l54 -54v-119h-73zM327 582h-217l-73 27c6 24 21 39 46 46h272zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM109 0h-73v73h73v-73z" />
<glyph glyph-name="at" unicode="@"
d="M400 318l18 -18v-109c-6 -24 -21 -39 -45 -46l-28 73v46zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19
zM355 145h-128c-24 6 -39 21 -45 45l73 28h72zM182 209v91l18 18l55 -54v-28zM255 418v-27l-55 -55l-18 19v90zM327 436h-72l-73 29c6 24 21 39 45 45l100 -1v-73z" />
<glyph glyph-name="A" unicode="A"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM109 264v-191l-27 -73
c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="B" unicode="B"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM36 64v236l19 18l54 -54v-173zM327 582h-218l-73 27v46h291l37 -37zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 27l45 -45v-209l-18 -19zM400 318l18 -18v-209l-45 -46l-28 28v191zM363 36l-37 -36h-290v45l73 28
h217z" />
<glyph glyph-name="C" unicode="C"
d="M382 0h-300c-24 6 -40 21 -46 45l73 28h246zM36 64v236l19 18l54 -54v-173zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="D" unicode="D"
d="M36 64v236l19 18l54 -54v-173zM327 582h-218l-73 27v46h291l37 -37zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 27l45 -45v-209l-18 -19zM400 318l18 -18v-209l-45 -46l-28 28v191zM363 36l-37 -36h-290v45l73 28h217z" />
<glyph glyph-name="E" unicode="E"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM382 0h-300c-24 6 -40 21 -46 45l73 28h246zM36 64v236l19 18l54 -54v-173zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="F" unicode="F"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="G" unicode="G"
d="M345 364l37 -37l-37 -36h-81l-37 36l37 37h81zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="H" unicode="H"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM55 327l-19 18v255c6 24 22 39 46 45l27 -72
v-191z" />
<glyph glyph-name="I" unicode="I"
d="M182 391v191l27 73c24 -7 39 -22 46 -46v-254l-19 -19zM236 327l19 -18v-254c-7 -25 -22 -40 -46 -46l-27 73v191z" />
<glyph glyph-name="J" unicode="J"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="K" unicode="K"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM127 436l218 219c37 0 61 -13 73 -37l-236 -236h-55v54zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM55 336l-19 19v254c6 24 22 39 46 46l27 -73
v-191z" />
<glyph glyph-name="L" unicode="L"
d="M109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM127 73h218l73 -28c-6 -24 -21 -39 -45 -45h-273zM55 336l-19 19v254c6 24 22 39 46 46l27 -73v-191z" />
<glyph glyph-name="M" unicode="M"
d="M264 355l-37 -37l-36 37v209h73v-209zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM109 264v-191l-27 -73
c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="N" unicode="N"
d="M109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM327 382h-63l-137 136v55h55l145 -146v-45zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM345 382v191l28 72c24 -6 39 -21 45 -45v-255l-18 -18zM55 327l-19 18v255c6 24 22 39 46 45l27 -72v-191z
" />
<glyph glyph-name="O" unicode="O"
d="M327 582h-200l-36 36l36 37h200l37 -37zM345 391v191l28 27l45 -45v-209l-18 -19zM400 318l18 -18v-209l-45 -46l-28 28v191zM55 336l-19 19v209l46 45l27 -27v-191zM364 36l-37 -36h-200l-36 36l36 37h200zM109 264v-191l-27 -28l-46 46v209l19 18z" />
<glyph glyph-name="P" unicode="P"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM327 582h-218l-73 27v46h291l37 -37zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 27l45 -45v-209l-18 -19zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="Q" unicode="Q"
d="M400 318l18 -18v-218l-73 73v109zM336 0h-254c-24 6 -40 21 -46 45l73 28h155zM36 64v236l19 18l54 -54v-173zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM255 164h54l118 -119
v-54h-54l-118 118v55z" />
<glyph glyph-name="R" unicode="R"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM127 273h55l236 -237c-12 -24 -36 -36 -73 -36l-218 218v55zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM327 582h-217l-73 27c6 24 21 39 46 46h272zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z
M109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="S" unicode="S"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM109 564v-173l-54 -55l-19 19v236zM110 582l-73 27c6 24 21 39 46 46h290c24 -7 39 -22 45 -46l-73 -27h-235z" />
<glyph glyph-name="T" unicode="T"
d="M227 318l37 -36v-237c-6 -24 -22 -39 -46 -45l-27 73v209zM191 373v191h73v-191l-37 -37zM110 582l-73 27c6 24 21 39 46 46h290c24 -7 39 -22 45 -46l-73 -27h-235z" />
<glyph glyph-name="U" unicode="U"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM55 327l-19 18v255c6 24 22 39 46 45l27 -72v-191z" />
<glyph glyph-name="V" unicode="V"
d="M55 327l-19 18v255c6 24 22 39 46 45l27 -72v-191zM345 382v191l28 72c24 -6 39 -21 45 -45v-255l-18 -18zM218 109v-109l-182 236v55l19 18l54 -54zM345 255l55 54l18 -18v-55l-182 -236v109z" />
<glyph glyph-name="W" unicode="W"
d="M264 91h-73v209l36 36l37 -36v-209zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM355 0h-272c-25 6 -40 21 -46 45l73 28h217zM36 64v236l19 18l54 -54v-173zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM55 336l-19 19v254c6 24 22 39 46 46
l27 -73v-191z" />
<glyph glyph-name="X" unicode="X"
d="M236 318h41l140 -282c-12 -24 -36 -36 -72 -36l-109 220v98zM237 435l108 220c37 0 61 -13 73 -37l-140 -282h-41v99zM217 220l-108 -220c-36 0 -61 12 -73 36l140 282h41v-98zM218 336h-41l-140 282c12 24 37 37 73 37l108 -221v-98z" />
<glyph glyph-name="Y" unicode="Y"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM109 591v-200l-54 -55l-19 19v263zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="Z" unicode="Z"
d="M382 0h-255l37 73h191zM291 582h-181l-73 27c6 24 21 39 46 46h244zM227 391l118 264c37 0 61 -13 73 -37l-136 -282h-55v55zM236 264l-127 -264c-36 0 -61 12 -73 36l146 282h54v-54z" />
<glyph glyph-name="bracketleft" unicode="["
d="M36 64v236l19 18l54 -54v-173zM173 582h-63l-73 27c6 24 21 39 46 46h126l18 -19zM109 564v-173l-54 -55l-19 19v236zM227 18l-18 -18h-126c-25 6 -40 21 -46 45l73 28h63z" />
<glyph glyph-name="backslash" unicode="\"
d="M236 318h41l140 -282c-12 -24 -36 -36 -72 -36l-109 220v98zM218 336h-41l-140 282c12 24 37 37 73 37l108 -221v-98z" />
<glyph glyph-name="bracketright" unicode="]"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM327 582h-45l-55 54l18 19h110zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM355 0h-110l-18 18l55 55h45z" />
<glyph glyph-name="asciicircum" unicode="^"
d="M235 555v100l182 -182v-37l-35 -27zM72 409l-36 27v37l182 182l-1 -100z" />
<glyph glyph-name="underscore" unicode="_"
d="M345 73l72 -28c-6 -24 -21 -39 -45 -45h-290c-24 6 -40 21 -46 45l73 28h236z" />
<glyph glyph-name="grave" unicode="`"
d="M309 555v-37l-36 -9l-128 127l10 37h36z" />
<glyph glyph-name="a" unicode="a"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM109 264v-191l-27 -73
c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="b" unicode="b"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM36 64v236l19 18l54 -54v-173zM327 582h-218l-73 27v46h291l37 -37zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 27l45 -45v-209l-18 -19zM400 318l18 -18v-209l-45 -46l-28 28v191zM363 36l-37 -36h-290v45l73 28
h217z" />
<glyph glyph-name="c" unicode="c"
d="M382 0h-300c-24 6 -40 21 -46 45l73 28h246zM36 64v236l19 18l54 -54v-173zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="d" unicode="d"
d="M36 64v236l19 18l54 -54v-173zM327 582h-218l-73 27v46h291l37 -37zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 27l45 -45v-209l-18 -19zM400 318l18 -18v-209l-45 -46l-28 28v191zM363 36l-37 -36h-290v45l73 28h217z" />
<glyph glyph-name="e" unicode="e"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM382 0h-300c-24 6 -40 21 -46 45l73 28h246zM36 64v236l19 18l54 -54v-173zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="f" unicode="f"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="g" unicode="g"
d="M345 364l37 -37l-37 -36h-81l-37 36l37 37h81zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM355 582h-245l-73 27c6 24 21 39 46 46h299zM109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="h" unicode="h"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM55 327l-19 18v255c6 24 22 39 46 45l27 -72
v-191z" />
<glyph glyph-name="i" unicode="i"
d="M182 391v191l27 73c24 -7 39 -22 46 -46v-254l-19 -19zM236 327l19 -18v-254c-7 -25 -22 -40 -46 -46l-27 73v191z" />
<glyph glyph-name="j" unicode="j"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="k" unicode="k"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM127 436l218 219c37 0 61 -13 73 -37l-236 -236h-55v54zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM55 336l-19 19v254c6 24 22 39 46 46l27 -73
v-191z" />
<glyph glyph-name="l" unicode="l"
d="M109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM127 73h218l73 -28c-6 -24 -21 -39 -45 -45h-273zM55 336l-19 19v254c6 24 22 39 46 46l27 -73v-191z" />
<glyph glyph-name="m" unicode="m"
d="M264 355l-37 -37l-36 37v209h73v-209zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM109 264v-191l-27 -73
c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="n" unicode="n"
d="M109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM327 382h-63l-137 136v55h55l145 -146v-45zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM345 382v191l28 72c24 -6 39 -21 45 -45v-255l-18 -18zM55 327l-19 18v255c6 24 22 39 46 45l27 -72v-191z
" />
<glyph glyph-name="o" unicode="o"
d="M327 582h-200l-36 36l36 37h200l37 -37zM345 391v191l28 27l45 -45v-209l-18 -19zM400 318l18 -18v-209l-45 -46l-28 28v191zM55 336l-19 19v209l46 45l27 -27v-191zM364 36l-37 -36h-200l-36 36l36 37h200zM109 264v-191l-27 -28l-46 46v209l19 18z" />
<glyph glyph-name="p" unicode="p"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM327 582h-218l-73 27v46h291l37 -37zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 27l45 -45v-209l-18 -19zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18z" />
<glyph glyph-name="q" unicode="q"
d="M400 318l18 -18v-218l-73 73v109zM336 0h-254c-24 6 -40 21 -46 45l73 28h155zM36 64v236l19 18l54 -54v-173zM327 582h-217l-73 27c6 24 21 39 46 46h272zM109 564v-173l-54 -55l-19 19v236zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM255 164h54l118 -119
v-54h-54l-118 118v55z" />
<glyph glyph-name="r" unicode="r"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM127 273h55l236 -237c-12 -24 -36 -36 -73 -36l-218 218v55zM109 264v-191l-27 -73c-24 6 -40 21 -46 45v255l19 18zM327 582h-217l-73 27c6 24 21 39 46 46h272zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z
M109 564v-173l-54 -55l-19 19v236z" />
<glyph glyph-name="s" unicode="s"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM109 564v-173l-54 -55l-19 19v236zM110 582l-73 27c6 24 21 39 46 46h290c24 -7 39 -22 45 -46l-73 -27h-235z" />
<glyph glyph-name="t" unicode="t"
d="M227 318l37 -36v-237c-6 -24 -22 -39 -46 -45l-27 73v209zM191 373v191h73v-191l-37 -37zM110 582l-73 27c6 24 21 39 46 46h290c24 -7 39 -22 45 -46l-73 -27h-235z" />
<glyph glyph-name="u" unicode="u"
d="M400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM36 64v236l19 18l54 -54v-173zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM55 327l-19 18v255c6 24 22 39 46 45l27 -72v-191z" />
<glyph glyph-name="v" unicode="v"
d="M55 327l-19 18v255c6 24 22 39 46 45l27 -72v-191zM345 382v191l28 72c24 -6 39 -21 45 -45v-255l-18 -18zM218 109v-109l-182 236v55l19 18l54 -54zM345 255l55 54l18 -18v-55l-182 -236v109z" />
<glyph glyph-name="w" unicode="w"
d="M264 91h-73v209l36 36l37 -36v-209zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19zM355 0h-272c-25 6 -40 21 -46 45l73 28h217zM36 64v236l19 18l54 -54v-173zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM55 336l-19 19v254c6 24 22 39 46 46
l27 -73v-191z" />
<glyph glyph-name="x" unicode="x"
d="M236 318h41l140 -282c-12 -24 -36 -36 -72 -36l-109 220v98zM237 435l108 220c37 0 61 -13 73 -37l-140 -282h-41v99zM217 220l-108 -220c-36 0 -61 12 -73 36l140 282h41v-98zM218 336h-41l-140 282c12 24 37 37 73 37l108 -221v-98z" />
<glyph glyph-name="y" unicode="y"
d="M345 364l37 -37l-37 -36h-236l-36 36l36 37h236zM400 318l18 -18v-255c-6 -24 -21 -39 -45 -45l-28 73v191zM355 0h-273c-24 6 -40 21 -46 45l73 28h218zM109 591v-200l-54 -55l-19 19v263zM345 391v191l28 73c24 -7 39 -22 45 -46v-254l-18 -19z" />
<glyph glyph-name="z" unicode="z"
d="M382 0h-255l37 73h191zM291 582h-181l-73 27c6 24 21 39 46 46h244zM227 391l118 264c37 0 61 -13 73 -37l-136 -282h-55v55zM236 264l-127 -264c-36 0 -61 12 -73 36l146 282h54v-54z" />
<glyph glyph-name="braceleft" unicode="{"
d="M136 64v200l55 54l18 -18v-209zM273 582h-63l-73 27c6 24 21 39 46 46h126l18 -19zM209 564v-209l-18 -19l-55 55v200zM327 18l-18 -18h-126c-25 6 -40 21 -46 45l73 28h63zM127 364l37 -37l-37 -36h-63l-37 36l37 37h63z" />
<glyph glyph-name="bar" unicode="|"
d="M109 45c-6 -24 -21 -39 -45 -45l-28 73v509l28 73c24 -7 39 -22 45 -46v-564z" />
<glyph glyph-name="braceright" unicode="}"
d="M191 91v209l18 18l55 -54v-200zM73 636l18 19h126c25 -7 40 -22 46 -46l-73 -27h-63zM264 591v-200l-55 -55l-18 19v209zM127 73h63l73 -28c-6 -24 -21 -39 -46 -45h-126l-18 18zM336 364l37 -37l-37 -36h-63l-37 36l37 37h63z" />
<glyph glyph-name="asciitilde" unicode="~"
d="M245 436l37 -36l-37 -36h-36l-36 36l36 36h36zM100 435l36 -36l-36 -36h-36l-37 36l37 36h36zM391 436l36 -36l-36 -36h-36l-37 36l37 36h36zM173 491l36 -36l-36 -37h-37l-36 37l36 36h37zM318 373l37 -37l-37 -36h-36l-37 36l37 37h36z" />
<glyph glyph-name="perthousand" unicode="&#x2030;"
d="M208 363l-145 -145c-37 0 -54 17 -54 54l172 173h27v-82zM82 582h-9l-73 27c6 24 21 39 45 46h64zM73 564v-55l-28 -73c-24 6 -39 22 -45 46v109zM91 509h9l73 -27c-6 -24 -21 -40 -46 -46h-63zM100 527v55l27 73c25 -7 40 -22 46 -46v-109zM355 145h-10l-72 28
c6 24 21 39 45 45h64zM346 127v-54l-27 -73c-24 6 -39 21 -45 45v110zM364 73h9l72 -28c-6 -24 -21 -39 -45 -45h-64zM373 91v54l27 73c24 -6 39 -21 45 -45v-109zM164 91v54l27 73c24 -6 39 -21 45 -45v-109zM155 72h9l72 -27c-6 -25 -21 -40 -45 -46h-64zM136 127v-54
l-27 -73c-24 6 -39 21 -45 45v110zM145 145h-9l-72 28c6 24 21 39 45 45h64zM218 483l146 144c36 0 53 -17 53 -53l-172 -174l-27 1v82z" />
<glyph glyph-name="quoteleft" unicode="&#x2018;"
d="M273 473h-73v145l36 37l37 -37v-145z" />
<glyph glyph-name="quoteright" unicode="&#x2019;"
d="M273 509l-37 -36l-36 36v146h73v-146z" />
<glyph glyph-name="quotedblleft" unicode="&#x201c;"
d="M200 474h-73v145l37 36l36 -36v-145zM345 473h-72v145l36 37l36 -37v-145z" />
<glyph glyph-name="quotedblright" unicode="&#x201d;"
d="M200 509l-36 -36l-37 36v146h73v-146zM346 510l-36 -36l-36 36v145h72v-145z" />
<glyph glyph-name="bullet" unicode="&#x2022;"
d="M223 200c-74 0 -132 58 -132 132c0 73 58 132 132 132c72 0 132 -60 132 -132c0 -74 -59 -132 -132 -132z" />
<glyph glyph-name="endash" unicode="&#x2013;"
d="M391 364l36 -37l-36 -36h-327l-37 36l37 37h327z" />
<glyph glyph-name="emdash" unicode="&#x2014;"
d="M409 364l36 -37l-36 -36h-364l-36 36l36 37h364z" />
<glyph glyph-name="copyright" unicode="&#xa9;"
d="M373 0h-328c-24 6 -39 21 -45 45l73 28h272zM345 582h-271l-73 27c6 24 21 39 45 46h327zM73 91l-73 -27v527l73 -27v-473zM436 45c-6 -24 -21 -39 -45 -45l-27 73v509l27 73c24 -7 39 -22 45 -46v-564zM300 436h-118l-73 28c6 24 21 39 46 45h172zM182 418v-200l-27 -73
c-25 7 -40 22 -46 46v254zM200 218h55l72 -27c-6 -24 -21 -39 -45 -46h-109z" />
</font>
</defs></svg>
No preview for this file type
No preview for this file type
/* @font-face kit by Fonts2u (https://fonts2u.com) */
@font-face {
font-family:"Digital-7 Mono";
src:url("digital-7__mono_.eot?") format("eot"),
url("digital-7__mono_.woff") format("woff"),
url("digital-7__mono_.ttf") format("truetype"),
url("digital-7__mono_.svg#Digital-7Mono") format("svg");
font-weight:normal;
font-style:normal;
}
.showdown
margin: 0 auto
font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial,sans-serif
color: #444444
line-height: 1
img
max-width: 100%body
margin: 0 auto
font-family: "ubuntu", "Tahoma", "Microsoft YaHei", arial,sans-serif
color: #444444
line-height: 1
padding: 30px
img
max-width: 100%
@media screen and (min-width: 1000px)
body
width: 842px
margin: 10px auto
h1, h2, h3, h4
color: #111111
font-weight: 400
margin-top: 1em
h1, h2, h3, h4, h5
font-family: Georgia, Palatino, serif
h1, h2, h3, h4, h5, dl
margin-bottom: 16px
padding: 0
p
margin-top: 8px
margin-bottom: 3px
h1
font-size: 48px
line-height: 54px
h2
font-size: 36px
line-height: 42px
h1, h2
border-bottom: 1px solid #EFEAEA
padding-bottom: 10px
h3
font-size: 24px
line-height: 30px
h4
font-size: 21px
line-height: 26px
h5
font-size: 18px
line-height: 23px
a
color: #0099ff
margin: 0 2px
padding: 0
vertical-align: baseline
text-decoration: none
a:hover
text-decoration: none
color: #FF4433
a:visited
/*color: purple*/
ul, ol
padding: 0
padding-left: 18px
margin: 0
li
line-height: 24px
list-style: disc
p, ul, ol
font-size: 16px
line-height: 24px
ol ol, ul ol
list-style-type: lower-roman
code, pre
font-family: Consolas, Monaco, Andale Mono, monospace
background-color: #f7f7f7
color: inherit
code
font-family: Consolas, Monaco, Andale Mono, monospace
margin: 0 2px
pre
font-family: Consolas, Monaco, Andale Mono, monospace
line-height: 1.7em
overflow: auto
padding: 6px 10px
border-left: 5px solid #6CE26C
pre > code
font-family: Consolas, Monaco, Andale Mono, monospace
border: 0
display: inline
max-width: initial
padding: 0
margin: 0
overflow: initial
line-height: 1.6em
font-size: .95em
white-space: pre
background: 0 0
code
color: #666555
aside
display: block
float: right
width: 390px
blockquote
border-left: .5em solid #eee
padding: 0 0 0 2em
margin-left: 0
blockquote cite
font-size: 14px
line-height: 20px
color: #bfbfbf
blockquote cite:before
content: '\2014 \00A0'
blockquote p
color: #666
hr
text-align: left
color: #999
height: 2px
padding: 0
margin: 16px 0
background-color: #e7e7e7
border: 0 none
dl
padding: 0
dl dt
padding: 10px 0
margin-top: 16px
font-size: 1em
font-style: italic
font-weight: bold
dl dd
padding: 0 16px
margin-bottom: 16px
dd
margin-left: 0
table
*border-collapse: collapse // IE7 and lower
border-spacing: 0
width: 100%
table
border: solid #ccc 1px
table thead
background: #f7f7f7
table thead tr:hover
background: #f7f7f7
table tr:hover
background: #fbf8e9
-o-transition: all 0.1s ease-in-out
-webkit-transition: all 0.1s ease-in-out
-moz-transition: all 0.1s ease-in-out
-ms-transition: all 0.1s ease-in-out
transition: all 0.1s ease-in-out
table td, .table th
border-left: 1px solid #ccc
border-top: 1px solid #ccc
padding: 10px
text-align: left
table th
border-top: none
text-shadow: 0 1px 0 rgba(255,255,255,.5)
padding: 5px
border-left: 1px solid #ccc
table td:first-child, table th:first-child
border-left: none
@media screen and (min-width: 1000px)
body
width: 842px
margin: 10px auto
h1, h2, h3, h4
color: #111111
font-weight: 400
margin-top: 1em
h1, h2, h3, h4, h5
font-family: Georgia, Palatino, serif
h1, h2, h3, h4, h5, dl
margin-bottom: 16px
padding: 0
p
margin-top: 8px
margin-bottom: 3px
h1
font-size: 48px
line-height: 54px
h2
font-size: 36px
line-height: 42px
h1, h2
border-bottom: 1px solid #EFEAEA
padding-bottom: 10px
h3
font-size: 24px
line-height: 30px
h4
font-size: 21px
line-height: 26px
h5
font-size: 18px
line-height: 23px
a
color: #0099ff
margin: 0 2px
padding: 0
vertical-align: baseline
text-decoration: none
a:hover
text-decoration: none
color: #FF4433
a:visited
/*color: purple*/
ul, ol
padding: 0
padding-left: 18px
margin: 0
li
line-height: 24px
p, ul, ol
font-size: 16px
line-height: 24px
ol ol, ul ol
list-style-type: lower-roman
code, pre
font-family: Consolas, Monaco, Andale Mono, monospace
background-color:#f7f7f7
color: inherit
code
font-family: Consolas, Monaco, Andale Mono, monospace
margin: 0 2px
pre
font-family: Consolas, Monaco, Andale Mono, monospace
line-height: 1.7em
overflow: auto
padding: 6px 10px
border-left: 5px solid #6CE26C
pre > code
font-family: Consolas, Monaco, Andale Mono, monospace
border: 0
display: inline
max-width: initial
padding: 0
margin: 0
overflow: initial
line-height: 1.6em
font-size: .95em
white-space: pre
background: 0 0
code
color: #666555
aside
display: block
float: right
width: 390px
blockquote
border-left: .5em solid #eee
padding: 0 0 0 2em
margin-left: 0
blockquote cite
font-size: 14px
line-height: 20px
color: #bfbfbf
blockquote cite:before
content: '\2014 \00A0'
blockquote p
color: #666
hr
text-align: left
color: #999
height: 2px
padding: 0
margin: 16px 0
background-color: #e7e7e7
border: 0 none
dl
padding: 0
dl dt
padding: 10px 0
margin-top: 16px
font-size: 1em
font-style: italic
font-weight: bold
dl dd
padding: 0 16px
margin-bottom: 16px
dd
margin-left: 0
table
*border-collapse: collapse // IE7 and lower
border-spacing: 0
width: 100%
table
border: solid #ccc 1px
table thead
background: #f7f7f7
table thead tr:hover
background: #f7f7f7
table tr:hover
background: #fbf8e9
-o-transition: all 0.1s ease-in-out
-webkit-transition: all 0.1s ease-in-out
-moz-transition: all 0.1s ease-in-out
-ms-transition: all 0.1s ease-in-out
transition: all 0.1s ease-in-out
table td, .table th
border-left: 1px solid #ccc
border-top: 1px solid #ccc
padding: 10px
text-align: left
table th
border-top: none
text-shadow: 0 1px 0 rgba(255,255,255,.5)
padding: 5px
border-left: 1px solid #ccc
table td:first-child, table th:first-child
border-left: none
// label 样式 (色块内文本)
.label
display: inline-block
min-width: 20px
width: 72px
padding: 5px 10px
margin: 0
border-radius: 2px
font-size: 12px
white-space: nowrap
text-align: center
font-family: PingFangSC-Regular, PingFang SC
font-weight: 400
line-height: 17px
height: 28px
&.disabled
color: #CCC!important
background-color: #F2F2F2!important
border: 1px solid #CCC!important
&.label-primary
// color: #4C4C4C
color: #409EFF
background: #EDF5FF
border: 1px solid #C6E1FF
// &.label-tag
// font-size: 12px
// color: #259DFF
// background-color: rgba(37,157,255,0.1)
&.label-data
color: #0079C9
background-color: #E0F5FF
border: 1px solid #0079C9
&.label-failed
color: #FF4433
background-color: #FFE6E6
border: 1px solid #E63622
/*
label.v-switch
input(
type="checkbox",
v-model="switchValue"
)
.icon
*/
// switch的高度
$switch-height: 20px
// switch的宽度
$switch-width: 36px
// switch的开关的直径
$switch-circle: 16px
// switch为true的颜色
$switch-active-color: #13ce66
// switch为false的颜色
$switch-inactive-color: #dcdfe6
.v-switch
display: inline-block
position: relative
font-size: 14px
width: $switch-width
height: $switch-height
vertical-align: middle
input
display: none
&:checked + .icon::after
left: $switch-width - $switch-height
&:checked + .icon
background: $switch-active-color
border: 1px solid $switch-active-color
.icon
display: inline-block
position: absolute
width: $switch-width
height: $switch-height
border: 1px solid $switch-inactive-color
outline: none
border-radius: 999px
background: $switch-inactive-color
cursor: pointer
transition: border-color .3s,background-color .3s
vertical-align: middle
&::after
content: ""
position: absolute
top: ($switch-height - $switch-circle - 2px)/2
left: ($switch-height - $switch-circle - 2px)/2
border-radius: 100%
transition: all .3s
width: $switch-circle
height: $switch-circle
background-color: #fff
// table.primary
// table-layout: fixed
// width: 100%
// thead
// text-align: left
// font-weight: bold
// background: #F5F7F9
// tr
// height: 40px
// border: 1px solid #EEE
// transition: background .25s ease-in-out
// tbody
// tr
// border: 1px solid #EEE
// &:hover
// background: #F1F1F5!important
// th, td
// vertical-align: middle
// padding: 0 15px
@import "../theme.sass"
table.through
table-layout: fixed
width: 100%
thead
font-size: 14px
font-weight: 500
color: $--color-text-primary
text-align: left
background: $--color-table-header
border-bottom: 1px solid $--color-table-border
tr
white-space: nowrap
th
padding: 12px 10px
th:not(:first-child)
position: relative
// &::before
// content: ''
// position: absolute
// left: 0
// top: 6px
// width: 1px
// height: 18px
// background: #CCC
.iconfont.icon-question-o
margin-left: 10px
tbody
color: #4C4C4C
tr
border-bottom: 1px solid #E5E5E5
transition: background .25s ease-in-out
&:hover
background: #F1F1F5!important
td
padding: 10px
th, td
vertical-align: middle
padding: 0 10px
&:first-child
padding-left: 15px
&:last-child
padding-right: 15px
table.diff-bgc
tbody tr
background: #fff
&:nth-child(2n)
background: F9F9Fc
.message-tip-toast
height: 32px
min-width: 400px
padding: 0 28px
position: fixed
left: 50%
transform: translateX(-50%)
background: #FFFFFF
border-radius: 2px
z-index: 1800
display: flex
flex-direction: row
justify-content: center
align-items: center
animation: fade-out 0.7s ease-in-out 2.5s
.desc
.iconfont
font-size: 14px
margin-right: 8px
.text
font-size: 12px
.close
font-size: 12px
position: absolute
right: 14px
top: 50%
transform: translateY(-50%) scale(0.8)
cursor: pointer
// .handle
// padding: 0 20px
// margin-top: 2px
// text-decoration: underline
// cursor: pointer
// color: #409EFF
&.text
background-color: #F1F1F5
.text
color: #737373
.iconfont
color: #CCCCCC
.desc
.iconfont
display: none
&.success
background-color: #E6FFE6
.text, .iconfont
color: #36B342
&.danger
background-color: #FFE6E6
.text, .iconfont
color: #FF4433
&.warning
background-color: #FFF3E6
.text, .iconfont
color: #FF9800
&.info
background-color: #E5F7FF
.text
color: #404040
.iconfont
color: #409EFF
@keyframes fade-out
0%
opacity: 1
100%
opacity: 0
.tippy-popper
.tippy-content
max-height: 270px
line-height: 18px
overflow: hidden
text-align: left
word-break: break-all
white-space: pre-wrap
//定位元素的具体样式。
.relative
position: relative
&.unfold
display: inline-block
width: 100%
height: 100%
.ab-center
//在父元素存在非static样式的时候,使用该类可使当前元素,水平垂直居中。
display: block
position: absolute
left: 50%
top: 50%
transform: translate(-50%, -50%)
.ab-left
display: block
position: absolute
left: 0
top: 50%
transform: translateY(-50%)
.ab-right
display: block
position: absolute
right: 0
top: 50%
transform: translateY(-50%)
.ab-center-top
display: block
position: absolute
left: 50%
top: 0
transform: translateX(-50%)
.ab-left-top
display: block
position: absolute
left: 0
top: 0
.ab-right-top
display: block
position: absolute
right: 0
top: 0
.ab-center-bottom
display: block
position: absolute
left: 50%
bottom: 0
transform: translateX(-50%)
.ab-left-bottom
display: block
position: absolute
left: 0
bottom: 0
.ab-right-bottom
display: block
position: absolute
right: 0
bottom: 0
.ab-expand
display: block
position: absolute
left: 0
top: 0
right: 0
bottom: 0
/**
* http://www.zhangxinxu.com/wordpress/2010/08/html5-css-reset/
*/
html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code,
del, dfn, em, img, ins, kbd, q, samp,
small, strong, sub, sup, var,
b, i,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video
margin: 0
padding: 0
border: 0
outline: 0
font-size: 100%
vertical-align: baseline
background: transparent
body
line-height: 1
article,aside,canvas,details,figcaption,figure,
footer,header,hgroup,menu,nav,section,summary
display: block
nav, ul
list-style: none
a
margin: 0
padding: 0
border: 0
font-size: 100%
vertical-align: baseline
background: transparent
abbr[title], dfn[title]
border-bottom: 1px dotted #000
cursor: help
table
border-collapse: collapse
border-spacing: 0
hr
display: block
height: 1px
border: 0
border-top: 1px solid #cccccc
margin: 1em 0
padding: 0
input, select
vertical-align: middle
/* custom */
a
color: #409EFF
-webkit-backface-visibility: hidden
text-decoration: none
&:hover
color: #66B1FF
&:active
color: #4092EF
&:disabled
color: #9FCEFF
body
-webkit-text-size-adjust: none
-webkit-tap-highlight-color: rgba(0, 0, 0, 0)
input
outline: none
//重置页码样式 解决admin系统的先后问题 需要增加 !important 复原原始element-ui的样式
// .el-pagination.is-background .el-pager li
// font-size: 12px !important
// border: 1px solid #CCCCCC !important
// background: #fff !important
// color: #63686D !important
// //width: 24px !important
// height: 24px !important
// box-sizing: border-box !important
// min-width: 24px !important
// line-height: 24px !important
// font-weight: 500 !important
// margin: 0 2px !important
// padding: 0px !important
// text-align: center !important
// .el-pagination.is-background .btn-prev
// border: 1px solid #CCCCCC !important
// background: #fff !important
// width: 24px !important
// height: 24px !important
// box-sizing: border-box !important
// min-width: 24px !important
// line-height: 24px !important
// margin: 0 2px !important
// .el-pagination.is-background .btn-next
// border: 1px solid #CCCCCC !important
// background: #fff !important
// width: 24px !important
// height: 24px !important
// box-sizing: border-box !important
// min-width: 24px !important
// line-height: 24px !important
// margin: 0 2px !important
// .el-pagination.is-background .el-pager li:not(.disabled).active
// background: #E6F7FF !important
// border: 1px solid #409EFF !important
// border-radius: 2px !important
// border-radius: 2px !important
// font-size: 12px !important
// color: #409EFF !important
// .el-pagination.is-background .el-pager li:not(.disabled)
// &:hover
// background: #E6F7FF !important
// border: 1px solid #409EFF !important
// border-radius: 2px !important
// border-radius: 2px !important
// font-size: 12px !important
// color: #409EFF !important
// .el-pagination span:not([class*=suffix])
// font-size: 12px !important
// position: relative !important
// top: -2px !important
// .el-pagination__editor.el-input
// width: 46px !important
// height: 24px !important
// line-height: 24px !important
// margin-right: 4px !important
// .el-pagination__editor.el-input .el-input__inner
// font-weight: 100 !important
// width: 44px !important
// height: 24px !important
// line-height: 24px !important
// .el-pager .more
// &::before
// line-height: 24px !important
\ No newline at end of file
// 组件配色
$--color-primary: #409EFF // 主色
$--color-success: #67C23A // 成功
$--color-warning: #F6AD3D // 警告
$--color-danger: #F56C6C // 危险
$--color-info: #999999 // 信息
$--color-text-primary: #333333 // 正文、标题
$--color-text-regular: #666666 // 二级文字
$--color-text-tip: #999999 // 提示文字
$--border-color-base: #D7DAE0 // 边框
$--color-divider: #E4E7ED // 分隔线
// $--border-color-lighter: red //组件边框、折叠面板分隔线
// 表格
$--color-table-border: #D7DAE0 // 边框
$--color-table-header: #F5F7FA // 标题背景
$--color-table-stripe: #FBFCFD // 斑马纹
$--color-table-hover: #EDF5FF // hover
// 框架配色
$--color-navigation: #161A1D // 顶栏
$--color-slider: #222C38 // 侧边栏
$--color-slider-active: #182129 //菜单激活
$--color-system-background: #EBEEF5 //系统背景色
// 弹窗样式
$--dialog-header-background: #FBFCFD
$--dialog-header-text: #3C3D40
$--dialog-header-border: #E4E7ED
$--dialog-tip-border: #FBDEB1
$--dialog-tip-background: #FEF6EB
$--dialog-tip-text: #F6AD3D
// $--font-path: '~element-ui/lib/theme-chalk/fonts'
// @import "~element-ui/packages/theme-chalk/src/index"
\ No newline at end of file
// 颜色定义规范
// $color-background: #fff
// $color-background-gray-f2: #f2f2f2
// $color-background-gray-f9: #f9f9f9
// $color-background-gray-e: #eee
// $color-theme: #5CBEFF
// $color-theme-d: #409EFF
// $color-sub-theme: #E04F56
// $color-text: #fff
// $color-text-c: #ccc
// $color-text-b: #999
// $color-text-bb: #666
// $color-text-bbb: #333
// $color-text-o: #F8B62D
// $color-text-g: #00D770
// $color-text-err: #F1255C
// $color-border-err: #E788A1
//
// //字体定义规范
// $font-size-small-s: 10px
// $font-size-small: 12px
// $font-size-medium: 14px
// $font-size-medium-x: 16px
// $font-size-large: 18px
// $font-size-large-x: 22px
// $font-size-large-xx: 24px
//
// //字体粗细规范
// $font-weight-blod: 700
//
// // 中心区域宽度
// $body-width: 1100px
//
// // 常用蓝绿渐变色
// $gradient-color: linear-gradient(135deg, #009BFF, #00DA68)
'use strict'
// 元素滚动到顶部, 默认为 body (页面)
export function scrollToTop(scrollEle = document.body) {
let timer
cancelAnimationFrame(timer)
timer = requestAnimationFrame(function fn() {
const oTop = scrollEle.scrollTop
if (oTop > 0) {
scrollEle.scrollTop = oTop - 200
timer = requestAnimationFrame(fn)
} else {
cancelAnimationFrame(timer)
}
})
}
/**
* 指定DOM节点, 计算渲染后的样式属性值
*
* @param {Object} ele - DOM 节点
* @param {Array.<string>|string} attrs - 需要查询的一个或一组属性
* @param {Object} [options] - 选项
* @param {Boolean} [options.trimPx] - 选项
* @return {Object|string|number} 查询结果, key 为查询的属性, value 为查询的结果, 当只查询一个属性时, 直接返回结果
* @memberof Utils-DOM
*/
// export function getElementProps(
// ele: Element, attrs: string[] | string, options: { trimPx: boolean } = { trimPx: true }
// ): { [key: string]: any } | string | number {
export function getElementProps(
ele: Element, attrs: string[] | string, options: { trimPx: boolean } = { trimPx: true },
): any {
if (!ele || !attrs) {
console.error('计算样式属性值传入参数有误')
return 0
}
const _attrs: string[] = _.isArray(attrs) ? attrs : [attrs]
const styleObj = window.getComputedStyle(ele, null)
const result = _attrs.reduce((res, attr) => {
const value = styleObj.getPropertyValue(attr)
res[attr] = options.trimPx && (/\d+px$/).test(value)
? parseFloat(value.slice(0, -2))
: value
return res
}, {})
return _attrs.length === 1 ? _.values(result)[0] : result
}
/**
* 转换文件尺寸到适合的单位
* @param {string|number} size - 文件大小 单位byte
* @return {string} 转换结果, 文件大小文本
*/
export function convertSize(
size: string | number,
isSplit = true,
): string | { num: number, unit?: string } {
if (!(+size) || +size < 0) return isSplit ? { num: 0 } : '0'
// 文件传入单位是byte
// order 为单位级,num 为当前单位级的数字
let order = 4
let num = 0
for (;; order--) {
const compareSize = Math.pow(1024, order)
if (+size >= compareSize) {
num = _.round((+size / compareSize), 1)
break
}
if (order <= 0) return '-'
}
const unit = ['byte', 'K', 'M', 'G', 'T'][order]
return isSplit ? { num, unit } : `${num} ${unit}`
}
/**
* 转换为 以100 为基数的 比值
* @param {string|number} divisor - 参数数值
* @param {string|number} amount - 总数
* @return {number} 转换结果
*/
export function getPercent(divisor: string | number, amount: string | number): number {
if (+amount === 0) return 0
const rate = +divisor / +amount
return _.round(rate * 100, 1)
}
/**
* 完美类型判断
* @param {*} obj 必传参数,用来判断的对象
* @param {...string} typeString (e.g. "number")
*
* dataType({}) ——> 'object' 只传第一个参数,则返回类型字符串
* dataType({}, 'number') ——> false 传两个,则会进行判断
* dataType({}, 'number', 'object') ——> true 传三个及以上,则判断是否存在匹配的类型,存在则返回true
*
* 可判断类型举例,及第二参数列举
* 1--number 'abc'--string true--boolean undefined--undefined null--null {}--object
* []--array new Date--date /\d/--regexp function(){}--function
* @return {string|boolean} 结果是字符串或布尔值
* @memberof Utils
*/
export function dataType(obj: any, ...typeString: string[]): string | boolean {
if (typeString.length === 0) {
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
} else {
let result = false
for (const typeSingle of typeString) {
const match = Object.prototype.toString
.call(obj).slice(8, -1).toLowerCase() === typeSingle.toString()
result = result || match
}
return result
}
}
/**
* 复制文本到系统剪贴板
* @param {String} val 需要复制的文本内容
*/
export function copyText(val: string) {
document.designMode = 'on'
const input = document.createElement('input')
document.body.appendChild(input)
input.setAttribute('value', val)
input.setAttribute('readonly', 'readonly')
input.select()
try {
const successful = document.execCommand('copy')
if (!successful) {
throw new Error('copy failed')
}
Toast.success(vm.$t('ApiDeployment.copySuc') + '!')
} catch (err) {
Toast.danger('复制失败,请重试或手动复制')
}
document.body.removeChild(input)
document.designMode = 'off'
}
// /**
// * 判断是否在指定dom内部
// * 标记dom 上写入属性 judge-limit = "1", 其中 1和传入index对应即可
// * @param {Element} targetEle 当前事件触发的dom
// * @return {Element|null} 找到则返回 标记的dom ,未找到则返回 null
// * @memberof Utils
// */
// export function judgeLimitDom(
// targetEle: HTMLFormElement,
// index: number = 1
// ): Element | null {
// if (!document.body.contains(targetEle)) return null
//
// let result: HTMLFormElement | null = null
// let parentEle: HTMLFormElement = targetEle
//
// while (!result) {
// if (parentEle === document.body) return null
//
// const validateAttr = parentEle.attributes['judge-limit']
// if (validateAttr && +validateAttr.value === index) {
// result = parentEle
// continue
// }
// parentEle = <HTMLFormElement>parentEle.parentNode
// }
// return result
// }
// 复制内容到粘贴板的实现
export function copySth(item) {
if (!item) {
return
}
const transfer = document.createElement('input')
document.body.appendChild(transfer)
transfer.value = item // 这里表示想要复制的内容
transfer.focus()
transfer.select()
if (document.execCommand('copy')) {
document.execCommand('copy')
}
transfer.blur()
this.$message({
message: '复制成功',
type: 'success'
})
document.body.removeChild(transfer)
}
export default {
install(Vue) {
// 防重复点击(指令实现)
Vue.directive('preventReClick', {
inserted: function(el, binding) {
el.addEventListener('click', () => {
if (!el.disabled) {
el.disabled = true
setTimeout(() => {
el.disabled = false
}, binding.value || 1000)
}
})
}
})
}
}
'use strict'
// 转换时间格式
export function rTime(date) {
const json_date = new Date(date).toJSON()
return new Date(new Date(json_date) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
}
// 转换时间格式 精确到分钟
export function rTimeMin(item) {
const json_date = moment(new Date(item)).format('YYYY-MM-DD kk:mm')
return json_date
// const y = date.getFullYear()
// let m = date.getMonth() + 1
// m = m < 10 ? ('0' + m) : m
// let d = date.getDate()
// d = d < 10 ? ('0' + d) : d
// let h = date.getHours()
// h = h < 10 ? ('0' + h) : h
// let minute = date.getMinutes()
// minute = minute < 10 ? ('0' + minute) : minute
// return y + '-' + m + '-' + d + ' ' + h + ':' + minute
}
// 文件大小转化
export function conver(limit) {
let size = ''
if (limit < 0.1 * 1024) { // 如果小于0.1KB转化成B
size = limit.toFixed(2) + 'B'
} else if (limit < 0.1 * 1024 * 1024) { // 如果小于0.1MB转化成KB
size = (limit / 1024).toFixed(2) + 'KB'
} else if (limit < 0.1 * 1024 * 1024 * 1024) { // 如果小于0.1GB转化成MB
size = (limit / (1024 * 1024)).toFixed(2) + 'MB'
} else { // 其他转化成GB
size = (limit / (1024 * 1024 * 1024)).toFixed(2) + 'GB'
}
const sizestr = size + ''
// eslint-disable-next-line
const len = sizestr.indexOf('\.')
const dec = sizestr.substr(len + 1, 2)
if (dec === '00') { // 当小数点后为00时 去掉小数部分
return sizestr.substring(0, len) + sizestr.substr(len + 3, 2)
}
return sizestr
}
export function copy(value) {
return JSON.parse(JSON.stringify(value))
}
// 数组内容对比
export function isArrayEqual(value1 = [], value2 = []) {
if (value1.length === 0 && value2.length === 0) {
return true
}
const hash = copy(value2)
if (value1.length === value2.length) {
for (let i = 0; i < value1.length; i++) {
const index = JSON.stringify(hash).indexOf(JSON.stringify(value1[i]))
if (index > -1) {
return true
} else {
return false
}
}
}
return false
}
'use strict'
import browserStorage from '@/services/local-storage'
import Store from '@/store'
// 用户信息存取
function saveUserInfo(userInfo) {
if (_.isEmpty(userInfo)) return
const oldUserInfo = getUserInfo()
const newUserInfo = {
...oldUserInfo,
...userInfo,
}
Store.commit('updateUserInfo', newUserInfo)
browserStorage.setItem('user', JSON.stringify(newUserInfo))
}
export function getUserInfo(): { id: number, username: string, is_admin: boolean} | null {
// const vuexUser = Store.getters.userInfo
// if (vuexUser) return vuexUser
const sessionUserInfo = browserStorage.getItem('user')
if (typeof sessionUserInfo !== 'string') return null
return JSON.parse(sessionUserInfo)
}
// token存取
// token 只会存储在local内部, 退出时需要主动清理
function saveToken(token: string) {
if (!token) return
browserStorage.setItem('token', token)
}
export function getToken(): string {
return browserStorage.getItem('token')
}
// 获取当前用户信息
export function getUser() {
const info = getUserInfo()
const token = getToken()
return { info, token }
}
// 存储用户信息
export function saveUser(userData: { info?, token? } = {}) {
if (userData.info) saveUserInfo(userData.info)
if (userData.token) saveToken(userData.token)
}
// 清理用户信息
export function removeUser() {
// 保留系统名称
// const customer_name = browserStorage.getItem('customer_name')
browserStorage.clear()
// browserStorage.setItem('customer_name', customer_name)
Store.commit('removeUser')
}
// 判断是否登录
export function checkLogin() {
const userData = getUser()
return userData.token
}
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
</style>
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
</style>
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
</style>
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
</style>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="227px" height="269px" viewBox="0 0 227 269" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 9</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M0,131.5 C1.52216317e-15,101.788282 2.0023434,70.3064817 6.0070302,37.054599 L6.00703147,37.0545992 C8.23177711,18.5819983 23.2321456,4.27478563 41.7892683,2.9258328 C68.6224469,0.975277594 91.0407969,-6.24317082e-09 109.044318,0 C127.133265,6.27279111e-09 149.842798,0.984554771 177.17292,2.9536643 L177.17292,2.95366535 C195.745345,4.29179116 210.761581,18.6099912 212.981582,37.0977487 C216.993859,70.5112465 218.999998,102.082949 219,131.812857 C219.000002,161.472158 217.003381,192.843579 213.010137,225.927119 L213.010136,225.927119 C210.780269,244.401296 195.772997,258.705423 177.213148,260.046888 C149.974602,262.015629 127.477504,263 109.721856,263 C91.927568,263 69.2911098,262.01134 41.8124813,260.034021 L41.8124814,260.03402 C23.2430488,258.697792 8.22697111,244.385384 6.00173205,225.9014 C2.00057735,192.665746 1.52149174e-15,161.198612 0,131.5 Z" id="path-1"></path>
<filter x="-4.5%" y="-1.4%" width="106.2%" height="104.4%" filterUnits="objectBoundingBox" id="filter-2">
<feMorphology radius="0.81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
<feOffset dx="-6" dy="4" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<path d="M39.654321,130.992298 C39.654321,110.09311 40.5351746,89.1940983 42.2968819,68.2952631 L42.2968835,68.2952632 C43.2666685,56.7908671 52.197293,47.5570778 63.6629191,46.2039222 C78.8424188,44.4124609 94.0195118,43.5167302 109.194198,43.5167302 C124.360772,43.5167302 139.527341,44.4115034 154.693904,46.2010498 L154.693904,46.2010495 C166.164025,47.5544421 175.09671,56.7944422 176.061501,68.3037662 C177.833381,89.4411461 178.719321,110.482698 178.719321,131.428422 C178.719321,152.307984 177.838969,173.187319 176.078265,194.066429 L176.078265,194.066429 C175.10807,205.571375 166.17633,214.805149 154.709997,216.157282 C139.486491,217.95247 124.287302,218.850064 109.112431,218.850064 C93.9666716,218.850064 78.8209665,217.95591 63.6753158,216.167604 L63.6753156,216.167605 C52.2067135,214.813462 43.275345,205.574785 42.309801,194.06695 C40.539481,172.967394 39.654321,151.94251 39.654321,130.992298 Z" id="path-3"></path>
<filter x="-6.0%" y="-2.3%" width="108.6%" height="105.9%" filterUnits="objectBoundingBox" id="filter-4">
<feMorphology radius="0.81" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
<feOffset dx="-5" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<path d="M161.510068,89.8583333 L176.8425,89.8583333 L176.8425,107.391667 L161.510068,107.391667 L161.510068,107.391667 C157.8829,107.391667 154.9425,104.451267 154.9425,100.824099 L154.9425,96.4259009 L154.9425,96.4259009 C154.9425,92.7987335 157.8829,89.8583333 161.510068,89.8583333 Z" id="path-5"></path>
<filter x="-13.7%" y="-5.7%" width="118.3%" height="117.1%" filterUnits="objectBoundingBox" id="filter-6">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<path d="M183.957568,89.8583333 L199.29,89.8583333 L199.29,107.391667 L183.957568,107.391667 L183.957568,107.391667 C180.3304,107.391667 177.39,104.451267 177.39,100.824099 L177.39,96.4259009 L177.39,96.4259009 C177.39,92.7987335 180.3304,89.8583333 183.957568,89.8583333 Z" id="path-7"></path>
<filter x="-2.3%" y="-2.9%" width="109.1%" height="111.4%" filterUnits="objectBoundingBox" id="filter-8">
<feOffset dx="1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<filter x="-55.5%" y="-9.3%" width="177.5%" height="148.0%" filterUnits="objectBoundingBox" id="filter-9">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-55.5%" y="-9.3%" width="177.5%" height="148.0%" filterUnits="objectBoundingBox" id="filter-10">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<path d="M8.86493515,17.2480344 C8.4007802,16.9327578 8.09567896,16.3993146 8.09567896,15.7943295 C8.09567896,14.82567 8.87784133,14.0404164 9.84268751,14.0404164 C10.8075337,14.0404164 11.5896961,14.82567 11.5896961,15.7943295 C11.5896961,16.3993146 11.2845948,16.9327578 10.8204399,17.2480344 L11.7961308,19.984547 C11.9101195,20.3042502 11.743355,20.6558271 11.4236517,20.7698158 C11.3574028,20.7934365 11.2875908,20.8055099 11.2172568,20.8055099 L8.46811816,20.8055099 L8.46811816,20.8055099 C8.1287016,20.8055099 7.85355011,20.5303584 7.85355011,20.1909418 C7.85355011,20.1206079 7.86562345,20.0507959 7.8892442,19.984547 L8.86493515,17.2480344 Z" id="path-11"></path>
<filter x="-12.0%" y="-7.4%" width="124.1%" height="114.8%" filterUnits="objectBoundingBox" id="filter-12">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetInner1"></feOffset>
<feComposite in="shadowOffsetInner1" in2="SourceAlpha" operator="arithmetic" k2="-1" k3="1" result="shadowInnerInner1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 1 0" type="matrix" in="shadowInnerInner1"></feColorMatrix>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-13">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-14">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-15">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-16">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-17">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-18">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-19">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-20">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-21">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-22">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-23">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-24">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-25">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-26">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-27">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-28">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-44.4%" y="-20.0%" width="166.7%" height="160.0%" filterUnits="objectBoundingBox" id="filter-29">
<feOffset dx="-2" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-30" x="79.0833333" y="68.7939815" width="60.8333333" height="24.3518519"></rect>
<filter x="-2.5%" y="-2.1%" width="103.3%" height="108.2%" filterUnits="objectBoundingBox" id="filter-31">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<rect id="path-32" x="119.233333" y="71.2346165" width="18.2504951" height="19.5072939"></rect>
<path d="M6.69173423,0.214583333 L15.4541667,0.214583333 L15.4541667,30.8979167 L6.69173423,30.8979167 L6.69173423,30.8979167 C3.06456682,30.8979167 0.124166667,27.9575165 0.124166667,24.3303491 L0.124166667,6.7821509 L0.124166667,6.7821509 C0.124166667,3.15498349 3.06456682,0.214583333 6.69173423,0.214583333 Z" id="path-34"></path>
<filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="filter-35">
<feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.866666667 0 0 0 0 0.890196078 0 0 0 0 0.909803922 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-36">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-37">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<path d="M42.8291667,11.875589 L42.8291667,19.236911 C42.8291667,19.9264853 42.3373793,20.5354959 41.738915,20.595957 L17.6441667,22.6791667 L17.6441667,8.43333333 L41.738915,10.516543 C42.3410444,10.5773757 42.8291667,11.185286 42.8291667,11.875589 Z" id="path-38"></path>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-39">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-40">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-41" x="12.23" y="6.78958333" width="7.1175" height="17.5333333" rx="1.09459459"></rect>
<filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="filter-42">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<path d="M6.69173423,0.214583333 L15.4541667,0.214583333 L15.4541667,30.8979167 L6.69173423,30.8979167 L6.69173423,30.8979167 C3.06456682,30.8979167 0.124166667,27.9575165 0.124166667,24.3303491 L0.124166667,6.7821509 L0.124166667,6.7821509 C0.124166667,3.15498349 3.06456682,0.214583333 6.69173423,0.214583333 Z" id="path-43"></path>
<filter x="-29.4%" y="-4.9%" width="139.1%" height="116.3%" filterUnits="objectBoundingBox" id="filter-44">
<feOffset dx="-3" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.866666667 0 0 0 0 0.890196078 0 0 0 0 0.909803922 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-45">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-46">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<path d="M42.8291667,11.875589 L42.8291667,19.236911 C42.8291667,19.9264853 42.3373793,20.5354959 41.738915,20.595957 L17.6441667,22.6791667 L17.6441667,8.43333333 L41.738915,10.516543 C42.3410444,10.5773757 42.8291667,11.185286 42.8291667,11.875589 Z" id="path-47"></path>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-48">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<filter x="-50.0%" y="-10.0%" width="160.0%" height="160.0%" filterUnits="objectBoundingBox" id="filter-49">
<feOffset dx="-1" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-50" x="12.23" y="6.78958333" width="7.1175" height="17.5333333" rx="1.09459459"></rect>
<filter x="-42.1%" y="-5.7%" width="156.2%" height="117.1%" filterUnits="objectBoundingBox" id="filter-51">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<path d="M24.5975819,18.9156325 C22.7107005,18.6906938 20.1873316,18.3702571 18.5998357,18.0903387 C15.7716385,17.5916513 10.2254435,16.2267099 10.2254435,16.2267099 L9.43228672,20.7249253 C9.43228672,20.7249253 15.1331234,21.2766981 17.950402,21.7734603 C19.3152185,22.0141143 21.3273422,22.4758916 23.0359088,22.887195 C22.0718328,24.3735021 20.9147108,26.1229174 20.0932954,27.2534987 C18.405278,29.5768553 14.7471849,33.9633914 14.7471849,33.9633914 L18.4424572,36.6481639 C18.4424572,36.6481639 21.4374695,31.7661671 23.1189701,29.4517801 C23.9598468,28.2944125 25.3148663,26.6203912 26.4570264,25.2388063 C27.4382453,26.7462318 28.6051214,28.5736505 29.3214044,29.8142891 C30.7573178,32.301364 33.2767374,37.4273633 33.2767374,37.4273633 L37.2324017,35.1435594 C37.2324017,35.1435594 33.990657,30.4217925 32.5602872,27.9443193 C31.8079686,26.6412654 30.764866,24.5861738 29.94691,22.9346427 C31.7349883,22.451283 33.9931664,21.8608332 35.4733174,21.5462174 C38.2823878,20.9491311 43.9360463,20.1370415 43.9360463,20.1370415 L42.9863873,15.669247 C42.9863873,15.669247 37.4939659,17.2932232 34.6957402,17.8880045 C33.1431973,18.2180076 30.6947576,18.5971515 28.8277097,18.8686298 C28.722602,16.9801623 28.6032977,14.4864013 28.6032977,12.8962937 C28.6032977,10.024467 28.984416,4.32551158 28.984416,4.32551158 L24.4168083,4.32551158 C24.4168083,4.32551158 24.8633581,10.0355541 24.8633581,12.8962937 C24.8633581,14.5048733 24.7214143,17.0240015 24.5975819,18.9156325 Z" id="path-52"></path>
<filter x="-14.6%" y="-6.2%" width="120.9%" height="121.4%" filterUnits="objectBoundingBox" id="filter-54">
<feMorphology radius="0.547297297" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
<feOffset dx="-3" dy="3" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
<feComposite in="shadowOffsetOuter1" in2="SourceAlpha" operator="out" result="shadowOffsetOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.639215686 0 0 0 0 0.694117647 0 0 0 0 0.749019608 0 0 0 0.3 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
<ellipse id="path-55" cx="26.802716" cy="22.6705733" rx="4.38" ry="4.38333333"></ellipse>
<filter x="-34.2%" y="-11.4%" width="145.7%" height="134.2%" filterUnits="objectBoundingBox" id="filter-56">
<feOffset dx="-2" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feColorMatrix values="0 0 0 0 0.596078431 0 0 0 0 0.647058824 0 0 0 0 0.701960784 0 0 0 1 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
</filter>
</defs>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="403" transform="translate(-592.000000, -260.000000)">
<g id="Group-9" transform="translate(599.000000, 261.000000)">
<g id="Group-11">
<g id="Rectangle-355">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-1"></use>
</g>
<g id="Rectangle-355">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
<use stroke="#A3B1BF" stroke-width="1.62" fill-opacity="0.15" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-3"></use>
</g>
<g id="Rectangle-357">
<use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-5"></use>
<path stroke="#A3B1BF" stroke-width="1.62" d="M176.0325,106.581667 L176.0325,90.6683333 L161.510068,90.6683333 C158.330251,90.6683333 155.7525,93.2460841 155.7525,96.4259009 L155.7525,100.824099 C155.7525,104.003916 158.330251,106.581667 161.510068,106.581667 L176.0325,106.581667 Z"></path>
</g>
<g id="Rectangle-357" transform="translate(188.340000, 98.625000) scale(-1, 1) translate(-188.340000, -98.625000) ">
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-7"></use>
<path stroke="#A3B1BF" stroke-width="1.62" d="M198.48,106.581667 L198.48,90.6683333 L183.957568,90.6683333 C180.777751,90.6683333 178.2,93.2460841 178.2,96.4259009 L178.2,100.824099 C178.2,104.003916 180.777751,106.581667 183.957568,106.581667 L198.48,106.581667 Z"></path>
</g>
<path d="M169.537821,109.198898 L179.520726,109.198898 L179.520726,106.316665 C179.657239,106.659699 174.968976,106.316665 172.419859,106.316665 L174.153055,100.243742 C171.605657,100.243742 169.537821,102.294522 169.537821,104.822572 L169.537821,109.198898 Z M181.404585,106.764356 L181.334952,105.82938 C178.493277,106.319657 175.877716,105.82938 172.088276,105.82938 L174.153055,98.0162037 C170.365914,98.0162037 167.291667,101.063519 167.291667,104.822572 L167.291667,106.764356 L166.869647,106.764356 L166.869647,106.764356 C165.758829,106.764356 164.858333,107.664852 164.858333,108.775669 L164.858333,108.775669 L164.858333,115.540394 C164.858333,119.983665 168.460316,123.585648 172.903588,123.585648 L176.279745,123.585648 C180.723017,123.585648 184.325,119.983665 184.325,115.540394 L184.325,108.775669 C184.325,107.664852 183.424504,106.764356 182.313686,106.764356 L181.404585,106.764356 Z" id="Shape" fill="#D4DBE2" fill-rule="nonzero"></path>
<g id="Group-6" filter="url(#filter-9)" transform="translate(160.419753, 95.472603)">
<ellipse id="Oval-191" stroke="#D9D9D9" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#D9D9D9" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6" filter="url(#filter-10)" transform="translate(189.259259, 95.472603)">
<ellipse id="Oval-191" stroke="#D9D9D9" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#D9D9D9" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="lock" transform="translate(166.683333, 96.798611)">
<path d="M2.43333333,9.34812925 L2.43333333,7.750693 C2.43333333,4.33901358 4.64933408,1.45058816 7.70555556,0.476293029 L7.70555556,4.05203095 C6.57838885,4.84048413 5.84,6.15673686 5.84,7.64734194 L5.84,9.34812925 L14.4830461,9.34812925 C14.4830461,8.8280509 14.4830461,8.25372782 14.4830461,7.64734194 C14.4830461,6.44285214 14.0009139,5.352206 13.2211113,4.56188949 L13.2211113,0.864048014 C15.7633754,2.09038625 17.52,4.7131478 17.52,7.750693 C17.52,8.30041562 17.52,8.83504216 17.52,9.3491485 C18.6008993,9.38327886 19.4666667,10.2702555 19.4666667,11.3594429 L19.4666667,18.3317768 C19.4666667,22.7750482 15.8646835,26.3770314 11.4214121,26.3770314 L8.04525456,26.3770314 C3.60198316,26.3770314 5.4414381e-16,22.7750482 0,18.3317768 L0,11.3594429 C-1.36035952e-16,10.248625 0.900495789,9.34812925 2.01131364,9.34812925 L2.01131364,9.34812925 L2.43333333,9.34812925 Z" id="Combined-Shape" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5"></path>
<g id="Oval-1115">
<use fill-opacity="0.3" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-11"></use>
<use fill="black" fill-opacity="1" filter="url(#filter-12)" xlink:href="#path-11"></use>
</g>
</g>
<g id="Group-6" filter="url(#filter-13)" transform="translate(64.000000, 75.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy-11" filter="url(#filter-14)" transform="translate(152.000000, 75.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy-2" filter="url(#filter-15)" transform="translate(57.000000, 120.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy-3" filter="url(#filter-16)" transform="translate(57.000000, 137.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy-4" filter="url(#filter-17)" transform="translate(64.000000, 186.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy-5" filter="url(#filter-18)" transform="translate(93.000000, 191.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy-6" filter="url(#filter-19)" transform="translate(122.000000, 191.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy-7" filter="url(#filter-20)" transform="translate(152.000000, 186.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6" filter="url(#filter-21)" transform="translate(160.419753, 95.472603)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F5F5F5" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6" filter="url(#filter-22)" transform="translate(189.259259, 95.472603)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6" filter="url(#filter-23)" transform="translate(25.000000, 38.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
</g>
<g id="Group-6-Copy-8" filter="url(#filter-24)" transform="translate(25.000000, 218.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
</g>
<g id="Group-6-Copy-9" filter="url(#filter-25)" transform="translate(106.000000, 237.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
</g>
<g id="Group-6-Copy-10" filter="url(#filter-26)" transform="translate(185.000000, 219.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
</g>
<g id="Group-6" filter="url(#filter-27)" transform="translate(14.419753, 129.698630)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
</g>
<g id="Group-6" filter="url(#filter-28)" transform="translate(105.444444, 20.715753)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F7FAFC" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
</g>
<g id="Group-6" filter="url(#filter-29)" transform="translate(185.055000, 37.806250)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.64189189" fill="#F5F5F5" cx="4.38" cy="4.93125" rx="4.38" ry="4.38333333"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="4.0041131 9.13310534 7.56201455 8.23226901 2.34303487 0.44644438 0.446211571 3.63004005 0.788921826 7.80592737"></polygon>
</g>
<g id="Rectangle-373">
<use fill="black" fill-opacity="1" filter="url(#filter-31)" xlink:href="#path-30"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-30"></use>
<rect stroke="#A3B1BF" stroke-width="2.43" x="80.2983333" y="70.0089815" width="58.4033333" height="21.9218519"></rect>
</g>
<mask id="mask-33" fill="white">
<use xlink:href="#path-32"></use>
</mask>
<use id="Mask" fill-opacity="0.3" fill="#A3B1BF" xlink:href="#path-32"></use>
<rect id="Rectangle-375" fill="#A3B1BF" x="114.366667" y="77.3171296" width="1.825" height="8.11728395" rx="0.9125"></rect>
<rect id="Rectangle-375" fill="#A3B1BF" x="118.016667" y="72.6496914" width="2.43333333" height="16.2345679" rx="1.21666667"></rect>
<g id="Group-4" transform="translate(25.000000, 88.000000)">
<g id="Rectangle-369">
<use fill="black" fill-opacity="1" filter="url(#filter-35)" xlink:href="#path-34"></use>
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-34"></use>
<path stroke="#A3B1BF" stroke-width="1.62" d="M14.6441667,30.0879167 L14.6441667,1.02458333 L6.69173423,1.02458333 C3.51191747,1.02458333 0.934166667,3.60233414 0.934166667,6.7821509 L0.934166667,24.3303491 C0.934166667,27.5101659 3.51191747,30.0879167 6.69173423,30.0879167 L14.6441667,30.0879167 Z"></path>
</g>
<g id="Group-6" filter="url(#filter-36)" transform="translate(6.207500, 6.789583)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6" filter="url(#filter-37)" transform="translate(6.543210, 19.181507)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Rectangle-371">
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-38"></use>
<path stroke="#A3B1BF" stroke-width="1.62" d="M18.4541667,9.31638699 L18.4541667,21.7961161 L41.6574976,19.7900592 C41.8219325,19.7734468 42.0191667,19.5280875 42.0191667,19.236911 L42.0191667,11.875589 C42.0191667,11.5822335 41.824213,11.3392839 41.6691435,11.3235325 L18.4541667,9.31638699 Z"></path>
</g>
<g id="Group-6" filter="url(#filter-39)" transform="translate(23.000000, 13.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy" filter="url(#filter-40)" transform="translate(33.000000, 13.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Rectangle-370">
<use fill="black" fill-opacity="1" filter="url(#filter-42)" xlink:href="#path-41"></use>
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-41"></use>
<rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.59958333" width="5.4975" height="15.9133333" rx="1.09459459"></rect>
</g>
<path d="M13.59875,15.55625 L17.97875,15.55625" id="Line" stroke="#A3B1BF" stroke-width="2.18918919" stroke-linecap="square"></path>
</g>
<g id="Group-4-Copy" transform="translate(25.000000, 145.000000)">
<g id="Rectangle-369">
<use fill="black" fill-opacity="1" filter="url(#filter-44)" xlink:href="#path-43"></use>
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-43"></use>
<path stroke="#A3B1BF" stroke-width="1.62" d="M14.6441667,30.0879167 L14.6441667,1.02458333 L6.69173423,1.02458333 C3.51191747,1.02458333 0.934166667,3.60233414 0.934166667,6.7821509 L0.934166667,24.3303491 C0.934166667,27.5101659 3.51191747,30.0879167 6.69173423,30.0879167 L14.6441667,30.0879167 Z"></path>
</g>
<g id="Group-6" filter="url(#filter-45)" transform="translate(6.207500, 6.789583)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6" filter="url(#filter-46)" transform="translate(6.543210, 19.181507)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Rectangle-371">
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-47"></use>
<path stroke="#A3B1BF" stroke-width="1.62" d="M18.4541667,9.31638699 L18.4541667,21.7961161 L41.6574976,19.7900592 C41.8219325,19.7734468 42.0191667,19.5280875 42.0191667,19.236911 L42.0191667,11.875589 C42.0191667,11.5822335 41.824213,11.3392839 41.6691435,11.3235325 L18.4541667,9.31638699 Z"></path>
</g>
<g id="Group-6" filter="url(#filter-48)" transform="translate(23.000000, 13.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Group-6-Copy" filter="url(#filter-49)" transform="translate(33.000000, 13.000000)">
<ellipse id="Oval-191" stroke="#A3B1BF" stroke-width="1.09459459" fill="#F7FAFC" cx="2.19" cy="2.73958333" rx="2.19" ry="2.19166667"></ellipse>
<polygon id="Path-301" fill="#A3B1BF" points="3.78100727 4.39009284 1.17151744 0.497180523 0.223105786 2.08897836 0.101076918 4.39009284"></polygon>
</g>
<g id="Rectangle-370">
<use fill="black" fill-opacity="1" filter="url(#filter-51)" xlink:href="#path-50"></use>
<use fill="#EAEFF3" fill-rule="evenodd" xlink:href="#path-50"></use>
<rect stroke="#A3B1BF" stroke-width="1.62" x="13.04" y="7.59958333" width="5.4975" height="15.9133333" rx="1.09459459"></rect>
</g>
<path d="M13.59875,15.55625 L17.97875,15.55625" id="Line" stroke="#A3B1BF" stroke-width="2.18918919" stroke-linecap="square"></path>
</g>
</g>
<g id="Group-17" transform="translate(135.185185, 131.500000)">
<path d="M22.4835494,46.23099 C10.0861375,46.23099 0.0360493827,36.1732534 0.0360493827,23.7664066 C0.0360493827,11.3595599 10.0861375,1.30182331 22.4835494,1.30182331 C34.8809613,1.30182331 44.9310494,11.3595599 44.9310494,23.7664066 C44.9310494,36.1732534 34.8809613,46.23099 22.4835494,46.23099 Z M22.4835494,39.65599 C31.2524505,39.65599 38.3610494,32.5419812 38.3610494,23.7664066 C38.3610494,14.9908321 31.2524505,7.87682331 22.4835494,7.87682331 C13.7146483,7.87682331 6.60604938,14.9908321 6.60604938,23.7664066 C6.60604938,32.5419812 13.7146483,39.65599 22.4835494,39.65599 Z" id="Oval-190" fill-opacity="0.3" fill="#A3B1BF"></path>
<mask id="mask-53" fill="white">
<use xlink:href="#path-52"></use>
</mask>
<g id="Mask">
<use fill="black" fill-opacity="1" filter="url(#filter-54)" xlink:href="#path-52"></use>
<use stroke="#A3B1BF" stroke-width="1.09459459" fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-52"></use>
</g>
<g id="Group-7" transform="translate(0.360494, 0.078598)" fill="#98A5B3">
<path d="M20.5636489,0.927088888 C22.1113303,0.589405992 23.7186545,0.411496914 25.3675,0.411496914 C37.7649119,0.411496914 47.815,10.4692335 47.815,22.8760802 C47.815,33.7386653 40.1110508,42.8005273 29.8728116,44.8880725 L27.4696515,38.6276265 C35.2448963,37.5983622 41.245,30.9384541 41.245,22.8760802 C41.245,14.1005057 34.1364011,6.98649691 25.3675,6.98649691 C22.0362626,6.98649691 18.9446369,8.01317718 16.3913275,9.76760576 L15.30877,6.94744709 L20.5636489,0.927088888 Z" id="Oval-190"></path>
</g>
<path d="M26.802716,45.1351566 C14.4053041,45.1351566 4.35521605,35.0774201 4.35521605,22.6705733 C4.35521605,10.2637265 14.4053041,0.20598998 26.802716,0.20598998 C39.200128,0.20598998 49.250216,10.2637265 49.250216,22.6705733 C49.250216,35.0774201 39.200128,45.1351566 26.802716,45.1351566 Z M26.802716,38.5601566 C35.5716172,38.5601566 42.680216,31.4461479 42.680216,22.6705733 C42.680216,13.8949988 35.5716172,6.78098998 26.802716,6.78098998 C18.0338149,6.78098998 10.925216,13.8949988 10.925216,22.6705733 C10.925216,31.4461479 18.0338149,38.5601566 26.802716,38.5601566 Z" id="Oval-190" fill="#A3B1BF"></path>
<path d="M37.5685802,6.47400902 C37.5685802,6.47400902 40.3560433,8.0639828 43.0005786,12.4958138 C45.6451139,16.9276447 45.9870813,21.4863845 45.9870813,21.4863845" id="Line" stroke="#F7FAFC" stroke-width="1.62" stroke-linecap="round"></path>
<g id="Oval-199">
<use fill="black" fill-opacity="1" filter="url(#filter-56)" xlink:href="#path-55"></use>
<use fill="#A3B1BF" fill-rule="evenodd" xlink:href="#path-55"></use>
</g>
<path d="M27.0403924,24.1861178 C28.3842853,24.1861178 29.4737257,23.0958483 29.4737257,21.7509326 C29.4737257,20.406017 28.3842853,19.3157475 27.0403924,19.3157475 C27.0403924,19.3157475 27.6699621,20.406017 27.6699621,21.7509326 C27.6699621,23.0958483 27.0403924,24.1861178 27.0403924,24.1861178 Z" id="Oval-199" fill="#F7FAFC" transform="translate(28.257059, 21.750933) rotate(-43.000000) translate(-28.257059, -21.750933) "></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="423px" height="341px" viewBox="0 0 423 341" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 4</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="404" transform="translate(-484.000000, -221.000000)">
<g id="Group-4" transform="translate(464.000000, 222.000000)">
<g id="Group-5" transform="translate(75.417348, 0.163879)" stroke="#A3B1BF" stroke-width="1.62" opacity="0.6" stroke-linejoin="round" stroke-dasharray="12.15">
<path d="M169.575185,288.890375 C103.647066,288.890375 50.2010204,235.455806 50.2010204,169.540425 C50.2010204,103.625045 103.647066,50.1904762 169.575185,50.1904762 C235.50394,50.1904762 288.94935,103.625045 288.94935,169.540425 C288.94935,235.455806 235.50394,288.890375 169.575185,288.890375 Z" id="Stroke-1"></path>
<path d="M169.405699,338.555288 C76.0274364,338.555288 0.329411882,262.872619 0.329411882,169.513299 C0.329411882,76.1539786 76.0274364,0.471309613 169.405699,0.471309613 C262.783961,0.471309613 338.481985,76.1539786 338.481985,169.513299 C338.481985,262.872619 262.783961,338.555288 169.405699,338.555288 Z" id="Stroke-3"></path>
</g>
<polygon id="Fill-6" fill="#F5F5F5" transform="translate(106.914750, 199.432805) rotate(22.000000) translate(-106.914750, -199.432805) " points="97.7112298 198.803016 116.11827 190.231152 107.544667 208.634458"></polygon>
<polygon id="Stroke-7" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(106.914750, 199.432805) rotate(22.000000) translate(-106.914750, -199.432805) " points="97.7112298 198.803016 116.11827 190.231152 107.544667 208.634458"></polygon>
<polygon id="Fill-8" transform="translate(58.996118, 219.767028) rotate(22.000000) translate(-58.996118, -219.767028) " points="38.8543444 215.183828 54.4119879 199.629341 79.1378915 224.350228 63.580248 239.904716"></polygon>
<polygon id="Stroke-9" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(58.996118, 219.767028) rotate(22.000000) translate(-58.996118, -219.767028) " points="38.8543444 215.183828 54.4119879 199.629341 79.1378915 224.350228 63.580248 239.904716"></polygon>
<polygon id="Fill-10" fill="#F5F5F5" transform="translate(71.226096, 214.577614) rotate(22.000000) translate(-71.226096, -214.577614) " points="51.4642422 198.657893 55.3028278 194.820086 90.9879502 230.497335 87.1487294 234.335141"></polygon>
<polygon id="Stroke-11" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" transform="translate(71.226096, 214.577614) rotate(22.000000) translate(-71.226096, -214.577614) " points="51.4642422 198.657893 55.3028278 194.820086 90.9879502 230.497335 87.1487294 234.335141"></polygon>
<polygon id="Fill-12" transform="translate(84.698338, 273.903349) rotate(22.000000) translate(-84.698338, -273.903349) " points="56.0769883 259.690379 70.4821667 245.288122 113.319688 288.116319 98.9145099 302.518575"></polygon>
<polygon id="Stroke-13" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(84.698338, 273.903349) rotate(22.000000) translate(-84.698338, -273.903349) " points="56.0769883 259.690379 70.4821667 245.288122 113.319688 288.116319 98.9145099 302.518575"></polygon>
<polygon id="Fill-14" transform="translate(75.456149, 212.782520) rotate(22.000000) translate(-75.456149, -212.782520) " points="63.8911557 203.879723 66.5512281 201.22019 87.0211429 221.685318 84.3604352 224.34485"></polygon>
<polygon id="Stroke-15" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(75.456149, 212.782520) rotate(22.000000) translate(-75.456149, -212.782520) " points="63.8911557 203.879723 66.5512281 201.22019 87.0211429 221.685318 84.3604352 224.34485"></polygon>
<polygon id="Fill-16" fill="#F5F5F5" transform="translate(78.176142, 202.618192) rotate(22.000000) translate(-78.176142, -202.618192) " points="74.4026766 205.006817 80.5652518 198.845492 81.9496076 200.229567 75.7870324 206.390892"></polygon>
<polygon id="Stroke-17" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(78.176142, 202.618192) rotate(22.000000) translate(-78.176142, -202.618192) " points="74.4026766 205.006817 80.5652518 198.845492 81.9496076 200.229567 75.7870324 206.390892"></polygon>
<polygon id="Fill-18" fill="#F5F5F5" transform="translate(84.676979, 217.928886) rotate(22.000000) translate(-84.676979, -217.928886) " points="80.9035138 220.317511 87.066089 214.156186 88.4504448 215.540261 82.2878696 221.701586"></polygon>
<polygon id="Stroke-19" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(84.676979, 217.928886) rotate(22.000000) translate(-84.676979, -217.928886) " points="80.9035138 220.317511 87.066089 214.156186 88.4504448 215.540261 82.2878696 221.701586"></polygon>
<polygon id="Fill-20" transform="translate(70.238421, 242.404581) rotate(22.000000) translate(-70.238421, -242.404581) " points="67.8493111 238.631881 74.0118863 244.793206 72.6275305 246.177281 66.4649553 240.015956"></polygon>
<polygon id="Stroke-21" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(70.238421, 242.404581) rotate(22.000000) translate(-70.238421, -242.404581) " points="67.8493111 238.631881 74.0118863 244.793206 72.6275305 246.177281 66.4649553 240.015956"></polygon>
<polygon id="Fill-22" transform="translate(48.081755, 224.398789) rotate(22.000000) translate(-48.081755, -224.398789) " points="35.1127107 220.725179 36.3242602 211.432376 61.0507992 236.153899 51.756111 237.365203"></polygon>
<polygon id="Stroke-23" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(48.081755, 224.398789) rotate(22.000000) translate(-48.081755, -224.398789) " points="35.1127107 220.725179 36.3242602 211.432376 61.0507992 236.153899 51.756111 237.365203"></polygon>
<polygon id="Fill-24" transform="translate(38.612968, 228.416820) rotate(22.000000) translate(-38.612968, -228.416820) " points="32.9179858 217.470622 26.2496982 216.056058 50.9762371 240.777581 49.5613861 234.110647"></polygon>
<polygon id="Stroke-25" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(38.612968, 228.416820) rotate(22.000000) translate(-38.612968, -228.416820) " points="32.9179858 217.470622 26.2496982 216.056058 50.9762371 240.777581 49.5613861 234.110647"></polygon>
<polygon id="Fill-26" transform="translate(31.086342, 221.523909) rotate(22.000000) translate(-31.086342, -221.523909) " points="32.6469986 217.297684 26.8592604 218.37941 34.2314793 225.750133 35.3134242 219.963569"></polygon>
<polygon id="Stroke-27" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(31.086342, 221.523909) rotate(22.000000) translate(-31.086342, -221.523909) " points="32.6469986 217.297684 26.8592604 218.37941 34.2314793 225.750133 35.3134242 219.963569"></polygon>
<polygon id="Fill-28" transform="translate(38.344372, 238.617819) rotate(22.000000) translate(-38.344372, -238.617819) " points="39.9050284 234.391595 34.1172902 235.47332 41.4895091 242.844044 42.571454 237.05748"></polygon>
<polygon id="Stroke-29" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(38.344372, 238.617819) rotate(22.000000) translate(-38.344372, -238.617819) " points="39.9050284 234.391595 34.1172902 235.47332 41.4895091 242.844044 42.571454 237.05748"></polygon>
<polygon id="Fill-30" fill="#F0F2F5" transform="translate(75.352798, 203.766862) rotate(22.000000) translate(-75.352798, -203.766862) " points="71.4417859 201.708217 73.2937351 199.856644 79.2638092 205.824871 77.4118601 207.67708"></polygon>
<polygon id="Stroke-31" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(75.352798, 203.766862) rotate(22.000000) translate(-75.352798, -203.766862) " points="71.4417859 201.708217 73.2937351 199.856644 79.2638092 205.824871 77.4118601 207.67708"></polygon>
<polygon id="Fill-32" fill="#F0F2F5" transform="translate(81.871541, 219.119730) rotate(22.000000) translate(-81.871541, -219.119730) " points="77.9605297 217.061085 79.8124789 215.209512 85.7825531 221.177739 83.9306039 223.029948"></polygon>
<polygon id="Stroke-33" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(81.871541, 219.119730) rotate(22.000000) translate(-81.871541, -219.119730) " points="77.9605297 217.061085 79.8124789 215.209512 85.7825531 221.177739 83.9306039 223.029948"></polygon>
<polygon id="Fill-34" transform="translate(68.034935, 237.215417) rotate(22.000000) translate(-68.034935, -237.215417) " points="65.1594898 237.106164 67.9256601 234.340555 70.9103796 237.324669 68.1442092 240.090278"></polygon>
<polygon id="Stroke-35" stroke="#A3B1BF" stroke-width="1.62" fill="#F5F5F5" stroke-linejoin="round" transform="translate(68.034935, 237.215417) rotate(22.000000) translate(-68.034935, -237.215417) " points="65.1594898 237.106164 67.9256601 234.340555 70.9103796 237.324669 68.1442092 240.090278"></polygon>
<path d="M90.2556147,213.065319 C79.2271463,202.039088 74.6433339,188.153875 78.4889079,179.512775 C79.1248602,178.084237 80.8319571,175.429786 84.5339495,179.131027 C88.2353065,182.832268 120.560237,215.150007 123.931865,218.52095 C127.303492,221.891894 125.245065,224.192545 123.817508,224.827733 C115.174655,228.675068 101.284718,224.092186 90.2556147,213.065319 Z" id="Fill-36" fill="#F5F5F5" transform="translate(101.453924, 201.708917) rotate(22.000000) translate(-101.453924, -201.708917) "></path>
<path d="M90.2556147,213.065319 C79.2271463,202.039088 74.6433339,188.153875 78.4889079,179.512775 C79.1248602,178.084237 80.8319571,175.429786 84.5339495,179.131027 C88.2353065,182.832268 120.560237,215.150007 123.931865,218.52095 C127.303492,221.891894 125.245065,224.192545 123.817508,224.827733 C115.174655,228.675068 101.284718,224.092186 90.2556147,213.065319 Z" id="Stroke-38" stroke="#A3B1BF" stroke-width="1.62" fill="#F0F2F5" stroke-linejoin="round" transform="translate(101.453924, 201.708917) rotate(22.000000) translate(-101.453924, -201.708917) "></path>
<polygon id="Fill-40" fill="#F0F2F5" transform="translate(86.633853, 208.038961) rotate(22.000000) translate(-86.633853, -208.038961) " points="77.9716233 201.230061 79.8235724 199.378488 95.2960835 214.84786 93.4441343 216.699433"></polygon>
<polygon id="Stroke-42" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(86.633853, 208.038961) rotate(22.000000) translate(-86.633853, -208.038961) " points="77.9716233 201.230061 79.8235724 199.378488 95.2960835 214.84786 93.4441343 216.699433"></polygon>
<path d="M121.635514,196.068815 C120.517356,197.186746 118.704797,197.186746 117.586639,196.068815 C116.469116,194.950884 116.469116,193.138692 117.586639,192.020761 C118.704797,190.903465 120.517356,190.903465 121.635514,192.020761 C122.753672,193.138692 122.753672,194.950884 121.635514,196.068815" id="Fill-44" fill="#A3B1BF" transform="translate(119.611315, 194.045026) rotate(22.000000) translate(-119.611315, -194.045026) "></path>
<polygon id="Fill-46" fill-opacity="0.6" fill="#A3B1BF" transform="translate(81.250567, 248.056422) rotate(22.000000) translate(-81.250567, -248.056422) " points="81.2505672 249.672341 79.6343206 248.056422 81.2505672 246.440503 82.8668137 248.056422"></polygon>
<polygon id="Stroke-48" transform="translate(81.250567, 248.056422) rotate(22.000000) translate(-81.250567, -248.056422) " points="81.2505672 249.672341 79.6343206 248.056422 81.2505672 246.440503 82.8668137 248.056422"></polygon>
<polygon id="Fill-50" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.702196, 251.475282) rotate(22.000000) translate(-82.702196, -251.475282) " points="82.7021965 253.091201 81.0859499 251.475282 82.7021965 249.859363 84.318443 251.475282"></polygon>
<polygon id="Stroke-52" transform="translate(82.702196, 251.475282) rotate(22.000000) translate(-82.702196, -251.475282) " points="82.7021965 253.091201 81.0859499 251.475282 82.7021965 249.859363 84.318443 251.475282"></polygon>
<polygon id="Fill-54" fill-opacity="0.6" fill="#A3B1BF" transform="translate(84.153791, 254.894059) rotate(22.000000) translate(-84.153791, -254.894059) " points="84.1537906 256.509978 82.5375441 254.894059 84.1537906 253.278141 85.7700372 254.894059"></polygon>
<polygon id="Stroke-56" transform="translate(84.153791, 254.894059) rotate(22.000000) translate(-84.153791, -254.894059) " points="84.1537906 256.509978 82.5375441 254.894059 84.1537906 253.278141 85.7700372 254.894059"></polygon>
<polygon id="Fill-58" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.605385, 258.312837) rotate(22.000000) translate(-85.605385, -258.312837) " points="85.6053848 259.928756 83.9891383 258.312837 85.6053848 256.696918 87.2216313 258.312837"></polygon>
<polygon id="Stroke-60" transform="translate(85.605385, 258.312837) rotate(22.000000) translate(-85.605385, -258.312837) " points="85.6053848 259.928756 83.9891383 258.312837 85.6053848 256.696918 87.2216313 258.312837"></polygon>
<polygon id="Fill-62" fill-opacity="0.6" fill="#A3B1BF" transform="translate(78.094482, 249.395723) rotate(22.000000) translate(-78.094482, -249.395723) " points="78.0944819 251.011642 76.4782353 249.395723 78.0944819 247.779804 79.7107284 249.395723"></polygon>
<polygon id="Stroke-64" transform="translate(78.094482, 249.395723) rotate(22.000000) translate(-78.094482, -249.395723) " points="78.0944819 251.011642 76.4782353 249.395723 78.0944819 247.779804 79.7107284 249.395723"></polygon>
<polygon id="Fill-66" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.546052, 252.814559) rotate(22.000000) translate(-79.546052, -252.814559) " points="79.5460522 254.430478 77.9298057 252.814559 79.5460522 251.198641 81.1622988 252.814559"></polygon>
<polygon id="Stroke-68" transform="translate(79.546052, 252.814559) rotate(22.000000) translate(-79.546052, -252.814559) " points="79.5460522 254.430478 77.9298057 252.814559 79.5460522 251.198641 81.1622988 252.814559"></polygon>
<polygon id="Fill-70" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.997705, 256.233360) rotate(22.000000) translate(-80.997705, -256.233360) " points="80.9977053 257.849279 79.3814588 256.23336 80.9977053 254.617442 82.6139518 256.23336"></polygon>
<polygon id="Stroke-72" transform="translate(80.997705, 256.233360) rotate(22.000000) translate(-80.997705, -256.233360) " points="79.3814588 256.23336 80.9977053 254.617442 82.6139518 256.23336 80.9977053 257.849279"></polygon>
<polygon id="Fill-74" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.449276, 259.652197) rotate(22.000000) translate(-82.449276, -259.652197) " points="82.4492757 261.268115 80.8330292 259.652197 82.4492757 258.036278 84.0655222 259.652197"></polygon>
<polygon id="Stroke-76" transform="translate(82.449276, 259.652197) rotate(22.000000) translate(-82.449276, -259.652197) " points="82.4492757 261.268115 80.8330292 259.652197 82.4492757 258.036278 84.0655222 259.652197"></polygon>
<polygon id="Fill-78" fill-opacity="0.6" fill="#A3B1BF" transform="translate(74.938373, 250.735083) rotate(22.000000) translate(-74.938373, -250.735083) " points="74.9383727 252.351002 73.3221262 250.735083 74.9383727 249.119164 76.5546193 250.735083"></polygon>
<polygon id="Stroke-80" transform="translate(74.938373, 250.735083) rotate(22.000000) translate(-74.938373, -250.735083) " points="74.9383727 252.351002 73.3221262 250.735083 74.9383727 249.119164 76.5546193 250.735083"></polygon>
<polygon id="Fill-82" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.389967, 254.153860) rotate(22.000000) translate(-76.389967, -254.153860) " points="76.3899669 255.769779 74.7737204 254.15386 76.3899669 252.537942 78.0062134 254.15386"></polygon>
<polygon id="Stroke-84" transform="translate(76.389967, 254.153860) rotate(22.000000) translate(-76.389967, -254.153860) " points="76.3899669 255.769779 74.7737204 254.15386 76.3899669 252.537942 78.0062134 254.15386"></polygon>
<polygon id="Fill-86" fill-opacity="0.6" fill="#A3B1BF" transform="translate(77.841620, 257.572661) rotate(22.000000) translate(-77.841620, -257.572661) " points="77.84162 259.18858 76.2253735 257.572661 77.84162 255.956743 79.4578665 257.572661"></polygon>
<polygon id="Stroke-88" transform="translate(77.841620, 257.572661) rotate(22.000000) translate(-77.841620, -257.572661) " points="77.84162 259.18858 76.2253735 257.572661 77.84162 255.956743 79.4578665 257.572661"></polygon>
<polygon id="Fill-90" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.293190, 260.991498) rotate(22.000000) translate(-79.293190, -260.991498) " points="79.2931904 262.607416 77.6769438 260.991498 79.2931904 259.375579 80.9094369 260.991498"></polygon>
<polygon id="Stroke-92" transform="translate(79.293190, 260.991498) rotate(22.000000) translate(-79.293190, -260.991498) " points="79.2931904 262.607416 77.6769438 260.991498 79.2931904 259.375579 80.9094369 260.991498"></polygon>
<polygon id="Fill-94" fill-opacity="0.6" fill="#A3B1BF" transform="translate(71.782287, 252.074384) rotate(22.000000) translate(-71.782287, -252.074384) " points="71.7822874 253.690302 70.1660409 252.074384 71.7822874 250.458465 73.3985339 252.074384"></polygon>
<polygon id="Stroke-96" transform="translate(71.782287, 252.074384) rotate(22.000000) translate(-71.782287, -252.074384) " points="71.7822874 253.690302 70.1660409 252.074384 71.7822874 250.458465 73.3985339 252.074384"></polygon>
<polygon id="Fill-98" fill-opacity="0.6" fill="#A3B1BF" transform="translate(73.233882, 255.493161) rotate(22.000000) translate(-73.233882, -255.493161) " points="73.2338816 257.10908 71.6176351 255.493161 73.2338816 253.877242 74.8501281 255.493161"></polygon>
<polygon id="Stroke-100" transform="translate(73.233882, 255.493161) rotate(22.000000) translate(-73.233882, -255.493161) " points="73.2338816 257.10908 71.6176351 255.493161 73.2338816 253.877242 74.8501281 255.493161"></polygon>
<polygon id="Fill-102" fill-opacity="0.6" fill="#A3B1BF" transform="translate(74.685535, 258.911962) rotate(22.000000) translate(-74.685535, -258.911962) " points="74.6855347 260.527881 73.0692881 258.911962 74.6855347 257.296044 76.3017812 258.911962"></polygon>
<polygon id="Stroke-104" transform="translate(74.685535, 258.911962) rotate(22.000000) translate(-74.685535, -258.911962) " points="74.6855347 260.527881 73.0692881 258.911962 74.6855347 257.296044 76.3017812 258.911962"></polygon>
<polygon id="Fill-106" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.137105, 262.330799) rotate(22.000000) translate(-76.137105, -262.330799) " points="76.137105 263.946717 74.5208585 262.330799 76.137105 260.71488 77.7533516 262.330799"></polygon>
<polygon id="Stroke-108" transform="translate(76.137105, 262.330799) rotate(22.000000) translate(-76.137105, -262.330799) " points="76.137105 263.946717 74.5208585 262.330799 76.137105 260.71488 77.7533516 262.330799"></polygon>
<polygon id="Fill-110" fill-opacity="0.6" fill="#A3B1BF" transform="translate(68.626202, 253.413685) rotate(22.000000) translate(-68.626202, -253.413685) " points="68.6262021 255.029603 67.0099556 253.413685 68.6262021 251.797766 70.2424486 253.413685"></polygon>
<polygon id="Stroke-112" transform="translate(68.626202, 253.413685) rotate(22.000000) translate(-68.626202, -253.413685) " points="68.6262021 255.029603 67.0099556 253.413685 68.6262021 251.797766 70.2424486 253.413685"></polygon>
<polygon id="Fill-114" fill-opacity="0.6" fill="#A3B1BF" transform="translate(70.077796, 256.832462) rotate(22.000000) translate(-70.077796, -256.832462) " points="70.0777963 258.448381 68.4615497 256.832462 70.0777963 255.216543 71.6940428 256.832462"></polygon>
<polygon id="Stroke-116" transform="translate(70.077796, 256.832462) rotate(22.000000) translate(-70.077796, -256.832462) " points="70.0777963 258.448381 68.4615497 256.832462 70.0777963 255.216543 71.6940428 256.832462"></polygon>
<polygon id="Fill-118" fill-opacity="0.6" fill="#A3B1BF" transform="translate(71.529426, 260.251322) rotate(22.000000) translate(-71.529426, -260.251322) " points="71.5294256 261.867241 69.913179 260.251322 71.5294256 258.635403 73.1456721 260.251322"></polygon>
<polygon id="Stroke-120" transform="translate(71.529426, 260.251322) rotate(22.000000) translate(-71.529426, -260.251322) " points="71.5294256 261.867241 69.913179 260.251322 71.5294256 258.635403 73.1456721 260.251322"></polygon>
<polygon id="Fill-122" fill-opacity="0.6" fill="#A3B1BF" transform="translate(72.981020, 263.670099) rotate(22.000000) translate(-72.981020, -263.670099) " points="72.9810197 265.286018 71.3647732 263.670099 72.9810197 262.054181 74.5972663 263.670099"></polygon>
<polygon id="Stroke-124" transform="translate(72.981020, 263.670099) rotate(22.000000) translate(-72.981020, -263.670099) " points="72.9810197 265.286018 71.3647732 263.670099 72.9810197 262.054181 74.5972663 263.670099"></polygon>
<polygon id="Fill-126" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.852907, 265.961362) rotate(22.000000) translate(-88.852907, -265.961362) " points="88.8529067 267.577281 87.2366602 265.961362 88.8529067 264.345443 90.4691533 265.961362"></polygon>
<polygon id="Stroke-128" transform="translate(88.852907, 265.961362) rotate(22.000000) translate(-88.852907, -265.961362) " points="88.8529067 267.577281 87.2366602 265.961362 88.8529067 264.345443 90.4691533 265.961362"></polygon>
<polygon id="Fill-130" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.304501, 269.380139) rotate(22.000000) translate(-90.304501, -269.380139) " points="90.3045009 270.996058 88.6882544 269.380139 90.3045009 267.764221 91.9207474 269.380139"></polygon>
<polygon id="Stroke-132" transform="translate(90.304501, 269.380139) rotate(22.000000) translate(-90.304501, -269.380139) " points="90.3045009 270.996058 88.6882544 269.380139 90.3045009 267.764221 91.9207474 269.380139"></polygon>
<polygon id="Fill-134" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.756130, 272.798999) rotate(22.000000) translate(-91.756130, -272.798999) " points="91.7561302 274.414918 90.1398837 272.798999 91.7561302 271.183081 93.3723767 272.798999"></polygon>
<polygon id="Stroke-136" transform="translate(91.756130, 272.798999) rotate(22.000000) translate(-91.756130, -272.798999) " points="91.7561302 274.414918 90.1398837 272.798999 91.7561302 271.183081 93.3723767 272.798999"></polygon>
<polygon id="Fill-138" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.207724, 276.217777) rotate(22.000000) translate(-93.207724, -276.217777) " points="93.2077244 277.833695 91.5914778 276.217777 93.2077244 274.601858 94.8239709 276.217777"></polygon>
<polygon id="Stroke-140" transform="translate(93.207724, 276.217777) rotate(22.000000) translate(-93.207724, -276.217777) " points="93.2077244 277.833695 91.5914778 276.217777 93.2077244 274.601858 94.8239709 276.217777"></polygon>
<polygon id="Fill-142" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.696821, 267.300663) rotate(22.000000) translate(-85.696821, -267.300663) " points="85.6968214 268.916582 84.0805749 267.300663 85.6968214 265.684744 87.313068 267.300663"></polygon>
<polygon id="Stroke-144" transform="translate(85.696821, 267.300663) rotate(22.000000) translate(-85.696821, -267.300663) " points="85.6968214 268.916582 84.0805749 267.300663 85.6968214 265.684744 87.313068 267.300663"></polygon>
<polygon id="Fill-146" fill-opacity="0.6" fill="#A3B1BF" transform="translate(87.148416, 270.719440) rotate(22.000000) translate(-87.148416, -270.719440) " points="87.1484156 272.335359 85.5321691 270.71944 87.1484156 269.103521 88.7646621 270.71944"></polygon>
<polygon id="Stroke-148" transform="translate(87.148416, 270.719440) rotate(22.000000) translate(-87.148416, -270.719440) " points="87.1484156 272.335359 85.5321691 270.71944 87.1484156 269.103521 88.7646621 270.71944"></polygon>
<polygon id="Fill-150" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.599986, 274.138276) rotate(22.000000) translate(-88.599986, -274.138276) " points="88.599986 275.754195 86.9837394 274.138276 88.599986 272.522358 90.2162325 274.138276"></polygon>
<polygon id="Stroke-152" transform="translate(88.599986, 274.138276) rotate(22.000000) translate(-88.599986, -274.138276) " points="88.599986 275.754195 86.9837394 274.138276 88.599986 272.522358 90.2162325 274.138276"></polygon>
<polygon id="Fill-154" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.051639, 277.557078) rotate(22.000000) translate(-90.051639, -277.557078) " points="90.0516391 279.172996 88.4353925 277.557078 90.0516391 275.941159 91.6678856 277.557078"></polygon>
<polygon id="Stroke-156" transform="translate(90.051639, 277.557078) rotate(22.000000) translate(-90.051639, -277.557078) " points="90.0516391 279.172996 88.4353925 277.557078 90.0516391 275.941159 91.6678856 277.557078"></polygon>
<polygon id="Fill-158" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.540736, 268.639964) rotate(22.000000) translate(-82.540736, -268.639964) " points="82.5407361 270.255882 80.9244896 268.639964 82.5407361 267.024045 84.1569826 268.639964"></polygon>
<polygon id="Stroke-160" transform="translate(82.540736, 268.639964) rotate(22.000000) translate(-82.540736, -268.639964) " points="82.5407361 270.255882 80.9244896 268.639964 82.5407361 267.024045 84.1569826 268.639964"></polygon>
<polygon id="Fill-162" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.992306, 272.058800) rotate(22.000000) translate(-83.992306, -272.058800) " points="83.9923065 273.674719 82.3760599 272.0588 83.9923065 270.442881 85.608553 272.0588"></polygon>
<polygon id="Stroke-164" transform="translate(83.992306, 272.058800) rotate(22.000000) translate(-83.992306, -272.058800) " points="83.9923065 273.674719 82.3760599 272.0588 83.9923065 270.442881 85.608553 272.0588"></polygon>
<polygon id="Fill-166" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.443901, 275.477577) rotate(22.000000) translate(-85.443901, -275.477577) " points="85.4439007 277.093496 83.8276541 275.477577 85.4439007 273.861659 87.0601472 275.477577"></polygon>
<polygon id="Stroke-168" transform="translate(85.443901, 275.477577) rotate(22.000000) translate(-85.443901, -275.477577) " points="85.4439007 277.093496 83.8276541 275.477577 85.4439007 273.861659 87.0601472 275.477577"></polygon>
<polygon id="Fill-170" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.895554, 278.896378) rotate(22.000000) translate(-86.895554, -278.896378) " points="86.8955537 280.512297 85.2793072 278.896378 86.8955537 277.28046 88.5118003 278.896378"></polygon>
<polygon id="Stroke-172" transform="translate(86.895554, 278.896378) rotate(22.000000) translate(-86.895554, -278.896378) " points="86.8955537 280.512297 85.2793072 278.896378 86.8955537 277.28046 88.5118003 278.896378"></polygon>
<polygon id="Fill-174" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.384651, 269.979265) rotate(22.000000) translate(-79.384651, -269.979265) " points="79.3846508 271.595183 77.7684043 269.979265 79.3846508 268.363346 81.0008973 269.979265"></polygon>
<polygon id="Stroke-176" transform="translate(79.384651, 269.979265) rotate(22.000000) translate(-79.384651, -269.979265) " points="79.3846508 271.595183 77.7684043 269.979265 79.3846508 268.363346 81.0008973 269.979265"></polygon>
<polygon id="Fill-178" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.836221, 273.398101) rotate(22.000000) translate(-80.836221, -273.398101) " points="80.8362212 275.01402 79.2199746 273.398101 80.8362212 271.782182 82.4524677 273.398101"></polygon>
<polygon id="Stroke-180" transform="translate(80.836221, 273.398101) rotate(22.000000) translate(-80.836221, -273.398101) " points="80.8362212 275.01402 79.2199746 273.398101 80.8362212 271.782182 82.4524677 273.398101"></polygon>
<polygon id="Fill-182" fill-opacity="0.6" fill="#A3B1BF" transform="translate(82.287815, 276.816878) rotate(22.000000) translate(-82.287815, -276.816878) " points="82.2878153 278.432797 80.6715688 276.816878 82.2878153 275.20096 83.9040619 276.816878"></polygon>
<polygon id="Stroke-184" transform="translate(82.287815, 276.816878) rotate(22.000000) translate(-82.287815, -276.816878) " points="82.2878153 278.432797 80.6715688 276.816878 82.2878153 275.20096 83.9040619 276.816878"></polygon>
<polygon id="Fill-186" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.739445, 280.235738) rotate(22.000000) translate(-83.739445, -280.235738) " points="83.7394446 281.851657 82.1231981 280.235738 83.7394446 278.61982 85.3556912 280.235738"></polygon>
<polygon id="Stroke-188" transform="translate(83.739445, 280.235738) rotate(22.000000) translate(-83.739445, -280.235738) " points="83.7394446 281.851657 82.1231981 280.235738 83.7394446 278.61982 85.3556912 280.235738"></polygon>
<polygon id="Fill-190" fill-opacity="0.6" fill="#A3B1BF" transform="translate(76.228483, 271.318601) rotate(22.000000) translate(-76.228483, -271.318601) " points="76.2284828 272.934519 74.6122362 271.318601 76.2284828 269.702682 77.8447293 271.318601"></polygon>
<polygon id="Stroke-192" transform="translate(76.228483, 271.318601) rotate(22.000000) translate(-76.228483, -271.318601) " points="76.2284828 272.934519 74.6122362 271.318601 76.2284828 269.702682 77.8447293 271.318601"></polygon>
<polygon id="Fill-194" fill-opacity="0.6" fill="#A3B1BF" transform="translate(77.680136, 274.737402) rotate(22.000000) translate(-77.680136, -274.737402) " points="77.6801358 276.353321 76.0638893 274.737402 77.6801358 273.121483 79.2963824 274.737402"></polygon>
<polygon id="Stroke-196" transform="translate(77.680136, 274.737402) rotate(22.000000) translate(-77.680136, -274.737402) " points="77.6801358 276.353321 76.0638893 274.737402 77.6801358 273.121483 79.2963824 274.737402"></polygon>
<polygon id="Fill-198" fill-opacity="0.6" fill="#A3B1BF" transform="translate(79.131730, 278.156179) rotate(22.000000) translate(-79.131730, -278.156179) " points="79.13173 279.772098 77.5154835 278.156179 79.13173 276.540261 80.7479765 278.156179"></polygon>
<polygon id="Stroke-200" transform="translate(79.131730, 278.156179) rotate(22.000000) translate(-79.131730, -278.156179) " points="79.13173 279.772098 77.5154835 278.156179 79.13173 276.540261 80.7479765 278.156179"></polygon>
<polygon id="Fill-202" fill-opacity="0.6" fill="#A3B1BF" transform="translate(80.583359, 281.575039) rotate(22.000000) translate(-80.583359, -281.575039) " points="80.5833593 283.190958 78.9671128 281.575039 80.5833593 279.959121 82.1996058 281.575039"></polygon>
<polygon id="Stroke-204" transform="translate(80.583359, 281.575039) rotate(22.000000) translate(-80.583359, -281.575039) " points="80.5833593 283.190958 78.9671128 281.575039 80.5833593 279.959121 82.1996058 281.575039"></polygon>
<polygon id="Fill-206" fill-opacity="0.6" fill="#A3B1BF" transform="translate(96.455246, 283.866302) rotate(22.000000) translate(-96.455246, -283.866302) " points="96.4552463 285.48222 94.8389998 283.866302 96.4552463 282.250383 98.0714929 283.866302"></polygon>
<polygon id="Stroke-208" transform="translate(96.455246, 283.866302) rotate(22.000000) translate(-96.455246, -283.866302) " points="96.4552463 285.48222 94.8389998 283.866302 96.4552463 282.250383 98.0714929 283.866302"></polygon>
<polygon id="Fill-210" fill-opacity="0.6" fill="#A3B1BF" transform="translate(97.906840, 287.285079) rotate(22.000000) translate(-97.906840, -287.285079) " points="97.9068405 288.900998 96.290594 287.285079 97.9068405 285.66916 99.523087 287.285079"></polygon>
<polygon id="Stroke-212" transform="translate(97.906840, 287.285079) rotate(22.000000) translate(-97.906840, -287.285079) " points="97.9068405 288.900998 96.290594 287.285079 97.9068405 285.66916 99.523087 287.285079"></polygon>
<polygon id="Fill-214" fill-opacity="0.6" fill="#A3B1BF" transform="translate(99.358435, 290.703856) rotate(22.000000) translate(-99.358435, -290.703856) " points="99.3584347 292.319775 97.7421881 290.703856 99.3584347 289.087938 100.974681 290.703856"></polygon>
<polygon id="Stroke-216" transform="translate(99.358435, 290.703856) rotate(22.000000) translate(-99.358435, -290.703856) " points="99.3584347 292.319775 97.7421881 290.703856 99.3584347 289.087938 100.974681 290.703856"></polygon>
<polygon id="Fill-218" fill-opacity="0.6" fill="#A3B1BF" transform="translate(100.810064, 294.122716) rotate(22.000000) translate(-100.810064, -294.122716) " points="100.810064 295.738635 99.1938174 294.122716 100.810064 292.506798 102.42631 294.122716"></polygon>
<polygon id="Stroke-220" transform="translate(100.810064, 294.122716) rotate(22.000000) translate(-100.810064, -294.122716) " points="100.810064 295.738635 99.1938174 294.122716 100.810064 292.506798 102.42631 294.122716"></polygon>
<polygon id="Fill-222" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.299102, 285.205579) rotate(22.000000) translate(-93.299102, -285.205579) " points="93.2991021 286.821497 91.6828556 285.205579 93.2991021 283.58966 94.9153486 285.205579"></polygon>
<polygon id="Stroke-224" transform="translate(93.299102, 285.205579) rotate(22.000000) translate(-93.299102, -285.205579) " points="93.2991021 286.821497 91.6828556 285.205579 93.2991021 283.58966 94.9153486 285.205579"></polygon>
<polygon id="Fill-226" fill-opacity="0.6" fill="#A3B1BF" transform="translate(94.750755, 288.624380) rotate(22.000000) translate(-94.750755, -288.624380) " points="94.7507552 290.240299 93.1345086 288.62438 94.7507552 287.008461 96.3670017 288.62438"></polygon>
<polygon id="Stroke-228" transform="translate(94.750755, 288.624380) rotate(22.000000) translate(-94.750755, -288.624380) " points="94.7507552 290.240299 93.1345086 288.62438 94.7507552 287.008461 96.3670017 288.62438"></polygon>
<polygon id="Fill-230" fill-opacity="0.6" fill="#A3B1BF" transform="translate(96.202326, 292.043216) rotate(22.000000) translate(-96.202326, -292.043216) " points="96.2023255 293.659135 94.586079 292.043216 96.2023255 290.427297 97.8185721 292.043216"></polygon>
<polygon id="Stroke-232" transform="translate(96.202326, 292.043216) rotate(22.000000) translate(-96.202326, -292.043216) " points="96.2023255 293.659135 94.586079 292.043216 96.2023255 290.427297 97.8185721 292.043216"></polygon>
<polygon id="Fill-234" fill-opacity="0.6" fill="#A3B1BF" transform="translate(97.653979, 295.462017) rotate(22.000000) translate(-97.653979, -295.462017) " points="97.6539786 297.077936 96.0377321 295.462017 97.6539786 293.846099 99.2702252 295.462017"></polygon>
<polygon id="Stroke-236" transform="translate(97.653979, 295.462017) rotate(22.000000) translate(-97.653979, -295.462017) " points="97.6539786 297.077936 96.0377321 295.462017 97.6539786 293.846099 99.2702252 295.462017"></polygon>
<polygon id="Fill-238" fill-opacity="0.6" fill="#A3B1BF" transform="translate(90.143017, 286.544880) rotate(22.000000) translate(-90.143017, -286.544880) " points="90.1430168 288.160798 88.5267702 286.54488 90.1430168 284.928961 91.7592633 286.54488"></polygon>
<polygon id="Stroke-240" transform="translate(90.143017, 286.544880) rotate(22.000000) translate(-90.143017, -286.544880) " points="90.1430168 288.160798 88.5267702 286.54488 90.1430168 284.928961 91.7592633 286.54488"></polygon>
<polygon id="Fill-242" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.594670, 289.963681) rotate(22.000000) translate(-91.594670, -289.963681) " points="91.5946698 291.5796 89.9784233 289.963681 91.5946698 288.347762 93.2109164 289.963681"></polygon>
<polygon id="Stroke-244" transform="translate(91.594670, 289.963681) rotate(22.000000) translate(-91.594670, -289.963681) " points="91.5946698 291.5796 89.9784233 289.963681 91.5946698 288.347762 93.2109164 289.963681"></polygon>
<polygon id="Fill-246" fill-opacity="0.6" fill="#A3B1BF" transform="translate(93.046240, 293.382517) rotate(22.000000) translate(-93.046240, -293.382517) " points="93.0462402 294.998436 91.4299937 293.382517 93.0462402 291.766598 94.6624868 293.382517"></polygon>
<polygon id="Stroke-248" transform="translate(93.046240, 293.382517) rotate(22.000000) translate(-93.046240, -293.382517) " points="93.0462402 294.998436 91.4299937 293.382517 93.0462402 291.766598 94.6624868 293.382517"></polygon>
<polygon id="Fill-250" fill-opacity="0.6" fill="#A3B1BF" transform="translate(94.497893, 296.801318) rotate(22.000000) translate(-94.497893, -296.801318) " points="94.4978933 298.417237 92.8816468 296.801318 94.4978933 295.1854 96.1141398 296.801318"></polygon>
<polygon id="Stroke-252" transform="translate(94.497893, 296.801318) rotate(22.000000) translate(-94.497893, -296.801318) " points="94.4978933 298.417237 92.8816468 296.801318 94.4978933 295.1854 96.1141398 296.801318"></polygon>
<polygon id="Fill-254" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.986931, 287.884181) rotate(22.000000) translate(-86.986931, -287.884181) " points="86.9869315 289.500099 85.3706849 287.884181 86.9869315 286.268262 88.603178 287.884181"></polygon>
<polygon id="Stroke-256" transform="translate(86.986931, 287.884181) rotate(22.000000) translate(-86.986931, -287.884181) " points="86.9869315 289.500099 85.3706849 287.884181 86.9869315 286.268262 88.603178 287.884181"></polygon>
<polygon id="Fill-258" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.438585, 291.302982) rotate(22.000000) translate(-88.438585, -291.302982) " points="88.4385845 292.9189 86.822338 291.302982 88.4385845 289.687063 90.0548311 291.302982"></polygon>
<polygon id="Stroke-260" transform="translate(88.438585, 291.302982) rotate(22.000000) translate(-88.438585, -291.302982) " points="88.4385845 292.9189 86.822338 291.302982 88.4385845 289.687063 90.0548311 291.302982"></polygon>
<polygon id="Fill-262" fill-opacity="0.6" fill="#A3B1BF" transform="translate(89.890155, 294.721818) rotate(22.000000) translate(-89.890155, -294.721818) " points="89.8901549 296.337737 88.2739084 294.721818 89.8901549 293.105899 91.5064014 294.721818"></polygon>
<polygon id="Stroke-264" transform="translate(89.890155, 294.721818) rotate(22.000000) translate(-89.890155, -294.721818) " points="89.8901549 296.337737 88.2739084 294.721818 89.8901549 293.105899 91.5064014 294.721818"></polygon>
<polygon id="Fill-266" fill-opacity="0.6" fill="#A3B1BF" transform="translate(91.341749, 298.140595) rotate(22.000000) translate(-91.341749, -298.140595) " points="91.3417491 299.756514 89.7255025 298.140595 91.3417491 296.524677 92.9579956 298.140595"></polygon>
<polygon id="Stroke-268" transform="translate(91.341749, 298.140595) rotate(22.000000) translate(-91.341749, -298.140595) " points="91.3417491 299.756514 89.7255025 298.140595 91.3417491 296.524677 92.9579956 298.140595"></polygon>
<polygon id="Fill-270" fill-opacity="0.6" fill="#A3B1BF" transform="translate(83.830846, 289.223482) rotate(22.000000) translate(-83.830846, -289.223482) " points="83.8308461 290.8394 82.2145996 289.223482 83.8308461 287.607563 85.4470927 289.223482"></polygon>
<polygon id="Stroke-272" transform="translate(83.830846, 289.223482) rotate(22.000000) translate(-83.830846, -289.223482) " points="82.2145996 289.223482 83.8308461 287.607563 85.4470927 289.223482 83.8308461 290.8394"></polygon>
<polygon id="Fill-274" fill-opacity="0.6" fill="#A3B1BF" transform="translate(85.282417, 292.642318) rotate(22.000000) translate(-85.282417, -292.642318) " points="85.2824165 294.258236 83.66617 292.642318 85.2824165 291.026399 86.898663 292.642318"></polygon>
<polygon id="Stroke-276" transform="translate(85.282417, 292.642318) rotate(22.000000) translate(-85.282417, -292.642318) " points="85.2824165 294.258236 83.66617 292.642318 85.2824165 291.026399 86.898663 292.642318"></polygon>
<polygon id="Fill-278" fill-opacity="0.6" fill="#A3B1BF" transform="translate(86.734070, 296.061119) rotate(22.000000) translate(-86.734070, -296.061119) " points="86.7340696 297.677038 85.1178231 296.061119 86.7340696 294.4452 88.3503161 296.061119"></polygon>
<polygon id="Stroke-280" transform="translate(86.734070, 296.061119) rotate(22.000000) translate(-86.734070, -296.061119) " points="86.7340696 297.677038 85.1178231 296.061119 86.7340696 294.4452 88.3503161 296.061119"></polygon>
<polygon id="Fill-282" fill-opacity="0.6" fill="#A3B1BF" transform="translate(88.185664, 299.479896) rotate(22.000000) translate(-88.185664, -299.479896) " points="88.1856638 301.095815 86.5694172 299.479896 88.1856638 297.863978 89.8019103 299.479896"></polygon>
<polygon id="Stroke-284" transform="translate(88.185664, 299.479896) rotate(22.000000) translate(-88.185664, -299.479896) " points="88.1856638 301.095815 86.5694172 299.479896 88.1856638 297.863978 89.8019103 299.479896"></polygon>
<polygon id="Fill-286" transform="translate(37.779995, 163.402514) rotate(22.000000) translate(-37.779995, -163.402514) " points="51.9961666 192.018058 66.401345 177.615802 23.5644587 134.78697 9.15864501 149.189862"></polygon>
<polygon id="Fill-290" transform="translate(50.400318, 195.682118) rotate(22.000000) translate(-50.400318, -195.682118) " points="54.1737837 198.070743 48.0112085 191.909418 46.6268527 193.293493 52.7894279 199.454818"></polygon>
<polygon id="Stroke-292" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(50.400318, 195.682118) rotate(22.000000) translate(-50.400318, -195.682118) " points="54.1737837 198.070743 48.0112085 191.909418 46.6268527 193.293493 52.7894279 199.454818"></polygon>
<polygon id="Fill-294" fill-opacity="0.8" fill="#A3B1BF" transform="translate(52.603532, 200.871447) rotate(22.000000) translate(-52.603532, -200.871447) " points="52.712807 203.746308 55.4789773 200.980699 52.4942579 197.996585 49.7280876 200.762195"></polygon>
<polygon id="Stroke-296" stroke="#A3B1BF" stroke-width="1.62" fill="#FFFFFF" stroke-linejoin="round" transform="translate(52.603532, 200.871447) rotate(22.000000) translate(-52.603532, -200.871447) " points="52.712807 203.746308 55.4789773 200.980699 52.4942579 197.996585 49.7280876 200.762195"></polygon>
<polygon id="Fill-298" fill-opacity="0.8" fill="#A3B1BF" transform="translate(53.983257, 183.836778) rotate(22.000000) translate(-53.983257, -183.836778) " points="52.3670108 183.836778 53.9832574 185.452697 55.5995039 183.836778 53.9832574 182.22086"></polygon>
<polygon id="Stroke-300" transform="translate(53.983257, 183.836778) rotate(22.000000) translate(-53.983257, -183.836778) " points="52.3670108 183.836778 53.9832574 185.452697 55.5995039 183.836778 53.9832574 182.22086"></polygon>
<polygon id="Fill-302" fill-opacity="0.8" fill="#A3B1BF" transform="translate(52.531663, 180.418001) rotate(22.000000) translate(-52.531663, -180.418001) " points="50.9154167 180.418001 52.5316632 182.03392 54.1479097 180.418001 52.5316632 178.802082"></polygon>
<polygon id="Stroke-304" transform="translate(52.531663, 180.418001) rotate(22.000000) translate(-52.531663, -180.418001) " points="50.9154167 180.418001 52.5316632 182.03392 54.1479097 180.418001 52.5316632 178.802082"></polygon>
<polygon id="Fill-306" fill-opacity="0.8" fill="#A3B1BF" transform="translate(51.080034, 176.999141) rotate(22.000000) translate(-51.080034, -176.999141) " points="49.4637874 176.999141 51.0800339 178.61506 52.6962805 176.999141 51.0800339 175.383222"></polygon>
<polygon id="Stroke-308" transform="translate(51.080034, 176.999141) rotate(22.000000) translate(-51.080034, -176.999141) " points="49.4637874 176.999141 51.0800339 178.61506 52.6962805 176.999141 51.0800339 175.383222"></polygon>
<polygon id="Fill-310" fill-opacity="0.8" fill="#A3B1BF" transform="translate(49.628440, 173.580364) rotate(22.000000) translate(-49.628440, -173.580364) " points="48.0121932 173.580364 49.6284397 175.196282 51.2446863 173.580364 49.6284397 171.964445"></polygon>
<polygon id="Stroke-312" transform="translate(49.628440, 173.580364) rotate(22.000000) translate(-49.628440, -173.580364) " points="48.0121932 173.580364 49.6284397 175.196282 51.2446863 173.580364 49.6284397 171.964445"></polygon>
<polygon id="Fill-314" fill-opacity="0.8" fill="#A3B1BF" transform="translate(50.827172, 185.176079) rotate(22.000000) translate(-50.827172, -185.176079) " points="49.2109255 185.176079 50.8271721 186.791998 52.4434186 185.176079 50.8271721 183.560161"></polygon>
<polygon id="Stroke-316" transform="translate(50.827172, 185.176079) rotate(22.000000) translate(-50.827172, -185.176079) " points="49.2109255 185.176079 50.8271721 186.791998 52.4434186 185.176079 50.8271721 183.560161"></polygon>
<polygon id="Fill-318" fill-opacity="0.8" fill="#A3B1BF" transform="translate(49.375578, 181.757302) rotate(22.000000) translate(-49.375578, -181.757302) " points="47.7593313 181.757302 49.3755779 183.373221 50.9918244 181.757302 49.3755779 180.141383"></polygon>
<polygon id="Stroke-320" transform="translate(49.375578, 181.757302) rotate(22.000000) translate(-49.375578, -181.757302) " points="47.7593313 181.757302 49.3755779 183.373221 50.9918244 181.757302 49.3755779 180.141383"></polygon>
<polygon id="Fill-322" fill-opacity="0.8" fill="#A3B1BF" transform="translate(47.923949, 178.338442) rotate(22.000000) translate(-47.923949, -178.338442) " points="46.3077021 178.338442 47.9239486 179.954361 49.5401951 178.338442 47.9239486 176.722523"></polygon>
<polygon id="Stroke-324" transform="translate(47.923949, 178.338442) rotate(22.000000) translate(-47.923949, -178.338442) " points="46.3077021 178.338442 47.9239486 179.954361 49.5401951 178.338442 47.9239486 176.722523"></polygon>
<polygon id="Fill-326" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.472354, 174.919665) rotate(22.000000) translate(-46.472354, -174.919665) " points="44.8561079 174.919665 46.4723544 176.535583 48.088601 174.919665 46.4723544 173.303746"></polygon>
<polygon id="Stroke-328" transform="translate(46.472354, 174.919665) rotate(22.000000) translate(-46.472354, -174.919665) " points="44.8561079 174.919665 46.4723544 176.535583 48.088601 174.919665 46.4723544 173.303746"></polygon>
<polygon id="Fill-330" fill-opacity="0.8" fill="#A3B1BF" transform="translate(47.671087, 186.515380) rotate(22.000000) translate(-47.671087, -186.515380) " points="46.0548402 186.51538 47.6710867 188.131299 49.2873333 186.51538 47.6710867 184.899461"></polygon>
<polygon id="Stroke-332" transform="translate(47.671087, 186.515380) rotate(22.000000) translate(-47.671087, -186.515380) " points="46.0548402 186.51538 47.6710867 188.131299 49.2873333 186.51538 47.6710867 184.899461"></polygon>
<polygon id="Fill-334" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.219493, 183.096603) rotate(22.000000) translate(-46.219493, -183.096603) " points="44.603246 183.096603 46.2194926 184.712521 47.8357391 183.096603 46.2194926 181.480684"></polygon>
<polygon id="Stroke-336" transform="translate(46.219493, 183.096603) rotate(22.000000) translate(-46.219493, -183.096603) " points="44.603246 183.096603 46.2194926 184.712521 47.8357391 183.096603 46.2194926 181.480684"></polygon>
<polygon id="Fill-338" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.767839, 179.677802) rotate(22.000000) translate(-44.767839, -179.677802) " points="43.1515929 179.677802 44.7678395 181.29372 46.384086 179.677802 44.7678395 178.061883"></polygon>
<polygon id="Stroke-340" transform="translate(44.767839, 179.677802) rotate(22.000000) translate(-44.767839, -179.677802) " points="43.1515929 179.677802 44.7678395 181.29372 46.384086 179.677802 44.7678395 178.061883"></polygon>
<polygon id="Fill-342" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.316269, 176.258965) rotate(22.000000) translate(-43.316269, -176.258965) " points="41.7000226 176.258965 43.3162691 177.874884 44.9325156 176.258965 43.3162691 174.643047"></polygon>
<polygon id="Stroke-344" transform="translate(43.316269, 176.258965) rotate(22.000000) translate(-43.316269, -176.258965) " points="41.7000226 176.258965 43.3162691 177.874884 44.9325156 176.258965 43.3162691 174.643047"></polygon>
<polygon id="Fill-346" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.514978, 187.854740) rotate(22.000000) translate(-44.514978, -187.854740) " points="42.8987311 187.85474 44.5149776 189.470659 46.1312242 187.85474 44.5149776 186.238821"></polygon>
<polygon id="Stroke-348" transform="translate(44.514978, 187.854740) rotate(22.000000) translate(-44.514978, -187.854740) " points="42.8987311 187.85474 44.5149776 189.470659 46.1312242 187.85474 44.5149776 186.238821"></polygon>
<polygon id="Fill-350" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.063348, 184.435880) rotate(22.000000) translate(-43.063348, -184.435880) " points="41.4471018 184.43588 43.0633483 186.051799 44.6795949 184.43588 43.0633483 182.819961"></polygon>
<polygon id="Stroke-352" transform="translate(43.063348, 184.435880) rotate(22.000000) translate(-43.063348, -184.435880) " points="41.4471018 184.43588 43.0633483 186.051799 44.6795949 184.43588 43.0633483 182.819961"></polygon>
<polygon id="Fill-354" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.611754, 181.017103) rotate(22.000000) translate(-41.611754, -181.017103) " points="39.9955076 181.017103 41.6117542 182.633021 43.2280007 181.017103 41.6117542 179.401184"></polygon>
<polygon id="Stroke-356" transform="translate(41.611754, 181.017103) rotate(22.000000) translate(-41.611754, -181.017103) " points="39.9955076 181.017103 41.6117542 182.633021 43.2280007 181.017103 41.6117542 179.401184"></polygon>
<polygon id="Fill-358" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.160184, 177.598266) rotate(22.000000) translate(-40.160184, -177.598266) " points="38.5439373 177.598266 40.1601838 179.214185 41.7764303 177.598266 40.1601838 175.982348"></polygon>
<polygon id="Stroke-360" transform="translate(40.160184, 177.598266) rotate(22.000000) translate(-40.160184, -177.598266) " points="38.5439373 177.598266 40.1601838 179.214185 41.7764303 177.598266 40.1601838 175.982348"></polygon>
<polygon id="Fill-362" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.358892, 189.194041) rotate(22.000000) translate(-41.358892, -189.194041) " points="39.7426458 189.194041 41.3588923 190.80996 42.9751388 189.194041 41.3588923 187.578122"></polygon>
<polygon id="Stroke-364" transform="translate(41.358892, 189.194041) rotate(22.000000) translate(-41.358892, -189.194041) " points="39.7426458 189.194041 41.3588923 190.80996 42.9751388 189.194041 41.3588923 187.578122"></polygon>
<polygon id="Fill-366" fill-opacity="0.8" fill="#A3B1BF" transform="translate(39.907263, 185.775181) rotate(22.000000) translate(-39.907263, -185.775181) " points="38.2910165 185.775181 39.907263 187.3911 41.5235095 185.775181 39.907263 184.159262"></polygon>
<polygon id="Stroke-368" transform="translate(39.907263, 185.775181) rotate(22.000000) translate(-39.907263, -185.775181) " points="38.2910165 185.775181 39.907263 187.3911 41.5235095 185.775181 39.907263 184.159262"></polygon>
<polygon id="Fill-370" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.455669, 182.356404) rotate(22.000000) translate(-38.455669, -182.356404) " points="36.8394223 182.356404 38.4556688 183.972322 40.0719154 182.356404 38.4556688 180.740485"></polygon>
<polygon id="Stroke-372" transform="translate(38.455669, 182.356404) rotate(22.000000) translate(-38.455669, -182.356404) " points="36.8394223 182.356404 38.4556688 183.972322 40.0719154 182.356404 38.4556688 180.740485"></polygon>
<polygon id="Fill-374" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.004016, 178.937602) rotate(22.000000) translate(-37.004016, -178.937602) " points="35.3877692 178.937602 37.0040158 180.553521 38.6202623 178.937602 37.0040158 177.321684"></polygon>
<polygon id="Stroke-376" transform="translate(37.004016, 178.937602) rotate(22.000000) translate(-37.004016, -178.937602) " points="35.3877692 178.937602 37.0040158 180.553521 38.6202623 178.937602 37.0040158 177.321684"></polygon>
<polygon id="Fill-378" fill-opacity="0.8" fill="#A3B1BF" transform="translate(46.380894, 165.931897) rotate(22.000000) translate(-46.380894, -165.931897) " points="44.7646475 165.931897 46.380894 167.547816 47.9971405 165.931897 46.380894 164.315979"></polygon>
<polygon id="Stroke-380" transform="translate(46.380894, 165.931897) rotate(22.000000) translate(-46.380894, -165.931897) " points="44.7646475 165.931897 46.380894 167.547816 47.9971405 165.931897 46.380894 164.315979"></polygon>
<polygon id="Fill-382" fill-opacity="0.8" fill="#A3B1BF" transform="translate(44.929324, 162.513061) rotate(22.000000) translate(-44.929324, -162.513061) " points="43.3130771 162.513061 44.9293236 164.12898 46.5455702 162.513061 44.9293236 160.897143"></polygon>
<polygon id="Stroke-384" transform="translate(44.929324, 162.513061) rotate(22.000000) translate(-44.929324, -162.513061) " points="43.3130771 162.513061 44.9293236 164.12898 46.5455702 162.513061 44.9293236 160.897143"></polygon>
<polygon id="Fill-386" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.477729, 159.094284) rotate(22.000000) translate(-43.477729, -159.094284) " points="41.8614829 159.094284 43.4777295 160.710203 45.093976 159.094284 43.4777295 157.478365"></polygon>
<polygon id="Stroke-388" transform="translate(43.477729, 159.094284) rotate(22.000000) translate(-43.477729, -159.094284) " points="41.8614829 159.094284 43.4777295 160.710203 45.093976 159.094284 43.4777295 157.478365"></polygon>
<polygon id="Fill-390" fill-opacity="0.8" fill="#A3B1BF" transform="translate(42.026100, 155.675424) rotate(22.000000) translate(-42.026100, -155.675424) " points="40.4098536 155.675424 42.0261002 157.291342 43.6423467 155.675424 42.0261002 154.059505"></polygon>
<polygon id="Stroke-392" transform="translate(42.026100, 155.675424) rotate(22.000000) translate(-42.026100, -155.675424) " points="40.4098536 155.675424 42.0261002 157.291342 43.6423467 155.675424 42.0261002 154.059505"></polygon>
<polygon id="Fill-394" fill-opacity="0.8" fill="#A3B1BF" transform="translate(43.224809, 167.271198) rotate(22.000000) translate(-43.224809, -167.271198) " points="41.6085622 167.271198 43.2248087 168.887117 44.8410552 167.271198 43.2248087 165.65528"></polygon>
<polygon id="Stroke-396" transform="translate(43.224809, 167.271198) rotate(22.000000) translate(-43.224809, -167.271198) " points="41.6085622 167.271198 43.2248087 168.887117 44.8410552 167.271198 43.2248087 165.65528"></polygon>
<polygon id="Fill-398" fill-opacity="0.8" fill="#A3B1BF" transform="translate(41.773238, 163.852362) rotate(22.000000) translate(-41.773238, -163.852362) " points="40.1569918 163.852362 41.7732383 165.468281 43.3894848 163.852362 41.7732383 162.236443"></polygon>
<polygon id="Stroke-400" transform="translate(41.773238, 163.852362) rotate(22.000000) translate(-41.773238, -163.852362) " points="40.1569918 163.852362 41.7732383 165.468281 43.3894848 163.852362 41.7732383 162.236443"></polygon>
<polygon id="Fill-402" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.321585, 160.433561) rotate(22.000000) translate(-40.321585, -160.433561) " points="38.7053387 160.433561 40.3215852 162.04948 41.9378318 160.433561 40.3215852 158.817642"></polygon>
<polygon id="Stroke-404" transform="translate(40.321585, 160.433561) rotate(22.000000) translate(-40.321585, -160.433561) " points="38.7053387 160.433561 40.3215852 162.04948 41.9378318 160.433561 40.3215852 158.817642"></polygon>
<polygon id="Fill-406" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.869991, 157.014784) rotate(22.000000) translate(-38.869991, -157.014784) " points="37.2537445 157.014784 38.8699911 158.630702 40.4862376 157.014784 38.8699911 155.398865"></polygon>
<polygon id="Stroke-408" transform="translate(38.869991, 157.014784) rotate(22.000000) translate(-38.869991, -157.014784) " points="37.2537445 157.014784 38.8699911 158.630702 40.4862376 157.014784 38.8699911 155.398865"></polygon>
<polygon id="Fill-410" fill-opacity="0.8" fill="#A3B1BF" transform="translate(40.068723, 168.610499) rotate(22.000000) translate(-40.068723, -168.610499) " points="38.4524768 168.610499 40.0687234 170.226418 41.6849699 168.610499 40.0687234 166.994581"></polygon>
<polygon id="Stroke-412" transform="translate(40.068723, 168.610499) rotate(22.000000) translate(-40.068723, -168.610499) " points="38.4524768 168.610499 40.0687234 170.226418 41.6849699 168.610499 40.0687234 166.994581"></polygon>
<polygon id="Fill-414" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.617129, 165.191722) rotate(22.000000) translate(-38.617129, -165.191722) " points="37.0008827 165.191722 38.6171292 166.807641 40.2333757 165.191722 38.6171292 163.575803"></polygon>
<polygon id="Stroke-416" transform="translate(38.617129, 165.191722) rotate(22.000000) translate(-38.617129, -165.191722) " points="37.0008827 165.191722 38.6171292 166.807641 40.2333757 165.191722 38.6171292 163.575803"></polygon>
<polygon id="Fill-418" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.165500, 161.772862) rotate(22.000000) translate(-37.165500, -161.772862) " points="35.5492534 161.772862 37.1654999 163.388781 38.7817464 161.772862 37.1654999 160.156943"></polygon>
<polygon id="Stroke-420" transform="translate(37.165500, 161.772862) rotate(22.000000) translate(-37.165500, -161.772862) " points="35.5492534 161.772862 37.1654999 163.388781 38.7817464 161.772862 37.1654999 160.156943"></polygon>
<polygon id="Fill-422" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.713906, 158.354085) rotate(22.000000) translate(-35.713906, -158.354085) " points="34.0976592 158.354085 35.7139057 159.970003 37.3301523 158.354085 35.7139057 156.738166"></polygon>
<polygon id="Stroke-424" transform="translate(35.713906, 158.354085) rotate(22.000000) translate(-35.713906, -158.354085) " points="34.0976592 158.354085 35.7139057 159.970003 37.3301523 158.354085 35.7139057 156.738166"></polygon>
<polygon id="Fill-426" fill-opacity="0.8" fill="#A3B1BF" transform="translate(36.912638, 169.949800) rotate(22.000000) translate(-36.912638, -169.949800) " points="35.2963915 169.9498 36.912638 171.565719 38.5288846 169.9498 36.912638 168.333882"></polygon>
<polygon id="Stroke-428" transform="translate(36.912638, 169.949800) rotate(22.000000) translate(-36.912638, -169.949800) " points="35.2963915 169.9498 36.912638 171.565719 38.5288846 169.9498 36.912638 168.333882"></polygon>
<polygon id="Fill-430" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.461068, 166.530964) rotate(22.000000) translate(-35.461068, -166.530964) " points="33.8448211 166.530964 35.4610677 168.146883 37.0773142 166.530964 35.4610677 164.915045"></polygon>
<polygon id="Stroke-432" transform="translate(35.461068, 166.530964) rotate(22.000000) translate(-35.461068, -166.530964) " points="33.8448211 166.530964 35.4610677 168.146883 37.0773142 166.530964 35.4610677 164.915045"></polygon>
<polygon id="Fill-434" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.009415, 163.112163) rotate(22.000000) translate(-34.009415, -163.112163) " points="32.3931681 163.112163 34.0094146 164.728081 35.6256611 163.112163 34.0094146 161.496244"></polygon>
<polygon id="Stroke-436" transform="translate(34.009415, 163.112163) rotate(22.000000) translate(-34.009415, -163.112163) " points="32.3931681 163.112163 34.0094146 164.728081 35.6256611 163.112163 34.0094146 161.496244"></polygon>
<polygon id="Fill-438" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.557820, 159.693385) rotate(22.000000) translate(-32.557820, -159.693385) " points="30.9415739 159.693385 32.5578204 161.309304 34.174067 159.693385 32.5578204 158.077467"></polygon>
<polygon id="Stroke-440" transform="translate(32.557820, 159.693385) rotate(22.000000) translate(-32.557820, -159.693385) " points="30.9415739 159.693385 32.5578204 161.309304 34.174067 159.693385 32.5578204 158.077467"></polygon>
<polygon id="Fill-442" fill-opacity="0.8" fill="#A3B1BF" transform="translate(33.756553, 171.289101) rotate(22.000000) translate(-33.756553, -171.289101) " points="32.1403062 171.289101 33.7565527 172.90502 35.3727993 171.289101 33.7565527 169.673182"></polygon>
<polygon id="Stroke-444" transform="translate(33.756553, 171.289101) rotate(22.000000) translate(-33.756553, -171.289101) " points="32.1403062 171.289101 33.7565527 172.90502 35.3727993 171.289101 33.7565527 169.673182"></polygon>
<polygon id="Fill-446" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.304959, 167.870324) rotate(22.000000) translate(-32.304959, -167.870324) " points="30.688712 167.870324 32.3049586 169.486242 33.9212051 167.870324 32.3049586 166.254405"></polygon>
<polygon id="Stroke-448" transform="translate(32.304959, 167.870324) rotate(22.000000) translate(-32.304959, -167.870324) " points="30.688712 167.870324 32.3049586 169.486242 33.9212051 167.870324 32.3049586 166.254405"></polygon>
<polygon id="Fill-450" fill-opacity="0.8" fill="#A3B1BF" transform="translate(30.853329, 164.451464) rotate(22.000000) translate(-30.853329, -164.451464) " points="29.2370827 164.451464 30.8533293 166.067382 32.4695758 164.451464 30.8533293 162.835545"></polygon>
<polygon id="Stroke-452" transform="translate(30.853329, 164.451464) rotate(22.000000) translate(-30.853329, -164.451464) " points="29.2370827 164.451464 30.8533293 166.067382 32.4695758 164.451464 30.8533293 162.835545"></polygon>
<polygon id="Fill-454" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.401735, 161.032686) rotate(22.000000) translate(-29.401735, -161.032686) " points="27.7854886 161.032686 29.4017351 162.648605 31.0179816 161.032686 29.4017351 159.416768"></polygon>
<polygon id="Stroke-456" transform="translate(29.401735, 161.032686) rotate(22.000000) translate(-29.401735, -161.032686) " points="27.7854886 161.032686 29.4017351 162.648605 31.0179816 161.032686 29.4017351 159.416768"></polygon>
<polygon id="Fill-458" fill-opacity="0.8" fill="#A3B1BF" transform="translate(38.778613, 148.026981) rotate(22.000000) translate(-38.778613, -148.026981) " points="37.1623668 148.026981 38.7786133 149.6429 40.3948599 148.026981 38.7786133 146.411063"></polygon>
<polygon id="Stroke-460" transform="translate(38.778613, 148.026981) rotate(22.000000) translate(-38.778613, -148.026981) " points="37.1623668 148.026981 38.7786133 149.6429 40.3948599 148.026981 38.7786133 146.411063"></polygon>
<polygon id="Fill-462" fill-opacity="0.8" fill="#A3B1BF" transform="translate(37.326984, 144.608121) rotate(22.000000) translate(-37.326984, -144.608121) " points="35.7107375 144.608121 37.3269841 146.22404 38.9432306 144.608121 37.3269841 142.992203"></polygon>
<polygon id="Stroke-464" transform="translate(37.326984, 144.608121) rotate(22.000000) translate(-37.326984, -144.608121) " points="35.7107375 144.608121 37.3269841 146.22404 38.9432306 144.608121 37.3269841 142.992203"></polygon>
<polygon id="Fill-466" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.875390, 141.189344) rotate(22.000000) translate(-35.875390, -141.189344) " points="34.2591433 141.189344 35.8753899 142.805263 37.4916364 141.189344 35.8753899 139.573425"></polygon>
<polygon id="Stroke-468" transform="translate(35.875390, 141.189344) rotate(22.000000) translate(-35.875390, -141.189344) " points="34.2591433 141.189344 35.8753899 142.805263 37.4916364 141.189344 35.8753899 139.573425"></polygon>
<polygon id="Fill-470" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.423796, 137.770567) rotate(22.000000) translate(-34.423796, -137.770567) " points="32.8075492 137.770567 34.4237957 139.386485 36.0400422 137.770567 34.4237957 136.154648"></polygon>
<polygon id="Stroke-472" fill="#B2BECA" transform="translate(34.423796, 137.770567) rotate(22.000000) translate(-34.423796, -137.770567) " points="34.4237957 139.386485 36.0400422 137.770567 34.4237957 136.154648 32.8075492 137.770567"></polygon>
<polygon id="Fill-474" fill-opacity="0.8" fill="#A3B1BF" transform="translate(35.622528, 149.366282) rotate(22.000000) translate(-35.622528, -149.366282) " points="34.0062815 149.366282 35.622528 150.982201 37.2387746 149.366282 35.622528 147.750364"></polygon>
<polygon id="Stroke-476" transform="translate(35.622528, 149.366282) rotate(22.000000) translate(-35.622528, -149.366282) " points="34.0062815 149.366282 35.622528 150.982201 37.2387746 149.366282 35.622528 147.750364"></polygon>
<polygon id="Fill-478" fill-opacity="0.8" fill="#A3B1BF" transform="translate(34.170875, 145.947481) rotate(22.000000) translate(-34.170875, -145.947481) " points="32.5546284 145.947481 34.1708749 147.5634 35.7871215 145.947481 34.1708749 144.331563"></polygon>
<polygon id="Stroke-480" transform="translate(34.170875, 145.947481) rotate(22.000000) translate(-34.170875, -145.947481) " points="32.5546284 145.947481 34.1708749 147.5634 35.7871215 145.947481 34.1708749 144.331563"></polygon>
<polygon id="Fill-482" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.719305, 142.528645) rotate(22.000000) translate(-32.719305, -142.528645) " points="31.103058 142.528645 32.7193046 144.144564 34.3355511 142.528645 32.7193046 140.912726"></polygon>
<polygon id="Stroke-484" transform="translate(32.719305, 142.528645) rotate(22.000000) translate(-32.719305, -142.528645) " points="31.103058 142.528645 32.7193046 144.144564 34.3355511 142.528645 32.7193046 140.912726"></polygon>
<polygon id="Fill-486" fill-opacity="0.8" fill="#A3B1BF" transform="translate(31.267651, 139.109844) rotate(22.000000) translate(-31.267651, -139.109844) " points="29.651405 139.109844 31.2676515 140.725763 32.883898 139.109844 31.2676515 137.493925"></polygon>
<polygon id="Stroke-488" transform="translate(31.267651, 139.109844) rotate(22.000000) translate(-31.267651, -139.109844) " points="29.651405 139.109844 31.2676515 140.725763 32.883898 139.109844 31.2676515 137.493925"></polygon>
<polygon id="Fill-490" fill-opacity="0.8" fill="#A3B1BF" transform="translate(32.466384, 150.705559) rotate(22.000000) translate(-32.466384, -150.705559) " points="30.8501373 150.705559 32.4663838 152.321478 34.0826303 150.705559 32.4663838 149.089641"></polygon>
<polygon id="Stroke-492" transform="translate(32.466384, 150.705559) rotate(22.000000) translate(-32.466384, -150.705559) " points="30.8501373 150.705559 32.4663838 152.321478 34.0826303 150.705559 32.4663838 149.089641"></polygon>
<polygon id="Fill-494" fill-opacity="0.8" fill="#A3B1BF" transform="translate(31.014790, 147.286782) rotate(22.000000) translate(-31.014790, -147.286782) " points="29.3985431 147.286782 31.0147896 148.902701 32.6310362 147.286782 31.0147896 145.670863"></polygon>
<polygon id="Stroke-496" transform="translate(31.014790, 147.286782) rotate(22.000000) translate(-31.014790, -147.286782) " points="29.3985431 147.286782 31.0147896 148.902701 32.6310362 147.286782 31.0147896 145.670863"></polygon>
<polygon id="Fill-498" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.563219, 143.867946) rotate(22.000000) translate(-29.563219, -143.867946) " points="27.9469727 143.867946 29.5632192 145.483865 31.1794658 143.867946 29.5632192 142.252027"></polygon>
<polygon id="Stroke-500" transform="translate(29.563219, 143.867946) rotate(22.000000) translate(-29.563219, -143.867946) " points="27.9469727 143.867946 29.5632192 145.483865 31.1794658 143.867946 29.5632192 142.252027"></polygon>
<polygon id="Fill-502" fill-opacity="0.8" fill="#A3B1BF" transform="translate(28.111566, 140.449145) rotate(22.000000) translate(-28.111566, -140.449145) " points="26.4953196 140.449145 28.1115662 142.065063 29.7278127 140.449145 28.1115662 138.833226"></polygon>
<polygon id="Stroke-504" transform="translate(28.111566, 140.449145) rotate(22.000000) translate(-28.111566, -140.449145) " points="26.4953196 140.449145 28.1115662 142.065063 29.7278127 140.449145 28.1115662 138.833226"></polygon>
<polygon id="Fill-506" fill-opacity="0.8" fill="#A3B1BF" transform="translate(29.310298, 152.044860) rotate(22.000000) translate(-29.310298, -152.044860) " points="27.6940519 152.04486 29.3102985 153.660779 30.926545 152.04486 29.3102985 150.428942"></polygon>
<polygon id="Stroke-508" transform="translate(29.310298, 152.044860) rotate(22.000000) translate(-29.310298, -152.044860) " points="27.6940519 152.04486 29.3102985 153.660779 30.926545 152.04486 29.3102985 150.428942"></polygon>
<polygon id="Fill-510" fill-opacity="0.8" fill="#A3B1BF" transform="translate(27.858704, 148.626083) rotate(22.000000) translate(-27.858704, -148.626083) " points="26.2424578 148.626083 27.8587043 150.242002 29.4749508 148.626083 27.8587043 147.010164"></polygon>
<polygon id="Stroke-512" transform="translate(27.858704, 148.626083) rotate(22.000000) translate(-27.858704, -148.626083) " points="26.2424578 148.626083 27.8587043 150.242002 29.4749508 148.626083 27.8587043 147.010164"></polygon>
<polygon id="Fill-514" fill-opacity="0.8" fill="#A3B1BF" transform="translate(26.407134, 145.207247) rotate(22.000000) translate(-26.407134, -145.207247) " points="24.7908874 145.207247 26.4071339 146.823166 28.0233805 145.207247 26.4071339 143.591328"></polygon>
<polygon id="Stroke-516" transform="translate(26.407134, 145.207247) rotate(22.000000) translate(-26.407134, -145.207247) " points="24.7908874 145.207247 26.4071339 146.823166 28.0233805 145.207247 26.4071339 143.591328"></polygon>
<polygon id="Fill-518" fill-opacity="0.8" fill="#A3B1BF" transform="translate(24.955481, 141.788446) rotate(22.000000) translate(-24.955481, -141.788446) " points="23.3392343 141.788446 24.9554808 143.404364 26.5717274 141.788446 24.9554808 140.172527"></polygon>
<polygon id="Stroke-520" transform="translate(24.955481, 141.788446) rotate(22.000000) translate(-24.955481, -141.788446) " points="23.3392343 141.788446 24.9554808 143.404364 26.5717274 141.788446 24.9554808 140.172527"></polygon>
<polygon id="Fill-522" fill-opacity="0.8" fill="#A3B1BF" transform="translate(26.154213, 153.384161) rotate(22.000000) translate(-26.154213, -153.384161) " points="24.5379666 153.384161 26.1542132 155.00008 27.7704597 153.384161 26.1542132 151.768243"></polygon>
<polygon id="Stroke-524" transform="translate(26.154213, 153.384161) rotate(22.000000) translate(-26.154213, -153.384161) " points="24.5379666 153.384161 26.1542132 155.00008 27.7704597 153.384161 26.1542132 151.768243"></polygon>
<polygon id="Fill-526" fill-opacity="0.8" fill="#A3B1BF" transform="translate(24.702619, 149.965384) rotate(22.000000) translate(-24.702619, -149.965384) " points="23.0863724 149.965384 24.702619 151.581303 26.3188655 149.965384 24.702619 148.349465"></polygon>
<polygon id="Stroke-528" transform="translate(24.702619, 149.965384) rotate(22.000000) translate(-24.702619, -149.965384) " points="23.0863724 149.965384 24.702619 151.581303 26.3188655 149.965384 24.702619 148.349465"></polygon>
<polygon id="Fill-530" fill-opacity="0.8" fill="#A3B1BF" transform="translate(23.250966, 146.546583) rotate(22.000000) translate(-23.250966, -146.546583) " points="21.6347194 146.546583 23.2509659 148.162502 24.8672124 146.546583 23.2509659 144.930664"></polygon>
<polygon id="Stroke-532" transform="translate(23.250966, 146.546583) rotate(22.000000) translate(-23.250966, -146.546583) " points="21.6347194 146.546583 23.2509659 148.162502 24.8672124 146.546583 23.2509659 144.930664"></polygon>
<polygon id="Fill-534" fill-opacity="0.8" fill="#A3B1BF" transform="translate(21.799396, 143.127747) rotate(22.000000) translate(-21.799396, -143.127747) " points="20.183149 143.127747 21.7993955 144.743665 23.4156421 143.127747 21.7993955 141.511828"></polygon>
<polygon id="Stroke-536" transform="translate(21.799396, 143.127747) rotate(22.000000) translate(-21.799396, -143.127747) " points="20.183149 143.127747 21.7993955 144.743665 23.4156421 143.127747 21.7993955 141.511828"></polygon>
<path d="M129.314819,189.942425 C126.372666,187.000233 124.490222,184.112668 125.110927,183.492089 C125.731631,182.87151 128.619783,184.753573 131.562571,187.695129 C134.504724,190.637321 136.387169,193.524886 135.766464,194.145465 C135.145759,194.766044 132.257608,192.883981 129.314819,189.942425 Z" id="Fill-538" fill="#F5F5F5" transform="translate(130.438695, 188.818777) rotate(22.000000) translate(-130.438695, -188.818777) "></path>
<path d="M129.314819,189.942425 C126.372666,187.000233 124.490222,184.112668 125.110927,183.492089 C125.731631,182.87151 128.619783,184.753573 131.562571,187.695129 C134.504724,190.637321 136.387169,193.524886 135.766464,194.145465 C135.145759,194.766044 132.257608,192.883981 129.314819,189.942425 Z" id="Stroke-540" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(130.438695, 188.818777) rotate(22.000000) translate(-130.438695, -188.818777) "></path>
<path d="M136.083433,187.715086 C130.20421,181.837055 126.443133,176.067006 127.683272,174.827118 C128.92341,173.587231 134.69463,177.347545 140.573854,183.225576 C146.453713,189.104243 150.21479,194.874292 148.974651,196.114179 C147.734513,197.354066 141.963293,193.593752 136.083433,187.715086 Z" id="Fill-542" fill="#F5F5F5" transform="translate(138.328961, 185.470648) rotate(22.000000) translate(-138.328961, -185.470648) "></path>
<path d="M136.083433,187.715086 C130.20421,181.837055 126.443133,176.067006 127.683272,174.827118 C128.92341,173.587231 134.69463,177.347545 140.573854,183.225576 C146.453713,189.104243 150.21479,194.874292 148.974651,196.114179 C147.734513,197.354066 141.963293,193.593752 136.083433,187.715086 Z" id="Stroke-544" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(138.328961, 185.470648) rotate(22.000000) translate(-138.328961, -185.470648) "></path>
<path d="M146.697288,183.650834 C138.818086,175.773231 133.777481,168.04045 135.43947,166.378798 C137.101459,164.717146 144.835809,169.756729 152.715011,177.634332 C160.594213,185.511936 165.634818,193.244716 163.972829,194.906369 C162.310839,196.568021 154.57649,191.528438 146.697288,183.650834 Z" id="Fill-546" fill-opacity="0.35" fill="#F5F5F5" transform="translate(149.706149, 180.642583) rotate(22.000000) translate(-149.706149, -180.642583) "></path>
<path d="M146.697288,183.650834 C138.818086,175.773231 133.777481,168.04045 135.43947,166.378798 C137.101459,164.717146 144.835809,169.756729 152.715011,177.634332 C160.594213,185.511936 165.634818,193.244716 163.972829,194.906369 C162.310839,196.568021 154.57649,191.528438 146.697288,183.650834 Z" id="Stroke-548" stroke="#A3B1BF" stroke-width="1.62" stroke-linejoin="round" transform="translate(149.706149, 180.642583) rotate(22.000000) translate(-149.706149, -180.642583) "></path>
<path d="M65.2279553,90.2345285 C62.4548336,90.0320836 60.4105231,89.3345405 60.4105231,88.5051511 C60.4105231,87.676673 62.4503446,86.9797514 65.2188187,86.7764428 C65.4149139,84.0068366 66.0879499,81.9659221 66.8880741,81.9659221 C67.6881984,81.9659221 68.3612344,84.0068366 68.5573295,86.7764428 C71.3258036,86.9797514 73.3656251,87.676673 73.3656251,88.5051511 C73.3656251,89.3345405 71.3213146,90.0320836 68.548193,90.2345285 C68.3410329,92.9408238 67.6762073,94.9210242 66.8880741,94.9210242 C66.0999409,94.9210242 65.4351154,92.9408238 65.2279553,90.2345285 Z" id="Oval-80-Copy-3" fill-opacity="0.4" fill="#A3B1BF" opacity="0.85" transform="translate(66.888074, 88.443473) rotate(-340.000000) translate(-66.888074, -88.443473) "></path>
<path d="M118.775569,329.140492 L118.424988,329.526146 C117.522244,330.5192 115.985396,330.592411 114.992341,329.689667 C114.596934,329.330218 114.331035,328.850456 114.235803,328.324641 L114.143075,327.812647 L113.669257,327.599091 C112.445737,327.047635 111.900921,325.608734 112.452377,324.385214 C112.672015,323.8979 113.046204,323.496601 113.516991,323.243469 L113.97521,322.997095 L114.032158,322.478985 C114.178786,321.144967 115.379087,320.182398 116.713105,320.329026 C117.24418,320.387399 117.741214,320.61917 118.127299,320.988476 L118.503957,321.348765 L119.01334,321.242962 C120.327346,320.970031 121.613813,321.813989 121.886744,323.127995 C121.995449,323.651349 121.928561,324.195943 121.696437,324.677436 L121.470742,325.145594 L121.728812,325.597409 C122.394441,326.762759 121.989337,328.247061 120.823987,328.91269 C120.359975,329.177726 119.82154,329.282421 119.292023,329.21057 L118.775569,329.140492 Z" id="Star-1-Copy-16" fill-opacity="0.4" fill="#A3B1BF"></path>
<path d="M432.83752,120.004816 L432.837087,120.005044 L432.837087,120.005044 C432.092472,120.396429 431.171561,120.110079 430.780176,119.365464 C430.624337,119.068978 430.570573,118.729391 430.627206,118.399266 L430.627206,118.399266 L430.627206,118.399266 L430.627206,118.399266 C430.024845,117.812233 430.01242,116.848039 430.599453,116.245678 C430.833262,116.005765 431.139652,115.849637 431.471171,115.801474 L431.471471,115.801431 L431.471471,115.801431 L431.471471,115.801431 C431.843891,115.046982 432.757399,114.737288 433.511848,115.109709 C433.812195,115.25797 434.055308,115.501083 434.20357,115.801431 L434.20357,115.801431 L434.203869,115.801474 L434.203869,115.801474 C435.036229,115.922398 435.612963,116.695187 435.492039,117.527547 C435.443876,117.859067 435.287748,118.165457 435.047835,118.399266 L435.047835,118.399266 L435.047835,118.399266 L435.047835,118.399266 C435.190066,119.228364 434.63325,120.015783 433.804152,120.158014 C433.474027,120.214647 433.134439,120.160883 432.837954,120.005044 L432.83752,120.004816 Z" id="Star-1-Copy-18" fill-opacity="0.4" fill="#A3B1BF" transform="translate(432.837619, 117.566125) rotate(-3.000000) translate(-432.837619, -117.566125) "></path>
<path d="M99.7727703,38.762372 L99.0266308,39.1545584 L99.0266308,39.1545584 C97.8386845,39.7789675 96.36948,39.3221304 95.7450708,38.134184 C95.4964477,37.6611755 95.4106732,37.1194035 95.5010241,36.5927278 L95.6433921,35.7628333 L95.0407812,35.1755563 L95.0407812,35.1755563 C94.0796578,34.2388893 94.059832,32.7004261 94.996499,31.7393027 C95.369563,31.3564979 95.8584376,31.1073808 96.3874089,31.0305329 L97.2206742,30.9094778 L97.5937913,30.1536188 L97.5937913,30.1536188 C98.1878378,28.950202 99.6449697,28.4562097 100.848387,29.0502562 C101.327469,29.2867472 101.715258,29.6745363 101.951749,30.1536188 L102.324866,30.9094778 L103.158132,31.0305329 L103.158132,31.0305329 C104.486241,31.223478 105.406474,32.4565366 105.213529,33.7846464 C105.136681,34.3136177 104.887564,34.8024923 104.504759,35.1755563 L103.902148,35.7628333 L104.044516,36.5927278 L104.044516,36.5927278 C104.27143,37.9154575 103.383095,39.1716915 102.060366,39.398605 C101.53369,39.4889559 100.991918,39.4031814 100.51891,39.1545584 L99.7727703,38.762372 Z" id="Star-1-Copy-19" fill-opacity="0.4" fill="#A3B1BF" transform="translate(99.772928, 34.116388) rotate(19.000000) translate(-99.772928, -34.116388) "></path>
<path d="M396.631073,305.744172 L396.098125,305.608596 C394.797498,305.277731 394.01135,303.955146 394.342215,302.654518 C394.473956,302.136643 394.772729,301.676633 395.192288,301.345694 L395.623376,301.00566 L395.587617,300.458372 C395.500116,299.119176 396.514815,297.962609 397.854012,297.875108 C398.387399,297.840257 398.917395,297.982247 399.361919,298.279089 L399.818473,298.583965 L400.329362,298.380373 C401.576068,297.883555 402.989473,298.491459 403.486291,299.738164 C403.684076,300.23448 403.712777,300.782145 403.567956,301.296416 L403.418882,301.825788 L403.76981,302.247972 C404.627682,303.280038 404.486471,304.812135 403.454406,305.670007 C403.043346,306.011688 402.531095,306.208301 401.996987,306.229395 L401.44896,306.251039 L401.15585,306.715309 C400.439401,307.850123 398.938655,308.189275 397.80384,307.472826 C397.351988,307.187555 397.006767,306.761296 396.821614,306.260029 L396.631073,305.744172 Z" id="Star-1-Copy-20" fill-opacity="0.4" fill="#A3B1BF"></path>
<path d="M439.755536,146.347757 L439.755103,146.347984 L439.755103,146.347984 C439.010488,146.739369 438.089577,146.45302 437.698192,145.708405 C437.542353,145.411919 437.488589,145.072331 437.545222,144.742206 L437.545222,144.742206 L437.545222,144.742206 L437.545222,144.742206 C436.942861,144.155173 436.930436,143.190979 437.517469,142.588619 C437.751277,142.348705 438.057668,142.192577 438.389187,142.144415 L438.389487,142.144371 L438.389487,142.144371 L438.389487,142.144371 C438.761907,141.389923 439.675415,141.080228 440.429864,141.452649 C440.730211,141.600911 440.973324,141.844024 441.121586,142.144371 L441.121586,142.144371 L441.121885,142.144415 L441.121885,142.144415 C441.954245,142.265338 442.530978,143.038128 442.410055,143.870488 C442.361892,144.202007 442.205764,144.508398 441.965851,144.742206 L441.965851,144.742206 L441.965851,144.742206 L441.965851,144.742206 C442.108082,145.571305 441.551266,146.358723 440.722168,146.500955 C440.392043,146.557588 440.052455,146.503823 439.755969,146.347984 L439.755536,146.347757 Z" id="Star-1-Copy-21" fill-opacity="0.4" fill="#A3B1BF" transform="translate(439.755635, 143.909066) rotate(-12.000000) translate(-439.755635, -143.909066) "></path>
<path d="M244.621971,220.61341 C277.15945,220.61341 303.536288,194.242112 303.536288,161.711467 C303.536288,129.180822 277.15945,102.809524 244.621971,102.809524 C212.084491,102.809524 185.707653,129.180822 185.707653,161.711467 C185.707653,194.242112 212.084491,220.61341 244.621971,220.61341 Z" id="Oval-8-Copy-2" fill-opacity="0.66" fill="#A3B1BF"></path>
<path d="M245.345696,141.060063 C241.146656,141.060063 237.880736,142.342349 235.547936,144.906921 C233.215136,147.354921 232.107056,150.618921 232.107056,154.698921 L236.714336,154.698921 C236.714336,151.842921 237.355856,149.628063 238.638896,147.996063 C240.038576,146.072635 242.196416,145.140063 245.112416,145.140063 C247.561856,145.140063 249.486416,145.781206 250.827776,147.180063 C252.110816,148.462349 252.810656,150.269206 252.810656,152.600635 C252.810656,154.232635 252.227456,155.748063 251.061056,157.205206 C250.711136,157.671492 250.011296,158.370921 249.078176,159.303492 C245.928896,162.101206 244.004336,164.316063 243.187856,166.064635 C242.488016,167.521778 242.138096,169.212063 242.138096,171.135492 L242.138096,172.476063 L246.803696,172.476063 L246.803696,171.135492 C246.803696,169.561778 247.153616,168.162921 247.911776,166.880635 C248.494976,165.831492 249.369776,164.782349 250.652816,163.674921 C253.218896,161.401778 254.793536,159.886349 255.376736,159.186921 C256.834736,157.263492 257.592896,154.990349 257.592896,152.367492 C257.592896,148.870349 256.484816,146.130921 254.326976,144.149206 C252.052496,142.050921 249.078176,141.060063 245.345696,141.060063 Z M244.470896,176.556063 C243.479456,176.556063 242.662976,176.847492 241.963136,177.546921 C241.263296,178.188063 240.971696,179.004063 240.971696,179.994921 C240.971696,180.985778 241.263296,181.801778 241.963136,182.501206 C242.662976,183.142349 243.479456,183.492063 244.470896,183.492063 C245.462336,183.492063 246.278816,183.142349 246.978656,182.501206 C247.678496,181.860063 248.028416,181.044063 248.028416,179.994921 C248.028416,179.004063 247.678496,178.188063 247.036976,177.546921 C246.337136,176.847492 245.462336,176.556063 244.470896,176.556063 Z" id="?" fill="#FFFFFF"></path>
<path d="M223.261662,133.139924 C229.077338,129.782947 239.631808,125.828273 236.274126,120.013819 C232.916444,114.199364 220.565868,115.043746 214.750193,118.400722 C208.934517,121.757699 202.729834,131.623951 206.087516,137.438405 C209.445198,143.252859 217.445986,136.4969 223.261662,133.139924" id="Oval-8-Copy-2" fill="#FAFAFA"></path>
<path d="M249.679003,119.820589 C252.365149,119.820589 254.5427,117.643495 254.5427,114.957913 C254.5427,112.272332 252.365149,110.095238 249.679003,110.095238 C246.992857,110.095238 244.815306,112.272332 244.815306,114.957913 C244.815306,117.643495 246.992857,119.820589 249.679003,119.820589 Z" id="Oval-10-Copy" fill="#FAFAFA"></path>
<path d="M421.5,321.5 L423,323" id="Line-2" stroke="#979797" stroke-linecap="square"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="422px" height="193px" viewBox="0 0 422 193" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 4</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="500" transform="translate(-477.000000, -299.000000)">
<g id="Group-4" transform="translate(479.000000, 290.000000)">
<polygon id="Fill-1" fill-opacity="0.25" fill="#A3B1BF" opacity="0.900000036" transform="translate(271.351592, 80.180646) rotate(90.000000) translate(-271.351592, -80.180646) " points="214.065678 134.970601 328.637506 134.970601 328.637506 25.3906904 214.065678 25.3906904"></polygon>
<polygon id="Stroke-2" stroke="#A3B1BF" stroke-width="1.62" transform="translate(271.351592, 80.180646) rotate(90.000000) translate(-271.351592, -80.180646) " points="214.065678 134.970601 328.637506 134.970601 328.637506 25.3906904 214.065678 25.3906904"></polygon>
<path d="M276.053859,94.8252648 C271.491929,94.8252648 267.759441,91.0782313 267.759441,86.4985238 L267.759441,73.9594928 C267.759441,69.3797853 271.491929,65.6327519 276.053859,65.6327519 L393.542211,65.6327519 C398.104141,65.6327519 401.836629,69.3797853 401.836629,73.9594928 L401.836629,86.4985238 C401.836629,91.0782313 398.104141,94.8252648 393.542211,94.8252648 L276.053859,94.8252648 Z" id="Fill-3" fill="#F0F2F5" transform="translate(334.798035, 80.229008) rotate(90.000000) translate(-334.798035, -80.229008) "></path>
<path d="M276.053859,94.8252648 C271.491929,94.8252648 267.759441,91.0782313 267.759441,86.4985238 L267.759441,73.9594928 C267.759441,69.3797853 271.491929,65.6327519 276.053859,65.6327519 L393.542211,65.6327519 C398.104141,65.6327519 401.836629,69.3797853 401.836629,73.9594928 L401.836629,86.4985238 C401.836629,91.0782313 398.104141,94.8252648 393.542211,94.8252648 L276.053859,94.8252648 L276.053859,94.8252648 Z" id="Stroke-5" stroke="#A3B1BF" stroke-width="1.62" transform="translate(334.798035, 80.229008) rotate(90.000000) translate(-334.798035, -80.229008) "></path>
<path d="M373.091719,31.232323 C373.091719,32.058752 372.424019,32.7290547 371.600798,32.7290547 C370.77654,32.7290547 370.108839,32.058752 370.108839,31.232323 C370.108839,30.405894 370.77654,29.7355913 371.600798,29.7355913 C372.424019,29.7355913 373.091719,30.405894 373.091719,31.232323 L356.360842,4.74110287 L349.082491,-8.6444393" id="Fill-7" transform="translate(361.087105, 12.042308) rotate(90.000000) translate(-361.087105, -12.042308) "></path>
<path d="M343.448596,22.5884924 C343.448596,23.4149215 342.780895,24.0852241 341.957674,24.0852241 C341.133416,24.0852241 340.465716,23.4149215 340.465716,22.5884924 C340.465716,21.7620634 341.133416,21.0917607 341.957674,21.0917607 C342.780895,21.0917607 343.448596,21.7620634 343.448596,22.5884924 L343.448596,22.5884924 Z" id="Stroke-9" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 22.588492) rotate(90.000000) translate(-341.957156, -22.588492) "></path>
<path d="M343.448596,31.5121872 C343.448596,32.3386162 342.780895,33.0089189 341.957674,33.0089189 C341.133416,33.0089189 340.465716,32.3386162 340.465716,31.5121872 C340.465716,30.6857582 341.133416,30.0154555 341.957674,30.0154555 C342.780895,30.0154555 343.448596,30.6857582 343.448596,31.5121872" id="Fill-11" fill="#FFFFFF" transform="translate(341.957156, 31.512187) rotate(90.000000) translate(-341.957156, -31.512187) "></path>
<path d="M343.448596,31.5121872 C343.448596,32.3386162 342.780895,33.0089189 341.957674,33.0089189 C341.133416,33.0089189 340.465716,32.3386162 340.465716,31.5121872 C340.465716,30.6857582 341.133416,30.0154555 341.957674,30.0154555 C342.780895,30.0154555 343.448596,30.6857582 343.448596,31.5121872 L343.448596,31.5121872 Z" id="Stroke-13" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 31.512187) rotate(90.000000) translate(-341.957156, -31.512187) "></path>
<path d="M343.448596,40.435882 C343.448596,41.262311 342.780895,41.9326137 341.957674,41.9326137 C341.133416,41.9326137 340.465716,41.262311 340.465716,40.435882 C340.465716,39.609453 341.133416,38.9391503 341.957674,38.9391503 C342.780895,38.9391503 343.448596,39.609453 343.448596,40.435882" id="Fill-15" fill="#FFFFFF" transform="translate(341.957156, 40.435882) rotate(90.000000) translate(-341.957156, -40.435882) "></path>
<path d="M343.448596,40.435882 C343.448596,41.262311 342.780895,41.9326137 341.957674,41.9326137 C341.133416,41.9326137 340.465716,41.262311 340.465716,40.435882 C340.465716,39.609453 341.133416,38.9391503 341.957674,38.9391503 C342.780895,38.9391503 343.448596,39.609453 343.448596,40.435882 L343.448596,40.435882 Z" id="Stroke-17" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 40.435882) rotate(90.000000) translate(-341.957156, -40.435882) "></path>
<path d="M343.448596,49.3595768 C343.448596,50.1860058 342.780895,50.8563085 341.957674,50.8563085 C341.133416,50.8563085 340.465716,50.1860058 340.465716,49.3595768 C340.465716,48.5331477 341.133416,47.8628451 341.957674,47.8628451 C342.780895,47.8628451 343.448596,48.5331477 343.448596,49.3595768" id="Fill-19" fill="#FFFFFF" transform="translate(341.957156, 49.359577) rotate(90.000000) translate(-341.957156, -49.359577) "></path>
<path d="M343.448596,49.3595768 C343.448596,50.1860058 342.780895,50.8563085 341.957674,50.8563085 C341.133416,50.8563085 340.465716,50.1860058 340.465716,49.3595768 C340.465716,48.5331477 341.133416,47.8628451 341.957674,47.8628451 C342.780895,47.8628451 343.448596,48.5331477 343.448596,49.3595768 L343.448596,49.3595768 Z" id="Stroke-21" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 49.359577) rotate(90.000000) translate(-341.957156, -49.359577) "></path>
<path d="M343.448596,58.2832715 C343.448596,59.1097006 342.780895,59.7800032 341.957674,59.7800032 C341.133416,59.7800032 340.465716,59.1097006 340.465716,58.2832715 C340.465716,57.4568425 341.133416,56.7865399 341.957674,56.7865399 C342.780895,56.7865399 343.448596,57.4568425 343.448596,58.2832715" id="Fill-23" fill="#FFFFFF" transform="translate(341.957156, 58.283272) rotate(90.000000) translate(-341.957156, -58.283272) "></path>
<path d="M343.448596,58.2832715 C343.448596,59.1097006 342.780895,59.7800032 341.957674,59.7800032 C341.133416,59.7800032 340.465716,59.1097006 340.465716,58.2832715 C340.465716,57.4568425 341.133416,56.7865399 341.957674,56.7865399 C342.780895,56.7865399 343.448596,57.4568425 343.448596,58.2832715 L343.448596,58.2832715 Z" id="Stroke-25" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 58.283272) rotate(90.000000) translate(-341.957156, -58.283272) "></path>
<path d="M343.448596,67.2069663 C343.448596,68.0333954 342.780895,68.703698 341.957674,68.703698 C341.133416,68.703698 340.465716,68.0333954 340.465716,67.2069663 C340.465716,66.3805373 341.133416,65.7102346 341.957674,65.7102346 C342.780895,65.7102346 343.448596,66.3805373 343.448596,67.2069663" id="Fill-27" fill="#FFFFFF" transform="translate(341.957156, 67.206966) rotate(90.000000) translate(-341.957156, -67.206966) "></path>
<path d="M343.448596,67.2069663 C343.448596,68.0333954 342.780895,68.703698 341.957674,68.703698 C341.133416,68.703698 340.465716,68.0333954 340.465716,67.2069663 C340.465716,66.3805373 341.133416,65.7102346 341.957674,65.7102346 C342.780895,65.7102346 343.448596,66.3805373 343.448596,67.2069663 L343.448596,67.2069663 Z" id="Stroke-29" stroke="#A3B1BF" stroke-width="0.81" transform="translate(341.957156, 67.206966) rotate(90.000000) translate(-341.957156, -67.206966) "></path>
<path d="M327.400971,24.0852241 C326.576713,24.0852241 325.909013,23.4149215 325.909013,22.5884924 C325.909013,21.7620634 326.576713,21.0917607 327.400971,21.0917607 C328.224192,21.0917607 328.891893,21.7620634 328.891893,22.5884924 C328.891893,23.4149215 328.224192,24.0852241 327.400971,24.0852241 Z" id="Fill-31" fill="#FFFFFF" transform="translate(327.400453, 22.588492) rotate(90.000000) translate(-327.400453, -22.588492) "></path>
<path d="M328.891893,22.5884924 C328.891893,23.4149215 328.224192,24.0852241 327.400971,24.0852241 C326.576713,24.0852241 325.909013,23.4149215 325.909013,22.5884924 C325.909013,21.7620634 326.576713,21.0917607 327.400971,21.0917607 C328.224192,21.0917607 328.891893,21.7620634 328.891893,22.5884924 L328.891893,22.5884924 Z" id="Stroke-33" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 22.588492) rotate(90.000000) translate(-327.400453, -22.588492) "></path>
<path d="M328.891893,31.5121872 C328.891893,32.3386162 328.224192,33.0089189 327.400971,33.0089189 C326.576713,33.0089189 325.909013,32.3386162 325.909013,31.5121872 C325.909013,30.6857582 326.576713,30.0154555 327.400971,30.0154555 C328.224192,30.0154555 328.891893,30.6857582 328.891893,31.5121872" id="Fill-35" fill="#FFFFFF" transform="translate(327.400453, 31.512187) rotate(90.000000) translate(-327.400453, -31.512187) "></path>
<path d="M328.891893,31.5121872 C328.891893,32.3386162 328.224192,33.0089189 327.400971,33.0089189 C326.576713,33.0089189 325.909013,32.3386162 325.909013,31.5121872 C325.909013,30.6857582 326.576713,30.0154555 327.400971,30.0154555 C328.224192,30.0154555 328.891893,30.6857582 328.891893,31.5121872 L328.891893,31.5121872 Z" id="Stroke-37" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 31.512187) rotate(90.000000) translate(-327.400453, -31.512187) "></path>
<path d="M328.891893,40.435882 C328.891893,41.262311 328.224192,41.9326137 327.400971,41.9326137 C326.576713,41.9326137 325.909013,41.262311 325.909013,40.435882 C325.909013,39.609453 326.576713,38.9391503 327.400971,38.9391503 C328.224192,38.9391503 328.891893,39.609453 328.891893,40.435882" id="Fill-39" fill="#FFFFFF" transform="translate(327.400453, 40.435882) rotate(90.000000) translate(-327.400453, -40.435882) "></path>
<path d="M328.891893,40.435882 C328.891893,41.262311 328.224192,41.9326137 327.400971,41.9326137 C326.576713,41.9326137 325.909013,41.262311 325.909013,40.435882 C325.909013,39.609453 326.576713,38.9391503 327.400971,38.9391503 C328.224192,38.9391503 328.891893,39.609453 328.891893,40.435882 L328.891893,40.435882 Z" id="Stroke-41" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 40.435882) rotate(90.000000) translate(-327.400453, -40.435882) "></path>
<path d="M328.891893,49.3595768 C328.891893,50.1860058 328.224192,50.8563085 327.400971,50.8563085 C326.576713,50.8563085 325.909013,50.1860058 325.909013,49.3595768 C325.909013,48.5331477 326.576713,47.8628451 327.400971,47.8628451 C328.224192,47.8628451 328.891893,48.5331477 328.891893,49.3595768" id="Fill-43" fill="#FFFFFF" transform="translate(327.400453, 49.359577) rotate(90.000000) translate(-327.400453, -49.359577) "></path>
<path d="M328.891893,49.3595768 C328.891893,50.1860058 328.224192,50.8563085 327.400971,50.8563085 C326.576713,50.8563085 325.909013,50.1860058 325.909013,49.3595768 C325.909013,48.5331477 326.576713,47.8628451 327.400971,47.8628451 C328.224192,47.8628451 328.891893,48.5331477 328.891893,49.3595768 L328.891893,49.3595768 Z" id="Stroke-45" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 49.359577) rotate(90.000000) translate(-327.400453, -49.359577) "></path>
<path d="M328.891893,58.2832715 C328.891893,59.1097006 328.224192,59.7800032 327.400971,59.7800032 C326.576713,59.7800032 325.909013,59.1097006 325.909013,58.2832715 C325.909013,57.4568425 326.576713,56.7865399 327.400971,56.7865399 C328.224192,56.7865399 328.891893,57.4568425 328.891893,58.2832715" id="Fill-47" fill="#FFFFFF" transform="translate(327.400453, 58.283272) rotate(90.000000) translate(-327.400453, -58.283272) "></path>
<path d="M328.891893,58.2832715 C328.891893,59.1097006 328.224192,59.7800032 327.400971,59.7800032 C326.576713,59.7800032 325.909013,59.1097006 325.909013,58.2832715 C325.909013,57.4568425 326.576713,56.7865399 327.400971,56.7865399 C328.224192,56.7865399 328.891893,57.4568425 328.891893,58.2832715 L328.891893,58.2832715 Z" id="Stroke-49" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 58.283272) rotate(90.000000) translate(-327.400453, -58.283272) "></path>
<path d="M328.891893,67.2069663 C328.891893,68.0333954 328.224192,68.703698 327.400971,68.703698 C326.576713,68.703698 325.909013,68.0333954 325.909013,67.2069663 C325.909013,66.3805373 326.576713,65.7102346 327.400971,65.7102346 C328.224192,65.7102346 328.891893,66.3805373 328.891893,67.2069663" id="Fill-51" fill="#FFFFFF" transform="translate(327.400453, 67.206966) rotate(90.000000) translate(-327.400453, -67.206966) "></path>
<path d="M328.891893,67.2069663 C328.891893,68.0333954 328.224192,68.703698 327.400971,68.703698 C326.576713,68.703698 325.909013,68.0333954 325.909013,67.2069663 C325.909013,66.3805373 326.576713,65.7102346 327.400971,65.7102346 C328.224192,65.7102346 328.891893,66.3805373 328.891893,67.2069663 L328.891893,67.2069663 Z" id="Stroke-53" stroke="#A3B1BF" stroke-width="0.81" transform="translate(327.400453, 67.206966) rotate(90.000000) translate(-327.400453, -67.206966) "></path>
<path d="M334.679323,28.141449 C333.855065,28.141449 333.187364,27.4711464 333.187364,26.6447173 C333.187364,25.8182883 333.855065,25.1479856 334.679323,25.1479856 C335.502544,25.1479856 336.170244,25.8182883 336.170244,26.6447173 C336.170244,27.4711464 335.502544,28.141449 334.679323,28.141449 Z" id="Fill-55" fill="#FFFFFF" transform="translate(334.678804, 26.644717) rotate(90.000000) translate(-334.678804, -26.644717) "></path>
<path d="M336.170244,26.6447173 C336.170244,27.4711464 335.502544,28.141449 334.679323,28.141449 C333.855065,28.141449 333.187364,27.4711464 333.187364,26.6447173 C333.187364,25.8182883 333.855065,25.1479856 334.679323,25.1479856 C335.502544,25.1479856 336.170244,25.8182883 336.170244,26.6447173 L336.170244,26.6447173 Z" id="Stroke-57" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 26.644717) rotate(90.000000) translate(-334.678804, -26.644717) "></path>
<path d="M336.170244,35.5684121 C336.170244,36.3948411 335.502544,37.0651438 334.679323,37.0651438 C333.855065,37.0651438 333.187364,36.3948411 333.187364,35.5684121 C333.187364,34.7419831 333.855065,34.0716804 334.679323,34.0716804 C335.502544,34.0716804 336.170244,34.7419831 336.170244,35.5684121" id="Fill-59" fill="#FFFFFF" transform="translate(334.678804, 35.568412) rotate(90.000000) translate(-334.678804, -35.568412) "></path>
<path d="M336.170244,35.5684121 C336.170244,36.3948411 335.502544,37.0651438 334.679323,37.0651438 C333.855065,37.0651438 333.187364,36.3948411 333.187364,35.5684121 C333.187364,34.7419831 333.855065,34.0716804 334.679323,34.0716804 C335.502544,34.0716804 336.170244,34.7419831 336.170244,35.5684121 L336.170244,35.5684121 Z" id="Stroke-61" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 35.568412) rotate(90.000000) translate(-334.678804, -35.568412) "></path>
<path d="M336.170244,44.4921069 C336.170244,45.3185359 335.502544,45.9888386 334.679323,45.9888386 C333.855065,45.9888386 333.187364,45.3185359 333.187364,44.4921069 C333.187364,43.6656779 333.855065,42.9953752 334.679323,42.9953752 C335.502544,42.9953752 336.170244,43.6656779 336.170244,44.4921069" id="Fill-63" fill="#FFFFFF" transform="translate(334.678804, 44.492107) rotate(90.000000) translate(-334.678804, -44.492107) "></path>
<path d="M336.170244,44.4921069 C336.170244,45.3185359 335.502544,45.9888386 334.679323,45.9888386 C333.855065,45.9888386 333.187364,45.3185359 333.187364,44.4921069 C333.187364,43.6656779 333.855065,42.9953752 334.679323,42.9953752 C335.502544,42.9953752 336.170244,43.6656779 336.170244,44.4921069 L336.170244,44.4921069 Z" id="Stroke-65" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 44.492107) rotate(90.000000) translate(-334.678804, -44.492107) "></path>
<path d="M336.170244,53.4158017 C336.170244,54.2422307 335.502544,54.9125333 334.679323,54.9125333 C333.855065,54.9125333 333.187364,54.2422307 333.187364,53.4158017 C333.187364,52.5893726 333.855065,51.91907 334.679323,51.91907 C335.502544,51.91907 336.170244,52.5893726 336.170244,53.4158017" id="Fill-67" fill="#FFFFFF" transform="translate(334.678804, 53.415802) rotate(90.000000) translate(-334.678804, -53.415802) "></path>
<path d="M336.170244,53.4158017 C336.170244,54.2422307 335.502544,54.9125333 334.679323,54.9125333 C333.855065,54.9125333 333.187364,54.2422307 333.187364,53.4158017 C333.187364,52.5893726 333.855065,51.91907 334.679323,51.91907 C335.502544,51.91907 336.170244,52.5893726 336.170244,53.4158017 L336.170244,53.4158017 Z" id="Stroke-69" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 53.415802) rotate(90.000000) translate(-334.678804, -53.415802) "></path>
<path d="M336.170244,62.3394964 C336.170244,63.1659255 335.502544,63.8362281 334.679323,63.8362281 C333.855065,63.8362281 333.187364,63.1659255 333.187364,62.3394964 C333.187364,61.5130674 333.855065,60.8427648 334.679323,60.8427648 C335.502544,60.8427648 336.170244,61.5130674 336.170244,62.3394964" id="Fill-71" fill="#FFFFFF" transform="translate(334.678804, 62.339496) rotate(90.000000) translate(-334.678804, -62.339496) "></path>
<path d="M336.170244,62.3394964 C336.170244,63.1659255 335.502544,63.8362281 334.679323,63.8362281 C333.855065,63.8362281 333.187364,63.1659255 333.187364,62.3394964 C333.187364,61.5130674 333.855065,60.8427648 334.679323,60.8427648 C335.502544,60.8427648 336.170244,61.5130674 336.170244,62.3394964 L336.170244,62.3394964 Z" id="Stroke-73" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 62.339496) rotate(90.000000) translate(-334.678804, -62.339496) "></path>
<path d="M336.170244,71.2631912 C336.170244,72.0896203 335.502544,72.7599229 334.679323,72.7599229 C333.855065,72.7599229 333.187364,72.0896203 333.187364,71.2631912 C333.187364,70.4367622 333.855065,69.7664595 334.679323,69.7664595 C335.502544,69.7664595 336.170244,70.4367622 336.170244,71.2631912" id="Fill-75" fill="#FFFFFF" transform="translate(334.678804, 71.263191) rotate(90.000000) translate(-334.678804, -71.263191) "></path>
<path d="M336.170244,71.2631912 C336.170244,72.0896203 335.502544,72.7599229 334.679323,72.7599229 C333.855065,72.7599229 333.187364,72.0896203 333.187364,71.2631912 C333.187364,70.4367622 333.855065,69.7664595 334.679323,69.7664595 C335.502544,69.7664595 336.170244,70.4367622 336.170244,71.2631912 L336.170244,71.2631912 Z" id="Stroke-77" stroke="#A3B1BF" stroke-width="0.81" transform="translate(334.678804, 71.263191) rotate(90.000000) translate(-334.678804, -71.263191) "></path>
<path d="M335.089444,136.046978 C332.700651,136.046978 330.763905,134.102684 330.763905,131.704582 C330.763905,129.306481 332.700651,127.362187 335.089444,127.362187 C337.478236,127.362187 339.414983,129.306481 339.414983,131.704582 C339.414983,134.102684 337.478236,136.046978 335.089444,136.046978 Z" id="Fill-79" fill="#A3B1BF" transform="translate(335.089444, 131.704582) rotate(90.000000) translate(-335.089444, -131.704582) "></path>
<path d="M307.865544,121.56038 C307.865544,122.386809 307.197843,123.057112 306.374622,123.057112 C305.550365,123.057112 304.882664,122.386809 304.882664,121.56038 C304.882664,120.733951 305.550365,120.063648 306.374622,120.063648 C307.197843,120.063648 307.865544,120.733951 307.865544,121.56038" id="Fill-81" fill="#F5F5F5" transform="translate(306.374104, 121.560380) rotate(90.000000) translate(-306.374104, -121.560380) "></path>
<path d="M307.865544,121.56038 C307.865544,122.386809 307.197843,123.057112 306.374622,123.057112 C305.550365,123.057112 304.882664,122.386809 304.882664,121.56038 C304.882664,120.733951 305.550365,120.063648 306.374622,120.063648 C307.197843,120.063648 307.865544,120.733951 307.865544,121.56038 L307.865544,121.56038 Z" id="Stroke-83" stroke="#A3B1BF" stroke-width="0.81" transform="translate(306.374104, 121.560380) rotate(90.000000) translate(-306.374104, -121.560380) "></path>
<path d="M294.117547,121.56038 C294.117547,122.386809 293.449846,123.057112 292.626625,123.057112 C291.802367,123.057112 291.134667,122.386809 291.134667,121.56038 C291.134667,120.733951 291.802367,120.063648 292.626625,120.063648 C293.449846,120.063648 294.117547,120.733951 294.117547,121.56038" id="Fill-85" fill="#F5F5F5" transform="translate(292.626107, 121.560380) rotate(90.000000) translate(-292.626107, -121.560380) "></path>
<path d="M294.117547,121.56038 C294.117547,122.386809 293.449846,123.057112 292.626625,123.057112 C291.802367,123.057112 291.134667,122.386809 291.134667,121.56038 C291.134667,120.733951 291.802367,120.063648 292.626625,120.063648 C293.449846,120.063648 294.117547,120.733951 294.117547,121.56038 L294.117547,121.56038 Z" id="Stroke-87" stroke="#A3B1BF" stroke-width="0.81" transform="translate(292.626107, 121.560380) rotate(90.000000) translate(-292.626107, -121.560380) "></path>
<path d="M307.865544,38.813392 C307.865544,39.6398211 307.197843,40.3101237 306.374622,40.3101237 C305.550365,40.3101237 304.882664,39.6398211 304.882664,38.813392 C304.882664,37.986963 305.550365,37.3166603 306.374622,37.3166603 C307.197843,37.3166603 307.865544,37.986963 307.865544,38.813392" id="Fill-89" fill="#F5F5F5" transform="translate(306.374104, 38.813392) rotate(90.000000) translate(-306.374104, -38.813392) "></path>
<path d="M307.865544,38.813392 C307.865544,39.6398211 307.197843,40.3101237 306.374622,40.3101237 C305.550365,40.3101237 304.882664,39.6398211 304.882664,38.813392 C304.882664,37.986963 305.550365,37.3166603 306.374622,37.3166603 C307.197843,37.3166603 307.865544,37.986963 307.865544,38.813392 L307.865544,38.813392 Z" id="Stroke-91" stroke="#A3B1BF" stroke-width="0.81" transform="translate(306.374104, 38.813392) rotate(90.000000) translate(-306.374104, -38.813392) "></path>
<path d="M294.117547,38.813392 C294.117547,39.6398211 293.449846,40.3101237 292.626625,40.3101237 C291.802367,40.3101237 291.134667,39.6398211 291.134667,38.813392 C291.134667,37.986963 291.802367,37.3166603 292.626625,37.3166603 C293.449846,37.3166603 294.117547,37.986963 294.117547,38.813392" id="Fill-93" fill="#F5F5F5" transform="translate(292.626107, 38.813392) rotate(90.000000) translate(-292.626107, -38.813392) "></path>
<path d="M294.117547,38.813392 C294.117547,39.6398211 293.449846,40.3101237 292.626625,40.3101237 C291.802367,40.3101237 291.134667,39.6398211 291.134667,38.813392 C291.134667,37.986963 291.802367,37.3166603 292.626625,37.3166603 C293.449846,37.3166603 294.117547,37.986963 294.117547,38.813392 L294.117547,38.813392 Z" id="Stroke-95" stroke="#A3B1BF" stroke-width="0.81" transform="translate(292.626107, 38.813392) rotate(90.000000) translate(-292.626107, -38.813392) "></path>
<path d="M205.696461,94.8252648 C201.134531,94.8252648 197.402043,91.0782313 197.402043,86.4985238 L197.402043,73.9594928 C197.402043,69.3797853 201.134531,65.6327519 205.696461,65.6327519 L323.184813,65.6327519 C327.746743,65.6327519 331.479231,69.3797853 331.479231,73.9594928 L331.479231,86.4985238 C331.479231,91.0782313 327.746743,94.8252648 323.184813,94.8252648 L205.696461,94.8252648 Z" id="Fill-97" fill="#F0F2F5" transform="translate(264.440637, 80.229008) rotate(90.000000) translate(-264.440637, -80.229008) "></path>
<path d="M205.696461,94.8252648 C201.134531,94.8252648 197.402043,91.0782313 197.402043,86.4985238 L197.402043,73.9594928 C197.402043,69.3797853 201.134531,65.6327519 205.696461,65.6327519 L323.184813,65.6327519 C327.746743,65.6327519 331.479231,69.3797853 331.479231,73.9594928 L331.479231,86.4985238 C331.479231,91.0782313 327.746743,94.8252648 323.184813,94.8252648 L205.696461,94.8252648 L205.696461,94.8252648 Z" id="Stroke-99" stroke="#A3B1BF" stroke-width="1.62" transform="translate(264.440637, 80.229008) rotate(90.000000) translate(-264.440637, -80.229008) "></path>
<path d="M273.091198,22.5884924 C273.091198,23.4149215 272.423497,24.0852241 271.600276,24.0852241 C270.776019,24.0852241 270.108318,23.4149215 270.108318,22.5884924 C270.108318,21.7620634 270.776019,21.0917607 271.600276,21.0917607 C272.423497,21.0917607 273.091198,21.7620634 273.091198,22.5884924" id="Fill-101" fill="#FFFFFF" transform="translate(271.599758, 22.588492) rotate(90.000000) translate(-271.599758, -22.588492) "></path>
<path d="M273.091198,22.5884924 C273.091198,23.4149215 272.423497,24.0852241 271.600276,24.0852241 C270.776019,24.0852241 270.108318,23.4149215 270.108318,22.5884924 C270.108318,21.7620634 270.776019,21.0917607 271.600276,21.0917607 C272.423497,21.0917607 273.091198,21.7620634 273.091198,22.5884924 L273.091198,22.5884924 Z" id="Stroke-103" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 22.588492) rotate(90.000000) translate(-271.599758, -22.588492) "></path>
<path d="M273.091198,31.5121872 C273.091198,32.3386162 272.423497,33.0089189 271.600276,33.0089189 C270.776019,33.0089189 270.108318,32.3386162 270.108318,31.5121872 C270.108318,30.6857582 270.776019,30.0154555 271.600276,30.0154555 C272.423497,30.0154555 273.091198,30.6857582 273.091198,31.5121872" id="Fill-105" fill="#FFFFFF" transform="translate(271.599758, 31.512187) rotate(90.000000) translate(-271.599758, -31.512187) "></path>
<path d="M273.091198,31.5121872 C273.091198,32.3386162 272.423497,33.0089189 271.600276,33.0089189 C270.776019,33.0089189 270.108318,32.3386162 270.108318,31.5121872 C270.108318,30.6857582 270.776019,30.0154555 271.600276,30.0154555 C272.423497,30.0154555 273.091198,30.6857582 273.091198,31.5121872 L273.091198,31.5121872 Z" id="Stroke-107" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 31.512187) rotate(90.000000) translate(-271.599758, -31.512187) "></path>
<path d="M273.091198,40.435882 C273.091198,41.262311 272.423497,41.9326137 271.600276,41.9326137 C270.776019,41.9326137 270.108318,41.262311 270.108318,40.435882 C270.108318,39.609453 270.776019,38.9391503 271.600276,38.9391503 C272.423497,38.9391503 273.091198,39.609453 273.091198,40.435882" id="Fill-109" fill="#FFFFFF" transform="translate(271.599758, 40.435882) rotate(90.000000) translate(-271.599758, -40.435882) "></path>
<path d="M273.091198,40.435882 C273.091198,41.262311 272.423497,41.9326137 271.600276,41.9326137 C270.776019,41.9326137 270.108318,41.262311 270.108318,40.435882 C270.108318,39.609453 270.776019,38.9391503 271.600276,38.9391503 C272.423497,38.9391503 273.091198,39.609453 273.091198,40.435882 L273.091198,40.435882 Z" id="Stroke-111" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 40.435882) rotate(90.000000) translate(-271.599758, -40.435882) "></path>
<path d="M273.091198,49.3595768 C273.091198,50.1860058 272.423497,50.8563085 271.600276,50.8563085 C270.776019,50.8563085 270.108318,50.1860058 270.108318,49.3595768 C270.108318,48.5331477 270.776019,47.8628451 271.600276,47.8628451 C272.423497,47.8628451 273.091198,48.5331477 273.091198,49.3595768" id="Fill-113" fill="#FFFFFF" transform="translate(271.599758, 49.359577) rotate(90.000000) translate(-271.599758, -49.359577) "></path>
<path d="M273.091198,49.3595768 C273.091198,50.1860058 272.423497,50.8563085 271.600276,50.8563085 C270.776019,50.8563085 270.108318,50.1860058 270.108318,49.3595768 C270.108318,48.5331477 270.776019,47.8628451 271.600276,47.8628451 C272.423497,47.8628451 273.091198,48.5331477 273.091198,49.3595768 L273.091198,49.3595768 Z" id="Stroke-115" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 49.359577) rotate(90.000000) translate(-271.599758, -49.359577) "></path>
<path d="M273.091198,58.2832715 C273.091198,59.1097006 272.423497,59.7800032 271.600276,59.7800032 C270.776019,59.7800032 270.108318,59.1097006 270.108318,58.2832715 C270.108318,57.4568425 270.776019,56.7865399 271.600276,56.7865399 C272.423497,56.7865399 273.091198,57.4568425 273.091198,58.2832715" id="Fill-117" fill="#FFFFFF" transform="translate(271.599758, 58.283272) rotate(90.000000) translate(-271.599758, -58.283272) "></path>
<path d="M273.091198,58.2832715 C273.091198,59.1097006 272.423497,59.7800032 271.600276,59.7800032 C270.776019,59.7800032 270.108318,59.1097006 270.108318,58.2832715 C270.108318,57.4568425 270.776019,56.7865399 271.600276,56.7865399 C272.423497,56.7865399 273.091198,57.4568425 273.091198,58.2832715 L273.091198,58.2832715 Z" id="Stroke-119" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 58.283272) rotate(90.000000) translate(-271.599758, -58.283272) "></path>
<path d="M271.600276,68.703698 C270.776019,68.703698 270.108318,68.0333954 270.108318,67.2069663 C270.108318,66.3805373 270.776019,65.7102346 271.600276,65.7102346 C272.423497,65.7102346 273.091198,66.3805373 273.091198,67.2069663 C273.091198,68.0333954 272.423497,68.703698 271.600276,68.703698 Z" id="Fill-121" fill="#FFFFFF" transform="translate(271.599758, 67.206966) rotate(90.000000) translate(-271.599758, -67.206966) "></path>
<path d="M273.091198,67.2069663 C273.091198,68.0333954 272.423497,68.703698 271.600276,68.703698 C270.776019,68.703698 270.108318,68.0333954 270.108318,67.2069663 C270.108318,66.3805373 270.776019,65.7102346 271.600276,65.7102346 C272.423497,65.7102346 273.091198,66.3805373 273.091198,67.2069663 L273.091198,67.2069663 Z" id="Stroke-123" stroke="#A3B1BF" stroke-width="0.81" transform="translate(271.599758, 67.206966) rotate(90.000000) translate(-271.599758, -67.206966) "></path>
<path d="M258.534495,22.5884924 C258.534495,23.4149215 257.866794,24.0852241 257.043573,24.0852241 C256.219316,24.0852241 255.551615,23.4149215 255.551615,22.5884924 C255.551615,21.7620634 256.219316,21.0917607 257.043573,21.0917607 C257.866794,21.0917607 258.534495,21.7620634 258.534495,22.5884924" id="Fill-125" fill="#FFFFFF" transform="translate(257.043055, 22.588492) rotate(90.000000) translate(-257.043055, -22.588492) "></path>
<path d="M258.534495,22.5884924 C258.534495,23.4149215 257.866794,24.0852241 257.043573,24.0852241 C256.219316,24.0852241 255.551615,23.4149215 255.551615,22.5884924 C255.551615,21.7620634 256.219316,21.0917607 257.043573,21.0917607 C257.866794,21.0917607 258.534495,21.7620634 258.534495,22.5884924 L258.534495,22.5884924 Z" id="Stroke-127" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 22.588492) rotate(90.000000) translate(-257.043055, -22.588492) "></path>
<path d="M258.534495,31.5121872 C258.534495,32.3386162 257.866794,33.0089189 257.043573,33.0089189 C256.219316,33.0089189 255.551615,32.3386162 255.551615,31.5121872 C255.551615,30.6857582 256.219316,30.0154555 257.043573,30.0154555 C257.866794,30.0154555 258.534495,30.6857582 258.534495,31.5121872" id="Fill-129" fill="#FFFFFF" transform="translate(257.043055, 31.512187) rotate(90.000000) translate(-257.043055, -31.512187) "></path>
<path d="M258.534495,31.5121872 C258.534495,32.3386162 257.866794,33.0089189 257.043573,33.0089189 C256.219316,33.0089189 255.551615,32.3386162 255.551615,31.5121872 C255.551615,30.6857582 256.219316,30.0154555 257.043573,30.0154555 C257.866794,30.0154555 258.534495,30.6857582 258.534495,31.5121872 L258.534495,31.5121872 Z" id="Stroke-131" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 31.512187) rotate(90.000000) translate(-257.043055, -31.512187) "></path>
<path d="M258.534495,40.435882 C258.534495,41.262311 257.866794,41.9326137 257.043573,41.9326137 C256.219316,41.9326137 255.551615,41.262311 255.551615,40.435882 C255.551615,39.609453 256.219316,38.9391503 257.043573,38.9391503 C257.866794,38.9391503 258.534495,39.609453 258.534495,40.435882" id="Fill-133" fill="#FFFFFF" transform="translate(257.043055, 40.435882) rotate(90.000000) translate(-257.043055, -40.435882) "></path>
<path d="M258.534495,40.435882 C258.534495,41.262311 257.866794,41.9326137 257.043573,41.9326137 C256.219316,41.9326137 255.551615,41.262311 255.551615,40.435882 C255.551615,39.609453 256.219316,38.9391503 257.043573,38.9391503 C257.866794,38.9391503 258.534495,39.609453 258.534495,40.435882 L258.534495,40.435882 Z" id="Stroke-135" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 40.435882) rotate(90.000000) translate(-257.043055, -40.435882) "></path>
<path d="M258.534495,49.3595768 C258.534495,50.1860058 257.866794,50.8563085 257.043573,50.8563085 C256.219316,50.8563085 255.551615,50.1860058 255.551615,49.3595768 C255.551615,48.5331477 256.219316,47.8628451 257.043573,47.8628451 C257.866794,47.8628451 258.534495,48.5331477 258.534495,49.3595768" id="Fill-137" fill="#FFFFFF" transform="translate(257.043055, 49.359577) rotate(90.000000) translate(-257.043055, -49.359577) "></path>
<path d="M258.534495,49.3595768 C258.534495,50.1860058 257.866794,50.8563085 257.043573,50.8563085 C256.219316,50.8563085 255.551615,50.1860058 255.551615,49.3595768 C255.551615,48.5331477 256.219316,47.8628451 257.043573,47.8628451 C257.866794,47.8628451 258.534495,48.5331477 258.534495,49.3595768 L258.534495,49.3595768 Z" id="Stroke-139" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 49.359577) rotate(90.000000) translate(-257.043055, -49.359577) "></path>
<path d="M258.534495,58.2832715 C258.534495,59.1097006 257.866794,59.7800032 257.043573,59.7800032 C256.219316,59.7800032 255.551615,59.1097006 255.551615,58.2832715 C255.551615,57.4568425 256.219316,56.7865399 257.043573,56.7865399 C257.866794,56.7865399 258.534495,57.4568425 258.534495,58.2832715" id="Fill-141" fill="#FFFFFF" transform="translate(257.043055, 58.283272) rotate(90.000000) translate(-257.043055, -58.283272) "></path>
<path d="M258.534495,58.2832715 C258.534495,59.1097006 257.866794,59.7800032 257.043573,59.7800032 C256.219316,59.7800032 255.551615,59.1097006 255.551615,58.2832715 C255.551615,57.4568425 256.219316,56.7865399 257.043573,56.7865399 C257.866794,56.7865399 258.534495,57.4568425 258.534495,58.2832715 L258.534495,58.2832715 Z" id="Stroke-143" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 58.283272) rotate(90.000000) translate(-257.043055, -58.283272) "></path>
<path d="M258.534495,67.2069663 C258.534495,68.0333954 257.866794,68.703698 257.043573,68.703698 C256.219316,68.703698 255.551615,68.0333954 255.551615,67.2069663 C255.551615,66.3805373 256.219316,65.7102346 257.043573,65.7102346 C257.866794,65.7102346 258.534495,66.3805373 258.534495,67.2069663" id="Fill-145" fill="#FFFFFF" transform="translate(257.043055, 67.206966) rotate(90.000000) translate(-257.043055, -67.206966) "></path>
<path d="M258.534495,67.2069663 C258.534495,68.0333954 257.866794,68.703698 257.043573,68.703698 C256.219316,68.703698 255.551615,68.0333954 255.551615,67.2069663 C255.551615,66.3805373 256.219316,65.7102346 257.043573,65.7102346 C257.866794,65.7102346 258.534495,66.3805373 258.534495,67.2069663 L258.534495,67.2069663 Z" id="Stroke-147" stroke="#A3B1BF" stroke-width="0.81" transform="translate(257.043055, 67.206966) rotate(90.000000) translate(-257.043055, -67.206966) "></path>
<path d="M265.812846,26.6447173 C265.812846,27.4711464 265.145146,28.141449 264.321925,28.141449 C263.497667,28.141449 262.829967,27.4711464 262.829967,26.6447173 C262.829967,25.8182883 263.497667,25.1479856 264.321925,25.1479856 C265.145146,25.1479856 265.812846,25.8182883 265.812846,26.6447173" id="Fill-149" fill="#FFFFFF" transform="translate(264.321407, 26.644717) rotate(90.000000) translate(-264.321407, -26.644717) "></path>
<path d="M265.812846,26.6447173 C265.812846,27.4711464 265.145146,28.141449 264.321925,28.141449 C263.497667,28.141449 262.829967,27.4711464 262.829967,26.6447173 C262.829967,25.8182883 263.497667,25.1479856 264.321925,25.1479856 C265.145146,25.1479856 265.812846,25.8182883 265.812846,26.6447173 L265.812846,26.6447173 Z" id="Stroke-151" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 26.644717) rotate(90.000000) translate(-264.321407, -26.644717) "></path>
<path d="M265.812846,35.5684121 C265.812846,36.3948411 265.145146,37.0651438 264.321925,37.0651438 C263.497667,37.0651438 262.829967,36.3948411 262.829967,35.5684121 C262.829967,34.7419831 263.497667,34.0716804 264.321925,34.0716804 C265.145146,34.0716804 265.812846,34.7419831 265.812846,35.5684121" id="Fill-153" fill="#FFFFFF" transform="translate(264.321407, 35.568412) rotate(90.000000) translate(-264.321407, -35.568412) "></path>
<path d="M265.812846,35.5684121 C265.812846,36.3948411 265.145146,37.0651438 264.321925,37.0651438 C263.497667,37.0651438 262.829967,36.3948411 262.829967,35.5684121 C262.829967,34.7419831 263.497667,34.0716804 264.321925,34.0716804 C265.145146,34.0716804 265.812846,34.7419831 265.812846,35.5684121 L265.812846,35.5684121 Z" id="Stroke-155" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 35.568412) rotate(90.000000) translate(-264.321407, -35.568412) "></path>
<path d="M265.812846,44.4921069 C265.812846,45.3185359 265.145146,45.9888386 264.321925,45.9888386 C263.497667,45.9888386 262.829967,45.3185359 262.829967,44.4921069 C262.829967,43.6656779 263.497667,42.9953752 264.321925,42.9953752 C265.145146,42.9953752 265.812846,43.6656779 265.812846,44.4921069" id="Fill-157" fill="#FFFFFF" transform="translate(264.321407, 44.492107) rotate(90.000000) translate(-264.321407, -44.492107) "></path>
<path d="M265.812846,44.4921069 C265.812846,45.3185359 265.145146,45.9888386 264.321925,45.9888386 C263.497667,45.9888386 262.829967,45.3185359 262.829967,44.4921069 C262.829967,43.6656779 263.497667,42.9953752 264.321925,42.9953752 C265.145146,42.9953752 265.812846,43.6656779 265.812846,44.4921069 L265.812846,44.4921069 Z" id="Stroke-159" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 44.492107) rotate(90.000000) translate(-264.321407, -44.492107) "></path>
<path d="M265.812846,53.4158017 C265.812846,54.2422307 265.145146,54.9125333 264.321925,54.9125333 C263.497667,54.9125333 262.829967,54.2422307 262.829967,53.4158017 C262.829967,52.5893726 263.497667,51.91907 264.321925,51.91907 C265.145146,51.91907 265.812846,52.5893726 265.812846,53.4158017" id="Fill-161" fill="#FFFFFF" transform="translate(264.321407, 53.415802) rotate(90.000000) translate(-264.321407, -53.415802) "></path>
<path d="M265.812846,53.4158017 C265.812846,54.2422307 265.145146,54.9125333 264.321925,54.9125333 C263.497667,54.9125333 262.829967,54.2422307 262.829967,53.4158017 C262.829967,52.5893726 263.497667,51.91907 264.321925,51.91907 C265.145146,51.91907 265.812846,52.5893726 265.812846,53.4158017 L265.812846,53.4158017 Z" id="Stroke-163" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 53.415802) rotate(90.000000) translate(-264.321407, -53.415802) "></path>
<path d="M265.812846,62.3394964 C265.812846,63.1659255 265.145146,63.8362281 264.321925,63.8362281 C263.497667,63.8362281 262.829967,63.1659255 262.829967,62.3394964 C262.829967,61.5130674 263.497667,60.8427648 264.321925,60.8427648 C265.145146,60.8427648 265.812846,61.5130674 265.812846,62.3394964" id="Fill-165" fill="#FFFFFF" transform="translate(264.321407, 62.339496) rotate(90.000000) translate(-264.321407, -62.339496) "></path>
<path d="M265.812846,62.3394964 C265.812846,63.1659255 265.145146,63.8362281 264.321925,63.8362281 C263.497667,63.8362281 262.829967,63.1659255 262.829967,62.3394964 C262.829967,61.5130674 263.497667,60.8427648 264.321925,60.8427648 C265.145146,60.8427648 265.812846,61.5130674 265.812846,62.3394964 L265.812846,62.3394964 Z" id="Stroke-167" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 62.339496) rotate(90.000000) translate(-264.321407, -62.339496) "></path>
<path d="M265.812846,71.2631912 C265.812846,72.0896203 265.145146,72.7599229 264.321925,72.7599229 C263.497667,72.7599229 262.829967,72.0896203 262.829967,71.2631912 C262.829967,70.4367622 263.497667,69.7664595 264.321925,69.7664595 C265.145146,69.7664595 265.812846,70.4367622 265.812846,71.2631912" id="Fill-169" fill="#FFFFFF" transform="translate(264.321407, 71.263191) rotate(90.000000) translate(-264.321407, -71.263191) "></path>
<path d="M265.812846,71.2631912 C265.812846,72.0896203 265.145146,72.7599229 264.321925,72.7599229 C263.497667,72.7599229 262.829967,72.0896203 262.829967,71.2631912 C262.829967,70.4367622 263.497667,69.7664595 264.321925,69.7664595 C265.145146,69.7664595 265.812846,70.4367622 265.812846,71.2631912 L265.812846,71.2631912 Z" id="Stroke-171" stroke="#A3B1BF" stroke-width="0.81" transform="translate(264.321407, 71.263191) rotate(90.000000) translate(-264.321407, -71.263191) "></path>
<path d="M263.92334,136.046978 C261.534548,136.046978 259.597801,134.102684 259.597801,131.704582 C259.597801,129.306481 261.534548,127.362187 263.92334,127.362187 C266.312132,127.362187 268.248879,129.306481 268.248879,131.704582 C268.248879,134.102684 266.312132,136.046978 263.92334,136.046978 Z" id="Fill-173" fill="#A3B1BF" transform="translate(263.923340, 131.704582) rotate(90.000000) translate(-263.923340, -131.704582) "></path>
<path d="M170.113409,94.8252648 C165.551479,94.8252648 161.818991,91.0782313 161.818991,86.4985238 L161.818991,73.9594928 C161.818991,69.3797853 165.551479,65.6327519 170.113409,65.6327519 L287.601762,65.6327519 C292.163691,65.6327519 295.896179,69.3797853 295.896179,73.9594928 L295.896179,86.4985238 C295.896179,91.0782313 292.163691,94.8252648 287.601762,94.8252648 L170.113409,94.8252648 Z" id="Fill-175" fill="#F0F2F5" transform="translate(228.857585, 80.229008) rotate(90.000000) translate(-228.857585, -80.229008) "></path>
<path d="M170.113409,94.8252648 C165.551479,94.8252648 161.818991,91.0782313 161.818991,86.4985238 L161.818991,73.9594928 C161.818991,69.3797853 165.551479,65.6327519 170.113409,65.6327519 L287.601762,65.6327519 C292.163691,65.6327519 295.896179,69.3797853 295.896179,73.9594928 L295.896179,86.4985238 C295.896179,91.0782313 292.163691,94.8252648 287.601762,94.8252648 L170.113409,94.8252648 L170.113409,94.8252648 Z" id="Stroke-177" stroke="#A3B1BF" stroke-width="1.62" transform="translate(228.857585, 80.229008) rotate(90.000000) translate(-228.857585, -80.229008) "></path>
<path d="M237.508146,22.5884924 C237.508146,23.4149215 236.840446,24.0852241 236.017225,24.0852241 C235.192967,24.0852241 234.525266,23.4149215 234.525266,22.5884924 C234.525266,21.7620634 235.192967,21.0917607 236.017225,21.0917607 C236.840446,21.0917607 237.508146,21.7620634 237.508146,22.5884924" id="Fill-179" transform="translate(236.016706, 22.588492) rotate(90.000000) translate(-236.016706, -22.588492) "></path>
<path d="M237.508146,22.5884924 C237.508146,23.4149215 236.840446,24.0852241 236.017225,24.0852241 C235.192967,24.0852241 234.525266,23.4149215 234.525266,22.5884924 C234.525266,21.7620634 235.192967,21.0917607 236.017225,21.0917607 C236.840446,21.0917607 237.508146,21.7620634 237.508146,22.5884924 L237.508146,22.5884924 Z" id="Stroke-181" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 22.588492) rotate(90.000000) translate(-236.016706, -22.588492) "></path>
<path d="M237.508146,31.5121872 C237.508146,32.3386162 236.840446,33.0089189 236.017225,33.0089189 C235.192967,33.0089189 234.525266,32.3386162 234.525266,31.5121872 C234.525266,30.6857582 235.192967,30.0154555 236.017225,30.0154555 C236.840446,30.0154555 237.508146,30.6857582 237.508146,31.5121872" id="Fill-183" transform="translate(236.016706, 31.512187) rotate(90.000000) translate(-236.016706, -31.512187) "></path>
<path d="M237.508146,31.5121872 C237.508146,32.3386162 236.840446,33.0089189 236.017225,33.0089189 C235.192967,33.0089189 234.525266,32.3386162 234.525266,31.5121872 C234.525266,30.6857582 235.192967,30.0154555 236.017225,30.0154555 C236.840446,30.0154555 237.508146,30.6857582 237.508146,31.5121872 L237.508146,31.5121872 Z" id="Stroke-185" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 31.512187) rotate(90.000000) translate(-236.016706, -31.512187) "></path>
<path d="M237.508146,40.435882 C237.508146,41.262311 236.840446,41.9326137 236.017225,41.9326137 C235.192967,41.9326137 234.525266,41.262311 234.525266,40.435882 C234.525266,39.609453 235.192967,38.9391503 236.017225,38.9391503 C236.840446,38.9391503 237.508146,39.609453 237.508146,40.435882" id="Fill-187" transform="translate(236.016706, 40.435882) rotate(90.000000) translate(-236.016706, -40.435882) "></path>
<path d="M237.508146,40.435882 C237.508146,41.262311 236.840446,41.9326137 236.017225,41.9326137 C235.192967,41.9326137 234.525266,41.262311 234.525266,40.435882 C234.525266,39.609453 235.192967,38.9391503 236.017225,38.9391503 C236.840446,38.9391503 237.508146,39.609453 237.508146,40.435882 L237.508146,40.435882 Z" id="Stroke-189" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 40.435882) rotate(90.000000) translate(-236.016706, -40.435882) "></path>
<path d="M237.508146,49.3595768 C237.508146,50.1860058 236.840446,50.8563085 236.017225,50.8563085 C235.192967,50.8563085 234.525266,50.1860058 234.525266,49.3595768 C234.525266,48.5331477 235.192967,47.8628451 236.017225,47.8628451 C236.840446,47.8628451 237.508146,48.5331477 237.508146,49.3595768" id="Fill-191" transform="translate(236.016706, 49.359577) rotate(90.000000) translate(-236.016706, -49.359577) "></path>
<path d="M237.508146,49.3595768 C237.508146,50.1860058 236.840446,50.8563085 236.017225,50.8563085 C235.192967,50.8563085 234.525266,50.1860058 234.525266,49.3595768 C234.525266,48.5331477 235.192967,47.8628451 236.017225,47.8628451 C236.840446,47.8628451 237.508146,48.5331477 237.508146,49.3595768 L237.508146,49.3595768 Z" id="Stroke-193" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 49.359577) rotate(90.000000) translate(-236.016706, -49.359577) "></path>
<path d="M237.508146,58.2832715 C237.508146,59.1097006 236.840446,59.7800032 236.017225,59.7800032 C235.192967,59.7800032 234.525266,59.1097006 234.525266,58.2832715 C234.525266,57.4568425 235.192967,56.7865399 236.017225,56.7865399 C236.840446,56.7865399 237.508146,57.4568425 237.508146,58.2832715" id="Fill-195" transform="translate(236.016706, 58.283272) rotate(90.000000) translate(-236.016706, -58.283272) "></path>
<path d="M237.508146,58.2832715 C237.508146,59.1097006 236.840446,59.7800032 236.017225,59.7800032 C235.192967,59.7800032 234.525266,59.1097006 234.525266,58.2832715 C234.525266,57.4568425 235.192967,56.7865399 236.017225,56.7865399 C236.840446,56.7865399 237.508146,57.4568425 237.508146,58.2832715 L237.508146,58.2832715 Z" id="Stroke-197" stroke-opacity="0.85" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 58.283272) rotate(90.000000) translate(-236.016706, -58.283272) "></path>
<path d="M237.508146,67.2069663 C237.508146,68.0333954 236.840446,68.703698 236.017225,68.703698 C235.192967,68.703698 234.525266,68.0333954 234.525266,67.2069663 C234.525266,66.3805373 235.192967,65.7102346 236.017225,65.7102346 C236.840446,65.7102346 237.508146,66.3805373 237.508146,67.2069663" id="Fill-199" transform="translate(236.016706, 67.206966) rotate(90.000000) translate(-236.016706, -67.206966) "></path>
<path d="M237.508146,67.2069663 C237.508146,68.0333954 236.840446,68.703698 236.017225,68.703698 C235.192967,68.703698 234.525266,68.0333954 234.525266,67.2069663 C234.525266,66.3805373 235.192967,65.7102346 236.017225,65.7102346 C236.840446,65.7102346 237.508146,66.3805373 237.508146,67.2069663 L237.508146,67.2069663 Z" id="Stroke-201" stroke="#A3B1BF" stroke-width="0.81" transform="translate(236.016706, 67.206966) rotate(90.000000) translate(-236.016706, -67.206966) "></path>
<path d="M223.760149,22.5884924 C223.760149,23.4149215 223.092448,24.0852241 222.269227,24.0852241 C221.44497,24.0852241 220.777269,23.4149215 220.777269,22.5884924 C220.777269,21.7620634 221.44497,21.0917607 222.269227,21.0917607 C223.092448,21.0917607 223.760149,21.7620634 223.760149,22.5884924" id="Fill-203" transform="translate(222.268709, 22.588492) rotate(90.000000) translate(-222.268709, -22.588492) "></path>
<path d="M223.760149,22.5884924 C223.760149,23.4149215 223.092448,24.0852241 222.269227,24.0852241 C221.44497,24.0852241 220.777269,23.4149215 220.777269,22.5884924 C220.777269,21.7620634 221.44497,21.0917607 222.269227,21.0917607 C223.092448,21.0917607 223.760149,21.7620634 223.760149,22.5884924 L223.760149,22.5884924 Z" id="Stroke-205" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 22.588492) rotate(90.000000) translate(-222.268709, -22.588492) "></path>
<path d="M223.760149,31.5121872 C223.760149,32.3386162 223.092448,33.0089189 222.269227,33.0089189 C221.44497,33.0089189 220.777269,32.3386162 220.777269,31.5121872 C220.777269,30.6857582 221.44497,30.0154555 222.269227,30.0154555 C223.092448,30.0154555 223.760149,30.6857582 223.760149,31.5121872" id="Fill-207" transform="translate(222.268709, 31.512187) rotate(90.000000) translate(-222.268709, -31.512187) "></path>
<path d="M223.760149,31.5121872 C223.760149,32.3386162 223.092448,33.0089189 222.269227,33.0089189 C221.44497,33.0089189 220.777269,32.3386162 220.777269,31.5121872 C220.777269,30.6857582 221.44497,30.0154555 222.269227,30.0154555 C223.092448,30.0154555 223.760149,30.6857582 223.760149,31.5121872 L223.760149,31.5121872 Z" id="Stroke-209" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 31.512187) rotate(90.000000) translate(-222.268709, -31.512187) "></path>
<path d="M223.760149,40.435882 C223.760149,41.262311 223.092448,41.9326137 222.269227,41.9326137 C221.44497,41.9326137 220.777269,41.262311 220.777269,40.435882 C220.777269,39.609453 221.44497,38.9391503 222.269227,38.9391503 C223.092448,38.9391503 223.760149,39.609453 223.760149,40.435882" id="Fill-211" transform="translate(222.268709, 40.435882) rotate(90.000000) translate(-222.268709, -40.435882) "></path>
<path d="M223.760149,40.435882 C223.760149,41.262311 223.092448,41.9326137 222.269227,41.9326137 C221.44497,41.9326137 220.777269,41.262311 220.777269,40.435882 C220.777269,39.609453 221.44497,38.9391503 222.269227,38.9391503 C223.092448,38.9391503 223.760149,39.609453 223.760149,40.435882 L223.760149,40.435882 Z" id="Stroke-213" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 40.435882) rotate(90.000000) translate(-222.268709, -40.435882) "></path>
<path d="M223.760149,49.3595768 C223.760149,50.1860058 223.092448,50.8563085 222.269227,50.8563085 C221.44497,50.8563085 220.777269,50.1860058 220.777269,49.3595768 C220.777269,48.5331477 221.44497,47.8628451 222.269227,47.8628451 C223.092448,47.8628451 223.760149,48.5331477 223.760149,49.3595768" id="Fill-215" transform="translate(222.268709, 49.359577) rotate(90.000000) translate(-222.268709, -49.359577) "></path>
<path d="M223.760149,49.3595768 C223.760149,50.1860058 223.092448,50.8563085 222.269227,50.8563085 C221.44497,50.8563085 220.777269,50.1860058 220.777269,49.3595768 C220.777269,48.5331477 221.44497,47.8628451 222.269227,47.8628451 C223.092448,47.8628451 223.760149,48.5331477 223.760149,49.3595768 L223.760149,49.3595768 Z" id="Stroke-217" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 49.359577) rotate(90.000000) translate(-222.268709, -49.359577) "></path>
<path d="M223.760149,58.2832715 C223.760149,59.1097006 223.092448,59.7800032 222.269227,59.7800032 C221.44497,59.7800032 220.777269,59.1097006 220.777269,58.2832715 C220.777269,57.4568425 221.44497,56.7865399 222.269227,56.7865399 C223.092448,56.7865399 223.760149,57.4568425 223.760149,58.2832715" id="Fill-219" transform="translate(222.268709, 58.283272) rotate(90.000000) translate(-222.268709, -58.283272) "></path>
<path d="M223.760149,58.2832715 C223.760149,59.1097006 223.092448,59.7800032 222.269227,59.7800032 C221.44497,59.7800032 220.777269,59.1097006 220.777269,58.2832715 C220.777269,57.4568425 221.44497,56.7865399 222.269227,56.7865399 C223.092448,56.7865399 223.760149,57.4568425 223.760149,58.2832715 L223.760149,58.2832715 Z" id="Stroke-221" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 58.283272) rotate(90.000000) translate(-222.268709, -58.283272) "></path>
<path d="M223.760149,67.2069663 C223.760149,68.0333954 223.092448,68.703698 222.269227,68.703698 C221.44497,68.703698 220.777269,68.0333954 220.777269,67.2069663 C220.777269,66.3805373 221.44497,65.7102346 222.269227,65.7102346 C223.092448,65.7102346 223.760149,66.3805373 223.760149,67.2069663" id="Fill-223" transform="translate(222.268709, 67.206966) rotate(90.000000) translate(-222.268709, -67.206966) "></path>
<path d="M223.760149,67.2069663 C223.760149,68.0333954 223.092448,68.703698 222.269227,68.703698 C221.44497,68.703698 220.777269,68.0333954 220.777269,67.2069663 C220.777269,66.3805373 221.44497,65.7102346 222.269227,65.7102346 C223.092448,65.7102346 223.760149,66.3805373 223.760149,67.2069663 L223.760149,67.2069663 Z" id="Stroke-225" stroke="#A3B1BF" stroke-width="0.81" transform="translate(222.268709, 67.206966) rotate(90.000000) translate(-222.268709, -67.206966) "></path>
<path d="M230.229795,26.6447173 C230.229795,27.4711464 229.562094,28.141449 228.738873,28.141449 C227.914615,28.141449 227.246915,27.4711464 227.246915,26.6447173 C227.246915,25.8182883 227.914615,25.1479856 228.738873,25.1479856 C229.562094,25.1479856 230.229795,25.8182883 230.229795,26.6447173" id="Fill-227" transform="translate(228.738355, 26.644717) rotate(90.000000) translate(-228.738355, -26.644717) "></path>
<path d="M230.229795,26.6447173 C230.229795,27.4711464 229.562094,28.141449 228.738873,28.141449 C227.914615,28.141449 227.246915,27.4711464 227.246915,26.6447173 C227.246915,25.8182883 227.914615,25.1479856 228.738873,25.1479856 C229.562094,25.1479856 230.229795,25.8182883 230.229795,26.6447173 L230.229795,26.6447173 Z" id="Stroke-229" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 26.644717) rotate(90.000000) translate(-228.738355, -26.644717) "></path>
<path d="M230.229795,35.5684121 C230.229795,36.3948411 229.562094,37.0651438 228.738873,37.0651438 C227.914615,37.0651438 227.246915,36.3948411 227.246915,35.5684121 C227.246915,34.7419831 227.914615,34.0716804 228.738873,34.0716804 C229.562094,34.0716804 230.229795,34.7419831 230.229795,35.5684121" id="Fill-231" transform="translate(228.738355, 35.568412) rotate(90.000000) translate(-228.738355, -35.568412) "></path>
<path d="M230.229795,35.5684121 C230.229795,36.3948411 229.562094,37.0651438 228.738873,37.0651438 C227.914615,37.0651438 227.246915,36.3948411 227.246915,35.5684121 C227.246915,34.7419831 227.914615,34.0716804 228.738873,34.0716804 C229.562094,34.0716804 230.229795,34.7419831 230.229795,35.5684121 L230.229795,35.5684121 Z" id="Stroke-233" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 35.568412) rotate(90.000000) translate(-228.738355, -35.568412) "></path>
<path d="M230.229795,44.4921069 C230.229795,45.3185359 229.562094,45.9888386 228.738873,45.9888386 C227.914615,45.9888386 227.246915,45.3185359 227.246915,44.4921069 C227.246915,43.6656779 227.914615,42.9953752 228.738873,42.9953752 C229.562094,42.9953752 230.229795,43.6656779 230.229795,44.4921069" id="Fill-235" transform="translate(228.738355, 44.492107) rotate(90.000000) translate(-228.738355, -44.492107) "></path>
<path d="M230.229795,44.4921069 C230.229795,45.3185359 229.562094,45.9888386 228.738873,45.9888386 C227.914615,45.9888386 227.246915,45.3185359 227.246915,44.4921069 C227.246915,43.6656779 227.914615,42.9953752 228.738873,42.9953752 C229.562094,42.9953752 230.229795,43.6656779 230.229795,44.4921069 L230.229795,44.4921069 Z" id="Stroke-237" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 44.492107) rotate(90.000000) translate(-228.738355, -44.492107) "></path>
<path d="M230.229795,53.4158017 C230.229795,54.2422307 229.562094,54.9125333 228.738873,54.9125333 C227.914615,54.9125333 227.246915,54.2422307 227.246915,53.4158017 C227.246915,52.5893726 227.914615,51.91907 228.738873,51.91907 C229.562094,51.91907 230.229795,52.5893726 230.229795,53.4158017" id="Fill-239" transform="translate(228.738355, 53.415802) rotate(90.000000) translate(-228.738355, -53.415802) "></path>
<path d="M230.229795,53.4158017 C230.229795,54.2422307 229.562094,54.9125333 228.738873,54.9125333 C227.914615,54.9125333 227.246915,54.2422307 227.246915,53.4158017 C227.246915,52.5893726 227.914615,51.91907 228.738873,51.91907 C229.562094,51.91907 230.229795,52.5893726 230.229795,53.4158017 L230.229795,53.4158017 Z" id="Stroke-241" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 53.415802) rotate(90.000000) translate(-228.738355, -53.415802) "></path>
<path d="M230.229795,62.3394964 C230.229795,63.1659255 229.562094,63.8362281 228.738873,63.8362281 C227.914615,63.8362281 227.246915,63.1659255 227.246915,62.3394964 C227.246915,61.5130674 227.914615,60.8427648 228.738873,60.8427648 C229.562094,60.8427648 230.229795,61.5130674 230.229795,62.3394964" id="Fill-243" transform="translate(228.738355, 62.339496) rotate(90.000000) translate(-228.738355, -62.339496) "></path>
<path d="M230.229795,62.3394964 C230.229795,63.1659255 229.562094,63.8362281 228.738873,63.8362281 C227.914615,63.8362281 227.246915,63.1659255 227.246915,62.3394964 C227.246915,61.5130674 227.914615,60.8427648 228.738873,60.8427648 C229.562094,60.8427648 230.229795,61.5130674 230.229795,62.3394964 L230.229795,62.3394964 Z" id="Stroke-245" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 62.339496) rotate(90.000000) translate(-228.738355, -62.339496) "></path>
<path d="M230.229795,71.2631912 C230.229795,72.0896203 229.562094,72.7599229 228.738873,72.7599229 C227.914615,72.7599229 227.246915,72.0896203 227.246915,71.2631912 C227.246915,70.4367622 227.914615,69.7664595 228.738873,69.7664595 C229.562094,69.7664595 230.229795,70.4367622 230.229795,71.2631912" id="Fill-247" transform="translate(228.738355, 71.263191) rotate(90.000000) translate(-228.738355, -71.263191) "></path>
<path d="M230.229795,71.2631912 C230.229795,72.0896203 229.562094,72.7599229 228.738873,72.7599229 C227.914615,72.7599229 227.246915,72.0896203 227.246915,71.2631912 C227.246915,70.4367622 227.914615,69.7664595 228.738873,69.7664595 C229.562094,69.7664595 230.229795,70.4367622 230.229795,71.2631912 L230.229795,71.2631912 Z" id="Stroke-249" stroke="#A3B1BF" stroke-width="0.81" transform="translate(228.738355, 71.263191) rotate(90.000000) translate(-228.738355, -71.263191) "></path>
<path d="M233.474533,131.704582 C233.474533,134.102684 231.537786,136.046978 229.148994,136.046978 C226.760202,136.046978 224.823455,134.102684 224.823455,131.704582 C224.823455,129.306481 226.760202,127.362187 229.148994,127.362187 C231.537786,127.362187 233.474533,129.306481 233.474533,131.704582 L226.809752,131.704582" id="Fill-251" fill="#A3B1BF" transform="translate(229.148994, 131.704582) rotate(90.000000) translate(-229.148994, -131.704582) "></path>
<path d="M116.93208,108.951605 L112.95698,97.0641411 C111.505457,92.7217457 113.856924,87.977585 118.181426,86.5204054 C118.181426,86.5204054 144.947552,77.5008125 158.330615,72.991016 C182.074402,64.9898842 229.561977,48.9876206 229.561977,48.9876206 C233.887516,47.530441 238.61326,49.8900312 240.064784,54.2313857 L244.039883,66.1188493 C245.491406,70.4612446 243.140976,75.2054053 238.815437,76.662585 L127.434886,114.19537 C123.110384,115.652549 118.383603,113.292959 116.93208,108.951605 Z" id="Stroke-255" stroke="#A3B1BF" stroke-width="1.62" transform="translate(178.498482, 81.591495) rotate(90.000000) translate(-178.498482, -81.591495) "></path>
<path d="M170.986678,36.9877796 C170.205966,37.2511128 169.360972,36.8295715 169.098661,36.0447762 C168.83635,35.2610217 169.257292,34.412735 170.038004,34.1494018 C170.818716,33.8860686 171.66371,34.3086507 171.926021,35.0924052 C172.188332,35.8761597 171.76739,36.7254872 170.986678,36.9877796 Z" id="Fill-257" transform="translate(170.512341, 35.568641) rotate(90.000000) translate(-170.512341, -35.568641) "></path>
<path d="M170.986678,36.9877796 C170.205966,37.2511128 169.360972,36.8295715 169.098661,36.0447762 C168.83635,35.2610217 169.257292,34.412735 170.038004,34.1494018 C170.818716,33.8860686 171.66371,34.3086507 171.926021,35.0924052 C172.188332,35.8761597 171.76739,36.7254872 170.986678,36.9877796 Z" id="Stroke-259" stroke="#A3B1BF" stroke-width="0.81" transform="translate(170.512341, 35.568641) rotate(90.000000) translate(-170.512341, -35.568641) "></path>
<path d="M174.352138,44.0161 C174.614449,44.7998545 174.193507,45.649182 173.412795,45.9114744 C172.632083,46.1748075 171.787089,45.7532663 171.524778,44.968471 C171.262467,44.1847165 171.683409,43.3364297 172.464121,43.0730966 C173.244833,42.8097634 174.089827,43.2323455 174.352138,44.0161" id="Fill-261" transform="translate(172.938458, 44.492336) rotate(90.000000) translate(-172.938458, -44.492336) "></path>
<path d="M173.412795,45.9114744 C172.632083,46.1748075 171.787089,45.7532663 171.524778,44.968471 C171.262467,44.1847165 171.683409,43.3364297 172.464121,43.0730966 C173.244833,42.8097634 174.089827,43.2323455 174.352138,44.0161 C174.614449,44.7998545 174.193507,45.649182 173.412795,45.9114744 Z" id="Stroke-263" stroke="#A3B1BF" stroke-width="0.81" transform="translate(172.938458, 44.492336) rotate(90.000000) translate(-172.938458, -44.492336) "></path>
<path d="M177.586961,52.1285498 C177.849272,52.9123043 177.42833,53.7616318 176.647618,54.0239242 C175.866906,54.2872573 175.021912,53.8657161 174.759601,53.0809208 C174.49729,52.2971663 174.918232,51.4488795 175.698944,51.1855464 C176.479656,50.9222132 177.32465,51.3447953 177.586961,52.1285498" id="Fill-265" transform="translate(176.173281, 52.604786) rotate(90.000000) translate(-176.173281, -52.604786) "></path>
<path d="M176.647618,54.0239242 C175.866906,54.2872573 175.021912,53.8657161 174.759601,53.0809208 C174.49729,52.2971663 174.918232,51.4488795 175.698944,51.1855464 C176.479656,50.9222132 177.32465,51.3447953 177.586961,52.1285498 C177.849272,52.9123043 177.42833,53.7616318 176.647618,54.0239242 Z" id="Stroke-267" stroke="#A3B1BF" stroke-width="0.81" transform="translate(176.173281, 52.604786) rotate(90.000000) translate(-176.173281, -52.604786) "></path>
<path d="M180.013078,61.0522445 C180.275389,61.835999 179.854447,62.6853266 179.073735,62.9476189 C178.293023,63.2109521 177.448029,62.7894109 177.185718,62.0046155 C176.923407,61.220861 177.344349,60.3725743 178.125061,60.1092411 C178.905773,59.845908 179.750767,60.2684901 180.013078,61.0522445" id="Fill-269" transform="translate(178.599398, 61.528481) rotate(90.000000) translate(-178.599398, -61.528481) "></path>
<path d="M180.013078,61.0522445 C180.275389,61.835999 179.854447,62.6853266 179.073735,62.9476189 C178.293023,63.2109521 177.448029,62.7894109 177.185718,62.0046155 C176.923407,61.220861 177.344349,60.3725743 178.125061,60.1092411 C178.905773,59.845908 179.750767,60.2684901 180.013078,61.0522445 L180.013078,61.0522445 Z" id="Stroke-271" stroke="#A3B1BF" stroke-width="0.81" transform="translate(178.599398, 61.528481) rotate(90.000000) translate(-178.599398, -61.528481) "></path>
<path d="M183.247901,69.1646943 C183.510212,69.9484488 183.08927,70.7977764 182.308558,71.0600687 C181.527846,71.3234019 180.682852,70.9018607 180.420541,70.1170653 C180.15823,69.3333108 180.579172,68.4850241 181.359884,68.2216909 C182.140596,67.9583578 182.98559,68.3809399 183.247901,69.1646943" id="Fill-273" transform="translate(181.834221, 69.640931) rotate(90.000000) translate(-181.834221, -69.640931) "></path>
<path d="M183.247901,69.1646943 C183.510212,69.9484488 183.08927,70.7977764 182.308558,71.0600687 C181.527846,71.3234019 180.682852,70.9018607 180.420541,70.1170653 C180.15823,69.3333108 180.579172,68.4850241 181.359884,68.2216909 C182.140596,67.9583578 182.98559,68.3809399 183.247901,69.1646943 L183.247901,69.1646943 Z" id="Stroke-275" stroke="#A3B1BF" stroke-width="0.81" transform="translate(181.834221, 69.640931) rotate(90.000000) translate(-181.834221, -69.640931) "></path>
<path d="M185.674018,78.0883891 C185.936329,78.8721436 185.515387,79.7214712 184.734675,79.9837635 C183.953963,80.2470967 183.108969,79.8255554 182.846658,79.0407601 C182.584347,78.2570056 183.005289,77.4087189 183.786001,77.1453857 C184.566713,76.8820525 185.411707,77.3046346 185.674018,78.0883891" id="Fill-277" transform="translate(184.260338, 78.564625) rotate(90.000000) translate(-184.260338, -78.564625) "></path>
<path d="M185.674018,78.0883891 C185.936329,78.8721436 185.515387,79.7214712 184.734675,79.9837635 C183.953963,80.2470967 183.108969,79.8255554 182.846658,79.0407601 C182.584347,78.2570056 183.005289,77.4087189 183.786001,77.1453857 C184.566713,76.8820525 185.411707,77.3046346 185.674018,78.0883891 L185.674018,78.0883891 Z" id="Stroke-279" stroke="#A3B1BF" stroke-width="0.81" transform="translate(184.260338, 78.564625) rotate(90.000000) translate(-184.260338, -78.564625) "></path>
<path d="M168.691198,39.9598751 C168.953509,40.7436296 168.532567,41.5929571 167.751855,41.8552495 C166.971143,42.1185826 166.126149,41.6970414 165.863838,40.9122461 C165.601527,40.1284916 166.022469,39.2802048 166.803181,39.0168717 C167.583893,38.7535385 168.428887,39.1761206 168.691198,39.9598751" id="Fill-281" transform="translate(167.277518, 40.436111) rotate(90.000000) translate(-167.277518, -40.436111) "></path>
<path d="M156.962155,41.8552495 C156.181443,42.1185826 155.336449,41.6970414 155.074139,40.9122461 C154.811828,40.1284916 155.232769,39.2802048 156.013481,39.0168717 C156.794193,38.7535385 157.639187,39.1761206 157.901498,39.9598751 C158.163809,40.7436296 157.742867,41.5929571 156.962155,41.8552495 Z" id="Stroke-283" stroke="#A3B1BF" stroke-width="0.81" transform="translate(156.487818, 40.436111) rotate(90.000000) translate(-156.487818, -40.436111) "></path>
<path d="M171.117315,48.0723249 C171.379626,48.8560794 170.958684,49.7054069 170.177972,49.9676993 C169.39726,50.2310324 168.552266,49.8094912 168.289955,49.0246959 C168.027644,48.2409414 168.448586,47.3926546 169.229298,47.1293215 C170.01001,46.8659883 170.855004,47.2885704 171.117315,48.0723249" id="Fill-285" transform="translate(169.703635, 48.548561) rotate(90.000000) translate(-169.703635, -48.548561) "></path>
<path d="M160.327615,48.0723249 C160.589926,48.8560794 160.168985,49.7054069 159.388273,49.9676993 C158.60756,50.2310324 157.762567,49.8094912 157.500256,49.0246959 C157.237945,48.2409414 157.658886,47.3926546 158.439598,47.1293215 C159.220311,46.8659883 160.065304,47.2885704 160.327615,48.0723249 L160.327615,48.0723249 Z" id="Stroke-287" stroke="#A3B1BF" stroke-width="0.81" transform="translate(158.913936, 48.548561) rotate(90.000000) translate(-158.913936, -48.548561) "></path>
<path d="M174.352138,56.9960196 C174.614449,57.7797741 174.193507,58.6291017 173.412795,58.891394 C172.632083,59.1547272 171.787089,58.733186 171.524778,57.9483906 C171.262467,57.1646361 171.683409,56.3163494 172.464121,56.0530162 C173.244833,55.7896831 174.089827,56.2122652 174.352138,56.9960196" id="Fill-289" transform="translate(172.938458, 57.472256) rotate(90.000000) translate(-172.938458, -57.472256) "></path>
<path d="M163.562438,56.9960196 C163.824749,57.7797741 163.403807,58.6291017 162.623095,58.891394 C161.842383,59.1547272 160.99739,58.733186 160.735079,57.9483906 C160.472768,57.1646361 160.893709,56.3163494 161.674421,56.0530162 C162.455133,55.7896831 163.300127,56.2122652 163.562438,56.9960196 L163.562438,56.9960196 Z" id="Stroke-291" stroke="#A3B1BF" stroke-width="0.81" transform="translate(162.148758, 57.472256) rotate(90.000000) translate(-162.148758, -57.472256) "></path>
<path d="M166.265081,65.1084694 C166.527392,65.8922239 166.10645,66.7415515 165.325738,67.0038438 C164.545026,67.267177 163.700032,66.8456358 163.437721,66.0608404 C163.17541,65.2770859 163.596352,64.4287992 164.377064,64.165466 C165.157776,63.9021329 166.00277,64.324715 166.265081,65.1084694" id="Fill-293" transform="translate(164.851401, 65.584706) rotate(90.000000) translate(-164.851401, -65.584706) "></path>
<path d="M166.265081,65.1084694 C166.527392,65.8922239 166.10645,66.7415515 165.325738,67.0038438 C164.545026,67.267177 163.700032,66.8456358 163.437721,66.0608404 C163.17541,65.2770859 163.596352,64.4287992 164.377064,64.165466 C165.157776,63.9021329 166.00277,64.324715 166.265081,65.1084694 L166.265081,65.1084694 Z" id="Stroke-295" stroke="#A3B1BF" stroke-width="0.81" transform="translate(164.851401, 65.584706) rotate(90.000000) translate(-164.851401, -65.584706) "></path>
<path d="M169.499903,74.0321642 C169.762214,74.8159187 169.341273,75.6652463 168.560561,75.9275386 C167.779849,76.1908718 166.934855,75.7693305 166.672544,74.9845352 C166.410233,74.2007807 166.831175,73.352494 167.611887,73.0891608 C168.392599,72.8258276 169.237592,73.2484097 169.499903,74.0321642" id="Fill-297" transform="translate(168.086224, 74.508400) rotate(90.000000) translate(-168.086224, -74.508400) "></path>
<path d="M169.499903,74.0321642 C169.762214,74.8159187 169.341273,75.6652463 168.560561,75.9275386 C167.779849,76.1908718 166.934855,75.7693305 166.672544,74.9845352 C166.410233,74.2007807 166.831175,73.352494 167.611887,73.0891608 C168.392599,72.8258276 169.237592,73.2484097 169.499903,74.0321642 L169.499903,74.0321642 Z" id="Stroke-299" stroke="#A3B1BF" stroke-width="0.81" transform="translate(168.086224, 74.508400) rotate(90.000000) translate(-168.086224, -74.508400) "></path>
<path d="M172.734726,82.144614 C172.997037,82.9283685 172.576096,83.7776961 171.795384,84.0399884 C171.014671,84.3033216 170.169678,83.8817803 169.907367,83.096985 C169.645056,82.3132305 170.065997,81.4649438 170.84671,81.2016106 C171.627422,80.9382774 172.472415,81.3608595 172.734726,82.144614" id="Fill-301" transform="translate(171.321047, 82.620850) rotate(90.000000) translate(-171.321047, -82.620850) "></path>
<path d="M172.734726,82.144614 C172.997037,82.9283685 172.576096,83.7776961 171.795384,84.0399884 C171.014671,84.3033216 170.169678,83.8817803 169.907367,83.096985 C169.645056,82.3132305 170.065997,81.4649438 170.84671,81.2016106 C171.627422,80.9382774 172.472415,81.3608595 172.734726,82.144614 L172.734726,82.144614 Z" id="Stroke-303" stroke="#A3B1BF" stroke-width="0.81" transform="translate(171.321047, 82.620850) rotate(90.000000) translate(-171.321047, -82.620850) "></path>
<path d="M166.265081,41.582365 C166.527392,42.3661195 166.10645,43.2154471 165.325738,43.4777394 C164.545026,43.7410726 163.700032,43.3195314 163.437721,42.534736 C163.17541,41.7509815 163.596352,40.9026948 164.377064,40.6393616 C165.157776,40.3760284 166.00277,40.7986105 166.265081,41.582365" id="Fill-305" transform="translate(164.851401, 42.058601) rotate(90.000000) translate(-164.851401, -42.058601) "></path>
<path d="M166.265081,41.582365 C166.527392,42.3661195 166.10645,43.2154471 165.325738,43.4777394 C164.545026,43.7410726 163.700032,43.3195314 163.437721,42.534736 C163.17541,41.7509815 163.596352,40.9026948 164.377064,40.6393616 C165.157776,40.3760284 166.00277,40.7986105 166.265081,41.582365 L166.265081,41.582365 Z" id="Stroke-307" stroke="#A3B1BF" stroke-width="0.81" transform="translate(164.851401, 42.058601) rotate(90.000000) translate(-164.851401, -42.058601) "></path>
<path d="M169.499903,50.5060598 C169.762214,51.2898143 169.341273,52.1391419 168.560561,52.4014342 C167.779849,52.6647674 166.934855,52.2432261 166.672544,51.4584308 C166.410233,50.6746763 166.831175,49.8263896 167.611887,49.5630564 C168.392599,49.2997232 169.237592,49.7223053 169.499903,50.5060598" id="Fill-309" transform="translate(168.086224, 50.982296) rotate(90.000000) translate(-168.086224, -50.982296) "></path>
<path d="M169.499903,50.5060598 C169.762214,51.2898143 169.341273,52.1391419 168.560561,52.4014342 C167.779849,52.6647674 166.934855,52.2432261 166.672544,51.4584308 C166.410233,50.6746763 166.831175,49.8263896 167.611887,49.5630564 C168.392599,49.2997232 169.237592,49.7223053 169.499903,50.5060598 L169.499903,50.5060598 Z" id="Stroke-311" stroke-opacity="0.85" stroke="#A3B1BF" stroke-width="0.81" transform="translate(168.086224, 50.982296) rotate(90.000000) translate(-168.086224, -50.982296) "></path>
<path d="M171.926021,58.6185096 C172.188332,59.4022641 171.76739,60.2515917 170.986678,60.513884 C170.205966,60.7772172 169.360972,60.3556759 169.098661,59.5708806 C168.83635,58.7871261 169.257292,57.9388394 170.038004,57.6755062 C170.818716,57.412173 171.66371,57.8347551 171.926021,58.6185096" id="Fill-313" transform="translate(170.512341, 59.094746) rotate(90.000000) translate(-170.512341, -59.094746) "></path>
<path d="M171.926021,58.6185096 C172.188332,59.4022641 171.76739,60.2515917 170.986678,60.513884 C170.205966,60.7772172 169.360972,60.3556759 169.098661,59.5708806 C168.83635,58.7871261 169.257292,57.9388394 170.038004,57.6755062 C170.818716,57.412173 171.66371,57.8347551 171.926021,58.6185096 L171.926021,58.6185096 Z" id="Stroke-315" stroke="#A3B1BF" stroke-width="0.81" transform="translate(170.512341, 59.094746) rotate(90.000000) translate(-170.512341, -59.094746) "></path>
<path d="M175.160844,67.5422044 C175.423154,68.3259589 175.002213,69.1752864 174.221501,69.4375788 C173.440789,69.700912 172.595795,69.2793707 172.333484,68.4945754 C172.071173,67.7108209 172.492115,66.8625342 173.272827,66.599201 C174.053539,66.3358678 174.898533,66.7584499 175.160844,67.5422044" id="Fill-317" transform="translate(173.747164, 68.018441) rotate(90.000000) translate(-173.747164, -68.018441) "></path>
<path d="M175.160844,67.5422044 C175.423154,68.3259589 175.002213,69.1752864 174.221501,69.4375788 C173.440789,69.700912 172.595795,69.2793707 172.333484,68.4945754 C172.071173,67.7108209 172.492115,66.8625342 173.272827,66.599201 C174.053539,66.3358678 174.898533,66.7584499 175.160844,67.5422044 L175.160844,67.5422044 Z" id="Stroke-319" stroke="#A3B1BF" stroke-width="0.81" transform="translate(173.747164, 68.018441) rotate(90.000000) translate(-173.747164, -68.018441) "></path>
<path d="M177.586961,75.6546542 C177.849272,76.4384087 177.42833,77.2877362 176.647618,77.5500286 C175.866906,77.8133618 175.021912,77.3918205 174.759601,76.6070252 C174.49729,75.8232707 174.918232,74.974984 175.698944,74.7116508 C176.479656,74.4483176 177.32465,74.8708997 177.586961,75.6546542" id="Fill-321" transform="translate(176.173281, 76.130890) rotate(90.000000) translate(-176.173281, -76.130890) "></path>
<path d="M177.586961,75.6546542 C177.849272,76.4384087 177.42833,77.2877362 176.647618,77.5500286 C175.866906,77.8133618 175.021912,77.3918205 174.759601,76.6070252 C174.49729,75.8232707 174.918232,74.974984 175.698944,74.7116508 C176.479656,74.4483176 177.32465,74.8708997 177.586961,75.6546542 L177.586961,75.6546542 Z" id="Stroke-323" stroke="#A3B1BF" stroke-width="0.81" transform="translate(176.173281, 76.130890) rotate(90.000000) translate(-176.173281, -76.130890) "></path>
<path d="M180.821784,84.578349 C181.084095,85.3621035 180.663153,86.211431 179.882441,86.4737234 C179.101729,86.7370565 178.256735,86.3155153 177.994424,85.53072 C177.732113,84.7469655 178.153055,83.8986787 178.933767,83.6353456 C179.714479,83.3720124 180.559473,83.7945945 180.821784,84.578349" id="Fill-325" transform="translate(179.408104, 85.054585) rotate(90.000000) translate(-179.408104, -85.054585) "></path>
<path d="M180.821784,84.578349 C181.084095,85.3621035 180.663153,86.211431 179.882441,86.4737234 C179.101729,86.7370565 178.256735,86.3155153 177.994424,85.53072 C177.732113,84.7469655 178.153055,83.8986787 178.933767,83.6353456 C179.714479,83.3720124 180.559473,83.7945945 180.821784,84.578349 L180.821784,84.578349 Z" id="Stroke-327" stroke="#A3B1BF" stroke-width="0.81" transform="translate(179.408104, 85.054585) rotate(90.000000) translate(-179.408104, -85.054585) "></path>
<path d="M199.285547,130.323988 C200.045523,132.597188 198.826243,135.059822 196.56083,135.82276 C194.296454,136.585697 191.844417,135.361666 191.084441,133.087425 C190.323428,130.814225 191.543745,128.352632 193.808121,127.588654 C196.073533,126.825716 198.525571,128.050788 199.285547,130.323988" id="Fill-329" fill="#A3B1BF" transform="translate(195.184790, 131.705757) rotate(90.000000) translate(-195.184790, -131.705757) "></path>
<polygon id="Stroke-333" stroke="#A3B1BF" stroke-width="0.81" transform="translate(194.281082, 12.765148) rotate(90.000000) translate(-194.281082, -12.765148) " points="192.77098 15.3911937 191.260359 12.7651478 192.77098 10.1391019 195.791185 10.1391019 197.301806 12.7651478 195.791185 15.3911937"></polygon>
<polygon id="Fill-335" transform="translate(263.829774, 193.672778) rotate(90.000000) translate(-263.829774, -193.672778) " points="262.319672 196.298824 260.809051 193.672778 262.319672 191.046732 265.339877 191.046732 266.850498 193.672778 265.339877 196.298824"></polygon>
<polygon id="Stroke-337" stroke="#A3B1BF" stroke-width="0.81" transform="translate(263.829774, 193.672778) rotate(90.000000) translate(-263.829774, -193.672778) " points="262.319672 196.298824 260.809051 193.672778 262.319672 191.046732 265.339877 191.046732 266.850498 193.672778 265.339877 196.298824"></polygon>
<polygon id="Stroke-341" stroke="#A3B1BF" stroke-width="0.81" transform="translate(199.942022, 45.214947) rotate(90.000000) translate(-199.942022, -45.214947) " points="196.921299 45.214947 198.43192 42.588901 201.452125 42.588901 202.962746 45.214947 201.452125 47.8409929 198.43192 47.8409929"></polygon>
<polygon id="Stroke-345" stroke="#A3B1BF" stroke-width="0.81" transform="translate(203.176845, 35.480007) rotate(90.000000) translate(-203.176845, -35.480007) " points="200.156122 35.4800072 201.666743 32.8539613 204.686948 32.8539613 206.197569 35.4800072 204.686948 38.1060531 201.666743 38.1060531"></polygon>
<path d="M28.7090531,149.674699 L408.800743,149.674699" id="Path-13-Copy" stroke="#A3B1BF" stroke-width="2.43"></path>
<path d="M126.73696,157.381526 C130.786107,157.381526 138.956903,157.381526 138.956903,157.381526 C138.956903,157.381526 146.694174,157.381526 150.585513,157.381526 C275.808174,157.381526 408.39639,157.381526 408.39639,157.381526 C408.39639,157.381526 348.147813,204.433735 274.15124,201.594378 C200.154666,198.75502 175.893495,186.586345 157.293263,179.67788 C138.693031,172.769415 101.923452,169.955823 76.4120034,175.634538 C50.9005548,181.313253 28.3047003,157.381526 28.3047003,157.381526 C28.3047003,157.381526 34.3629836,157.381526 126.73696,157.381526 Z" id="Path-22-Copy" fill-opacity="0.25" fill="#A3B1BF"></path>
<g id="Group-2" transform="translate(0.000000, 75.851406)">
<ellipse id="Oval-40-Copy-2" stroke="#A3B1BF" stroke-width="2.43" fill-opacity="0.25" fill="#A3B1BF" cx="35.5830518" cy="35.6947791" rx="35.5830518" ry="35.6947791"></ellipse>
<ellipse id="Oval-40-Copy-3" fill="#F0F2F5" cx="35.8526204" cy="35.9651941" rx="30.4612489" ry="30.5568942"></ellipse>
</g>
<path d="M39.6265804,107.895582 L78.4444551,119.253012" id="Path-736" stroke="#A3B1BF" stroke-width="0.81"></path>
<path d="M32.7525817,115.60241 L65.9095164,140.751004" id="Path-736-Copy" stroke="#A3B1BF" stroke-width="0.81" transform="translate(49.331049, 128.176707) scale(-1, -1) translate(-49.331049, -128.176707) "></path>
<g id="Group" transform="translate(95.154052, 106.919777) rotate(19.000000) translate(-95.154052, -106.919777) translate(34.154052, 63.919777)" fill="#A3B1BF">
<path d="M42.7522815,72.4570067 C42.7522815,75.8233475 45.3271005,78.562549 48.4926445,78.562549 C51.6578573,78.562549 54.2333386,75.8233475 54.2333386,72.4570067 C54.2333386,69.091018 51.6578573,66.3525208 48.4926445,66.3525208 C45.3271005,66.3525208 42.7522815,69.091018 42.7522815,72.4570067 M40.1907075,72.4570067 C40.1907075,67.5898976 43.9148573,63.6284609 48.4926445,63.6284609 C53.0707627,63.6284609 56.7949126,67.5898976 56.7949126,72.4570067 C56.7949126,77.3251722 53.0707627,81.2859046 48.4926445,81.2859046 C43.9148573,81.2859046 40.1907075,77.3251722 40.1907075,72.4570067 L54.193687,73.4098081" id="Fill-13" fill-opacity="0.4"></path>
<path d="M37.9000472,72.2309321 C37.9000472,78.1565371 42.4331326,82.9775175 48.0049535,82.9775175 C53.5774367,82.9775175 58.110191,78.1565371 58.110191,72.2309321 C58.110191,66.3056792 53.5774367,61.485051 48.0049535,61.485051 C42.4331326,61.485051 37.9000472,66.3056792 37.9000472,72.2309321 M35.3384731,72.2309321 C35.3384731,64.8035024 41.0205583,58.760991 48.0049535,58.760991 C54.9893488,58.760991 60.6724273,64.8035024 60.6724273,72.2309321 C60.6724273,79.6587139 54.9893488,85.7019295 48.0049535,85.7019295 C41.0205583,85.7019295 35.3384731,79.6587139 35.3384731,72.2309321" id="Fill-15"></path>
<path d="M1.80809546,66.1576486 C1.80809546,68.834124 3.79009311,71.0116629 6.22625634,71.0116629 C8.66270911,71.0116629 10.644562,68.834124 10.644562,66.1576486 C10.644562,63.4813322 8.66270911,61.3039523 6.22625634,61.3039523 C3.79009311,61.3039523 1.80809546,63.4813322 1.80809546,66.1576486 M0.688100292,66.1576486 C0.688100292,62.8028295 3.17247427,60.0735498 6.22625634,60.0735498 C9.2800384,60.0735498 11.7648467,62.8028295 11.7648467,66.1576486 C11.7648467,69.5126267 9.2800384,72.2422245 6.22625634,72.2422245 C3.17247427,72.2422245 0.688100292,69.5126267 0.688100292,66.1576486" id="Fill-15-Copy"></path>
<path d="M8.98009502,66.0939913 L39.179583,29.1533303 L87.9014765,24.076001 L44.6752454,68.7902332 L45.5153066,69.7089343 L8.98009502,66.0939913 Z M5.34865982,69.3835683 L46.1480843,73.419304 C47.0103308,73.4270508 47.6235721,72.9654113 47.8811865,72.2953123 L49.8354794,74.4316711 L93.1120414,29.6649719 L108.025528,67.5588426 C108.413605,68.5455044 109.312607,69.1391917 110.258627,69.1391917 C110.569884,69.1391917 110.886107,69.0747523 111.192066,68.9391832 C112.424508,68.3905682 113.0053,66.8827574 112.490071,65.5728423 L88.7958421,5.36886461 L92.7040968,5.36886461 L92.7040968,12.726573 C92.7040968,13.562172 93.3408479,14.2400178 94.1272671,14.2400178 L108.786782,14.2400178 C109.171548,14.2400178 109.540751,14.0741657 109.809292,13.7794348 L117.408916,5.43506461 C117.934078,5.90550723 118.567187,6.70025945 118.772153,7.90031067 C119.120826,9.94441199 118.336394,13.6565422 112.619209,19.7367313 C112.062921,20.3272495 112.062921,21.2857411 112.619209,21.8769635 C112.896691,22.1727507 113.26159,22.3206444 113.625495,22.3206444 C113.989731,22.3206444 114.354298,22.1727507 114.63178,21.8769635 C119.954265,16.2168628 122.285045,11.3085547 121.560215,7.28796059 C120.892339,3.580408 117.884078,2.16415038 117.756265,2.10569718 C117.213553,1.85709502 116.581768,1.9916078 116.170513,2.44303552 L108.184137,11.2131281 L95.5507685,11.2131281 L95.5507685,5.36886461 L97.3534067,5.36886461 C98.6894914,5.36886461 99.7725975,4.21670276 99.7725975,2.7962196 C99.7725975,1.37538432 98.6894914,0.223222475 97.3534067,0.223222475 L85.1604334,0.223222475 C84.3508356,0.223222475 83.5948798,0.653874656 83.1465381,1.37045453 C82.6972031,2.08738654 82.6157466,2.99517176 82.9286587,3.78957186 L89.4140503,20.2684441 L40.3087153,25.3855639 L38.2463901,12.9619427 C37.9924181,11.9967607 37.0503708,11.4323 36.1411047,11.7044947 C35.232832,11.9752809 34.703365,12.9777884 34.9583303,13.9436747 L36.9981391,26.2845459 L4.21787189,66.3834403 C3.79767573,66.8968425 3.68310688,67.6183522 3.92184717,68.2504214 C4.1595941,68.883547 4.71058417,69.3198332 5.34865982,69.3835683 Z" id="Fill-17"></path>
</g>
<path d="M120.0928,133.044177 C120.0928,133.044177 117.26233,133.044177 117.26233,134.261044 C117.26233,135.477912 128.179857,144.401606 128.179857,144.401606 L120.0928,133.044177 Z" id="Path-731" fill="#A3B1BF"></path>
<path d="M146.375736,133.044177 C146.375736,133.044177 149.206206,133.044177 149.206206,134.261044 C149.206206,135.477912 138.288678,144.401606 138.288678,144.401606 L146.375736,133.044177 Z" id="Path-731-Copy-2" fill="#A3B1BF"></path>
<path d="M114.922075,137.687235 C114.922075,137.687235 112.297709,138.747548 112.753556,139.875807 C113.209402,141.004067 126.674832,145.188195 126.674832,145.188195 L114.922075,137.687235 Z" id="Path-731-Copy" fill="#A3B1BF"></path>
<path d="M150.02854,138.516693 C150.02854,138.516693 152.652906,139.580123 152.198396,140.708383 C151.743886,141.836643 138.288257,146.008745 138.288257,146.008745 L150.02854,138.516693 Z" id="Path-731-Copy-3" fill="#A3B1BF"></path>
<path d="M74.4009265,59.626506 C72.9743667,59.2687463 68.3698232,57.9570172 67.9312807,60.437751 C67.5752067,62.4519795 70.5119271,68.4526327 73.5922208,69.3614461 C80.4662194,71.3895585 88.1489236,68.5502009 95.0229222,70.5783133 C101.896921,72.6064258 101.500006,68.9632854 100.279509,67.7389559 C97.8533925,65.3052209 77.6357492,60.437751 74.4009265,59.626506 Z" id="Path-735" stroke="#A3B1BF" stroke-width="2.43"></path>
<g id="Group-2-Copy" transform="translate(346.684026, 76.257028)">
<ellipse id="Oval-40-Copy-2" stroke="#A3B1BF" stroke-width="2.43" fill="#DCE1E7" cx="35.5830518" cy="35.6947791" rx="35.5830518" ry="35.6947791"></ellipse>
<ellipse id="Oval-40-Copy-3" fill="#F0F2F5" cx="35.8526204" cy="35.9651941" rx="30.4612489" ry="30.5568942"></ellipse>
</g>
<path d="M364.90109,93.2931727 C363.56683,94.0412049 361.930683,95.8872138 360.413184,99.4391645 C355.560949,110.796594 356.774008,120.937157 356.774008,120.937157 C356.774008,120.937157 358.391419,101.467276 364.861065,97.8166743" id="Path-738" fill="#A3B1BF"></path>
<path d="M408.39639,103.839357 C407.06213,104.58739 405.425983,106.433399 403.908483,109.985349 C399.056249,121.342779 400.269308,131.483341 400.269308,131.483341 C400.269308,131.483341 401.886718,112.013461 408.356365,108.362859" id="Path-738-Copy" fill="#A3B1BF" transform="translate(404.265457, 117.661349) scale(-1, -1) translate(-404.265457, -117.661349) "></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<template>
<div class="exception">
<div class="imgBlock">
<div class="imgEle" :style="{backgroundImage: `url(${config[type].img})`}">
</div>
</div>
<div class="content">
<h1>{{ config[type].title }}</h1>
<div class="desc">{{ config[type].desc }}</div>
<div class="actions">
<el-button @click="handleToHome">{{ '返回首页' }}</el-button>
</div>
</div>
</div>
</template>
<script>
import types from './type'
export default {
name: 'Exception',
// props: {
// type: {
// type: String,
// default: '404'
// }
// },
data() {
return {
config: types,
type: '404'
}
},
mounted() {
if (this.$route.params.type) {
this.type = this.$route.params.type
}
},
methods: {
handleToHome() {
// 是否登录 返回不同页面
if (localStorage.username) {
this.$router.push({ name: 'apply' })
} else {
this.$router.push({ name: 'login' })
}
}
}
}
</script>
<style lang="stylus" scoped>
.exception
display flex
display -webkit-flex
align-items center
justify-content center
padding 10% 20%
min-height 500px
.imgBlock
flex 1
.imgEle
width 100%
max-width 430px
height 360px
background-repeat no-repeat
background-position 50% 50%
background-size contain
.content
flex 1
h1
margin-bottom 24px
color #434e59
font-weight 600
font-size 72px
line-height 72px
.desc
margin-bottom 16px
color #434e59
font-size 20px
line-height 28px
.actions
button:not(:last-child)
margin-right 8px
@media screen and (max-width: 768px) {
.exception {
padding 10% 0
}
}
</style>
import i18n from '@/i18n/index'
const types = {
403: {
img: require('./403.svg'),
title: '403',
desc: '抱歉,你无权访问该页面'
},
404: {
img: require('./404.svg'),
title: '404',
desc: '抱歉,你访问的页面不存在或仍在开发中'
},
500: {
img: require('./500.svg'),
title: '500',
desc: '抱歉,服务器出错了'
}
}
export default types
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
</style>
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
</style>
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="sass" scoped>
</style>
<!-- 登录页面 -->
<template lang="pug">
.layout.flex.column
.navigation
.flex.left
img.logo-img(src="@assets/logo/logoa.png")
.right.lang
span.login-btn(@click="$router.push({ name: 'register' })") {{'注册'}}
seeta-popover(
trigger="hover"
placement="bottom"
width="100"
v-model="showLangePopover"
popper-class="login-popover"
)
ul.lang-list
li(
v-for="item in langList"
@click="changeLang(item)"
:class="{'is-active': item === currentLang}"
) {{item === 'zh-CN' ? '简体中文' : '日本語'}}
template(v-slot:reference)
span.reference {{currentLang === 'zh-CN' ? '简体中文' : '日本語'}}
.wrap.flex-1
.content
.introduce
.title {{'自主 · 可控 · 边缘智算'}}
.desc {{'人工智能物联网平台'}}
.login-area
.pic-code-continue(v-show="yzmDialogVisible")
puzzle-validator(
ref="mychild"
v-on:getMatchInfo="getMatchInfo"
:isMatch="isMatch"
@onlogin="login"
@close="closeYzmDialog"
:height="283"
:width="340"
)
.login-title {{ isAdminLogin ? $t('login.backLogin') : $t("login.logTitle")}}
.browserTip(v-if="!notification")
span.iconfont.icon-jinggao
span {{$t('public.browserPrompt')}}
span.iconfont.icon-guanbi(
@click="closeNotification"
)
template(v-if="!isFirstLogin")
.login-content
.login-item
st-input.name(
size=""
width="300px"
type="text",
v-model="userName",
@blur="checkError",
@focus="errmsg = ''",
@input="errmsg = ''",
:placeholder="$t('login.pleaseInputUsername')",
)
.login-item
st-input.password(
size=""
width="300px"
ref="password",
type="password",
v-model="userPassWord",
@blur="checkError",
@focus="errmsg = ''",
@input="errmsg = ''",
@keyup.enter.native="submitForm"
:placeholder="$t('login.pleaseInputPassword')",
)
.error
span(v-if="errmsg") {{ errmsg }}
//- .login-item.flex.left
//- st-input.captcha(
//- ref="captcha",
//- size=""
//- type="text",
//- v-model="captcha",
//- @blur="checkCaptchaError",
//- @focus="errmsg = ''",
//- @input="errmsg = ''",
//- @keyup.enter.native="submitForm()",
//- :placeholder="$t('login.pleaseInputCode')",
//- )
//- img.captcha-img(@click="getCaptcha" src="")
//- .error
//- span(v-if="errmsg") {{ errmsg }}
st-button(v-if="!isAdminLogin" width="300px" style="margin-top:48px" type="primary" @click="submitForm" v-preventReClick) {{$t('login.loginButton')}}
st-button(v-else width="300px" type="primary" @click="submitAdminForm") {{$t('login.loginButton')}}
.another-login(v-if="oidcList.length && !isAdminLogin")
.caption {{$t('login.threePartiesLogin')}}
.login-ways.flex.left
.login-way.pointer(
v-for="item in oidcList",
@click="linkToOidc(item)",
)
img.img(
:src="getOidcIcon(item)",
)
.text {{ item.service_name }}
.admin-tips(v-if="!isAdminLogin")
span {{$t('login.adminPlease')}}
span.pointer(
@click="linkToAdmin",
) {{$t('login.backLogin')}}
.admin-tips(v-else)
span {{$t('public.return')}}
span.pointer(
@click="linkToFront",
) {{$t('public.fontUserLogin')}}
.first-content(v-else)
first-login(
:username="userName",
:password="userPassWord"
@show-login="showLogin",
)
</template>
<script>
import crypto from 'crypto-js'
import browserStorage from '@/services/local-storage'
import seetaPopover from '@/components/seeta-ui/seeta-popover'
import { saveUser } from '@/utils/user'
// import { usersApi } from '../../http'
import { langList } from '@/i18n/utils'
export default {
name: 'login',
components: {
seetaPopover,
},
props: {
},
data() {
// 语言项列表
this.langList = langList
return {
userName: '',
userPassWord: '',
captcha: '',
isFirstLogin: false,
errmsg: '',
currentCaptcha: {},
oidcList: [],
notification: true,
showLangePopover: false,
// 获取拼图是否验证成功
isMatch: 0,
yzmDialogVisible: false,
}
},
computed: {
currentLang() {
return this.$store.getters.lang
},
isAdminLogin() {
return this.$route.name === 'admin-login'
},
},
beforeCreate() {
// 保留系统名称
const customer_name = browserStorage.getItem('customer_name')
browserStorage.clear()
browserStorage.setItem('customer_name', customer_name)
},
created() {
},
mounted() {
this.getOidcList()
this.getCaptcha()
this.isChrome()
},
methods: {
// 判断是否为谷歌浏览器提示
isChrome() {
this.notification = navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') < 0
},
// 关闭浏览器提示
closeNotification() {
this.notification = true
},
// 获取验证码
async getCaptcha() {
},
// 获取第三方登录列表
async getOidcList() {
},
getOidcIcon(oidc) { },
// 跳转到第三方登录地址
linkToOidc(oidc) {
const randomState = _.pad(_.random(1, 999999), 6, 'a')
browserStorage.setItem(`state_${randomState}`, oidc.service_name)
const redirectUrl = encodeURIComponent(`${location.origin}/`)
const url = `${oidc.auth_url}?response_type=code&client_id=${oidc.client_id}&redirect_uri=${location.origin}&state=${randomState}&scope=${oidc.scope}`
location.href = url
},
linkToAdmin() {
// location.href = adminUrl
this.$router.push({ name: 'admin-login' })
},
linkToFront() {
this.$router.push({ name: 'login' })
},
checkCaptchaError() {
this.errmsg = this.captcha ? '' : this.$t('login.pleaseInputCode')
return !!this.captcha
},
checkError() {
if (!this.userName && !this.userPassWord) {
this.errmsg = this.$t('public.inputNamePassword')
return false
}
if (!this.userName) {
this.errmsg = this.$t('login.pleaseInputUsername')
return false
}
if (!this.userPassWord) {
this.errmsg = this.$t('login.pleaseInputPassword')
return false
}
// if (!(/^.{4,10}$/.test(this.userName))) {
// this.errmsg = '账号必须为4-10位'
// return false
// }
// if (!(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\-_]{8,64}$/.test(this.userPassWord))) {
// this.errmsg = '密码必须包含大小写字母和数字,大于8位且小于64位'
// return false
// }
this.errmsg = ''
return true
},
showLogin(val) {
this.captcha = ''
this.getCaptcha()
this.userPassWord = ''
this.isFirstLogin = val
this.$nextTick(() => {
this.$refs.password.focus()
})
},
changeFocus(type) {
const fild = this.checkError()
if (!fild) return
this.$refs[type].focus()
},
// 普通用户登录
submitForm() {
const fild = this.checkError()
if (!fild) return
// const isCaptcha = this.checkCaptchaError()
// if (!isCaptcha) return
// TODO 滑动验证
// if (!this.isMatch) {
// this.yzmDialogVisible = true
// return
// }
this.login()
},
// 关闭滑动验证
closeYzmDialog() {
this.isMatch = 0
this.yzmDialogVisible = false
},
getMatchInfo(val) {
if (val) {
this.prelogin(val)
}
},
async prelogin(val) {
},
async login() {
const res = await usersApi.login({
username: this.userName,
password: this.userPassWord
})
if (res) {
// TokenId
browserStorage.setItem('id', res.data.id)
const resInfo = await usersApi.getUser(res.data.subject_id)
if (resInfo) {
// 如果subjectID和个人信息ID重复则只存一个
if (res.data.subject_id === resInfo.data.id) {
// 用户ID
browserStorage.setItem('userId', res.data.subject_id)
} else {
// 个人信息的ID
browserStorage.setItem('reqId', resInfo.data.id)
// 用户ID
browserStorage.setItem('userId', res.data.subject_id)
}
browserStorage.setItem('username', resInfo.data.username)
// UUID
browserStorage.setItem('uuid', resInfo.data.uuid)
// 页面右上角用户名显示
browserStorage.setItem('user', JSON.stringify({ username: this.userName }))
// 进入欢迎页
this.$router.push({ name: 'apply' })
} else {
vm.$notify.error({
title: '请求错误',
message: '获取用户信息失败,请重新登录',
})
}
} else {
this.errmsg = this.$store.getters.errorInfo.msg
}
},
// 管理员登录
submitAdminForm() {
const fild = this.checkError()
if (!fild) return
const isCaptcha = this.checkCaptchaError()
if (!isCaptcha) return
this.adminLogin()
},
async adminLogin() {
},
// 切换语言
changeLang(item) {
this.$store.commit('setLang', {
lang: item
})
this.$i18n.locale = item
// 更新路由
// this.$router.push('/control/deviceLogs')
this.showLangePopover = false
},
},
}
</script>
<style lang="sass" scoped>
.layout
background: #539DFF
min-height: 100%
// min-width: 1300px
.notification
width: 100%
height: 40px
background-color: #FFFAF5
font-family: PingFangSC-Regular
font-size: 14px
text-align: center
line-height: 40px
color: #FF5F07
position: fixed
top: 50px
box-shadow: 0 2px 12px 0 rgba(0,0,0,0.10)
.close-button
position: absolute
right: 23px
font-size: 12px
cursor: pointer
transform: scale(0.85)
span
display: inline-block
height: 100%
line-height: 18px
.iconfont.icon-notice
display: inline-block
margin-right: 6px
.navigation
height: 50px
padding: 0 36px
background-color: #011E33
.left
height: 50px
line-height: 50px
float: left
.logo-img
height: 24px
.right
float: right
height: 50px
line-height: 50px
color: #FFF
cursor: pointer
.reference
&:hover
color: #4099EF
& ::v-deep.el-popover__reference-wrapper
margin-left: 20px
.login-btn:hover
color: #4099EF
.wrap
background-color: #011E33
// background-image: url(~@/assets/login-bg.gif)
background-position: 45% 40%
background-repeat: no-repeat
padding: 0 120px 0 160px
position: relative
display: flex
align-items: center
justify-content: center
.content
background-image: url(~@/assets/login-bg.gif)
background-repeat: no-repeat
transform: translateY(-40px)
width: calc(100% - 280px)
width: 1200px
min-width: 1200px
height: 600px
display: flex
justify-content: space-between
align-items: center
.introduce
color: #FFF
height: 100%
padding: 20px 0
.title
font-size: 32px
font-weight: 800
.desc
font-size: 20px
font-weight: 400
margin-top: 10px
.login-area
width: 360px
background: #FFFFFF
padding: 24px 30px
border-radius: 2px
position: relative
.pic-code-continue
z-index: 99
position: absolute
top: 0px
left: 0px
// right: 0px
// bottom: 0px
// margin: 50px 50px 30px
background-color: #fff
padding: 10px
box-shadow: 0px 6px 9px 0px rgba(53, 100, 237, 0.37)
// float: right
.browserTip
width: 300px
background-color: #FEF6EB
border: 1px solid #FBDEB1
padding: 6px 20px
color: #F6AD3D
margin-top: 24px
display: flex
font-size: 14px
.icon-jinggao
margin-right: 10px
.icon-guanbi
color: #999999
margin-left: 10px
font-size: 10px
cursor: pointer
.login-title
font-size: 20px
color: #333
text-align: center
font-weight: bold
.login-content
margin-top: 30px
.content
width: 273px
margin: 0 auto
.login-title
font-size: 24px
font-weight: 600
color: #000
text-align: center
.login-item
position: relative
font-size: 14px
margin-bottom: 24px
.captcha-img
width: 116px
height: 40px
margin: 0 0 0 10px
cursor: pointer
.icon-refresh
font-size: 16px
&:hover
color: #409EFF
.error
bottom: -24px
left: 0
position: absolute
color: #F56C6C
font-size: 12px
height: 22px
.el-button
font-size: 16px
.another-login
.caption
margin-top: 24px
text-align: center
position: relative
font-size: 14px
color: #666
&::before, &::after
content: ''
position: absolute
width: 115px
height: 1px
background-color: #D7DAE0
top: 50%
transform: translateY(-50%)
&:before
left: 0
&:after
right: 0
.login-ways
width: 100%
margin-top: 16px
overflow-x: auto
.login-way
text-align: center
white-space: nowrap
&:not(:first-child)
margin-left: 25px
.text
margin-top: 2px
font-size: 14px
color: #333
.img
width: 40px
height: 40px
border-radius: 2px
.admin-tips
margin-top: 24px
text-align: right
font-size: 14px
color: #666666
.pointer
color: #409EFF
</style>
<style lang="sass">
.login-popover
background: #001423 !important
border-color: #001423 !important
color: #FFF !important
</style>
<!-- 注册页面 -->
<template lang="pug">
.layout.flex.column
.navigation
.flex.left
img.logo-img(src="@assets/logo/logoa.png")
.right.lang
span.login-btn(@click="$router.push({ name: 'login' })") {{'登录'}}
.wrap.flex-1
.content
.introduce
.title {{'自主 · 可控 · 边缘智算'}}
.desc {{'人工智能物联网平台'}}
.login-area
//- .pic-code-continue(v-show="yzmDialogVisible")
//- puzzle-validator(
//- ref="mychild"
//- v-on:getMatchInfo="getMatchInfo"
//- :isMatch="isMatch"
//- @onlogin="login"
//- @close="closeYzmDialog"
//- :height="283"
//- :width="340"
//- )
.login-title {{ '账号注册' }}
.browserTip(v-if="!notification")
span.iconfont.icon-jinggao
span {{$t('public.browserPrompt')}}
span.iconfont.icon-guanbi(
@click="closeNotification"
)
template
.login-content
st-form(:model="form" :rules="rules" ref="form")
st-form-item(prop="username" style="margin-bottom:20px")
st-input.name(
size=""
width="300px"
type="text",
v-model="form.username",
placeholder="请输入账号"
)
st-form-item(prop="password" style="margin-bottom:20px")
st-input.password(
size=""
width="300px"
type="password",
v-model="form.password",
placeholder="请输入密码"
)
st-form-item(prop="password_confirmation" style="margin-bottom:20px")
st-input.password(
size=""
width="300px"
type="password",
v-model="form.password_confirmation",
placeholder="请确认密码"
)
st-form-item(prop="phone" style="margin-bottom:20px;text-align: left")
st-input.phone(
size=""
width="190px"
type="text",
v-model="form.phone",
placeholder="请输入手机号"
)
span.send-captcha(style="display: inline-block;width: 110px;text-align:center" @click="sendCaptcha") {{sendLoading ? sendInterval + 's后可重新发送' : '获取验证码'}}
st-form-item(prop="sms_code" style="margin-bottom:20px")
st-input.captcha(
size=""
width="300px"
type="text",
v-model="form.sms_code",
placeholder="请输入验证码"
@keyup.enter="handleRegister"
)
st-button(width="300px" type="primary" @click="handleRegister" v-preventReClick) {{'注册'}}
</template>
<script>
import { usersApi, codeApi } from '@/http'
export default {
data() {
const validatePassword = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'))
} else if (!(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\-_]{8,64}$/.test(value))) {
callback(new Error('密码必须包含大小写字母和数字,大于8位且小于64位'))
} else {
callback()
}
}
const validatePasswordConfirmation = (rule, value, callback) => {
if (value === '') {
callback(new Error('请确认密码'))
} else if (value !== this.form.password) {
callback(new Error('密码与确认密码不一致'))
} else {
callback()
}
}
const validatePhone = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入手机号'))
} else if (!(/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-7|9])|(?:5[0-3|5-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1|8|9]))\d{8}$/.test(value))) {
callback(new Error('手机号格式不正确'))
} else {
callback()
}
}
return {
form: {},
sendLoading: false,
sendInterval: 60,
errmsg: '',
notification: '',
rules: {
username: [
{ required: true, message: '请输入账号' },
{ min: 4, max: 10, trigger: 'blur', message: '账号必须为4-10位' },
],
password: [
{ required: true, message: '请输入密码' },
{ validator: validatePassword, message: '密码必须包含大小写字母和数字,大于8位且小于64位' },
],
password_confirmation: [
{ required: true, message: '请确认密码' },
{ validator: validatePasswordConfirmation, trigger: 'blur', message: '密码与确认密码不一致' },
],
phone: [
{ required: true, message: '请输入手机号' },
{ validator: validatePhone, trigger: 'blur', message: '手机号格式不正确' },
],
sms_code: [
{ required: true, message: '请输入验证码' },
],
},
}
},
mounted() {
this.isChrome()
},
methods: {
// 判断是否为谷歌浏览器提示
isChrome() {
this.notification = navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') < 0
},
// 关闭浏览器提示
closeNotification() {
this.notification = true
},
async sendCaptcha() {
if (!this.form.phone) {
Toast.warning('请输入手机号')
return
}
if (!(/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-7|9])|(?:5[0-3|5-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1|8|9]))\d{8}$/.test(this.form.phone))) {
Toast.warning('手机号格式不正确')
return
}
if (this.sendLoading) return
this.sendLoading = true
Toast.success('已发送')
const timer = setInterval(() => {
this.sendInterval--
if (this.sendInterval <= 0) {
clearInterval(timer)
this.sendLoading = false
this.sendInterval = 60
}
}, 1000)
const res = await codeApi.getCodeForRegistration({ contact: this.form.phone, type: 1 })
},
async handleRegister() {
this.$refs.form.validate(async valid => {
if (valid) {
this.form.name = this.form.username
const res = await usersApi.register(this.form)
if (res) {
this.$router.push({ name: 'login' })
}
}
})
}
}
}
</script>
<style lang="sass" scoped>
.layout
background: #539DFF
min-height: 100%
// min-width: 1300px
overflow: hidden
.notification
width: 100%
height: 40px
background-color: #FFFAF5
font-family: PingFangSC-Regular
font-size: 14px
text-align: center
line-height: 40px
color: #FF5F07
position: fixed
top: 50px
box-shadow: 0 2px 12px 0 rgba(0,0,0,0.10)
.close-button
position: absolute
right: 23px
font-size: 12px
cursor: pointer
transform: scale(0.85)
span
display: inline-block
height: 100%
line-height: 18px
.iconfont.icon-notice
display: inline-block
margin-right: 6px
.navigation
height: 50px
padding: 0 36px
background-color: #011E33
.left
height: 50px
line-height: 50px
float: left
.logo-img
height: 24px
.right
float: right
height: 50px
line-height: 50px
color: #FFF
cursor: pointer
.reference
&:hover
color: #4099EF
.login-btn:hover
color: #4099EF
.wrap
background-color: #011E33
// background-image: url(~@/assets/login-bg.gif)
background-position: 45% 40%
background-repeat: no-repeat
padding: 0 120px 0 160px
position: relative
display: flex
align-items: center
justify-content: center
.content
background-image: url(~@/assets/login-bg.gif)
background-repeat: no-repeat
transform: translateY(-40px)
width: calc(100% - 280px)
width: 1200px
min-width: 1200px
height: 600px
display: flex
justify-content: space-between
align-items: center
.introduce
color: #FFF
height: 100%
padding: 20px 0
.title
font-size: 32px
font-weight: 800
.desc
font-size: 20px
font-weight: 400
margin-top: 10px
.login-area
width: 360px
background: #FFFFFF
padding: 24px 30px
border-radius: 2px
position: relative
.pic-code-continue
z-index: 99
position: absolute
top: 0px
left: 0px
// right: 0px
// bottom: 0px
// margin: 50px 50px 30px
background-color: #fff
padding: 10px
box-shadow: 0px 6px 9px 0px rgba(53, 100, 237, 0.37)
// float: right
.browserTip
width: 300px
background-color: #FEF6EB
border: 1px solid #FBDEB1
padding: 6px 20px
color: #F6AD3D
margin-top: 24px
display: flex
font-size: 14px
.icon-jinggao
margin-right: 10px
font-size: 14px
.icon-guanbi
color: #999999
margin-left: 10px
font-size: 10px
cursor: pointer
.login-title
font-size: 20px
color: #333
text-align: center
font-weight: bold
.login-content
margin-top: 30px
margin-bottom: 30px
::v-deep .el-form-item__error
text-align: left
.content
width: 273px
margin: 0 auto
.login-title
font-size: 24px
font-weight: 600
color: #000
text-align: center
.login-item
position: relative
font-size: 14px
margin-bottom: 24px
.send-captcha
width: 110px
display: inline-block
color: #409EFF
cursor: pointer
.icon-refresh
font-size: 16px
&:hover
color: #409EFF
.error
bottom: -24px
left: 0
position: absolute
color: #F56C6C
font-size: 12px
height: 22px
.el-button
font-size: 16px
.another-login
.caption
margin-top: 24px
text-align: center
position: relative
font-size: 14px
color: #666
&::before, &::after
content: ''
position: absolute
width: 115px
height: 1px
background-color: #D7DAE0
top: 50%
transform: translateY(-50%)
&:before
left: 0
&:after
right: 0
.login-ways
width: 100%
margin-top: 16px
overflow-x: auto
.login-way
text-align: center
white-space: nowrap
&:not(:first-child)
margin-left: 25px
.text
margin-top: 2px
font-size: 14px
color: #333
.img
width: 40px
height: 40px
border-radius: 2px
.admin-tips
margin-top: 24px
text-align: right
font-size: 14px
color: #666666
.pointer
color: #409EFF
</style>
<style lang="sass">
.login-popover
background: #001423 !important
border-color: #001423 !important
color: #FFF !important
</style>
// tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
// "strict": true,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"allowJs": true,
"baseUrl": ".",
"types": [
"webpack-env",
"jest"
],
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
},
"include": [
"src/**/*.ts",
"src/**/*.js",
"src/**/*.tsx",
"src/**/*.vue"
, "src/globals.ts" ],
"exclude": [
"node_modules"
]
}
\ No newline at end of file
const path = require('path')
function resolve (dir) {
return path.join(__dirname, dir)
}
module.exports = {
configureWebpack: {
entry: './src/main.ts',
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js',
},
},
},
chainWebpack: (config) => {
config.resolve.alias
.set('@utils', resolve('src/utils'))
.set('@assets', resolve('src/assets'))
.set('@comp', resolve('src/components'))
.set('@views', resolve('src/views'))
.set('@layouts', resolve('src/layouts'))
.set('@store', resolve('src/store'))
.end().end()
.resolve.extensions.add('.ts').add('.tsx').add('.js')
.end().end()
.module
.rule('typescript')
.test(/\.tsx?$/)
.use('babel-loader')
.loader('babel-loader')
.end()
.use('ts-loader')
.loader('ts-loader')
.options({
transpileOnly: true,
appendTsSuffixTo: [
'\\.vue$'
],
happyPackMode: false
})
.end()
},
// devServer: {
// // development server port 8000
// port: 9000,
// // If you want to turn on the proxy, please remove the mockjs /src/main.jsL11
// // 配置代理,解决跨域
// proxy: {
// // 匹配到/api才使用代理,避免路由冲突
// '/api': {
// target: 'http://218.94.122.141:8089',
// changeOrigin: true,
// pathRewrite: {
// // 路径重写
// '^/api': '/' // 这个意思就是以api开头的,定向到哪里, 如果你的后边还有路径的话, 会自动拼接上
// }
// }
// }
// },
}
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!