{"version":3,"sources":["../../react-kicad-module/src/module.js","../../react-kicad-module/src/layer.js","../../react-kicad-module/src/pad.js","../../react-kicad-module/src/colors.js","../../react-kicad-module/src/slider.js","action-creaters.ts","option-list.tsx","dropzone.tsx","main.tsx","download.tsx","update.tsx","App.tsx","serviceWorker.ts","store.ts","index.tsx","../../react-kicad-module/src/utils.js","../../react-kicad-module/index.js"],"names":["__createBinding","this","Object","create","o","m","k","k2","undefined","defineProperty","enumerable","get","__setModuleDefault","v","value","__importStar","mod","__esModule","result","prototype","hasOwnProperty","call","__importDefault","exports","KicadModule","react_1","require","styled_components_1","kicad_module_parser_1","utils_1","layer_1","colors_1","slider_1","FRONT_LAYERS","BACK_LAYERS","USER_LAYERS","STANDARD_LAYERS","Module","_layers","layers","Proxy","target","prop","receiver","text","pads","shapes","color","BOARD_COLORS","Reflect","Layers","default","div","Svg","svg","reFrontBack","Row","module","data","parse_module","_module","minxy","maxxy","minmax","x","forEach","_layer","push","pad","R","console","log","JSON","stringify","type","start","end","len","center","add","multiply","points","control1","control2","expander","diff","hw","INITIAL_LAYER_ORDER","keys","filter","indexOf","useState","LayerOrders","setLayerOrders","fromEntries","map","showLayer","setShowLayer","layerStackingOrder","setLayerStackingOrder","activeLayer","_setActiveLayer","zref","getZ","re_val","exec","layerGroupName","lg","newlayerOrders","ref","useRef","contianerHeight","setContianerHeight","useEffect","current","Math","ceil","offsetWidth","window","addEventListener","createElement","style","position","height","xmlns","viewBox","entries","sort","y","entry","Layer","key","layer","z","listStyleType","margin","paddingLeft","paddingTop","cursor","onClick","ev","stopPropagation","preventDefault","indx","newLayerGroupOrder","slice","setActiveLayer","activeColor","checked","sl","onChange","marginTop","verticalAlign","pad_1","i","_a","_b","_c","at","fontSize","effects","font","size","dominantBaseline","textAnchor","className","fill","x1","y1","x2","y2","stroke","strokeWidth","width","max","rotate","angle","r","d","abs","cx","cy","inner_string","join","Plating","children","shape","drill","offset","rx","min","ry","main","Fragment","pad_type","label","id","transform","_BOARD_COLORS_NAMES","LAYER_COLORS","COLOR_NAME","LIGHT_COLORS","colorHash","sdbm_1","padding","hex","Number","toString","length","decimalToHex","BLACK","DARKDARKGRAY","DARKGRAY","LIGHTGRAY","WHITE","LIGHTYELLOW","DARKBLUE","DARKGREEN","DARKCYAN","DARKRED","DARKMAGENTA","DARKBROWN","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN","LIGHTBLUE","LIGHTGREEN","LIGHTCYAN","LIGHTRED","LIGHTMAGENTA","YELLOW","PUREBLUE","PUREGREEN","PURECYAN","PURERED","PUREMAGENTA","PUREYELLOW","colors","ANCHOR","CURSOR","GRID","RATSNEST","VIAS","WORKSHEET","Margin","_BOARD_COLORS","pair","alert","uuid_1","v4","CheckBoxWrapper","CheckBox","CheckBoxLabel","htmlFor","props","input","INVALID_FILE_MESSAGE","process_content_action","content","dispatch","getState","a","options","txactions","txfile","rawfile","file_path","actions","preprocess_object","preprocess_stroke","prev_actions","ttp_formData","FormData","append","File","axios","post","params","headers","ttp_response","response","status","message","statusText","payload","_options","dpi","parseFloat","precision","scale_factor","formData","mapStateToProps","state","options_validation","mapDispatchToProps","update_parameter","update","create_update_option_action","DropDownOption","connect","select_options","FormControl","InputLabel","Select","error","e","MenuItem","TextOption","ListItem","TextField","helperText","CheckOption","component","FormControlLabel","control","Checkbox","name","List","minWidth","whiteSpace","format","useStyles","makeStyles","theme","dropzone","DropZone","on_drop","path","file","endsWith","contents","create_path_action","on_error","drop_error","classes","onDrop","persist","dataTransfer","items","fileItem","kind","getAsFile","files","onDragOver","event","paddingBottom","paper","spacing","display","justifyContent","alignItems","root","wrapper","fabProgress","top","left","zIndex","module_success","module_contents","error_message","loading","module_format","prev_options","convert_to_pads","Typography","fontFamily","Fab","CircularProgress","Paper","href","rel","textDecoration","filename","new_path","Button","disabled","variant","element","document","setAttribute","encodeURIComponent","body","appendChild","click","removeChild","download","equal","backgroundColor","borderColor","appBar","drawer","flexShrink","downloads","indigo","minHeight","bottom","marginBottom","drawerPaper","flexGrow","toolbar","mixins","red","palette","secondary","dark","headerSpan","marginLeft","marginRight","handle","paddingRight","has_contents","MyDrawer","Drawer","CssBaseline","AppBar","Toolbar","noWrap","Boolean","location","hostname","match","is_float","is_int","ValidateOptions","out","module_name","module_value","test","default_options","ignore_hidden_layers","units","dot_svg","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","store","createStore","action","replace","is_invalid","file_contents","success","svg2ModOptions","applyMiddleware","thunkMiddleware","ReactDOM","render","getElementById","navigator","serviceWorker","ready","then","registration","unregister","b","c","cos","PI","s","sin","dx","sqrt","module_1"],"mappings":"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","file":"static/js/main.faca1559.chunk.js","sourcesContent":["\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KicadModule = void 0;\nconst react_1 = __importStar(require(\"react\"));\nconst styled_components_1 = __importDefault(require(\"styled-components\"));\nconst kicad_module_parser_1 = require(\"kicad-module-parser\");\nconst utils_1 = require(\"./utils\");\nconst layer_1 = require(\"./layer\");\nconst colors_1 = require(\"./colors\");\nconst slider_1 = __importDefault(require(\"./slider\"));\nconst FRONT_LAYERS = [\"F.Cu\", \"F.Adhes\", \"F.Paste\", \"F.SilkS\", \"F.Mask\", \"F.CrtYd\", \"F.Fab\"];\nconst BACK_LAYERS = [\"F.Cu\", \"F.Adhes\", \"F.Paste\", \"F.SilkS\", \"F.Mask\", \"F.CrtYd\", \"F.Fab\"];\nconst USER_LAYERS = [\"Dwgs.User\", \"Cmts.User\", \"Eco1.User\", \"Eco2.User\", \"Edge.Cuts\"];\nconst STANDARD_LAYERS = [...FRONT_LAYERS, ...BACK_LAYERS, ...USER_LAYERS];\n// const randomColor = () => \"#\" + Math.floor(Math.random() * 16777215).toString(16);\nclass Module {\n constructor() {\n this._layers = {};\n this.layers = new Proxy(this._layers, {\n // @ts-ignore (keyof layerset is a string)\n get: (target, prop, receiver) => {\n if (!(prop in target)) {\n target[prop] = {\n text: [],\n pads: [],\n shapes: [],\n color: colors_1.BOARD_COLORS[prop]\n };\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n }\n}\n// const Data = styled.div`\n// font-family: 'Roboto Mono', monospace;\n// `\nconst Drawing = styled_components_1.default.div `\nposition: relative;\nheight: calc(100vh - 5rem);\n`;\n//height: calc(100% - 4rem);\nconst Layers = styled_components_1.default.div `\nposition: absolute;\n`;\nconst Svg = styled_components_1.default.svg `\nbackground-color: black;\nposition: absolute;\nmax-height: 100%;\nfont-family: 'Jura', sans-serif;\n`;\nconst reFrontBack = /^([FB])\\./;\nconst Row = styled_components_1.default.div `\ndisplay: flex;\nflex-direction: row;\nalign-items: flex-start;\n`;\nconst KicadModule = ({ module }) => {\n const data = kicad_module_parser_1.parse_module(module);\n const _module = new Module();\n let minxy = undefined;\n let maxxy = undefined;\n const minmax = (x) => {\n if (!minxy || !maxxy) {\n minxy = [x[0], x[1]];\n maxxy = [x[0], x[1]];\n return;\n }\n if (x[0] < minxy[0]) {\n minxy[0] = x[0];\n }\n if (x[1] < minxy[1]) {\n minxy[1] = x[1];\n }\n if (x[0] > maxxy[0]) {\n maxxy[0] = x[0];\n }\n if (x[1] > maxxy[1]) {\n maxxy[1] = x[1];\n }\n };\n data.text.forEach(text => {\n if (text.layers)\n for (let _layer of text.layers) {\n let LAYER = _module.layers[_layer];\n LAYER.text.push(text);\n }\n });\n data.pads.forEach(pad => {\n if (pad.layers)\n for (let _layer of pad.layers) {\n let LAYER = _module.layers[_layer];\n LAYER.pads.push(pad);\n }\n });\n data.shapes.forEach((x) => {\n let R;\n if (x.layers) {\n for (let _layer of x.layers) {\n _module.layers[_layer].shapes.push(x);\n }\n }\n else {\n console.log('[react-kicad-module] unknown layers: ' + JSON.stringify(x));\n }\n switch (x.type) {\n case \"fp_line\":\n minmax(x.start);\n minmax(x.end);\n break;\n case \"fp_arc\":\n R = utils_1.len(x.center, x.end);\n minmax(utils_1.add(x.center, [R, R]));\n minmax(utils_1.add(x.center, utils_1.multiply(-1, [R, R])));\n break;\n case \"fp_circle\":\n R = utils_1.len(x.center, x.end);\n minmax(utils_1.add(x.center, [R, R]));\n minmax(utils_1.add(x.center, utils_1.multiply(-1, [R, R])));\n break;\n case \"fp_poly\":\n x.points.forEach(x => minmax(x));\n break;\n case \"fp_curve\":\n minmax(x.start);\n minmax(x.control1);\n minmax(x.control2);\n minmax(x.end);\n break;\n }\n });\n minxy = minxy || [0, 0];\n maxxy = maxxy || [1, 1];\n const expander = utils_1.multiply(0.3, utils_1.diff(maxxy, minxy));\n minxy = utils_1.diff(minxy, expander);\n maxxy = utils_1.add(expander, maxxy);\n const hw = utils_1.add(maxxy, utils_1.multiply(-1, minxy));\n // for (const [key, value] of Object.entries(_module._layers)) {\n // console.log(`[react-kicad-module] ${key}: ${value}`);\n // }\n const INITIAL_LAYER_ORDER = {\n \"F\": FRONT_LAYERS,\n \"B\": BACK_LAYERS,\n \"O\": [...USER_LAYERS, ...Object.keys(_module._layers).filter(x => STANDARD_LAYERS.indexOf(x) === -1)]\n };\n const [LayerOrders, setLayerOrders] = react_1.useState(INITIAL_LAYER_ORDER);\n const [showLayer, setShowLayer] = react_1.useState(Object.fromEntries(Object.keys(_module._layers).map(x => [x, true])));\n const [layerStackingOrder, setLayerStackingOrder] = react_1.useState([\"F\", \"B\", \"O\"]);\n // alert(`current stack order ${JSON.stringify(layerStackingOrder)} ` )\n const [activeLayer, _setActiveLayer] = react_1.useState(\"F.Cu\");\n const setActiveLayer = (x) => {\n // set the active layer group\n let re_val = reFrontBack.exec(x);\n let layerGroupName = (re_val ? re_val[1] : \"O\");\n let indx = layerStackingOrder.indexOf(layerGroupName);\n if (indx !== 0) {\n let newLayerGroupOrder = [layerGroupName, ...layerStackingOrder.slice(0, indx), ...layerStackingOrder.slice(indx + 1),];\n // alert(`setting stack order from ${JSON.stringify(layerGroupName)} to ${JSON.stringify(newLayerGroupOrder)} ` )\n setLayerStackingOrder(newLayerGroupOrder);\n }\n // alert(\"actually setting active layer: \" + x)\n // set the active layer\n _setActiveLayer(x);\n };\n const zref = {};\n const getZ = (x) => {\n if (x in zref)\n return zref[x];\n let re_val = reFrontBack.exec(x);\n let layerGroupName = (re_val ? re_val[1] : \"O\");\n let lg = LayerOrders[layerGroupName];\n if (typeof lg === \"undefined\") {\n console.log(`[react-kicad-module] unknown layer group name ${layerGroupName} of ${JSON.stringify(Object.keys(LayerOrders))}`);\n return 0;\n }\n if (lg.indexOf(x) === -1) {\n lg = [x, ...lg];\n let newlayerOrders = { ...LayerOrders };\n newlayerOrders[layerGroupName] = lg;\n setLayerOrders(newlayerOrders);\n }\n const z = (lg.indexOf(x) +\n 100 * (3 - layerStackingOrder.indexOf(layerGroupName)) +\n ((activeLayer === x) ? 1000 : 0));\n // alert(`layer: ${x} -- z: ${z}`)\n return z;\n };\n const ref = react_1.useRef(null);\n const [contianerHeight, setContianerHeight] = react_1.useState(\"1000px\");\n // INITIAL ELEMENT WIDTH\n react_1.useEffect(() => {\n const current = ref.current;\n if (current) {\n setContianerHeight(`${Math.ceil(current.offsetWidth * hw[1] / hw[0]) + 10}px`);\n }\n }, [ref.current]);\n // ELEMNT WIDTN ON RESIZE\n window.addEventListener('resize', () => {\n const current = ref.current;\n if (current) {\n setContianerHeight(`${Math.ceil(current.offsetWidth * hw[1] / hw[0]) + 10}px`);\n }\n });\n return (react_1.default.createElement(\"div\", { ref: ref, style: {\n position: \"relative\",\n height: contianerHeight\n } },\n react_1.default.createElement(Svg, { xmlns: \"http://www.w3.org/2000/svg\", viewBox: `${minxy[0]} ${minxy[1]} ${hw[0]} ${hw[1]} ` }, Object.entries(_module._layers)\n .filter(x => showLayer[x[0]])\n .sort((x, y) => getZ(x[0]) - getZ(y[0]))\n .map(entry => react_1.default.createElement(layer_1.Layer, { key: entry[0], layer: entry[1], z: 0 }))),\n react_1.default.createElement(Layers, null,\n react_1.default.createElement(\"ul\", { style: { listStyleType: 'none', margin: \"0px\", paddingLeft: \"1.3rem\", paddingTop: \"1.3rem\" } },\n \" \",\n Object.keys(_module._layers)\n .map(x => {\n const color = _module.layers[x].color;\n return (react_1.default.createElement(\"li\", { key: x, style: { color: color, cursor: \"default\" }, onClick: (ev) => {\n ev.stopPropagation();\n ev.preventDefault();\n setActiveLayer(x);\n } },\n react_1.default.createElement(Row, null,\n react_1.default.createElement(slider_1.default, { activeColor: color, checked: showLayer[x], onClick: (ev) => {\n ev.stopPropagation();\n ev.preventDefault();\n const sl = { ...showLayer };\n sl[x] = !sl[x];\n setShowLayer(sl);\n }, onChange: (ev) => {\n ev.stopPropagation();\n ev.preventDefault();\n const sl = { ...showLayer };\n sl[x] = ev.target.checked;\n setShowLayer(sl);\n } }),\n react_1.default.createElement(\"span\", { style: { marginTop: \"0.2rem\", verticalAlign: \"center\" } }, x))));\n }),\n \" \"))));\n};\nexports.KicadModule = KicadModule;\nexports.default = exports.KicadModule;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Layer = void 0;\nconst react_1 = __importDefault(require(\"react\"));\nconst pad_1 = __importDefault(require(\"./pad\"));\nconst utils_1 = require(\"./utils\");\nconst Layer = ({ layer, z }) => {\n console.log(\"layer\", layer);\n const text = layer.text.map((x, i) => {\n var _a, _b, _c;\n return ((react_1.default.createElement(\"text\", { key: i, x: x.at.x, y: x.at.y, style: { fontSize: (((_c = (_b = (_a = x.effects) === null || _a === void 0 ? void 0 : _a.font) === null || _b === void 0 ? void 0 : _b.size) === null || _c === void 0 ? void 0 : _c.height) * 100) || \"154\" }, dominantBaseline: \"middle\", textAnchor: \"middle\", className: \"fonty\", color: layer.color, fill: layer.color }, x.value)));\n });\n const shapes = layer.shapes.map((x, i) => {\n // console.log(\"width: \", x.width)\n switch (x.type) {\n case \"fp_line\":\n return (react_1.default.createElement(\"line\", { key: i, x1: x.start[0], y1: x.start[1], x2: x.end[0], y2: x.end[1], stroke: layer.color, strokeWidth: (x.width && Math.max(x.width, 25)) || \"0.025\" }));\n case \"fp_arc\":\n let end = utils_1.rotate(x.center, x.end, x.angle);\n let r = utils_1.len(x.center, x.end);\n // alert(`${x.center[0]},${x.center[1]} ${x.end[0]},${x.end[1]} ${end[0]},${end[1]} `)\n // alert(x.angle)\n return (react_1.default.createElement(\"path\", { key: i, d: `M ${x.end[0]} ${x.end[1]} A ${r} ${r} 0 ${Math.abs(x.angle) > 180 ? 1 : 0} ${x.angle > 0 ? 1 : 0} ${end[0]} ${end[1]}`, fill: \"none\", stroke: layer.color, strokeWidth: (x.width && Math.max(x.width, 25)) || \"0.025\" }));\n case \"fp_circle\":\n return (react_1.default.createElement(\"circle\", { key: i, cx: x.center[0], cy: x.center[1], r: utils_1.len(x.center, x.end), strokeWidth: (x.width && Math.max(x.width, 25)) || \"0.025\", fill: layer.color, stroke: \"yellow\" }));\n case \"fp_poly\":\n let inner_string = x.points.map(x => `${x[0]},${x[1]}`).join(\" L \");\n return (react_1.default.createElement(\"path\", { key: i, d: `M ${inner_string}`, stroke: layer.color, strokeWidth: (x.width && Math.max(x.width, 25)) || \"0.025\" }));\n case \"fp_curve\":\n return (react_1.default.createElement(\"path\", { key: i, d: `M ${x.start[0]},${x.start[1]} C ${x.control1[0]},${x.control1[1]} ${x.control2[0]},${x.control2[1]} ${x.end[0]},${x.end[1]}`, stroke: layer.color, strokeWidth: (x.width && Math.max(x.width, 25)) || \"0.025\" }));\n default:\n console.log(\"unhandled shape in layer: \" + JSON.stringify(x));\n return null;\n }\n });\n return (react_1.default.createElement(\"g\", { z: z },\n layer.pads.map(x => react_1.default.createElement(pad_1.default, { pad: x, color: layer.color })),\n shapes,\n text));\n};\nexports.Layer = Layer;\nexports.default = exports.Layer;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst react_1 = __importDefault(require(\"react\"));\nconst Plating = ({ pad, children, color }) => {\n // if(pad.pad_type == \"\")\n // \"thru_hole\" | \"np_thru_hole\" | \"smd\" | \"connect\";\n var _a, _b;\n switch (pad.shape) {\n case \"oval\":\n return react_1.default.createElement(\"rect\", { x: (pad.at.x + (((_b = (_a = pad.drill) === null || _a === void 0 ? void 0 : _a.offset) === null || _b === void 0 ? void 0 : _b.x) || 0) - pad.size.width / 2), y: (pad.at.y - pad.size.height / 2), height: pad.size.height, width: pad.size.width, rx: Math.min(pad.size.width, pad.size.height) / 2, ry: Math.min(pad.size.width, pad.size.height) / 2, fill: color });\n case \"circle\":\n return react_1.default.createElement(\"circle\", { cx: pad.at.x, cy: pad.at.y, r: pad.size.height / 2, fill: color }, children);\n case \"rect\":\n return react_1.default.createElement(\"rect\", { x: (pad.at.x - pad.size.width / 2), y: (pad.at.y - pad.size.height / 2), width: pad.size.width, height: pad.size.height, fill: color }, children);\n case \"trapezoid\":\n case \"roundrect\":\n case \"custom\":\n return react_1.default.createElement(\"circle\", { fill: 'red' });\n }\n};\nconst Pad = ({ pad, color }) => {\n const main = (react_1.default.createElement(react_1.default.Fragment, null,\n pad.pad_type === \"np_thru_hole\" ? null : react_1.default.createElement(Plating, { pad: pad, color: color }),\n pad.drill ?\n react_1.default.createElement(\"rect\", { x: (pad.at.x - pad.drill.width / 2), y: (pad.at.y - pad.drill.height / 2), width: pad.drill.width, height: pad.drill.height, rx: Math.min(pad.drill.width, pad.drill.height) / 2, ry: Math.min(pad.drill.width, pad.drill.height) / 2, fill: \"black\" })\n : null));\n const label = pad.id ? (react_1.default.createElement(\"text\", { x: pad.at.x, y: pad.at.y, style: { fontSize: \"1\" }, dominantBaseline: \"middle\", textAnchor: \"middle\", className: \"fonty\", fill: \"white\" }, pad.id)) : null;\n // if(pad.at.angle) alert(`rotate(1 ${pad.at.x} ${pad.at.y})`)\n return (react_1.default.createElement(react_1.default.Fragment, null,\n pad.at.angle ?\n react_1.default.createElement(\"g\", { transform: `rotate(${-pad.at.angle} ${pad.at.x} ${pad.at.y})` }, main) :\n main,\n label));\n};\nexports.default = Pad;\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BOARD_COLORS = exports._BOARD_COLORS_NAMES = exports.LAYER_COLORS = exports.COLOR_NAME = exports.LIGHT_COLORS = exports.colorHash = void 0;\n// fonts live in helpers/tools_to_build_newstroke-font/README.md\n// taken mostly from colors.cpp and color_settings.cpp\nconst sdbm_1 = __importDefault(require(\"sdbm\"));\nfunction colorHash(x) {\n return \"#\" + decimalToHex(sdbm_1.default(x) % 0x1000000, 6);\n}\nexports.colorHash = colorHash;\nfunction decimalToHex(d, padding) {\n var hex = Number(d).toString(16);\n padding =\n typeof padding === \"undefined\" || padding === null\n ? (padding = 2)\n : padding;\n while (hex.length < padding) {\n hex = \"0\" + hex;\n }\n return hex;\n}\n/*\nfunction decimalToHex(d, padding) {\n var hex = Number(d).toString(16);\n padding =\n typeof padding === \"undefined\" || padding === null\n ? (padding = 2)\n : padding;\n while (hex.length < padding) {\n hex = \"0\" + hex;\n }\n return hex;\n}\n\nconst raw_colors = {\n BLACK: [0, 0, 0],\n DARKDARKGRAY: [72, 72, 72],\n DARKGRAY: [132, 132, 132],\n LIGHTGRAY: [194, 194, 194],\n WHITE: [255, 255, 255],\n LIGHTYELLOW: [194, 255, 255],\n DARKBLUE: [72, 0, 0],\n DARKGREEN: [0, 72, 0],\n DARKCYAN: [72, 72, 0],\n DARKRED: [0, 0, 72],\n DARKMAGENTA: [72, 0, 72],\n DARKBROWN: [0, 72, 72],\n BLUE: [132, 0, 0],\n GREEN: [0, 132, 0],\n CYAN: [132, 132, 0],\n RED: [0, 0, 132],\n MAGENTA: [132, 0, 132],\n BROWN: [0, 132, 132],\n LIGHTBLUE: [194, 0, 0],\n LIGHTGREEN: [0, 194, 0],\n LIGHTCYAN: [194, 194, 0],\n LIGHTRED: [0, 0, 194],\n LIGHTMAGENTA: [194, 0, 194],\n YELLOW: [0, 194, 194],\n PUREBLUE: [255, 0, 0],\n PUREGREEN: [0, 255, 0],\n PURECYAN: [255, 255, 0],\n PURERED: [0, 0, 255],\n PUREMAGENTA: [255, 0, 255],\n PUREYELLOW: [0, 255, 255],\n};\n\nObject.fromEntries(\n Object.entries(raw_colors)\n .map((pair) => [pair[0], pair[1].map((x) => decimalToHex(x, 2))])\n .map((pair) => [pair[0], `#${pair[1][2]}${pair[1][1]}${pair[1][0]}`])\n);\n\n*/\nexports.LIGHT_COLORS = {\n BLACK: \"DARKDARKGRAY\",\n DARKDARKGRAY: \"DARKGRAY\",\n DARKGRAY: \"LIGHTGRAY\",\n LIGHTGRAY: \"WHITE\",\n WHITE: \"WHITE\",\n LIGHTYELLOW: \"WHITE\",\n DARKBLUE: \"BLUE\",\n DARKGREEN: \"GREEN\",\n DARKCYAN: \"CYAN\",\n DARKRED: \"RED\",\n DARKMAGENTA: \"MAGENTA\",\n DARKBROWN: \"BROWN\",\n BLUE: \"LIGHTBLUE\",\n GREEN: \"LIGHTGREEN\",\n CYAN: \"LIGHTCYAN\",\n RED: \"LIGHTRED\",\n MAGENTA: \"LIGHTMAGENTA\",\n BROWN: \"YELLOW\",\n LIGHTBLUE: \"PUREBLUE\",\n LIGHTGREEN: \"PUREGREEN\",\n LIGHTCYAN: \"PURECYAN\",\n LIGHTRED: \"PURERED\",\n LIGHTMAGENTA: \"PUREMAGENTA\",\n YELLOW: \"PUREYELLOW\",\n PUREBLUE: \"WHITE\",\n PUREGREEN: \"WHITE\",\n PURECYAN: \"WHITE\",\n PURERED: \"WHITE\",\n PUREMAGENTA: \"WHITE\",\n PUREYELLOW: \"WHITE\",\n};\nexports.COLOR_NAME = {\n BLACK: \"Black\",\n DARKDARKGRAY: \"Gray 1\",\n DARKGRAY: \"Gray 2\",\n LIGHTGRAY: \"Gray 3\",\n WHITE: \"White\",\n LIGHTYELLOW: \"L.Yellow\",\n DARKBLUE: \"Blue 1\",\n DARKGREEN: \"Green 1\",\n DARKCYAN: \"Cyan 1\",\n DARKRED: \"Red 1\",\n DARKMAGENTA: \"Magenta 1\",\n DARKBROWN: \"Brown 1\",\n BLUE: \"Blue 2\",\n GREEN: \"Green 2\",\n CYAN: \"Cyan 2\",\n RED: \"Red 2\",\n MAGENTA: \"Magenta 2\",\n BROWN: \"Brown 2\",\n LIGHTBLUE: \"Blue 3\",\n LIGHTGREEN: \"Green 3\",\n LIGHTCYAN: \"Cyan 3\",\n LIGHTRED: \"Red 3\",\n LIGHTMAGENTA: \"Magenta 3\",\n YELLOW: \"Yellow 3\",\n PUREBLUE: \"Blue 4\",\n PUREGREEN: \"Green 4\",\n PURECYAN: \"Cyan 4\",\n PURERED: \"Red 4\",\n PUREMAGENTA: \"Magenta 4\",\n PUREYELLOW: \"Yellow 4\",\n};\nconst colors = {\n BLACK: \"#000000\",\n DARKDARKGRAY: \"#484848\",\n DARKGRAY: \"#848484\",\n LIGHTGRAY: \"#c2c2c2\",\n WHITE: \"#ffffff\",\n LIGHTYELLOW: \"#ffffc2\",\n DARKBLUE: \"#000048\",\n DARKGREEN: \"#004800\",\n DARKCYAN: \"#004848\",\n DARKRED: \"#480000\",\n DARKMAGENTA: \"#480048\",\n DARKBROWN: \"#484800\",\n BLUE: \"#000084\",\n GREEN: \"#008400\",\n CYAN: \"#008484\",\n RED: \"#840000\",\n MAGENTA: \"#840084\",\n BROWN: \"#848400\",\n LIGHTBLUE: \"#0000c2\",\n LIGHTGREEN: \"#00c200\",\n LIGHTCYAN: \"#00c2c2\",\n LIGHTRED: \"#c20000\",\n LIGHTMAGENTA: \"#c200c2\",\n YELLOW: \"#c2c200\",\n PUREBLUE: \"#0000ff\",\n PUREGREEN: \"#00ff00\",\n PURECYAN: \"#00ffff\",\n PURERED: \"#ff0000\",\n PUREMAGENTA: \"#ff00ff\",\n PUREYELLOW: \"#ffff00\",\n};\nexports.LAYER_COLORS = {\n ANCHOR: \"BLUE\",\n \"AUX.ITEMS\": \"WHITE\",\n \"PCB.BACKGROUND\": \"BLACK\",\n CURSOR: \"WHITE\",\n \"DRC.ERROR\": \"PURERED\",\n \"DRC.WARNING\": \"PUREYELLOW\",\n \"MOD.TEXT.BK\": \"BLUE\",\n \"MOD.TEXT.FR\": \"LIGHTGRAY\",\n \"MOD.TEXT.INVISIBLE\": \"LIGHTGRAY\",\n GRID: \"DARKGRAY\",\n \"GRID.AXES\": \"LIGHTGRAY\",\n \"NO.CONNECTS\": \"BLUE\",\n \"PAD.BK\": \"GREEN\",\n \"PAD.FR\": \"RED\",\n \"PADS.PLATEDHOLES\": \"YELLOW\",\n \"PADS.TH\": \"YELLOW\",\n \"NON.PLATEDHOLES\": \"YELLOW\",\n RATSNEST: \"WHITE\",\n \"SELECT.OVERLAY\": \"DARKRED\",\n VIAS: \"BLACK\",\n \"VIA.BBLIND\": \"BROWN\",\n \"VIAS.HOLES\": \"WHITE\",\n \"VIA.MICROVIA\": \"CYAN\",\n \"VIA.THROUGH\": \"LIGHTGRAY\",\n WORKSHEET: \"DARKRED\",\n};\nexports._BOARD_COLORS_NAMES = {\n \"F.Cu\": \"RED\",\n \"In1.Cu\": \"YELLOW\",\n \"In2.Cu\": \"LIGHTMAGENTA\",\n \"In3.Cu\": \"LIGHTRED\",\n \"In4.Cu\": \"CYAN\",\n \"In5.Cu\": \"GREEN\",\n \"In6.Cu\": \"BLUE\",\n \"In7.Cu\": \"DARKGRAY\",\n \"In8.Cu\": \"MAGENTA\",\n \"In9.Cu\": \"LIGHTGRAY\",\n \"In10.Cu\": \"MAGENTA\",\n \"In11.Cu\": \"RED\",\n \"In12.Cu\": \"BROWN\",\n \"In13.Cu\": \"LIGHTGRAY\",\n \"In14.Cu\": \"BLUE\",\n \"In15.Cu\": \"GREEN\",\n \"In16.Cu\": \"RED\",\n \"In17.Cu\": \"YELLOW\",\n \"In18.Cu\": \"LIGHTMAGENTA\",\n \"In19.Cu\": \"LIGHTRED\",\n \"In20.Cu\": \"CYAN\",\n \"In21.Cu\": \"GREEN\",\n \"In22.Cu\": \"BLUE\",\n \"In23.Cu\": \"DARKGRAY\",\n \"In24.Cu\": \"MAGENTA\",\n \"In25.Cu\": \"LIGHTGRAY\",\n \"In26.Cu\": \"MAGENTA\",\n \"In27.Cu\": \"RED\",\n \"In28.Cu\": \"BROWN\",\n \"In29.Cu\": \"LIGHTGRAY\",\n \"In30.Cu\": \"BLUE\",\n \"B.Cu\": \"GREEN\",\n \"B.Adhes\": \"BLUE\",\n \"F.Adhes\": \"MAGENTA\",\n \"B.Paste\": \"LIGHTCYAN\",\n \"F.Paste\": \"RED\",\n \"B.SilkS\": \"MAGENTA\",\n \"F.SilkS\": \"CYAN\",\n \"B.Mask\": \"BROWN\",\n \"F.Mask\": \"MAGENTA\",\n \"Dwgs.User\": \"LIGHTGRAY\",\n \"Cmts.User\": \"BLUE\",\n \"Eco1.User\": \"GREEN\",\n \"Eco2.User\": \"YELLOW\",\n \"Edge.Cuts\": \"YELLOW\",\n Margin: \"LIGHTMAGENTA\",\n \"B.CrtYd\": \"DARKGRAY\",\n \"F.CrtYd\": \"LIGHTGRAY\",\n \"B.Fab\": \"BLUE\",\n \"F.Fab\": \"DARKGRAY\",\n};\nconst _BOARD_COLORS = Object.fromEntries(Object.entries(exports._BOARD_COLORS_NAMES).map((pair) => [\n pair[0],\n colors[pair[1]],\n]));\nexports.BOARD_COLORS = new Proxy(_BOARD_COLORS, {\n get: (target, prop, receiver) => {\n if (prop === \"$$typeof\")\n return Reflect.get(target, prop, receiver);\n if (!(prop in target)) {\n alert(\"color prop: '\" + prop + \"'\");\n target[prop] = colorHash(prop);\n }\n return Reflect.get(target, prop, receiver);\n },\n});\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst react_1 = __importDefault(require(\"react\"));\nconst styled_components_1 = __importDefault(require(\"styled-components\"));\nconst uuid_1 = require(\"uuid\");\nconst Slider = ({ onChange, color, activeColor, checked, onClick }) => {\n const id = uuid_1.v4();\n return (react_1.default.createElement(CheckBoxWrapper, { onClick: onClick },\n react_1.default.createElement(CheckBox, { id: id, type: \"checkbox\", onChange: onChange, color: activeColor, checked: checked }),\n react_1.default.createElement(CheckBoxLabel, { htmlFor: id, color: color })));\n};\nexports.default = Slider;\nconst CheckBoxWrapper = styled_components_1.default.div `\n position: relative;\n display: inline-block;\n`;\nconst CheckBoxLabel = styled_components_1.default.label `\n position: absolute;\n top: 0;\n left: 0;\n width: 2.6rem;\n height: 1.4rem;\n border-radius: 0.8rem;\n background: ${props => props.color || \"#bebebe\"};\n cursor: pointer;\n &::after {\n content: \"\";\n display: block;\n border-radius: 50%;\n width: 1rem;\n height: 1rem;\n margin: 0.2rem;\n background: #ffffff;\n box-shadow: 1px 3px 3px 1px rgba(0, 0, 0, 0.2);\n transition: 0.2s;\n }\n`;\nconst CheckBox = styled_components_1.default.input `\n opacity: 0;\n z-index: 1;\n width: 2.6rem;\n height: 1.4rem;\n border-radius: 0.8rem;\n &:checked + ${CheckBoxLabel} {\n background: ${props => props.color || \"#4fbe79\"};\n &::after {\n content: \"\";\n display: block;\n border-radius: 50%;\n width: 1rem;\n height: 1rem;\n margin: 0.2rem;\n margin-left: 1.4rem;\n transition: 0.2s;\n }\n }\n`;\n","import axios from \"axios\";\n// import { ThunkResult } from \"redux-thunk\";\n\nimport {\n ThunkResult,\n action,\n // set_module_action,\n update_options,\n svg2ModOptions_update,\n storeState,\n svg2ModOptions,\n // svg2ModOptions,\n} from \"./store\";\n\ninterface actionCreator {\n (...args: any[]): action;\n}\n\nconst VERBOSE = true;\nconst INVALID_FILE_MESSAGE =\n \"This does not appear to be a valid Inkscape SVG file. Note that this software is particular to the normal (not compressed) Inkscape format.\";\n\nexport function create_path_action(\n file_path: string,\n file: File\n): ThunkResult {\n return async (dispatch: { (x: action | ThunkResult): void }) => {\n if (!file_path.endsWith(\".svg\")) {\n dispatch({\n type: \"INVALID_FILE\",\n file_path,\n message: \"Not an svg file\",\n });\n return;\n }\n dispatch({ type: \"SET_PATH\", file_path, file });\n\n if (!file.size) {\n dispatch({\n type: \"INVALID_FILE\",\n file_path,\n message: \"Empty file (Zero bytes received)\",\n });\n return;\n }\n\n try {\n // @ts-ignore\n const contents = await file.text();\n\n dispatch({\n type: \"SET_RAW_SVG\",\n payload: contents,\n });\n VERBOSE && console.log(\"about to process file\");\n dispatch(process_content_action(contents));\n } catch (err) {\n dispatch({\n type: \"INVALID_FILE\",\n file_path,\n message: \"Unable to connect to the backend server\",\n });\n }\n };\n}\n\n// export function transform_file_action(\n// rawfile: string,\n// actions: string[]\n// ): ThunkResult {\n\n// //console.log(\"response.data:\", response.data);\n// if (response.statusText === \"OK\") {\n// dispatch({\n// type: \"SET_TRANSFORMED_SVG\",\n// file_path,\n// // new_path: file_path.slice(0, -3) + \"kicad_mod\",\n// payload: response.data,\n// });\n\n// dispatch(process_content_action(response.data));\n// } else {\n// dispatch({\n// type: \"INVALID_FILE\",\n// file_path,\n// message: response.data.message,\n// });\n// return;\n// }\n// };\n// }\n\nconst get_actions = (x: svg2ModOptions): string[] =>\n [\n x.preprocess_object && \"ObjectToPath\",\n x.preprocess_stroke && \"StrokeToPath\",\n ].filter((x) => !!x) as string[];\n\nexport function process_content_action(content?: string): ThunkResult {\n console.log(\"starting process_content_action\");\n return async (\n dispatch: { (x: action): void },\n getState: { (): storeState }\n ) => {\n console.log(\"processing process_content_action\");\n\n // --------------------------------------------------\n // ARGS\n // --------------------------------------------------\n var { options, txactions, txfile, rawfile, file_path } = getState();\n if (\n typeof file_path === \"undefined\" ||\n typeof rawfile === \"undefined\"\n ) {\n return;\n }\n\n // --------------------------------------------------\n /// PREPROCESS WITH INKSCAPE\n // --------------------------------------------------\n\n const actions = get_actions(options);\n VERBOSE && console.log(\"options: \", options);\n VERBOSE && console.log(\"actions: \", actions);\n const prev_actions = txactions;\n\n if (!actions.length) {\n // no preprocessing\n console.log(\"[USIGG raw file] actions:\", actions);\n content = rawfile;\n } else if (\n prev_actions &&\n actions.join(\"\") === prev_actions.join(\"\") &&\n typeof txfile !== undefined\n ) {\n console.log(\"[USIGG PREV TXFILE] prev_actions:\", prev_actions);\n console.log(\"[USIGG PREV TXFILE] actions:\", actions);\n // use the previous pre=processing\n content = txfile;\n } else {\n console.log(\"[PRE-PROCESSING FILE] prev_actions:\", prev_actions);\n console.log(\"[PRE-PROCESSING FILE] actions:\", actions);\n // do the pre-processing now\n //const contents =\n const ttp_formData = new FormData();\n\n ttp_formData.append(\n \"file\",\n new File([rawfile], \"foo.svg\", {\n type: \"text/plain\",\n })\n );\n try {\n var ttp_response = await axios.post(\n \"/api/text-to-path\",\n ttp_formData,\n {\n params: { actions },\n headers: { \"Content-Type\": \"multipart/form-data\" },\n }\n );\n } catch (err) {\n if (err.response.status === 404) {\n dispatch({\n type: \"INVALID_FILE\",\n file_path,\n message: \"Unable to connect to the backend server\",\n });\n return;\n }\n dispatch({\n type: \"INVALID_FILE\",\n file_path,\n message: INVALID_FILE_MESSAGE,\n });\n return;\n }\n\n if (ttp_response.statusText !== \"OK\") {\n dispatch({\n type: \"INVALID_FILE\",\n file_path,\n message: ttp_response.data.message,\n });\n return;\n }\n dispatch({\n type: \"SET_TRANSFORMED_SVG\",\n rawfile,\n actions,\n payload: ttp_response.data,\n });\n\n content = ttp_response.data;\n }\n // --------------------------------------------------\n /// PREPROCESS WITH INKSCAPE\n // --------------------------------------------------\n\n const _options: any = { ...options };\n _options.dpi = parseFloat(_options.dpi);\n _options.precision = parseFloat(_options.precision);\n _options.scale_factor = parseFloat(_options.dpi);\n\n if (typeof content === \"undefined\") {\n console.log(\"process_content_action called prematurely\");\n return;\n }\n\n const formData = new FormData();\n formData.append(\"options\", JSON.stringify(_options));\n formData.append(\"file\", content);\n\n try {\n var response = await axios.post(\"/api/svg2mod\", formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n });\n } catch (err) {\n if (err.response.status === 404) {\n dispatch({\n type: \"INVALID_SVG\",\n txfile: content,\n options,\n message:\n \"[/api/svg2mod] Unable to connect to the backend server\",\n });\n return;\n }\n dispatch({\n type: \"INVALID_SVG\",\n txfile: content,\n options,\n message: INVALID_FILE_MESSAGE,\n });\n return;\n }\n\n //console.log(\"response.data:\", response.data);\n if (response.statusText === \"OK\") {\n dispatch({\n type: \"SET_MODULE\",\n // : content,\n options,\n // new_path: file_path.slice(0, -3) + \"kicad_mod\",\n payload: response.data,\n });\n } else {\n dispatch({\n type: \"INVALID_SVG\",\n txfile: content,\n options,\n message: response.data.message,\n });\n return;\n }\n };\n}\n\nexport const drop_error: actionCreator = (message: string) => ({\n type: \"INVALID_FILE\",\n file_path: \"[Drop Error]\",\n message: message,\n});\n\nexport function create_update_option_action(\n update: svg2ModOptions_update\n): update_options {\n return {\n type: \"UPDATE_OPTIONS\",\n payload: update,\n };\n}\n","import React from 'react';\nimport { connect } from \"react-redux\";\n// import { withStyles, Theme } from '@material-ui/core/styles';\n\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\n// import ListItemIcon from '@material-ui/core/ListItemIcon';\n// import ListItemText from '@material-ui/core/ListItemText';\n//import Switch from '@material-ui/core/Switch';\n// import Radio from '@material-ui/core/Radio';\n// import RadioGroup from '@material-ui/core/RadioGroup';\n// import Button from '@material-ui/core/Button';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormControl from '@material-ui/core/FormControl';\n// import FormLabel from '@material-ui/core/FormLabel';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport TextField from \"@material-ui/core/TextField\"\nimport Select from \"@material-ui/core/Select\"\nimport InputLabel from \"@material-ui/core/InputLabel\"\nimport MenuItem from \"@material-ui/core/MenuItem\"\n// import ExpandLess from '@material-ui/icons/ExpandLess';\n// import ExpandMore from '@material-ui/icons/ExpandMore';\n// import Collapse from '@material-ui/core/Collapse';\n// import Tooltip from '@material-ui/core/Tooltip';\n\nimport { storeState, svg2ModOptions_update, svg2ModOptions, OptionsValidation } from \"./store\"\n// import { options as option_spec, option_descriptions, option_group } from \"./options\"\nimport { create_update_option_action } from \"./action-creaters\"\n\n// import debounce from \"debounce\"\n\n// --------------------------------------------------\n// connectors\n// --------------------------------------------------\n\ninterface MappedState {\n options: svg2ModOptions;\n options_validation: OptionsValidation;\n}\n\nconst mapStateToProps = (state: storeState): MappedState => ({\n options: state.options,\n options_validation: state.options_validation\n})\n\nconst mapDispatchToProps = (dispatch: { (x: any): void }) => (\n {\n update_parameter: (x: svg2ModOptions_update) => {\n dispatch(create_update_option_action(x))\n }\n }\n)\n\ntype TextFieldName = \"module_name\" | \"module_value\" | \"scale_factor\" | \"precision\" | \"dpi\" | \"format\" | \"units\"\n\ninterface OptionProps {\n id: TextFieldName;\n label: string;\n options: svg2ModOptions;\n options_validation: OptionsValidation;\n update_parameter: { (x: svg2ModOptions_update): void }\n}\n\n\n// --------------------------------------------------\n// Dropdown\n// --------------------------------------------------\n\ninterface SelectOptionProps extends OptionProps {\n select_options: string[];\n}\n\nconst _DropDown: React.FC = ({ id, label, update_parameter, options, options_validation, select_options }) => (\n //\n \n {label}\n update_parameter({ [id]: e.target.value })} // debounce(e => update_parameter({ [id]: e.target.value }),200)\n >\n {select_options.map((value) => ({value}))}\n \n \n //\n)\n\n/*\n\n \n*/\n\nconst DropDownOption = connect(mapStateToProps, mapDispatchToProps)(_DropDown);\n\n\n// --------------------------------------------------\n// TextField\n// --------------------------------------------------\n\n\nconst _TextOption: React.FC = ({ id, label, update_parameter, options, options_validation }) => (\n \n update_parameter({ [id]: e.target.value })} // debounce(e => update_parameter({ [id]: e.target.value }),200)\n helperText={options_validation[id]}\n />\n )\n\n/*\n\n \n*/\n\nconst TextOption = connect(mapStateToProps, mapDispatchToProps)(_TextOption);\n\n// --------------------------------------------------\n// Radio Buttons\n// --------------------------------------------------\n\n// interface RadioProps {\n// id: keyof svg2ModOptions;\n// label: string;\n// options_list: string[];\n// options: svg2ModOptions;\n// update_parameter: { (x: svg2ModOptions_update): void }\n// }\n\n// const _RadioOption: React.FC = ({ id, label, options, options_list, update_parameter }) => (\n// \n// \n// {label}\n//
\n// {options_list.map(opt => (\n// update_parameter({ [id]: opt })}>{opt}))}\n//
\n//
\n//
\n// )\n\n// const RadioOption = connect(mapStateToProps, mapDispatchToProps)(_RadioOption);\n\n// --------------------------------------------------\n// Checkbox\n// --------------------------------------------------\n\ninterface CheckProps {\n id: keyof svg2ModOptions;\n label: string;\n options: svg2ModOptions;\n update_parameter: { (x: svg2ModOptions_update): void }\n}\n\nconst _CheckOption: React.FC = ({ id, label, options, update_parameter }) => (\n \n \n { update_parameter({ [id]: e.target.checked }) }}\n name={id}\n />}\n label={label}\n />\n \n \n)\n\nconst CheckOption = connect(mapStateToProps, mapDispatchToProps)(_CheckOption);\n\n\n\n// --------------------------------------------------\n// Main Options panel\n// --------------------------------------------------\n\ninterface formOptions {\n options: svg2ModOptions;\n}\n\nconst OptionsForm: React.FC = ({ options }) => (\n
\n \n \n \n \n \n \n \n
\n \n
\n {options.format === \"legacy\" && }\n
\n \n
\n
\n)\n\n/*\n\n \n \n {(options.format === \"legacy\") && }\n*/\nexport default connect(mapStateToProps)(OptionsForm);","import React from 'react';\nimport { connect } from \"react-redux\";\nimport { create_path_action, drop_error } from \"./action-creaters\"\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles(theme => ({\n dropzone: {\n height: '100vh'\n },\n}));\n\n\ninterface dzProps {\n on_drop: { (path: string, file: File): void }\n on_error: { (message: string): void }\n}\nconst _DropZone: React.FC = (props) => {\n\n const classes = useStyles();\n const onDrop = (ev: React.DragEvent) => {\n ev.stopPropagation();\n ev.preventDefault();\n\n ev.persist()\n\n var file: File\n if (ev.dataTransfer.items) {\n // Use DataTransferItemList interface to access the file(s)\n let fileItem: DataTransferItem\n for (var i = 0; i < ev.dataTransfer.items.length; i++) {\n if (ev.dataTransfer.items[i].kind === 'file') {\n if (typeof fileItem! !== 'undefined') {\n props.on_error(\"please drop a single file\")\n return;\n\n }\n fileItem = ev.dataTransfer.items[i]\n }\n }\n if (typeof fileItem! === 'undefined') {\n props.on_error(\"no file recieved\")\n return;\n }\n file = fileItem.getAsFile()!;\n } else {\n // Use DataTransfer interface to access the file(s)\n if (ev.dataTransfer.files.length > 1) {\n props.on_error(\"please drop a single file\")\n return;\n }\n if (ev.dataTransfer.files.length === 0) {\n props.on_error(\"no file recieved\")\n return;\n }\n file = ev.dataTransfer.files[0]\n }\n\n\n // var reader = new FileReader();\n // reader.onload = function (event) {\n props.on_drop(file!.name, file)\n // };\n // reader.readAsArrayBuffer(file!);\n // reader.readAsText(file);\n\n }\n\n const onDragOver = (event: React.DragEvent) => {\n event.stopPropagation();\n event.preventDefault();\n }\n\n return (\n\n
\n {props.children}\n
\n )\n}\n\nfunction mapDispatchToProps(dispatch: { (x: any): void }) {\n return {\n on_drop: (path: string, file: File) => {\n dispatch(create_path_action(path, file))\n },\n on_error: (message: string) => {\n dispatch(drop_error(message))\n }\n }\n}\n\nconst DropZone = connect(null, mapDispatchToProps)(_DropZone);\nexport default DropZone\n","import React from 'react';\nimport { connect } from \"react-redux\";\nimport { storeState } from \"./store\"\nimport { makeStyles } from '@material-ui/core/styles';\nimport Fab from '@material-ui/core/Fab';\nimport Typography from '@material-ui/core/Typography';\nimport Paper from '@material-ui/core/Paper';\nimport CircularProgress from '@material-ui/core/CircularProgress'\nimport SaveIcon from '@material-ui/icons/Save';\nimport { KicadModule } from \"react-kicad-module\"\n// import LayerNames from \"./layer-names\"\n\n\nconst useStyles = makeStyles(theme => ({\n error: {\n paddingBottom: \"1rem\",\n },\n paper: {\n margin: theme.spacing(1),\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n content: {\n margin: \"3em\"\n },\n root: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n wrapper: {\n margin: theme.spacing(1),\n position: (\"relative\" as \"relative\"), // obsurd code to satisfy tsc\n },\n fabProgress: {\n position: (\"absolute\" as \"absolute\"), // obsurd code to satisfy tsc\n top: -6,\n left: -6,\n zIndex: 1,\n },\n}));\n\nconst Main: React.FC = (props) => {\n\n const classes = useStyles();\n\n if (props.error_message) {\n return ({props.error_message})\n }\n if (props.module_success) {\n return (\n <>\n {props.module_format === \"pretty\" && }\n

This illustration is only an approximation. Donownload your module and import it into Kicad for acutal results.\n {props.pads && ( In particular, pads are not rendered well in this rendering)}

\n
\n
{props.module}
\n \n )\n }\n\n return (\n <>\n
\n
\n \n \n \n {props.loading && }\n\n
\n
\n
\n \n
\n

How to use

\n Want to bring your Designs into Kicad? Great!\n Create your beautiful designs using InkScape, and drop them onto the page.\n Layers in your svg file will be mapped into a Kicad module that you can import onto your favorite PCB.\n Create a layer in InkScape using the layer dialog and it will be included in the layer with the same name (e.g. F.Cu\") of your new Kicad module!\n More details can be found here \n
\n
\n
\n\n
\n \n
\n

About this Site

\n This site sends Inkscape SVG files to a backend server, compiles them with svg2mod and the results are displayed here. Documents are encrypted in transit and nothing is ever stored on the server. However, if your designs are precious and you don't trust the internets, then head over to GitHub and compile them from the comfort your own machine.\n
\n
\n
\n \n )\n\n}\n\ninterface mainProps {\n module_success?: boolean;\n module?: any;\n error_message?: string;\n loading: boolean;\n module_format: \"legacy\" | \"pretty\";\n pads: boolean;\n}\n\nfunction mapStateToProps(state: storeState): mainProps {\n return {\n module_success: state.module_success,\n module: state.module_contents,\n error_message: state.error_message,\n loading: state.loading,\n module_format: (state.prev_options ? state.prev_options.format : \"legacy\"),\n pads: state.options.convert_to_pads\n };\n}\n\nexport default connect(mapStateToProps)(Main);\n","import React from 'react';\nimport { storeState } from \"./store\"\n// import GetAppIcon from '@material-ui/icons/GetApp';\n// import Button from '@material-ui/core/IconButton';\nimport Button from '@material-ui/core/Button';\nimport { connect } from \"react-redux\";\n\ninterface downloadProps {\n contents?: any;\n filename?: string;\n}\n\nfunction download(filename: string, text: string) {\n var element = document.createElement('a');\n element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));\n element.setAttribute('download', filename);\n element.style.display = 'none';\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n}\n\nconst Download: React.FC = ({ filename, contents }) => {\n return (\n { download(filename!, contents,) }}>\n Download\n \n )\n}\n\nfunction mapStateToProps(state: storeState): downloadProps {\n return {\n contents: state.module_contents,\n filename: state.new_path,\n };\n}\n\nexport default connect(mapStateToProps)(Download);\n","import React from 'react';\nimport { storeState } from \"./store\"\nimport { process_content_action } from \"./action-creaters\"\nimport equal from \"fast-deep-equal\"\nimport Button from '@material-ui/core/Button';\nimport { connect } from \"react-redux\";\n\ninterface iUpdateProps {\n disabled: boolean;\n onClick: { (): void }\n}\n\nconst Update: React.FC = ({ disabled, onClick }) => {\n return (\n \n Update\n \n )\n}\n\nconst mapStateToProps: { (state: storeState): { disabled: boolean; } } = (state: storeState) => (\n {\n disabled: (\n (!state.prev_options) ||\n (!state.module_contents) ||\n equal(state.options, state.prev_options)\n )\n }\n)\n\nconst mapDispatchToProps: { (dispatch: { (x: any): void }): { onClick: { (): void } } } = (dispatch: { (x: any): void }) => (\n {\n onClick: () => dispatch(process_content_action())\n }\n)\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Update);\n","/// \n\nimport React from 'react';\nimport { connect } from \"react-redux\";\nimport { storeState } from \"./store\"\nimport { makeStyles } from '@material-ui/core/styles';\nimport Drawer from '@material-ui/core/Drawer';\nimport AppBar from '@material-ui/core/AppBar';\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Typography from '@material-ui/core/Typography';\nimport OptionList from \"./option-list\"\nimport DropZone from \"./dropzone\"\nimport GitHubForkRibbon from \"react-github-fork-ribbon\"\nimport Main from \"./main\"\nimport Download from \"./download\"\nimport Update from \"./update\"\nimport indigo from '@material-ui/core/colors/indigo';\n\n// import MenuOpenRoundedIcon from '@material-ui/icons/MenuOpenRounded';\n// import MenuRoundedIcon from '@material-ui/icons/MenuRounded';\n\nconst drawerWidth = 300;\n\nconst useStyles = makeStyles(theme => ({\n root: {\n display: 'flex',\n },\n appBar: {\n zIndex: theme.zIndex.drawer + 1,\n },\n drawer: {\n width: drawerWidth,\n flexShrink: 0,\n position: \"relative\",\n },\n downloads: {\n backgroundColor: indigo[500],\n minHeight: \"5rem\",\n padding: \"1rem\",\n color: \"#fff\",\n bottom: \"0px\",\n },\n filename: {\n marginBottom: \".5rem\"\n },\n drawerPaper: {\n width: drawerWidth,\n },\n content: {\n flexGrow: 1,\n padding: theme.spacing(3),\n },\n toolbar: theme.mixins.toolbar,\n red: {\n color: theme.palette.secondary.dark\n },\n headerSpan: {\n marginLeft: \"1rem\",\n marginRight: \"1rem\",\n },\n handle: {\n paddingRight: '0.6rem'\n },\n}));\n\ninterface appProps {\n file_path?: string;\n new_path?: string;\n has_contents: boolean;\n}\n\nconst App: React.FC = (props) => {\n // const [open, setOpen] = React.useState(false);\n // const toggleOpen = () => { setOpen(!open) };\n const classes = useStyles();\n\n const MyDrawer = (\n \n
\n \n\n
\n {(props.file_path && !props.file_path.endsWith(\".svg\")) ?\n [not a .svg file] :\n null}\n\n {props.has_contents ?\n
\n {/* \n {props.new_path}\n */}\n
\n \n
\n \n
\n : null}\n
\n\n \n )\n\n\n return (\n\n \n
\n \n \n \n Fork me on GitHub\n \n \n \n Inkscape to Kicad Module Converter\n \n \n \n {MyDrawer}\n
\n
\n
\n
\n
\n
\n \n )\n}\n\nfunction mapStateToProps(state: storeState): appProps {\n return {\n file_path: state.file_path,\n new_path: state.new_path,\n has_contents: !!state.module_contents,\n };\n}\n\nexport default connect(mapStateToProps)(App);","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import thunkMiddleware, { ThunkAction } from \"redux-thunk\";\nimport { createStore, applyMiddleware, compose } from \"redux\";\n\nexport type action =\n | set_path_action\n | set_module_action\n | set_raw_svg_action\n | set_transformed_svg_action\n | invalid_file\n | invalid_svg\n | update_options;\n\nexport interface storeState {\n file_path?: string;\n new_path?: string;\n file?: File;\n // the transformed svg file\n rawfile?: string;\n txfile?: string;\n txactions?: string[];\n is_invalid?: boolean;\n file_contents?: any;\n error_message?: string;\n options: svg2ModOptions;\n loading: boolean;\n options_validation: OptionsValidation;\n // the previous set of options\n prev_options?: svg2ModOptions;\n // was the request to process the svg into a module successful?\n module_success?: boolean;\n // the body of the module or the error message\n module_contents?: string;\n}\n\nexport interface OptionsValidation {\n module_name?: string;\n module_value?: string;\n scale_factor?: string;\n precision?: string;\n dpi?: string;\n units?: string;\n format?: string;\n}\n\nconst is_float = /^[0-9]*\\.?[0-9]+$/;\nconst is_int = /^[0-9]+$/;\n\nexport const ValidateOptions = (x: svg2ModOptions): OptionsValidation => {\n const out: OptionsValidation = {};\n\n if (!x.module_name.length) out.module_name = \"required\";\n if (!x.module_value.length) out.module_value = \"required\";\n if (!is_float.test(x.scale_factor))\n out.scale_factor = \"Must be a valid float\";\n if (!is_float.test(x.precision)) out.precision = \"Must be a valid float\";\n if (!is_int.test(x.dpi)) out.dpi = \"Must be an integer\";\n\n return out;\n};\n\nconst default_options: svg2ModOptions = {\n format: \"pretty\",\n module_name: \"MyModule\",\n module_value: \"V***\",\n ignore_hidden_layers: true,\n convert_to_pads: false,\n preprocess_object: false,\n preprocess_stroke: false,\n units: \"mm\",\n dpi: \"96\",\n center: true,\n scale_factor: \"1\",\n precision: \"1\",\n};\n\n// {\n// module_name: \"\",\n// module_value: \"\",\n// scale_factor: \"1\",\n// precision: \"0.1\",\n// dpi: \"96\",\n// units: \"mm\",\n// format: \"pretty\",\n// center: true,\n// }\n\nexport const coerce_options = (x: svg2ModOptions): pythonSvg2ModOptions => {\n const {\n module_name,\n module_value,\n scale_factor,\n precision,\n // dpi,\n center,\n } = x;\n\n const out: pythonSvg2ModOptions = {\n module_name,\n module_value,\n scale_factor: parseFloat(scale_factor),\n precision: parseFloat(precision),\n // dpi: parseInt(dpi),\n center,\n };\n return out;\n};\n\nexport interface pythonSvg2ModOptions {\n module_name: string;\n module_value: string;\n scale_factor: number;\n precision: number;\n // dpi: number;\n center: boolean;\n}\n\ntype module_format = \"pretty\" | \"legacy\";\ntype module_units = \"mm\" | \"decimal\";\n\nexport interface svg2ModOptions {\n module_name: string;\n module_value: string;\n scale_factor: string;\n precision: string;\n dpi: string;\n units: module_units;\n format: module_format;\n center: boolean;\n convert_to_pads: boolean;\n ignore_hidden_layers: boolean;\n preprocess_object: boolean;\n preprocess_stroke: boolean;\n}\n\nexport interface svg2ModOptions_update {\n module_name?: string;\n module_value?: string;\n scale_factor?: string;\n precision?: string;\n dpi?: string;\n units?: module_units;\n format?: module_format;\n center?: boolean;\n convert_to_pads?: boolean;\n ignore_hidden_layers?: boolean;\n preprocess_object?: boolean;\n preprocess_stroke?: boolean;\n}\n\nexport interface invalid_svg {\n type: \"INVALID_SVG\";\n txfile: string;\n options: svg2ModOptions;\n message: string;\n}\n\n// export interface set_contents {\n// type: \"SET_CONTENTS\";\n// path: string;\n// options: svg2ModOptions;\n// payload: string;\n// }\n\nexport interface invalid_file {\n type: \"INVALID_FILE\";\n file_path: string;\n message: string;\n}\n\nexport interface set_path_action {\n type: \"SET_PATH\";\n file: File;\n file_path: string;\n}\n\nexport interface set_transformed_svg_action {\n type: \"SET_TRANSFORMED_SVG\";\n rawfile: string;\n actions: string[];\n payload: string;\n}\nexport interface set_raw_svg_action {\n type: \"SET_RAW_SVG\";\n payload: string;\n}\n\nexport interface set_module_action {\n type: \"SET_MODULE\";\n // rawfile: string;\n options: svg2ModOptions;\n payload: any;\n}\nexport interface set_tx_module_action {\n type: \"SET_TX_MODULE\";\n actions: string[];\n payload: any;\n}\n\nexport interface update_options {\n type: \"UPDATE_OPTIONS\";\n payload: svg2ModOptions_update;\n}\n\nconst dot_svg = /\\.svg$/;\n\nfunction reducer(\n state: storeState = {\n options: default_options,\n loading: false,\n options_validation: ValidateOptions(default_options),\n },\n action: action\n): storeState {\n switch (action.type) {\n case \"SET_PATH\":\n return {\n ...state,\n file: action.file,\n file_path: action.file_path,\n new_path: action.file_path.replace(\n dot_svg,\n state.options.format === \"pretty\" ? \".kicad_mod\" : \".mod\"\n ),\n is_invalid: false,\n file_contents: null,\n error_message: undefined,\n loading: true,\n module_success: undefined,\n module_contents: undefined,\n };\n case \"SET_RAW_SVG\":\n return {\n ...state,\n rawfile: action.payload,\n };\n case \"SET_TRANSFORMED_SVG\":\n if (action.rawfile !== state.rawfile) {\n console.log(\"Expired process request: SET_TRANSFORMED_SVG\");\n return state;\n }\n return {\n ...state,\n txfile: action.payload,\n txactions: action.actions,\n };\n case \"INVALID_SVG\":\n // TODO: FIXME: this should be carefuly reinstated\n // if (action.txfile !== state.txfile) {\n // console.log(\"Expired process request: INVALID_SVG\");\n // return state;\n // }\n return {\n ...state,\n is_invalid: true,\n error_message: action.message,\n loading: false,\n };\n case \"INVALID_FILE\":\n return {\n ...state,\n file_path: action.file_path,\n is_invalid: true,\n error_message: action.message,\n loading: false,\n };\n case \"SET_MODULE\":\n // TODO: FIXME: reinstate (carefully)\n // if (\n // state.txfile !== action.txfile ||\n // state.options !== action.options\n // ) {\n // console.log(\"OUT OF DATE RESPONSE\");\n // return state;\n // }\n return {\n ...state,\n is_invalid: false,\n error_message: undefined,\n loading: false,\n module_success: action.payload.success,\n module_contents: action.payload.body,\n prev_options: { ...action.options },\n };\n case \"UPDATE_OPTIONS\": {\n const svg2ModOptions: svg2ModOptions = {\n ...state.options,\n ...action.payload,\n };\n\n let out: storeState = {\n ...state,\n error_message: undefined,\n\n options: svg2ModOptions,\n new_path:\n state.file_path &&\n state.file_path.replace(\n dot_svg,\n state.options.format === \"pretty\"\n ? \".kicad_mod\"\n : \".mod\"\n ),\n options_validation: ValidateOptions(svg2ModOptions),\n };\n return out;\n }\n\n default:\n //alert(\"unhandled action type: \" + (action as any).type);\n return state;\n }\n}\n\nexport type ThunkResult = ThunkAction;\n\nconst composeEnhancers =\n (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\n\nexport const store = createStore(\n reducer,\n {\n options: default_options,\n loading: false,\n options_validation: ValidateOptions(default_options),\n },\n composeEnhancers(applyMiddleware(thunkMiddleware))\n);\n\nexport default store;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nimport { Provider } from 'react-redux'\nimport store from './store'\n\nReactDOM.render(\n \n\n , document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.len = exports.diff = exports.multiply = exports.add = exports.rotate = void 0;\nconst rotate = (a, b, r) => {\n // rotate b about a by r degrees\n const c = Math.cos((Math.PI * r) / 180);\n const s = Math.sin((Math.PI * r) / 180);\n const dx = exports.add(b, exports.multiply(-1, a));\n return [c * dx[0] - s * dx[1] + a[0], s * dx[0] + c * dx[1] + a[1]];\n};\nexports.rotate = rotate;\nconst add = (x, y) => [x[0] + y[0], x[1] + y[1]];\nexports.add = add;\nconst multiply = (x, y) => [x * y[0], x * y[1]];\nexports.multiply = multiply;\nconst diff = (x, y) => exports.add(x, exports.multiply(-1, y));\nexports.diff = diff;\nconst len = (x, y) => {\n if (y)\n x = exports.add(x, exports.multiply(-1, y));\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n};\nexports.len = len;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KicadModule = void 0;\nvar module_1 = require(\"./src/module\");\nObject.defineProperty(exports, \"KicadModule\", { enumerable: true, get: function () { return module_1.KicadModule; } });\n"],"sourceRoot":""}