tada: Initial commit
This commit is contained in:
parent
8e473c635c
commit
ca10d79943
6 changed files with 175 additions and 28 deletions
3
packages/plugin-bundle/.babelrc
Normal file
3
packages/plugin-bundle/.babelrc
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"plugins": ["transform-object-rest-spread"]
|
||||||
|
}
|
|
@ -16,6 +16,11 @@ A freesewing plugin that provides the following plugins in one bundle:
|
||||||
4) [plugin-logo](https://github.com/freesewing/plugin-logo) : Add our logo to your patterns
|
4) [plugin-logo](https://github.com/freesewing/plugin-logo) : Add our logo to your patterns
|
||||||
5) [plugin-title](https://github.com/freesewing/plugin-title) : Add pretty titles to your pattern parts
|
5) [plugin-title](https://github.com/freesewing/plugin-title) : Add pretty titles to your pattern parts
|
||||||
|
|
||||||
|
Note that these are all **build-time plugins**. In other words, plugins used by developers/pattern designers,
|
||||||
|
rather than run-time plugins that are used when generating patterns.
|
||||||
|
|
||||||
|
Without exception, all freesewing patterns use all these 5 plugins, so it made sense to bundle them.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
To load this plugin, add it to your instantiated pattern.
|
To load this plugin, add it to your instantiated pattern.
|
||||||
|
|
121
packages/plugin-bundle/package-lock.json
generated
121
packages/plugin-bundle/package-lock.json
generated
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"name": "@freesewing/plugin-debug",
|
"name": "@freesewing/plugin-bundle",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
|
@ -13,6 +13,12 @@
|
||||||
"@babel/highlight": "7.0.0-beta.53"
|
"@babel/highlight": "7.0.0-beta.53"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@babel/helper-plugin-utils": {
|
||||||
|
"version": "7.0.0-beta.56",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.56.tgz",
|
||||||
|
"integrity": "sha512-6IlFMU13X7gwnnMldDHwfc7IqngqCH/KfiU7I+GdNoZPnddmjghc87E/zKHaJpWdX1VvXCCelp2EnKq0rgBQ8w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@babel/highlight": {
|
"@babel/highlight": {
|
||||||
"version": "7.0.0-beta.53",
|
"version": "7.0.0-beta.53",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.53.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.53.tgz",
|
||||||
|
@ -24,6 +30,50 @@
|
||||||
"js-tokens": "3.0.2"
|
"js-tokens": "3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@babel/plugin-proposal-object-rest-spread": {
|
||||||
|
"version": "7.0.0-beta.56",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.56.tgz",
|
||||||
|
"integrity": "sha512-onVk2kI39dzkDP+SzX6eC3nAkq5yemiiZX+AuXAmshOyuz+ZYUu5b+zzXKw0oPFTSnMnlIfJItQCcVzesXcU6A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/helper-plugin-utils": "7.0.0-beta.56",
|
||||||
|
"@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.56"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@babel/plugin-syntax-object-rest-spread": {
|
||||||
|
"version": "7.0.0-beta.56",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.56.tgz",
|
||||||
|
"integrity": "sha512-rDqe3TN5cZaUg4zi3Kzfq5qySS6IcEs19WE7GHlmelgQ1QXy9d/tsPEAWHZTLrG4mjbbEFJZdLvAi+LSGdhJAQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/helper-plugin-utils": "7.0.0-beta.56"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@freesewing/plugin-cutonfold": {
|
||||||
|
"version": "0.9.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@freesewing/plugin-cutonfold/-/plugin-cutonfold-0.9.0.tgz",
|
||||||
|
"integrity": "sha512-FZC6bSaDMgXKDzIU5ynByHmiVIVDXKzB9rlxZyldv+q8c0T/xfJ/x15wcey2Bffj/pv37hzLI+CocwGLHjWH7g=="
|
||||||
|
},
|
||||||
|
"@freesewing/plugin-dimension": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@freesewing/plugin-dimension/-/plugin-dimension-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-W4O3p4LlvNVt9bRG/2obKrzAWqX7MogdX2E1TYN8nJX0+KMBKArvQyR6RnODXWHuK2Mh+KZkF/dqVKqAc9EMDg=="
|
||||||
|
},
|
||||||
|
"@freesewing/plugin-grainline": {
|
||||||
|
"version": "0.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@freesewing/plugin-grainline/-/plugin-grainline-0.0.2.tgz",
|
||||||
|
"integrity": "sha512-9aaUvxK9rdXMpOZhR+/Ew8VDa9CFmDKF8lULupETd99h0E8XT6iTVeiRWuufQ1hpidYzfshN3Iz2VIIjURj+mA=="
|
||||||
|
},
|
||||||
|
"@freesewing/plugin-logo": {
|
||||||
|
"version": "0.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@freesewing/plugin-logo/-/plugin-logo-0.3.2.tgz",
|
||||||
|
"integrity": "sha512-cYmMAcvWl7B0RC3LUaCNRVj98nDIsT47Uf+84fQAnsAeZeAyiA1Y1NmPlmb3n30znlFwiJYjII7cRBn73l6wGQ=="
|
||||||
|
},
|
||||||
|
"@freesewing/plugin-title": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@freesewing/plugin-title/-/plugin-title-0.6.2.tgz",
|
||||||
|
"integrity": "sha512-OpiM4qQ0kN8NAP/OZkjveiMcebwk/ZBwfng9sVFDxp3zAB1YisoYgYjFoURCqR7ePAMbAa66sXD+o0YgITR9wg=="
|
||||||
|
},
|
||||||
"@samverschueren/stream-to-observable": {
|
"@samverschueren/stream-to-observable": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz",
|
||||||
|
@ -447,6 +497,22 @@
|
||||||
"babel-runtime": "6.26.0"
|
"babel-runtime": "6.26.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"babel-plugin-syntax-object-rest-spread": {
|
||||||
|
"version": "6.13.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
|
||||||
|
"integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"babel-plugin-transform-object-rest-spread": {
|
||||||
|
"version": "6.26.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
|
||||||
|
"integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"babel-plugin-syntax-object-rest-spread": "6.13.0",
|
||||||
|
"babel-runtime": "6.26.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"babel-register": {
|
"babel-register": {
|
||||||
"version": "6.26.0",
|
"version": "6.26.0",
|
||||||
"resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
|
"resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
|
||||||
|
@ -3025,6 +3091,15 @@
|
||||||
"yallist": "2.1.2"
|
"yallist": "2.1.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"magic-string": {
|
||||||
|
"version": "0.22.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
|
||||||
|
"integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"vlq": "0.2.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"map-cache": {
|
"map-cache": {
|
||||||
"version": "0.2.2",
|
"version": "0.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
|
||||||
|
@ -3509,9 +3584,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"path-parse": {
|
"path-parse": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
|
||||||
"integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
|
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"pify": {
|
"pify": {
|
||||||
|
@ -3814,7 +3889,7 @@
|
||||||
"integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
|
"integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"path-parse": "1.0.5"
|
"path-parse": "1.0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resolve-url": {
|
"resolve-url": {
|
||||||
|
@ -3857,6 +3932,36 @@
|
||||||
"rollup-pluginutils": "1.5.2"
|
"rollup-pluginutils": "1.5.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rollup-plugin-commonjs": {
|
||||||
|
"version": "9.1.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.5.tgz",
|
||||||
|
"integrity": "sha512-Hy7KbvsSMNu6aCO2xabp8gBcWrTiS+EzfHkzWwZwMjrcAYuYfCLU7fP1nM4xM0FMye/13r8mzTkfb9AmDaZ1hQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"estree-walker": "0.5.2",
|
||||||
|
"magic-string": "0.22.5",
|
||||||
|
"resolve": "1.8.1",
|
||||||
|
"rollup-pluginutils": "2.3.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"estree-walker": {
|
||||||
|
"version": "0.5.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz",
|
||||||
|
"integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"rollup-pluginutils": {
|
||||||
|
"version": "2.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz",
|
||||||
|
"integrity": "sha512-JZS8aJMHEHhqmY2QVPMXwKP6lsD1ShkrcGYjhAIvqKKdXQyPHw/9NF0tl3On/xOJ4ACkxfeG7AF+chfCN1NpBg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"estree-walker": "0.5.2",
|
||||||
|
"micromatch": "2.3.11"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"rollup-plugin-filesize": {
|
"rollup-plugin-filesize": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/rollup-plugin-filesize/-/rollup-plugin-filesize-4.0.1.tgz",
|
||||||
|
@ -4668,6 +4773,12 @@
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"vlq": {
|
||||||
|
"version": "0.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
|
||||||
|
"integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"which": {
|
"which": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
"clean": "rimraf dist",
|
"clean": "rimraf dist",
|
||||||
"pretty": "npx prettier --write \"src/*.js\"",
|
"pretty": "npx prettier --write \"src/*.js\"",
|
||||||
"lint": "eslint --fix \"src/*.js\"",
|
"lint": "eslint --fix \"src/*.js\"",
|
||||||
"browserbuild": "rollup -c rollup.js --file dist/browser.js --format iife --name freesewing.plugins.bundle",
|
"browserbuild": "rollup -c rollup.js -o dist/browser.js -f iife -n freesewing_plugins_bundle --footer 'freesewing.plugins.bundle = freesewing_plugins_bundle;'",
|
||||||
"nodebuild": "rollup -c rollup.js --file dist/index.js --format cjs",
|
"nodebuild": "rollup -c rollup.js --file dist/index.js --format cjs",
|
||||||
"modulebuild": "rollup -c rollup.js --file dist/index.mjs --format es",
|
"modulebuild": "rollup -c rollup.js --file dist/index.mjs --format es",
|
||||||
"build": "npm run clean && npm run browserbuild && npm run nodebuild && npm run modulebuild"
|
"build": "npm run clean && npm run browserbuild && npm run nodebuild && npm run modulebuild"
|
||||||
|
@ -45,8 +45,10 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.56",
|
||||||
"babel-core": "^6.26.3",
|
"babel-core": "^6.26.3",
|
||||||
"babel-eslint": "^8.2.6",
|
"babel-eslint": "^8.2.6",
|
||||||
|
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||||
"eslint": "^5.2.0",
|
"eslint": "^5.2.0",
|
||||||
"eslint-config-prettier": "^2.9.0",
|
"eslint-config-prettier": "^2.9.0",
|
||||||
"eslint-plugin-prettier": "^2.6.2",
|
"eslint-plugin-prettier": "^2.6.2",
|
||||||
|
@ -55,9 +57,10 @@
|
||||||
"prettier": "^1.13.7",
|
"prettier": "^1.13.7",
|
||||||
"rimraf": "^2.6.2",
|
"rimraf": "^2.6.2",
|
||||||
"rollup-plugin-babel": "^3.0.7",
|
"rollup-plugin-babel": "^3.0.7",
|
||||||
|
"rollup-plugin-commonjs": "9.1.5",
|
||||||
"rollup-plugin-filesize": "^4.0.1",
|
"rollup-plugin-filesize": "^4.0.1",
|
||||||
"rollup-plugin-json": "^3.0.0",
|
"rollup-plugin-json": "^3.0.0",
|
||||||
"rollup-plugin-node-resolve": "^3.3.0",
|
"rollup-plugin-node-resolve": "3.3.0",
|
||||||
"rollup-plugin-terser": "^1.0.1"
|
"rollup-plugin-terser": "^1.0.1"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
|
@ -65,5 +68,12 @@
|
||||||
"README.md",
|
"README.md",
|
||||||
"package-lock.json",
|
"package-lock.json",
|
||||||
"package.json"
|
"package.json"
|
||||||
]
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"@freesewing/plugin-cutonfold": "0.9.0",
|
||||||
|
"@freesewing/plugin-dimension": "0.4.0",
|
||||||
|
"@freesewing/plugin-grainline": "0.0.2",
|
||||||
|
"@freesewing/plugin-logo": "0.3.2",
|
||||||
|
"@freesewing/plugin-title": "0.6.2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { terser } from "rollup-plugin-terser";
|
import { terser } from "rollup-plugin-terser";
|
||||||
import babel from "rollup-plugin-babel";
|
import babel from "rollup-plugin-babel";
|
||||||
import resolve from "rollup-plugin-node-resolve";
|
import resolve from "rollup-plugin-node-resolve";
|
||||||
|
import commonjs from "rollup-plugin-commonjs";
|
||||||
import json from "rollup-plugin-json";
|
import json from "rollup-plugin-json";
|
||||||
import { version, name, description, author, license } from "./package.json";
|
import { version, name, description, author, license } from "./package.json";
|
||||||
|
|
||||||
|
@ -11,16 +12,13 @@ export default {
|
||||||
browser: true
|
browser: true
|
||||||
}),
|
}),
|
||||||
json(),
|
json(),
|
||||||
|
commonjs(),
|
||||||
babel({
|
babel({
|
||||||
exclude: "node_modules/**"
|
exclude: "node_modules/**"
|
||||||
}),
|
}),
|
||||||
terser({
|
terser({
|
||||||
output: {
|
output: {
|
||||||
preamble: `/**\n * ${name} | v${version}\n * ${
|
preamble: `/**\n * ${name} | v${version}\n * ${description}\n * (c) ${new Date().getFullYear()} ${author}\n * @license ${license}\n */`
|
||||||
description
|
|
||||||
}\n * (c) ${new Date().getFullYear()} ${author}\n * @license ${
|
|
||||||
license
|
|
||||||
}\n */`
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,20 +1,40 @@
|
||||||
|
import cutonfold from "@freesewing/plugin-cutonfold";
|
||||||
|
import dimension from "@freesewing/plugin-dimension";
|
||||||
|
import grainline from "@freesewing/plugin-grainline";
|
||||||
|
import logo from "@freesewing/plugin-logo";
|
||||||
|
import title from "@freesewing/plugin-title";
|
||||||
import { version, name } from "../package.json";
|
import { version, name } from "../package.json";
|
||||||
|
|
||||||
|
let bundle = [cutonfold, dimension, grainline, logo, title];
|
||||||
|
|
||||||
|
function bundleHooks() {
|
||||||
|
let hooks = {};
|
||||||
|
for (let plugin of bundle) {
|
||||||
|
for (let i in plugin.hooks) {
|
||||||
|
if (typeof hooks[i] === "undefined") hooks[i] = [];
|
||||||
|
let hook = plugin.hooks[i];
|
||||||
|
if (typeof hook === "function") hooks[i].push(hook);
|
||||||
|
else if (typeof hook === "array") {
|
||||||
|
for (let method of hook) hooks[i].push(method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hooks;
|
||||||
|
}
|
||||||
|
|
||||||
|
function bundleMacros() {
|
||||||
|
let macros = {};
|
||||||
|
for (let plugin of bundle) {
|
||||||
|
for (let i in plugin.macros) macros[i] = plugin.macros[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return macros;
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: name,
|
name: name,
|
||||||
version: version,
|
version: version,
|
||||||
hooks: {
|
hooks: bundleHooks(),
|
||||||
debug: function(next, d = "", e = "", b = "", u = "", g = "") {
|
macros: bundleMacros()
|
||||||
console.log(
|
|
||||||
"%cDebug",
|
|
||||||
"color: #dd69dd; font-weight: bold",
|
|
||||||
d,
|
|
||||||
e,
|
|
||||||
b,
|
|
||||||
u,
|
|
||||||
g
|
|
||||||
);
|
|
||||||
next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue