Files
GravityHW/Hardware/gtoe/rev 2 bom/ibom.html

4443 lines
291 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html,
body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 10px 10px 10px 0px;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 5px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
position: relative;
}
.bom th,
.bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th,
.dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.bom .value {
width: 15%;
}
.bom .quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal,
.gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 10px 10px 10px 0px;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid,
.dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
width: 100%;
height: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
height: 78px;
border-bottom: 2px solid black;
}
.dark #top {
border-bottom: 2px solid #ccc;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas,
#backcanvas {
touch-action: none;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": false, "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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HkqusJudBeSYWEHimhmT4pp8m3SYiwV4nHyaXJ4SnxKbUDXQmBSaGJ44n0KZ1xzCmyiYhJnCmoifTIMgnrccoJ6snEicHJvy8H2EwoMAA0if0AMTcmCaop3MqaKaswOimryfgwLsniiZ7J6IBQAD7Jikm/8cn0FnghqLUpvYnpCYBIWQnmSenJ2cndKYsAfSnUycMpz0mXyaZRHQnb8tQpxfGdyfGJ38mDyZip5Em9KACwDymQKakJ/bGUqd4ptKndScypjFBsqZ1JnSmjKe8JkymiqekpoMm8ya1xjCmwiawp4snGAFLJ6FASCbKxpymqyYSJ6FA1sfcpw/GGyZ8ppsmsiZbJ+Yn2yeGxpqnGKdJJhSmKqf/JqqmLyPiwLimxyde6CCmnSYiwNonWqeTJj0mDKbvJ9MmvCb2Jtcmvsb6pr8nVsZFJw31oqf2p+am6gLmJuqm3ABuJ8Cn6KYUASCm1iegpvSmbqZypu6nnydHJt5x3yZAAYqngyaip5imwybYphrH90CuJv6nO8cWJwXGJyePx86ncqZTJjqncqa+JpCmfiZQpl6m0KcGpqynhqZsp+bHISYmpvCm4iecp2an7ca3x5ImEqd6Tbym3AF8pyimsieopzGn2CaCprgmGKe7JpindqZYpyqnrSYTEQaiodNHJ5KnOydVJiwBLqeTJh8nIafgp+6n8qf6ZQqmpKfMpoUnK8fepn8nP8b2ppSnpSasJwTgOablphqmFaYTJzqnnWHapxcmoadgp7qntaY3J4YnAScspvAmwSaLJ2ymxqdwphynLcaZpmamiKbcpmriTRC8p1rGRUA6xiqtWyfexxPUKgFrwdHGQ8dFpnanyqYlpr6njydnDRJ8Y6eRxg/HhafIAfGmMUGVpu2mIaaJpx2muqb9J/bGAyYppkqmDabNJ5GnWKdhxxHgSRDjkWkmQgBAJ/ZlJN0Vpsuni6ehp0SmEKYepg0nK6ddp44m66fFplGnG6bS4qGRW6eTxnvH2AE7pm2mCadVp0un1aehp9SmsybMpnMn+qcBJ0enU6fHpgCmqsHpEeYm1tAYANbRE6YLplemrqcV4XunQabEp+UnAZCCQYem9acx3EMn66clptymlkqiYo+mBe1PpoGmAa3Ppjwn7yaEpvKm4KYAZjWnaSZMwB+mN6c3JremNcZ3po2m06ZNp76nLw35JxKn98bbpvOm/6e0pxemgGdupi+ny6cHpgd9H6Zkp78m4GcmJyUnUaZHEcnQBaeAJjBn56ceJm+nAGfBp6+mWqfwZzMmh6agZt2mNcY9p0EnogHBJumm7KbLJhymyscV0xEnXKbZpvTREnPDpjEmVqeyJkFkBaY2pp31JybCpywASicip2mn4Gb3p6UmfHPdEgWmmmgap3GmtKeapi6mBKbnJphnYKb7psBn1Kaep7AQEaZGJ0IBa6ZfpsemG6YApoyQEceoZ7GnLyYZJ7gmjGewZsxmjKYsZ1em9idhpw4ndaeIZ5+mkaacZt+nxGYSvHnH3GbAp5Ymmqa7pvBme6fMZhhnLGaCZsmmbGerpt/HuGesp7CnfafspiwAyse0HQimaybcpusnPKa5p6IAMiYIyWRnusbYJhRn+8FSp7aneydfp9Omt8b8vYcnjqfqJgRqlGaSZ3pMMqZVpnBm1adAZwJnVyZ+J56nQmZgZ/Wm5Kb3JyJn2mcdnPYh4EztJ+JmDGdTxkGmWGZSZ/xm0mbGZ18mqcZMkWxnt6ccZ3ennGYOpxB6hrJWZvdBPGb6Zhenu6cJph2nkmZJplAnkKayZqZnXqaBJ4YACyZpp/JmlscKZ8rGQcdKZsRmENJyKxampGcbJqoG6mezpvImlFw7J3+mEgBaZtRnPqcQZwcmSKZqJ3RmTqYaJm5n6Gf4pwZmtmeAZgJmnacepiZnXmc3p16nRid3Jj6m2meRZrfGSKf/ys8m76dWZs6msGbuZpemHmdGZwlm+ieCZg5nsmawJ0hmzifIZmPHLieAp1Bmc6cZZ3+nmiexZ22n7mZEpnZmOWe+JqnGSWegZ95ncme+Z0anfmcEZiwBSCZKZ5mng6Y6ZjmQyKc5piinRoH8pn0xAqb3QYKmvGZFp8KmxaZOZqJmE1o4pg1nLadI062nJWaVpkxnL6ftpmVnNmaeZ7QnfCaIZ6Zm3qdmZyln5mepZmXsDPE4p9Fn5abhZ5lnkmelZkBmeid9J/rGJKdMpj8meWfdpqmnPad4Z72n+GYKZjVmMUFIJgFmdWbKZmlmu9PoJsFmfKb8pvmmAqYFp2imMGfhZ5OnWmZDZgVnlKfEJ82nZafUpqNmQqYxx25mXo1xZuNmCWdYZgqm/WY4ZgInyWbKpjRnTmeIps2naqZFZinHO2ctZ0Kn+mecJ4Znl6fZZwd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WUpa6lisXHpcclgMY1unUDGSWhpbyly6WNpe+lraW/JaSljqWCZYelvUXkZc9546X1AzoecGWsZYsAKGXOueKl6yWCGZQZwmWn6aRlw6W3KfZl1cBm+b2Jj6WYpchlnGXoZdul/6X7paCl4mWQpetpAvRxfTel6WWqZc+luWXaZdxltqWdpeVl7SXdRaRZnsX3OA1lhYXKZcxl6mXFJfllvmXfpZw5/GXbJYRlyUXVZZH5i2W0Y3HtDGXGpcSZu2X9ZYVlvGWlZaZllWWWZbFlvqWyZal5dGX3pZ1l2WWrpftlz7nUmcNlhmWZpcBltMX3ZfNl0mWC9B13LmXbZb6F3mXE5e2Z5OW4ZeNliqW5pbDlp6X7cJeltug81Fzl3WX45YDlh2WYZfSZwWXApZNl0WXK5acl9G5IlHX8M6WKcZllpqX/ZddJ8aWr6aTl7aWU5fhl4WW0pZ6lkmX1ZdB0VKLIpYHlv2X85YTlnyWx5fplkuWQ5fblmeW1Zdqly5tdiDrluOWaZeHln6Xm5d2ZinHS5ZnF9OWK5dnlveXdtQGtH2W1pe05oeXlJYml9eWppaNlreWy5f2lm+Xd5aylv30jhe1lm2X65ePl1+XR5aLl8eXN5ZdlqeXEZZ3lj2XQpYMlzWXD5cHlleXG5cLlkDni5ZN5r+Wr5cql3+X4FZBHGhdSICllvoml5e4ll+WLJcmlv6XP5egV5mWzZZBl7uXK+2jloBXfZbIV1BWT5bplj+WJ5cvlyCXsJfBF5PmUBbT5kABxeemF5IX/OYSvNQbkRfUF8+EOsdWFqTn1hc6LX+ncRe2FucXJJaMkV4WPhapx5CXBRat5t8WLxbCFqPmOxe/l1wXYOcMF1RWErwShJcWhJZOFrRWdOdQlgEXJxaDFtOX02fgFpLmUuYsAGQXekwcp0Xn+Ocl52YWBzN3Q1QXDWakV8vglebo2vuXogHkV3QWthcYlg6WWJYsV6QAfBcilvwXThbk52xXdFbQlpeR9FavFk2W3edFlliXXhZUF+kmTeesV8VnrBdHQOxWrhcBFzCX25d4VtxWU+bwloRXEhd8Vs5nL2bh5+Xn3ceWF2RXwldV59vh1eYv5mjmtecKF7HnTFcbp+JWL1EAVg0mSlasF4CW/hdAl9CWqlccV12Wf+eaF1kWw5e4FgpXamAmVzMmplYCFspWhRZAl8cX5lYcViIXDFZwVuAX2OcT5vhXcJdQF8XmlACSF3VngxPGVtIX2lcL5kJXNBbCVhPHIlc2FgZWChYoF2JWZRbGVzZXDxeSVt7mg+Z0Vg5X3xayV6pWjFdyVm8WqiY2V9wcNFbN50pWZlZFFo5XwJacV85XPmbBFupWBFY35sXnr0eaV4imaJ2ImgvnOlY+Vtgmvlf6VyuxMeev5ooXpRcklmicxgksVjqWdlcYF7RWKlY1FhZWTlYgl0dmxJZMV54XSOZonbzEoxYvltlWhBbBVzlX0VZHlp3nTlZ4VmIWcJbiFm5WvqHuVnLmKF2k+/PmXlfJV8jbulapVs+nflfxFtZWUZeYXVQgWVajkz4WUlb0eV/nfRdmVw5XMleuFgxXeVdEllZXxJegl2KmRe0zmzNbilYtV/VWOVfSV+xWMVaWVuPnalaQF9xWGlfF5kRniJaSJ+P9Zef35pYXpFdCVnVXPld6VjYXqVdnQJRWYlaNVkoWY1dsEUVWrFZ9V/MXUVfVF6VXHVcxV0znXVYzF7NXzFZMF4FXxVeVFotXixftV7lXbhbLVwImFVauVpVXBFbKx9AWiVZRZ3ItsMsWFqRXMicxJ5BgVea8CsFE01evJwZW/lbwVzOXpsG4W4u1RyaEMBT7vhfSpinm15YgVjeWsFZoVlwXYVeCl/BXo8Er9cjgl1f2xnc1V1dGl9hWDZcgV7dWhZdoV4GWapf7VsOhjqeXVs9XUlfIVkeXPWbPluVmL5ewV7qX91bnVw9X95YR8bpWboFPV0FW2FbAVz9XFZeoV29XQ5boVh9Xvm1OjOUm9iZfV8DWzJdXlt+XN1c4VqBXYNe3l/9WWJdyLWXJn1bA1lFW9ZcvVwOXMFbXp39WEuZcVwXnxheVV1VWlBcI3OeR/BbJVhNX3laTVylWU1YUV6ZWDVZv5hlWY8cBV9YskVf950jW/VYhVvRWHVeyVmFX+Vfp5kZWW2a8Ft4XGge9VzRWxNbSViTWMlb6wZtWmMEiFoxXQRcuV3FWoRcEV0XnKyfhF8pmciqtltQX0ie1VvNWelZ0F75X1menVw1WVFdGVmtXDhdrVgtXeNfE121XIVak16FWzlfLVgVWBNdipjZX3hd8FutXHNZQl/1XKleOVltWg1eiF2jWpBe45jxWSCfF5oiXRFfM1vYhAlbY1t5WVhYpVrQm9VbE15RWqBeNVtzXmiECVlTXkVa819TWfNck17TW50F01gLXjFbk1wVX5qYRVirXjhc813ZWG1bmVptXYtZ01uVWaNYuVhAXDNZS16InRedFQRjWsBcuSjVXB1es19jW8tc41grXuNaiVvR4M1ax52vmx6e4FrZLPVds181XVNdXFnrW7Va01/rWGtcG151XSqaC1t1Wqqa2ShHAcxc61g7WgJai1jTWA1ZlVxrX5VcS1sYXktYaV9Pm4RajVtynG+bJGObWfKYz4ayg1RB5pw7JT+efcJ8wq+a2pzNX4Nc95wHWnO3RZifm85bf59dXMNYwV69XuqYX50W02Bb3VjOXttcQ14Y6QNdl7SoX1paD5jrn0Fa75xKWeuZ+UQcW9pbbVz7XFVfo1wRXSCcjVjLWG+YV7CRWrNYrZjIWq2cIFqTmchcZkdlXita210rWemxB0Qnnvm3J12dBrVbXVsBXZVadV2nnZNfd5+TWc+YV7Snsuhd9VniWMdZOAd7WhtexVgzXQ1fqVm5X0tYeVlTmwtd517mmbNbHVlbWHNfuJpzX+Neu14imhNcs10nWQVbU1yVXota5V07X9dfO1lXWXVau1ytWY8dC193XKtdE16rXvdZe1mLXA1ZgV5Vn21dG18NXFACm1vxX6iBl57PNgdZt1hbWuleTV+zXJ1ZwAdbW6VeGV1rXjyYz19RXwta61gUWatbRVvrW49fx11XW8lczF6tWfecr1x7Xq9ej12rXNNcRQerX/deV1xGWQ1YhFsNWblY51i3X/FdaV55XyJdt17QWS8Yd1qdW+NfpVl3WUWcBVxFW29aq17rXnta7117XS1fi1poXLtZa14LXSOYRV2/A19cj1jfXvNdr1k7X69awlxPWTdbxV2QWMUGhF83W1VeUF8mWpeBeV1EWvcfRF+YnMRdTsbEXFFdpVoZXNtY959oWIxfUDOFgAJcfFmxXO9cv1h9RpNaa1gnWs1aqJhcWu8D21o8Wn5efFo7XfNcDFnlXW1ab1koXEIeNfSA2kJcLVzfXYDa3F/zW/1f+VkoXDRdQN4g2GddINi/Xi1ftVnA24tfj1h0XqDaqJrMWSHPoN48WO9b6F8FWt9bbFt7WA9dgV78WZReJFjmXq2cilwCX+DdVFmPWwJZEN/vW3ZaQNgCnuDbIRs1X0DZMli0X1xZ919CXWDYG15Q2ODdUN6UnaDYgNh8WSDcO1sg3mDbtUeA2qDZMNhEWLwfMNhUWoDcYNmvWbDbgNyg2iZYcN48mUDecNmQ3XDasNpg3G1dsNrw2RZbhVgCnYJZuwTQ3ZDabF6w2Qjc8NxZX2Dfslzg2AKd/F6I3eDYwNwb0XxfKVvQ2WDb91pXW8DYiN6Un0jboNiw2GDaCN9w2EjYoNpI271fF1koWojbKNlw3LDae14I3etdCN2o2b9eZ1jtXWdfxVsgmfFe35tPWKJ1VzQuR0hZuiAXXbNeF10gWrVad1xfWQ9eUpgz60cGl1tnn6JZpViAXahdwN3fWHhdWVlzWFjbvHExdtdZf59Y3eJc2N5I2EteG11xW79aM1vo2Jtef1pjWaBaDnAa0ctfAMRbXbNcK1vIXADZnV3Y2btbvHbDI0Dc91yo2YDY8NiPmCjYN1i7XB+Z8NjpmdtZX6TQ2ATdaNqo32jZ710E3RDYT17o2k9ZuV09nFBem1qwKQWdY1rVWc9fy1/rH3jfP1sXWQDYApoTXlNYe19fXz1d0NhQ2S1bsNvlWg9YP1pfW2adC1yk2/SYi1x3X4jcRNkE3r9ZqV2/Wh9dN14zX/MFT1jXWEsFnMrPWFeYJNpbWiTft1gvXMGbxF53X5jbFNqrNvPA819vWJVYENqVW69aUN1tXEDe+N+amPVb+N9U3qTc1N+Q2hDd91vk29NcH1/hXrjYf1xgAC2buV3tWuddfB2/KxjcmiQvnBde6VqY35Tc+N5zWStcR14RdsYwFpgQXVjbl14429dcKNrY3ZKZ2NgM3XNa0XOQLDja7Z+XWcWcjNsE20pZtN65XjNe1ZrE2hjYWpvE2p9elNt425Tem50k31dcNNsrXhNdP1r4W31a1NvI2r9d1N6M3AteZN5U22tcU19Ch/BYj1ms2flbaN47WkTatNprX9NZG1q42xta8V5MBRTfmpnNWedaCV+bXctdz1rjX89ZxFv02lTarFlGWc1Yr1pJXOTcwN7k2+zd5Nxs2zjb31iE2DTbcpnNX4lZE17s3vRawNurXkTaMN4NWBTdtN0c2LAAAARTuN7E2lDSRgqGD8Tcf8HmmVcECpyXRVTVLN+HX71bMV78GIUY91z4X5TcCFhXWKFfflqhWGZZzYU3RhPQb1pk21dYs5xlWaN3UDMC2TeYgttDWWSYw18BWsda3V7qnJogE+ps3TZe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"))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* Utility functions */
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
pcbdata.metadata.revision + '__#';
var storage;
function initStorage(key) {
try {
window.localStorage.getItem("blank");
storage = window.localStorage;
} catch (e) {
// localStorage not available
}
if (!storage) {
try {
window.sessionStorage.getItem("blank");
storage = window.sessionStorage;
} catch (e) {
// sessionStorage also not available
}
}
}
function readStorage(key) {
if (storage) {
return storage.getItem(storagePrefix + key);
} else {
return null;
}
}
function writeStorage(key, value) {
if (storage) {
storage.setItem(storagePrefix + key, value);
}
}
function fancyDblClickHandler(el, onsingle, ondouble) {
return function() {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function() {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 200);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
}
function smoothScrollToRow(rowid) {
document.getElementById(rowid).scrollIntoView({
behavior: "smooth",
block: "center",
inline: "nearest"
});
}
function focusInputField(input) {
input.scrollIntoView(false);
input.focus();
input.select();
}
function saveBomTable(output) {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
}
if (node != bomhead.childNodes[0].lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
let val = '';
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
val += '✓';
}
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
val += node.firstChild.nodeValue;
} else {
val += node.nodeValue;
}
}
if (output == 'csv') {
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
if (isNumeric(val)) {
val = +val; // use number
} else {
val = `"${val}"`; // enclosed within double-quote
}
}
text += val;
if (cell != row.lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
}
if (output != 'clipboard') {
// To file: csv or txt
var blob = new Blob([text], {
type: `text/${output}`
});
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
} else {
// To clipboard
var textArea = document.createElement("textarea");
textArea.classList.add('clipboard-temp');
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
if (document.execCommand('copy')) {
console.log('Bom copied to clipboard.');
}
} catch (err) {
console.log('Can not copy to clipboard.');
}
document.body.removeChild(textArea);
}
}
function isNumeric(str) {
/* https://stackoverflow.com/a/175787 */
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}
function removeGutterNode(node) {
for (var i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].classList &&
node.childNodes[i].classList.contains("gutter")) {
node.removeChild(node.childNodes[i]);
break;
}
}
}
function cleanGutters() {
removeGutterNode(document.getElementById("bot"));
removeGutterNode(document.getElementById("canvasdiv"));
}
var units = {
prefixes: {
giga: ["G", "g", "giga", "Giga", "GIGA"],
mega: ["M", "mega", "Mega", "MEGA"],
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
milli: ["m", "milli", "Milli", "MILLI"],
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
nano: ["N", "n", "nano", "Nano", "NANO"],
pico: ["P", "p", "pico", "Pico", "PICO"],
},
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
unitsLong: [
"OHM", "Ohm", "ohm", "ohms",
"FARAD", "Farad", "farad",
"HENRY", "Henry", "henry"
],
getMultiplier: function(s) {
if (this.prefixes.giga.includes(s)) return 1e9;
if (this.prefixes.mega.includes(s)) return 1e6;
if (this.prefixes.kilo.includes(s)) return 1e3;
if (this.prefixes.milli.includes(s)) return 1e-3;
if (this.prefixes.micro.includes(s)) return 1e-6;
if (this.prefixes.nano.includes(s)) return 1e-9;
if (this.prefixes.pico.includes(s)) return 1e-12;
return 1;
},
valueRegex: null,
}
function initUtils() {
var allPrefixes = units.prefixes.giga
.concat(units.prefixes.mega)
.concat(units.prefixes.kilo)
.concat(units.prefixes.milli)
.concat(units.prefixes.micro)
.concat(units.prefixes.nano)
.concat(units.prefixes.pico);
var allUnits = units.unitsShort.concat(units.unitsLong);
units.valueRegex = new RegExp("^([0-9\.]+)" +
"\\s*(" + allPrefixes.join("|") + ")?" +
"(" + allUnits.join("|") + ")?" +
"(\\b.*)?$", "");
units.valueAltRegex = new RegExp("^([0-9]*)" +
"(" + units.unitsShort.join("|") + ")?" +
"([GgMmKkUuNnPp])?" +
"([0-9]*)" +
"(\\b.*)?$", "");
if (config.fields.includes("Value")) {
var index = config.fields.indexOf("Value");
pcbdata.bom["parsedValues"] = {};
for (var id in pcbdata.bom.fields) {
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
}
}
}
function parseValue(val, ref) {
var inferUnit = (unit, ref) => {
if (unit) {
unit = unit.toLowerCase();
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
unit = 'r';
}
unit = unit[0];
} else {
ref = /^([a-z]+)\d+$/i.exec(ref);
if (ref) {
ref = ref[1].toLowerCase();
if (ref == "c") unit = 'f';
else if (ref == "l") unit = 'h';
else if (ref == "r" || ref == "rv") unit = 'r';
else unit = null;
}
}
return unit;
};
val = val.replace(/,/g, "");
var match = units.valueRegex.exec(val);
var unit;
if (match) {
val = parseFloat(match[1]);
if (match[2]) {
val = val * units.getMultiplier(match[2]);
}
unit = inferUnit(match[3], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[4],
}
}
match = units.valueAltRegex.exec(val);
if (match && (match[1] || match[4])) {
val = parseFloat(match[1] + "." + match[4]);
if (match[3]) {
val = val * units.getMultiplier(match[3]);
}
unit = inferUnit(match[2], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[5],
}
}
return null;
}
function valueCompare(a, b, stra, strb) {
if (a === null && b === null) {
// Failed to parse both values, compare them as strings.
if (stra != strb) return stra > strb ? 1 : -1;
else return 0;
} else if (a === null) {
return 1;
} else if (b === null) {
return -1;
} else {
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
else return 0;
}
}
function validateSaveImgDimension(element) {
var valid = false;
var intValue = 0;
if (/^[1-9]\d*$/.test(element.value)) {
intValue = parseInt(element.value);
if (intValue <= 16000) {
valid = true;
}
}
if (valid) {
element.classList.remove("invalid");
} else {
element.classList.add("invalid");
}
return intValue;
}
function saveImage(layer) {
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
var bgcolor = null;
if (!document.getElementById("render-save-transparent").checked) {
var style = getComputedStyle(topmostdiv);
bgcolor = style.getPropertyValue("background-color");
}
if (!width || !height) return;
// Prepare image
var canvas = document.createElement("canvas");
var layerdict = {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
bg: canvas,
fab: canvas,
silk: canvas,
highlight: canvas,
layer: layer,
}
// Do the rendering
recalcLayerScale(layerdict, width, height);
prepareLayer(layerdict);
clearCanvas(canvas, bgcolor);
drawBackground(layerdict, false);
drawHighlightsOnLayer(layerdict, false);
// Save image
var imgdata = canvas.toDataURL("image/png");
var filename = pcbdata.metadata.title;
if (pcbdata.metadata.revision) {
filename += `.${pcbdata.metadata.revision}`;
}
filename += `.${layer}.png`;
saveFile(filename, dataURLtoBlob(imgdata));
}
function saveSettings() {
var data = {
type: "InteractiveHtmlBom settings",
version: 1,
pcbmetadata: pcbdata.metadata,
settings: settings,
}
var blob = new Blob([JSON.stringify(data, null, 4)], {
type: "application/json"
});
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}
function loadSettings() {
var input = document.createElement("input");
input.type = "file";
input.accept = ".settings.json";
input.onchange = function(e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = readerEvent => {
var content = readerEvent.target.result;
var newSettings;
try {
newSettings = JSON.parse(content);
} catch (e) {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
if (newSettings.type != "InteractiveHtmlBom settings") {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
if (metadataMatches) {
for (var k in pcbdata.metadata) {
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
metadataMatches = false;
}
}
}
if (!metadataMatches) {
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
if (!confirm(
`Settins file metadata does not match current metadata.\n\n` +
`Page metadata:\n${currentMetadata}\n\n` +
`Settings file metadata:\n${fileMetadata}\n\n` +
`Press OK if you would like to import settings anyway.`)) {
return;
}
}
overwriteSettings(newSettings.settings);
}
reader.readAsText(file, 'UTF-8');
}
input.click();
}
function overwriteSettings(newSettings) {
initDone = false;
Object.assign(settings, newSettings);
writeStorage("bomlayout", settings.bomlayout);
writeStorage("bommode", settings.bommode);
writeStorage("canvaslayout", settings.canvaslayout);
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
for (var checkbox of settings.checkboxes) {
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
}
writeStorage("markWhenChecked", settings.markWhenChecked);
padsVisible(settings.renderPads);
document.getElementById("padsCheckbox").checked = settings.renderPads;
fabricationVisible(settings.renderFabrication);
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
silkscreenVisible(settings.renderSilkscreen);
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
referencesVisible(settings.renderReferences);
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
valuesVisible(settings.renderValues);
document.getElementById("valuesCheckbox").checked = settings.renderValues;
tracksVisible(settings.renderTracks);
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
zonesVisible(settings.renderZones);
document.getElementById("zonesCheckbox").checked = settings.renderZones;
dnpOutline(settings.renderDnpOutline);
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
setRedrawOnDrag(settings.redrawOnDrag);
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
setDarkMode(settings.darkMode);
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
setHighlightPin1(settings.highlightpin1);
document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
setOffsetBackRotation(settings.offsetBackRotation);
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
initDone = true;
prepCheckboxes();
changeBomLayout(settings.bomlayout);
}
function saveFile(filename, blob) {
var link = document.createElement("a");
var objurl = URL.createObjectURL(blob);
link.download = filename;
link.href = objurl;
link.click();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime
});
}
var settings = {
canvaslayout: "default",
bomlayout: "default",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: false,
redrawOnDrag: true,
boardRotation: 0,
offsetBackRotation: false,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
columnOrder: [],
hiddenColumns: []
}
function initDefaults() {
settings.bomlayout = readStorage("bomlayout");
if (settings.bomlayout === null) {
settings.bomlayout = config.bom_view;
}
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
settings.bomlayout = config.bom_view;
}
settings.bommode = readStorage("bommode");
if (settings.bommode === null) {
settings.bommode = "grouped";
}
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
settings.bommode = "grouped";
}
settings.canvaslayout = readStorage("canvaslayout");
if (settings.canvaslayout === null) {
settings.canvaslayout = config.layer_view;
}
var bomCheckboxes = readStorage("bomCheckboxes");
if (bomCheckboxes === null) {
bomCheckboxes = config.checkboxes;
}
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
document.getElementById("bomCheckboxes").value = bomCheckboxes;
settings.markWhenChecked = readStorage("markWhenChecked") || "";
populateMarkWhenCheckedOptions();
function initBooleanSetting(storageString, def, elementId, func) {
var b = readStorage(storageString);
if (b === null) {
b = def;
} else {
b = (b == "true");
}
document.getElementById(elementId).checked = b;
func(b);
}
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
if ("tracks" in pcbdata) {
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
} else {
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
tracksVisible(false);
zonesVisible(false);
}
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
var hcols = JSON.parse(readStorage("hiddenColumns"));
if (hcols === null) {
hcols = [];
}
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
var cord = JSON.parse(readStorage("columnOrder"));
if (cord === null) {
cord = fields;
} else {
cord = cord.filter(e => fields.includes(e));
if (cord.length != fields.length)
cord = fields;
}
settings.columnOrder = cord;
settings.boardRotation = readStorage("boardRotation");
if (settings.boardRotation === null) {
settings.boardRotation = config.board_rotation * 5;
} else {
settings.boardRotation = parseInt(settings.boardRotation);
}
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function() {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function(eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function(eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for (callback of this.callbacks[eventType])
callback(event);
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
var point = [
linepoint[0] * text.width + offsetx,
linepoint[1] * text.height + offsety
];
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
return point;
}
function drawText(ctx, text, color) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if ("svgpath" in text) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
if ("polygons" in text) {
ctx.fill(getPolygonsPath(text));
ctx.restore();
return;
}
ctx.translate(...text.pos);
ctx.translate(text.thickness * 0.5, 0);
var angle = -text.angle;
if (text.attr.includes("mirrored")) {
ctx.scale(-1, 1);
angle = -angle;
}
var tilt = 0;
if (text.attr.includes("italic")) {
tilt = 0.125;
}
var interline = text.height * 1.5 + text.thickness;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
for (var i in txt) {
var lineWidth = text.thickness + interline / 2 * tilt;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
}
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
}
}
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
var inOverbar = false;
for (var j = 0; j < txt[i].length; j++) {
if (config.kicad_text_formatting) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
} else if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
if (txt[i][j] != '~') {
inOverbar = !inOverbar;
}
}
}
var glyph = pcbdata.font_data[txt[i][j]];
if (inOverbar) {
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
if (!lastHadOverbar) {
overbarStart[0] += text.height * 1.4 * tilt;
lastHadOverbar = true;
}
ctx.beginPath();
ctx.moveTo(...overbarStart);
ctx.lineTo(...overbarEnd);
ctx.stroke();
} else {
lastHadOverbar = false;
}
for (var line of glyph.l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var k = 1; k < line.length; k++) {
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
}
ctx.stroke();
}
offsetx += glyph.w * text.width;
}
offsety += interline;
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
if ("svgpath" in edge) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "rect") {
ctx.moveTo(...edge.start);
ctx.lineTo(edge.start[0], edge.end[1]);
ctx.lineTo(...edge.end);
ctx.lineTo(edge.end[0], edge.start[1]);
ctx.lineTo(...edge.start);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
if("filled" in edge && edge.filled)
ctx.fill();
else
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if ("svgpath" in shape) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, scalefactor, shape, color) {
ctx.save();
if (!("svgpath" in shape)) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
if("filled" in shape && !shape.filled) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke(getPolygonsPath(shape));
} else {
ctx.fillStyle = color;
ctx.fill(getPolygonsPath(shape));
}
ctx.restore();
}
function drawDrawing(ctx, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, scalefactor, drawing, color);
} else {
drawText(ctx, drawing, color);
}
}
function getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline) {
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
if (pad.offset) {
ctx.translate(...pad.offset);
}
ctx.fillStyle = color;
ctx.strokeStyle = color;
var path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
ctx.restore();
}
function drawPadHole(ctx, pad, padHoleColor) {
if (pad.type != "th") return;
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
ctx.fillStyle = padHoleColor;
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
ctx.restore();
}
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
if (highlight) {
// draw bounding box
if (footprint.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...footprint.bbox.pos);
ctx.rotate(deg2rad(-footprint.bbox.angle));
ctx.translate(...footprint.bbox.relpos);
ctx.fillStyle = colors.pad;
ctx.fillRect(0, 0, ...footprint.bbox.size);
ctx.globalAlpha = 1;
ctx.strokeStyle = colors.pad;
ctx.lineWidth = 3 / scalefactor;
ctx.strokeRect(0, 0, ...footprint.bbox.size);
ctx.restore();
}
}
// draw drawings
for (var drawing of footprint.drawings) {
if (drawing.layer == layer) {
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
}
}
ctx.lineWidth = 3 / scalefactor;
// draw pads
if (settings.renderPads) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, colors.pad, outline);
if (pad.pin1 && settings.highlightpin1) {
drawPad(ctx, pad, colors.outline, true);
}
}
}
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, colors.padHole);
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawDrawing(ctx, scalefactor, edge, edgecolor);
}
}
function drawFootprints(canvas, layer, scalefactor, highlight) {
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3 / scalefactor;
var style = getComputedStyle(topmostdiv);
var colors = {
pad: style.getPropertyValue('--pad-color'),
padHole: style.getPropertyValue('--pad-hole-color'),
outline: style.getPropertyValue('--pin1-outline-color'),
}
for (var i = 0; i < pcbdata.footprints.length; i++) {
var mod = pcbdata.footprints[i];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
var h = highlightedFootprints.includes(i);
var d = markedFootprints.has(i);
if (highlight) {
if(h && d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
} else if (h) {
colors.pad = style.getPropertyValue('--pad-color-highlight');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
} else if (d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
}
}
if( h || d || !highlight) {
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata.drawings[layername][layer]) {
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, scalefactor, d, polygonColor);
} else {
drawText(ctx, d, textColor);
}
}
}
function drawTracks(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.lineCap = "round";
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
ctx.lineWidth = track.width;
ctx.beginPath();
if ('radius' in track) {
ctx.arc(
...track.center,
track.radius,
deg2rad(track.startangle),
deg2rad(track.endangle));
} else {
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
}
ctx.stroke();
}
}
function drawZones(canvas, layer, color, highlight) {
ctx = canvas.getContext("2d");
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineJoin = "round";
for (var zone of pcbdata.zones[layer]) {
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
if (highlight && highlightedNet != zone.net) continue;
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
if (zone.width > 0) {
ctx.lineWidth = zone.width;
ctx.stroke(zone.path2d);
}
}
}
function clearCanvas(canvas, color = null) {
var ctx = canvas.getContext("2d");
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
if (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
} else {
if (!window.matchMedia("print").matches)
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var padHoleColor = style.getPropertyValue('--pad-hole-color');
var ctx = canvas.getContext("2d");
for (var footprint of pcbdata.footprints) {
// draw pads
var padDrawn = false;
for (var pad of footprint.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false);
padDrawn = true;
}
}
if (padDrawn) {
// redraw all pad holes because some pads may overlap
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, padHoleColor);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
drawFootprints(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawFootprints(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
function prepareCanvas(canvas, flip, transform) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer === "B");
for (var c of ["bg", "fab", "silk", "highlight"]) {
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
}
}
function rotateVector(v, angle) {
angle = deg2rad(angle);
return [
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
];
}
function applyRotation(bbox, flip) {
var corners = [
[bbox.minx, bbox.miny],
[bbox.minx, bbox.maxy],
[bbox.maxx, bbox.miny],
[bbox.maxx, bbox.maxy],
];
corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
return {
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
}
}
function recalcLayerScale(layerdict, width, height) {
var flip = (layerdict.layer === "B");
var bbox = applyRotation(pcbdata.edges_bbox, flip);
var scalefactor = 0.98 * Math.min(
width / (bbox.maxx - bbox.minx),
height / (bbox.maxy - bbox.miny)
);
if (scalefactor < 0.1) {
scalefactor = 1;
}
layerdict.transform.s = scalefactor;
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function modulo(n, mod) {
return ((n % mod) + mod) % mod;
}
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
var dx = x - xc;
var dy = y - yc;
var r_sq = dx * dx + dy * dy;
var rmin = Math.max(0, radius - d);
var rmax = radius + d;
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
return false;
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
var dx1 = xc + radius * Math.cos(angle1) - x;
var dy1 = yc + radius * Math.sin(angle1) - y;
if (dx1 * dx1 + dy1 * dy1 <= d * d)
return true;
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
var dx2 = xc + radius * Math.cos(angle2) - x;
var dy2 = yc + radius * Math.sin(angle2) - y;
if (dx2 * dx2 + dy2 * dy2 <= d * d)
return true;
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
if (angle1 > angle2)
return (angle >= angle2 || angle <= angle1);
else
return (angle >= angle1 && angle <= angle2);
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for (var track of pcbdata.tracks[layer]) {
if ('radius' in track) {
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
return track.net;
}
} else {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
}
// Check pads
if (settings.renderPads) {
for (var footprint of pcbdata.footprints) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinFootprintBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.footprints.length; i++) {
var footprint = pcbdata.footprints[i];
if (footprint.layer == layer) {
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0 && e.button != 1) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
var flip = layerdict.layer === "B";
if (flip) {
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
} else {
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
}
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var footprints = bboxHitScan(layerdict.layer, ...v);
if (footprints.length > 0) {
footprintsClicked(footprints);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist / oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
}
function handleMouseWheel(e, layerdict) {
e.preventDefault();
e.stopPropagation();
var t = layerdict.transform;
var wheeldelta = e.deltaY;
if (e.deltaMode == 1) {
// FF only, scroll by lines
wheeldelta *= 30;
} else if (e.deltaMode == 2) {
wheeldelta *= 300;
}
var m = Math.pow(1.1, -wheeldelta / 40);
// Limit amount of zoom per tick.
if (m > 2) {
m = 2;
} else if (m < 0.5) {
m = 0.5;
}
t.zoom *= m;
var zoomd = (1 - m) / t.zoom;
t.panx += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function setOffsetBackRotation(value) {
settings.offsetBackRotation = value;
writeStorage("offsetBackRotation", value);
resizeAll();
}
function initRender() {
allcanvas = {
front: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("F_bg"),
fab: document.getElementById("F_fab"),
silk: document.getElementById("F_slk"),
highlight: document.getElementById("F_hl"),
layer: "F",
},
back: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("B_bg"),
fab: document.getElementById("B_fab"),
silk: document.getElementById("B_slk"),
highlight: document.getElementById("B_hl"),
layer: "B",
}
};
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/*
* Table reordering via Drag'n'Drop
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
*/
function setBomHandlers() {
const bom = document.getElementById('bomtable');
let dragName;
let placeHolderElements;
let draggingElement;
let forcePopulation;
let xOffset;
let yOffset;
let wasDragged;
const mouseUpHandler = function(e) {
// Delete dragging element
draggingElement.remove();
// Make BOM selectable again
bom.style.removeProperty("userSelect");
// Remove listeners
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
if (wasDragged) {
// Redraw whole BOM
populateBomTable();
}
}
const mouseMoveHandler = function(e) {
// Notice the dragging
wasDragged = true;
// Make the dragged element visible
draggingElement.style.removeProperty("display");
// Set elements position to mouse position
draggingElement.style.left = `${e.screenX - xOffset}px`;
draggingElement.style.top = `${e.screenY - yOffset}px`;
// Forced redrawing of BOM table
if (forcePopulation) {
forcePopulation = false;
// Copy array
phe = Array.from(placeHolderElements);
// populate BOM table again
populateBomHeader(dragName, phe);
populateBomBody(dragName, phe);
}
// Set up array of hidden columns
var hiddenColumns = Array.from(settings.hiddenColumns);
// In the ungrouped mode, quantity don't exist
if (settings.bommode === "ungrouped")
hiddenColumns.push("Quantity");
// If no checkbox fields can be found, we consider them hidden
if (settings.checkboxes.length == 0)
hiddenColumns.push("checkboxes");
// Get table headers and group them into checkboxes, extrafields and normal headers
const bh = document.getElementById("bomhead");
headers = Array.from(bh.querySelectorAll("th"))
headers.shift() // numCol is not part of the columnOrder
headerGroups = []
lastCompoundClass = null;
for (i = 0; i < settings.columnOrder.length; i++) {
cElem = settings.columnOrder[i];
if (hiddenColumns.includes(cElem)) {
// Hidden columns appear as a dummy element
headerGroups.push([]);
continue;
}
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
if (elem.classList.contains("bom-checkbox")) {
if (lastCompoundClass === "bom-checkbox") {
cbGroup = headerGroups.pop();
cbGroup.push(elem);
headerGroups.push(cbGroup);
} else {
lastCompoundClass = "bom-checkbox";
headerGroups.push([elem])
}
} else {
headerGroups.push([elem])
}
}
// Copy settings.columnOrder
var columns = Array.from(settings.columnOrder)
// Set up array with indices of hidden columns
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
var dragIndex = columns.indexOf(dragName);
var swapIndex = dragIndex;
var swapDone = false;
// Check if the current dragged element is swapable with the left or right element
if (dragIndex > 0) {
// Get left headers boundingbox
swapIndex = dragIndex - 1;
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
swapIndex--;
if (!hiddenIndices.includes(swapIndex)) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
// Get right headers boundingbox
swapIndex = dragIndex + 1;
while (hiddenIndices.includes(swapIndex))
swapIndex++;
if (swapIndex < headerGroups.length) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
// Write back change to storage
if (swapDone) {
settings.columnOrder = columns
writeStorage("columnOrder", JSON.stringify(columns));
}
}
const mouseDownHandler = function(e) {
var target = e.target;
if (target.tagName.toLowerCase() != "td")
target = target.parentElement;
// Used to check if a dragging has ever happened
wasDragged = false;
// Create new element which will be displayed as the dragged column
draggingElement = document.createElement("div")
draggingElement.classList.add("dragging");
draggingElement.style.display = "none";
draggingElement.style.position = "absolute";
draggingElement.style.overflow = "hidden";
// Get bomhead and bombody elements
const bh = document.getElementById("bomhead");
const bb = document.getElementById("bombody");
// Get all compound headers for the current column
var compoundHeaders;
if (target.classList.contains("bom-checkbox")) {
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
} else {
compoundHeaders = [target];
}
// Create new table which will display the column
var newTable = document.createElement("table");
newTable.classList.add("bom");
newTable.style.background = "white";
draggingElement.append(newTable);
// Create new header element
var newHeader = document.createElement("thead");
newTable.append(newHeader);
// Set up array for storing all placeholder elements
placeHolderElements = [];
// Add all compound headers to the new thead element and placeholders
compoundHeaders.forEach(function(h) {
clone = cloneElementWithDimensions(h);
newHeader.append(clone);
placeHolderElements.push(clone);
});
// Create new body element
var newBody = document.createElement("tbody");
newTable.append(newBody);
// Get indices for compound headers
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
// For each row in the BOM body...
var rows = bb.querySelectorAll("tr");
rows.forEach(function(row) {
// ..get the cells for the compound column
const tds = row.querySelectorAll("td");
var copytds = idxs.map(i => tds[i]);
// Add them to the new element and the placeholders
var newRow = document.createElement("tr");
copytds.forEach(function(td) {
clone = cloneElementWithDimensions(td);
newRow.append(clone);
placeHolderElements.push(clone);
});
newBody.append(newRow);
});
// Compute width for compound header
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
draggingElement.style.width = `${width}px`;
// Insert the new dragging element and disable selection on BOM
bom.insertBefore(draggingElement, null);
bom.style.userSelect = "none";
// Determine the mouse position offset
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
yOffset = e.screenY - compoundHeaders[0].offsetTop;
// Get name for the column in settings.columnOrder
dragName = getColumnOrderName(target);
// Change text and class for placeholder elements
placeHolderElements = placeHolderElements.map(function(e) {
newElem = cloneElementWithDimensions(e);
newElem.textContent = "";
newElem.classList.add("placeholder");
return newElem;
});
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
forcePopulation = true;
// Add listeners for move and up on mouse
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
// In netlist mode, there is nothing to reorder
if (settings.bommode === "netlist")
return;
// Add mouseDownHandler to every column except the numCol
bom.querySelectorAll("th")
.forEach(function(head) {
if (!head.classList.contains("numCol")) {
head.onmousedown = mouseDownHandler;
}
});
}
function getBoundingClientRectFromMultiple(elements) {
var elems = Array.from(elements);
if (elems.length == 0)
return null;
var box = elems.shift()
.getBoundingClientRect();
elems.forEach(function(elem) {
var elembox = elem.getBoundingClientRect();
box.left = Math.min(elembox.left, box.left);
box.top = Math.min(elembox.top, box.top);
box.width += elembox.width;
box.height = Math.max(elembox.height, box.height);
});
return box;
}
function cloneElementWithDimensions(elem) {
var newElem = elem.cloneNode(true);
newElem.style.height = window.getComputedStyle(elem).height;
newElem.style.width = window.getComputedStyle(elem).width;
return newElem;
}
function getBomTableHeaderIndex(elem) {
const bh = document.getElementById('bomhead');
const ths = Array.from(bh.querySelectorAll("th"));
return ths.indexOf(elem);
}
function getColumnOrderName(elem) {
var cname = elem.getAttribute("col_name");
if (cname === "bom-checkbox")
return "checkboxes";
else
return cname;
}
function resizableGrid(tablehead) {
var cols = tablehead.firstElementChild.children;
var rowWidth = tablehead.offsetWidth;
for (var i = 1; i < cols.length; i++) {
if (cols[i].classList.contains("bom-checkbox"))
continue;
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
}
for (var i = 1; i < cols.length - 1; i++) {
var div = document.createElement('div');
div.className = "column-width-handle";
cols[i].appendChild(div);
setListeners(div);
}
function setListeners(div) {
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
div.addEventListener('mousedown', function(e) {
e.preventDefault();
e.stopPropagation();
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
startX = e.pageX;
var padding = paddingDiff(curCol);
rowWidth = curCol.parentElement.offsetWidth;
curColWidth = curCol.clientWidth - padding;
nxtColWidth = nxtCol.clientWidth - padding;
});
document.addEventListener('mousemove', function(e) {
if (startX) {
var diffX = e.pageX - startX;
diffX = -Math.min(-diffX, curColWidth - 20);
diffX = Math.min(diffX, nxtColWidth - 20);
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
}
});
document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
startX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}
function paddingDiff(col) {
if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}
var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));
}
function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* DOM manipulation and misc code */
var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
var highlightedNet = null;
var lastClicked;
function dbg(html) {
dbgdiv.innerHTML = html;
}
function redrawIfInitDone() {
if (initDone) {
redrawCanvas(allcanvas.front);
redrawCanvas(allcanvas.back);
}
}
function padsVisible(value) {
writeStorage("padsVisible", value);
settings.renderPads = value;
redrawIfInitDone();
}
function referencesVisible(value) {
writeStorage("referencesVisible", value);
settings.renderReferences = value;
redrawIfInitDone();
}
function valuesVisible(value) {
writeStorage("valuesVisible", value);
settings.renderValues = value;
redrawIfInitDone();
}
function tracksVisible(value) {
writeStorage("tracksVisible", value);
settings.renderTracks = value;
redrawIfInitDone();
}
function zonesVisible(value) {
writeStorage("zonesVisible", value);
settings.renderZones = value;
redrawIfInitDone();
}
function dnpOutline(value) {
writeStorage("dnpOutline", value);
settings.renderDnpOutline = value;
redrawIfInitDone();
}
function setDarkMode(value) {
if (value) {
topmostdiv.classList.add("dark");
} else {
topmostdiv.classList.remove("dark");
}
writeStorage("darkmode", value);
settings.darkMode = value;
redrawIfInitDone();
}
function setShowBOMColumn(field, value) {
if (field === "references") {
var rl = document.getElementById("reflookup");
rl.disabled = !value;
if (!value) {
rl.value = "";
updateRefLookup("");
}
}
var n = settings.hiddenColumns.indexOf(field);
if (value) {
if (n != -1) {
settings.hiddenColumns.splice(n, 1);
}
} else {
if (n == -1) {
settings.hiddenColumns.push(field);
}
}
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
if (initDone) {
populateBomTable();
}
redrawIfInitDone();
}
function setFullscreen(value) {
if (value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
function getStoredCheckboxRefs(checkbox) {
function convert(ref) {
var intref = parseInt(ref);
if (isNaN(intref)) {
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.footprints[i].ref == ref) {
return i;
}
}
return -1;
} else {
return intref;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
function getCheckboxState(checkbox, references) {
var storedRefsSet = getStoredCheckboxRefs(checkbox);
var currentRefsSet = new Set(references.map(r => r[1]));
// Get difference of current - stored
var difference = new Set(currentRefsSet);
for (ref of storedRefsSet) {
difference.delete(ref);
}
if (difference.size == 0) {
// All the current refs are stored
return "checked";
} else if (difference.size == currentRefsSet.size) {
// None of the current refs are stored
return "unchecked";
} else {
// Some of the refs are stored
return "indeterminate";
}
}
function setBomCheckboxState(checkbox, element, references) {
var state = getCheckboxState(checkbox, references);
element.checked = (state == "checked");
element.indeterminate = (state == "indeterminate");
}
function createCheckboxChangeHandler(checkbox, references, row) {
return function () {
refsSet = getStoredCheckboxRefs(checkbox);
var markWhenChecked = settings.markWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (markWhenChecked) {
row.classList.add("checked");
for (var ref of references) {
markedFootprints.add(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (markWhenChecked) {
row.classList.remove("checked");
for (var ref of references) {
markedFootprints.delete(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'unchecked';
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
}
}
function clearHighlightedFootprints() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedFootprints = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function () {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
EventHandler.emitEvent(
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
rowid: rowid,
refs: refs,
net: net
});
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
if (!settings.hiddenColumns.includes("references")) {
for (var ref of entry) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
// check fields
for (var i in config.fields) {
var f = config.fields[i];
if (!settings.hiddenColumns.includes(f)) {
for (var ref of entry) {
if (pcbdata.bom.fields[ref[1]][i].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
}
return false;
}
function findRefInEntry(entry) {
return entry.filter(r => r[0].toLowerCase() == reflookup);
}
function highlightFilter(s) {
if (!filter) {
return s;
}
var parts = s.toLowerCase().split(filter);
if (parts.length == 1) {
return s;
}
var r = "";
var pos = 0;
for (var i in parts) {
if (i > 0) {
r += '<mark class="highlight">' +
s.substring(pos, pos + filter.length) +
'</mark>';
pos += filter.length;
}
r += s.substring(pos, pos + parts[i].length);
pos += parts[i].length;
}
return r;
}
function checkboxSetUnsetAllHandler(checkboxname) {
return function () {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (checkboxnum >= settings.checkboxes.length) {
return;
}
var allset = true;
var checkbox;
var row;
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
if (!checkbox.checked || checkbox.indeterminate) {
allset = false;
break;
}
}
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = !allset;
checkbox.indeterminate = false;
checkbox.onchange();
}
}
}
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
if (is_checkbox)
th.setAttribute("col_name", "bom-checkbox");
else
th.setAttribute("col_name", name);
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
var spacer = document.createElement("div");
spacer.className = "column-spacer";
th.appendChild(spacer);
spacer.onclick = function () {
if (currentSortColumn && th !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && th === currentSortColumn) {
// Already sorted by this column
if (currentSortOrder == "asc") {
// Sort by this column, descending order
bomSortFunction = function (a, b) {
return -comparator(a, b);
}
currentSortColumn.childNodes[1].classList.remove("asc");
currentSortColumn.childNodes[1].classList.add("desc");
currentSortOrder = "desc";
} else {
// Unsort
bomSortFunction = null;
currentSortColumn.childNodes[1].classList.remove("desc");
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
} else {
// Sort by this column, ascending order
bomSortFunction = comparator;
currentSortColumn = th;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
if (is_checkbox) {
spacer.onclick = fancyDblClickHandler(
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
}
return th;
}
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
var vismenu = document.createElement("div");
vismenu.id = "vismenu";
vismenu.classList.add("menu");
var visbutton = document.createElement("div");
visbutton.classList.add("visbtn");
visbutton.classList.add("hideonprint");
var viscontent = document.createElement("div");
viscontent.classList.add("menu-content");
viscontent.id = "vismenu-content";
settings.columnOrder.forEach(column => {
if (typeof column !== "string")
return;
// Skip empty columns
if (column === "checkboxes" && settings.checkboxes.length == 0)
return;
else if (column === "Quantity" && settings.bommode == "ungrouped")
return;
var label = document.createElement("label");
label.classList.add("menu-label");
var input = document.createElement("input");
input.classList.add("visibility_checkbox");
input.type = "checkbox";
input.onchange = function (e) {
setShowBOMColumn(column, e.target.checked)
};
input.checked = !(settings.hiddenColumns.includes(column));
label.appendChild(input);
if (column.length > 0)
label.append(column[0].toUpperCase() + column.slice(1));
viscontent.appendChild(label);
});
viscontent.childNodes[0].classList.add("menu-label-top");
vismenu.appendChild(visbutton);
if (settings.bommode != "netlist") {
vismenu.appendChild(viscontent);
th.appendChild(vismenu);
}
tr.appendChild(th);
var checkboxCompareClosure = function (checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a);
var stateB = getCheckboxState(checkbox, b);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
var stringFieldCompareClosure = function (fieldIndex) {
return (a, b) => {
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
var compareRefs = (a, b) => {
var ra = referenceRegex.exec(a);
var rb = referenceRegex.exec(b);
if (ra === null || rb === null) {
if (a != b) return a > b ? 1 : -1;
return 0;
} else {
if (ra.groups.prefix != rb.groups.prefix) {
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
}
if (ra.groups.number != rb.groups.number) {
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
}
return 0;
}
}
if (settings.bommode == "netlist") {
th = createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
});
tr.appendChild(th);
} else {
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
var valueIndex = config.fields.indexOf("Value");
var footprintIndex = config.fields.indexOf("Footprint");
columns.forEach((column) => {
if (column === placeHolderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
tr.appendChild(th);
}
} else if (column === "References") {
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
var i = 0;
while (i < a.length && i < b.length) {
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
i++;
}
return a.length - b.length;
}));
} else if (column === "Value") {
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
var ra = a[0][1], rb = b[0][1];
return valueCompare(
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
}));
return;
} else if (column === "Footprint") {
tr.appendChild(createColumnHeader(
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
} else if (column === "Quantity" && settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
return a.length - b.length;
}));
} else {
// Other fields
var i = config.fields.indexOf(column);
if (i < 0)
return;
tr.appendChild(createColumnHeader(
column, `field${i + 1}`, stringFieldCompareClosure(i)));
}
});
}
bomhead.appendChild(tr);
}
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
footprintIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
if (settings.bommode == "netlist") {
bomtable = pcbdata.nets.slice();
} else {
switch (settings.canvaslayout) {
case 'F':
bomtable = pcbdata.bom.F.slice();
break;
case 'FB':
bomtable = pcbdata.bom.both.slice();
break;
case 'B':
bomtable = pcbdata.bom.B.slice();
break;
}
if (settings.bommode == "ungrouped") {
// expand bom table
expandedTable = []
for (var bomentry of bomtable) {
for (var ref of bomentry) {
expandedTable.push([ref]);
}
}
bomtable = expandedTable;
}
}
if (bomSortFunction) {
bomtable = bomtable.sort(bomSortFunction);
}
for (var i in bomtable) {
var bomentry = bomtable[i];
if (filter && !entryMatches(bomentry)) {
continue;
}
var references = null;
var netname = null;
var tr = document.createElement("TR");
var td = document.createElement("TD");
var rownum = +i + 1;
tr.id = "bomrow" + rownum;
td.textContent = rownum;
tr.appendChild(td);
if (settings.bommode == "netlist") {
netname = bomentry;
td = document.createElement("TD");
td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
tr.appendChild(td);
} else {
if (reflookup) {
references = findRefInEntry(bomentry);
if (references.length == 0) {
continue;
}
} else {
references = bomentry;
}
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
columns.forEach((column) => {
if (column === placeholderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
if (checkbox) {
td = document.createElement("TD");
var input = document.createElement("input");
input.type = "checkbox";
input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
setBomCheckboxState(checkbox, input, references);
if (input.checked && settings.markWhenChecked == checkbox) {
tr.classList.add("checked");
}
td.appendChild(input);
tr.appendChild(td);
}
}
} else if (column === "References") {
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
} else if (column === "Quantity" && settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = references.length;
tr.appendChild(td);
} else {
// All the other fields
var field_index = config.fields.indexOf(column)
if (field_index < 0)
return;
var valueSet = new Set();
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
td = document.createElement("TD");
var output = new Array();
for (let item of valueSet) {
const visible = highlightFilter(item);
if (typeof item === 'string' && item.match(urlRegex)) {
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
} else {
output.push(visible);
}
}
td.innerHTML = output.join(", ");
tr.appendChild(td);
}
});
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
footprintIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
if ((filter || reflookup) && first) {
handler();
first = false;
}
}
EventHandler.emitEvent(
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
filter: filter,
reflookup: reflookup,
checkboxes: settings.checkboxes,
bommode: settings.bommode,
});
}
function highlightPreviousRow() {
if (!currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[0].id == currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
for (var i = 0; i < highlightHandlers.length - 1; i++) {
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function highlightNextRow() {
if (!currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
for (var i = 1; i < highlightHandlers.length; i++) {
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function populateBomTable() {
populateBomHeader();
populateBomBody();
setBomHandlers();
resizableGrid(bomhead);
}
function footprintsClicked(footprintIndexes) {
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
for (var i = 1; i <= footprintIndexes.length; i++) {
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
if (refIndex in footprintIndexToHandler) {
lastClicked = refIndex;
footprintIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedFootprints();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
function changeCanvasLayout(layout) {
document.getElementById("fl-btn").classList.remove("depressed");
document.getElementById("fb-btn").classList.remove("depressed");
document.getElementById("bl-btn").classList.remove("depressed");
switch (layout) {
case 'F':
document.getElementById("fl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
function populateMetadata() {
document.getElementById("title").innerHTML = pcbdata.metadata.title;
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
document.getElementById("company").innerHTML = pcbdata.metadata.company;
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
if (pcbdata.metadata.title != "") {
document.title = pcbdata.metadata.title + " BOM";
}
// Calculate board stats
var fp_f = 0,
fp_b = 0,
pads_f = 0,
pads_b = 0,
pads_th = 0;
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.footprints[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
// Update version string
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}
function changeBomLayout(layout) {
document.getElementById("bom-btn").classList.remove("depressed");
document.getElementById("lr-btn").classList.remove("depressed");
document.getElementById("tb-btn").classList.remove("depressed");
switch (layout) {
case 'bom-only':
document.getElementById("bom-btn").classList.add("depressed");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
document.getElementById("frontcanvas").style.display = "none";
document.getElementById("backcanvas").style.display = "none";
document.getElementById("bot").style.height = "";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.remove("split-horizontal");
document.getElementById("canvasdiv").classList.remove("split-horizontal");
document.getElementById("frontcanvas").classList.add("split-horizontal");
document.getElementById("backcanvas").classList.add("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
direction: "vertical",
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
onDragEnd: resizeAll
});
break;
case 'left-right':
document.getElementById("lr-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("bot").style.height = "calc(100% - 80px)";
document.getElementById("bomdiv").classList.add("split-horizontal");
document.getElementById("canvasdiv").classList.add("split-horizontal");
document.getElementById("frontcanvas").classList.remove("split-horizontal");
document.getElementById("backcanvas").classList.remove("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeAll
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
var chkbxs = document.getElementsByClassName("visibility_checkbox");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = true;
}
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedFootprints();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
prepCheckboxes();
populateMarkWhenCheckedOptions();
setMarkWhenChecked(settings.markWhenChecked);
}
function setMarkWhenChecked(value) {
writeStorage("markWhenChecked", value);
settings.markWhenChecked = value;
markedFootprints.clear();
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
markedFootprints.add(ref);
}
populateBomTable();
drawHighlights();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function populateMarkWhenCheckedOptions() {
var container = document.getElementById("markWhenCheckedContainer");
if (settings.checkboxes.length == 0) {
container.parentElement.style.display = "none";
return;
}
container.innerHTML = '';
container.parentElement.style.display = "inline-block";
function createOption(name, displayName) {
var id = "markWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "markWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setMarkWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.markWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
function constrain(number, min, max){
return Math.min(Math.max(parseInt(number), min), max);
}
document.onkeydown = function (e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
case "ArrowLeft":
case "ArrowRight":
if (document.activeElement.type != "text"){
e.preventDefault();
let boardRotationElement = document.getElementById("boardRotation")
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
if (e.key == "ArrowLeft"){
settings.boardRotation += 3; // 15 degrees
}
else{
settings.boardRotation -= 3;
}
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
boardRotationElement.value = settings.boardRotation
setBoardRotation(settings.boardRotation);
}
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
e.preventDefault();
}
}
}
function hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
window.onload = function (e) {
initUtils();
initRender();
initStorage();
initDefaults();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
// Triggers render
changeBomLayout(settings.bomlayout);
// Users may leave fullscreen without touching the checkbox. Uncheck.
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement)
document.getElementById('fullscreenCheckbox').checked = false;
});
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
///////////////////////////////////////////////
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div style="float: right; height: 100%;">
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="menubtn"></button>
<div class="menu-content">
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label><!-- This comment eats space! All of it!
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
Full Screen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Pads
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP outlined
</label>
<label class="menu-label">
<input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
Highlight first pin
</label>
<label class="menu-label">
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
<span>Board rotation</span>
<span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
</label>
<label class="menu-label">
<input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
Offset back rotation
</label>
<label class="menu-label">
<div style="margin-left: 5px">Bom checkboxes</div>
<input id="bomCheckboxes" class="menu-textbox" type=text
oninput="setBomCheckboxes(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Mark when checked</div>
<div id="markWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint"
style="float: right; position: relative; top: 8px">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu" style="float: right; top: 8px;">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Save bom table as</span>
<div class="flexbox">
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
</div>
</div>
</div>
</div>
</div>
<div id="fileinfodiv" style="overflow: auto;">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="bot" class="split" style="height: calc(100% - 80px)">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="saveBomTable('clipboard')"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>