4728 lines
324 KiB
HTML
4728 lines
324 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: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.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: 3px;
|
|
}
|
|
|
|
.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: 0.4rem 0.4rem 0.4rem 0;
|
|
}
|
|
|
|
.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 {
|
|
display: flex;
|
|
flex-direction: column;
|
|
width: 100%;
|
|
background-color: white;
|
|
transition: background-color 0.3s;
|
|
min-height: 100%;
|
|
}
|
|
|
|
#top {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
justify-content: flex-end;
|
|
align-items: center;
|
|
}
|
|
|
|
#topdivider {
|
|
border-bottom: 2px solid black;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.dark #topdivider {
|
|
border-bottom: 2px solid #ccc;
|
|
}
|
|
|
|
#topdivider>div {
|
|
position: relative;
|
|
}
|
|
|
|
#toptoggle {
|
|
cursor: pointer;
|
|
user-select: none;
|
|
position: absolute;
|
|
padding: 0.1rem 0.3rem;
|
|
top: -0.4rem;
|
|
left: -1rem;
|
|
font-size: 1.4rem;
|
|
line-height: 60%;
|
|
border: 1px solid black;
|
|
border-radius: 1rem;
|
|
background-color: #fff;
|
|
z-index: 100;
|
|
}
|
|
|
|
.flipped {
|
|
transform: rotate(0.5turn);
|
|
}
|
|
|
|
.dark #toptoggle {
|
|
border: 1px solid #fff;
|
|
background-color: #222;
|
|
}
|
|
|
|
#fileinfodiv {
|
|
flex: 20rem 1 0;
|
|
overflow: auto;
|
|
}
|
|
|
|
#bomcontrols {
|
|
display: flex;
|
|
flex-direction: row-reverse;
|
|
}
|
|
|
|
#bomcontrols>* {
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
#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;
|
|
}
|
|
|
|
.bom-color {
|
|
width: 20%;
|
|
}
|
|
|
|
.color-column input {
|
|
width: 1.6rem;
|
|
height: 1rem;
|
|
border: 1px solid black;
|
|
cursor: pointer;
|
|
padding: 0;
|
|
}
|
|
|
|
/* removes default styling from input color element */
|
|
::-webkit-color-swatch {
|
|
border: none;
|
|
}
|
|
|
|
::-webkit-color-swatch-wrapper {
|
|
padding: 0;
|
|
}
|
|
|
|
::-moz-color-swatch,
|
|
::-moz-focus-inner {
|
|
border: none;
|
|
}
|
|
|
|
::-moz-focus-inner {
|
|
padding: 0;
|
|
}
|
|
/* #bomhead {
|
|
position: sticky;
|
|
top: 0px;
|
|
z-index: 1;
|
|
} */
|
|
</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": "none", "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, "mark_when_checked": "", "fields": ["Value", "Footprint"]}
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
var pcbdata = JSON.parse(LZString.decompressFromBase64("N4IgpgJg5mDOD6AjRB7AHiAXAAlAWwEsA7DHARgHYA6AJhoE4AabEQogTy20qooFY+zVgEM0pbjWqSmLPKM7l6NKgA4ADHwC+QyDFhcA2qAAu7AA5guIMygA27KCiIghN/TgNrmagLpDhRFC2ljheLDb2jkTu2AZxPDR8ACzMPBQqfrFkkrTJqdTpmQbZUnncSrwZzMWlKeXKhT6ZIADuBBDGABZcalQaQgBmBLbBED2azRAATsJtgTGgsMMA1rAAxlNgYM44oABihibmISywYFB428Yup8bCU9ce9ABsVPQUz6nPypJVLNtjJ7UF51MjPMi0ejNNodbqhKhkLTMI4WKxnC5XG4gWB3B6Gd59JKgvivChkP7gIiA2L0FR9T7cAS8NQ0aHtLo9BFI3AgUyonDY86XIjXIQ4+6PGnA56g8GQ5oAwxkNS9GhqADMXwhDDZsM5iO0PL5J0FGJFWPFeKedLUDMRfGZrJ0VKVKtoGtSTIoLN1HPhBuRvOOaKFmLFuMlxTU1BJMntvHJCpdHmVDr46oonodZIpML92F6AaNwYF6OFotuEtdMeecblvyT1KjaYzWtohSEebhBa5hpRJvuawtEdd9CoSQ+qXJfRoSWaMwgBAArjEIWFsRGAkETgBacm9dcArfBLg7+gHzvs7u9bn9kNmisbqsptR0id2tUzufOpvKt+T7hpxZb8WC7TlbyDflTlDc1w2fLJX3HACyCSV5gMbV1/ztIkv19a8qAg4173LYd4KjOlY09UlEx/asCNrLME1zK99UIktoIfUirQQiiGO4b52wpRUXxrOttQ7UCWP9NioNNEi4O4qMx3fKdqHQ2iUzICEVMAtTZzw8C+0ggcpiHBTI2VZTkNQ3ChAXZdVz6czjxOc8nP+KkXK4fd3NaKSexkk0yzDStFK07TrL0kDKV/NQrOwqKDPhQLiJCp8ws/HStMSjSsjoJC7R4dTJL1ZKjKIgVBy4iz8qyoD9Ls4RFxXbzfMtO5AhPHAzwvDyIC8+F1zAsrAwqjj5NCmrlCyidbL6pVMsiua/NKgLyvYuS0vahb1QKqcbQa+aUxoXass/YqVvzG91tk4LYMmna9u4HCLuEvLTustDDsu/CUsq0zqoW6bPuW+yWvINrN06k5epigbsDcob/Ou0bOgINZliIOAYlh2AADcoDMYR8xAABZHDzzJJgtJtcE4r4AAZJIHXVGV1XZxgafpSy+HJh0yHVPgPjITnpxUOn6EZ5mEUF4XRdpnm+YI5J1GpoCJaltCVBUFDNS58XFZs18daSPX1Z5pm0xVuL5dUDWQHKtGMax2AcbagmiZJ8nqBUegwTINW6QN+mmeob4kklmhbaSdQUJob3x3VIlJ31jXQ8T5PPi520Ldmih1SUdUVFtnOQ9mnXkhoYvs/oP36HTlR0z4E7bYFigq6ln2/fBQPaAF98G+7gPbfVSRhYbpuW65pINUjhvESSKvo8XtQJ3T/PC+r6cY7UOP09NzPo9jxfybpREVA7ku05jqha393vg8l0/b6H3vS8lpmz74C/G9tx++AdqjdGmNsacnXPjQmxNuxkz4IWXeKktJfXPB/WBCJ4EpzBLfD4ZIkgM1QQLSWZJRakmbueXB+CKAfGeFnTBFA/Z4NVOmRumZEGqAYCHVBM9vhF2IWw5BjNOEX0XlvUk9DUHNw0FPWhpDV4MOVgbNWrxnjYJQnIgQCjeEsn4aTVB54UL8F4c8FUzd1R4O1EIperCjGSPVDo3oF9m6/1YRffhZi+h12bpo9hKCISCwNiIvh9MdHKFfLOSxmCXEcIhBXOWrCiQm3jnwCE3xHGCGcd4gRyTEiX1YVoqJbx1QqgnF41xzc+i2hOiwzBtoqZ4JCUSdmUdWGpg7nUvoFiAnkn0c8NpoThG8IYELcEvSGmj14RmAOzdekVNbHE5Uq8KBuPoIUhZvD4l7ySbfbJTjMHrJPmU9Ulla4lI4Q0Z4CSTlPzKemQhvDIkoOUDcoWlzeZlNrsogWvCWmNzwbtDUO9FH0lqemBERzAV5JQbtQp+i0nVIyb8qgGYqE0LQh8+uIKkiIliZg75AjTpMJJF8k2HwEXMyLoS1hiRkWkqxeCcZVMplvO/uCAJ9y8XjgJSiwJktAFGidiA12YCxQeygVYcm016BEnCTaWuAcmbTXJCdLeCsy7KEKQXTx2dr7KHJC8ahJdZX10XqCpOGCz78CLvKvoFqda20SFisgVqNTtx2W+WeUzjXOpydOJJF9LWeptSLLmyic5Gp1f3M1vBUKqytbq6hNCg4nSteqyOf9tWIuPmbIO6aI5SuVWw0xxr0zZJSFzdIEdZFFtHs3UtPrFX+rVZm22vqlXitUIGtNudlAqA7Vq3OULq2zk7WXAdJar6G12mSU1Ca7b9oTNO8dI63juqaebMuSQ+j1vzXFOuTMN1xTza3G1e6ZbZKzbkB1J7KChujiuq93oe7Nq3Vewd56Q09xPQe/pZbo1xU/Vuv+SbTbLo1au7Nc6p0ILFvbR2wCXZu0RMKyBXsCR0NrLSTmqDd5IsdbSXImLMWYYPG3MkpMCSNwI0GzZq8TqLwZnhlkAgWHUcXkneODGL5Ts5hHLBcVVEcckJ8xEa5WMnzw4kSjRHEUkm+CoejBQXi12rpw70fskhkbpIc7IKhS1YdU/xscVdBN6z03x9TeHWY6ckFJ2kUza60ESM8xEvRbPsc0+cxezGbyNxoPRukzxkgoSo955uGnEUees85yEkqfkWYi8xkTtG3O30C4RqLYS2N+fC1Zrz0WY68zw8s2zaTxE+fo4ZxzuXv6hfs2CHL3Gxwuo0IsvDAXJMoUaz5sLi8mMNdUKJ3zeGHFOZ4+kOzibetRaUOoIWYWiuNxK6qWu+XysOcm6ghgMXGb2boOtxLbGyNjhJPVqL0YzMM3me04zUmztqcO6oVLTT8FV2axdt0oSuNRcFtQqu92KNxz677Lbq2N6NyzpwkjZA/uPb6yGtTq3/uL0w/tsTY5EdPYPPp3B9njueak+h/LpNLtaarrplHvnLvzYpSxpLRO3Qk501JjLdHidaVJzZrrl2Y7XaizKJLb3egfBO6gvnB3Lt8EU8cjrlQpmU8l9TDbA26cuYLmDqT/Aftycp6r6nLnOf07Z4z9LA2BdsPW6qE3l2hd4950r8XOus48bh6ornnGhM8aByty7H2hOK9p8qXxDubuQ7exCNDtcFfEZw3TiEuPLFYZDwH3gQeouYuj0nuP1ceOS016HxF8v8d293lspjQandY7zykoWVHycx94AX3ny2fnKm7ZV4LL8tt1/R4Dy3LIzfV57/74vLwrPKd6BOc7LeEzacW0hMzdeR/fr95lqfZIZ9M6LxCRf8fMeT+HxFsfc+7tT4IWr6XzvcEn5T9nmTv2p83LP+Xvfjzr9jhz7JhfB+bsV9X4b2ft2Xc+818ckVN58p8GdZ9RcWc+8H9dc3gXshY3tW9S9kdCQh81U/8pMJ94cT8G9UEdYcMkCrtPtdEEDFkk9w8pcacxcNRQV19TtE9aCq8iEGD09aDdsB9hM0CV9aCC4EtuCT5lQoV3hYcf9eCRCuCaMaDdpmD2809KFHUhC6CQCbwyC6dJ0JDRsyslC6FcsNcP9lR9028+t38q43sN1T8nNl9BDV5iCUIpNqsKcmDjCosCCFC6cN0ID8cm9GZDCCIddctptmsPDEVMDbd+c/CfddN7ExDJ0AjUCpCbCN1uccE+smtEC/CUj7DTsxDPCv9wiaCN1tZBNojpNc9lRXhLNF5I8yiDDbCqcWEtDZdbRQjtNHdOtQtUw3gItqYminCHRt8Fda8uj2ZbNGiOj+jEV4jU9GCHQOCWDUF9CzC/CGiEii9qI2isDGCz4ddD95DSMKjeAejv898DomMMdrUwCWiqcs9GsyC3tqBwoq52jVAfC6dgRDcXj0jyDoxb43c0kb9Nd3j89ctsDACYxPjvDgdlQChdipMe1TiZZbNlNhjfi+CTicC0SJDQDMSpBKsLiCdm9rjsSYi98lFUsTNydeUTB+V4NOQh1TgRUvZLsdM45lNKiyQftTdWSl9+ZOTvg88GBmEqM+SwQBSk9MUO5wc5iq4Zs89UII8Fc5jG4Ys89m4cEnsHQZ4WQk41SSjNSCJ+SnDtJ0MqCHRzkJcY55SZ9pSo1Cl6Ek8hTOCmR1AdTL83QeT48HRXTaM6dlBwQpTMMOSxSnD6k2SgzEUjSiDV5wz4xKAQz1DN0O5mNRSuSlDd5kyIzdY+M3s/lmNXgqUkVcyEQSiTNKiUJmjdpZxYySRIyQzizilERgy0zaDv5hEStyzmYnCZCCN48CyhYiylDaxhSszTYcyhyxiRSEQjSQjfYRz4w6BtYNBzDKhhFbT4yWyN0AzmFMNUzxTbCiQayZSlzfDbDR4cETMWYxyHTbDIsmRmZ85KEVyaAZ8Uy/jLStdbzXzdyHtHyfiN07ytYPyVzzzdYIy1Q3SVzDyl9Ozmitzvymy6zNzeBSyIyJlkK5znTYKnCN1JZq9dN+y/yVy8LUj4xmFBzbD24LyfzyLKFqTeRaTQF4QGTsQmToFlcULqL/ZXi9UnDBdUKwReh0MWztIEK5QgcRLxwxKhL3lvg/S+5MzBKO8WzppezqYjFlL9zHlS9S0NKNc5Sp9lFOYNKe1LJFCgCBK5Qd0VLOKwLuKI5eKiCjLuKXVaMiCBB8LjLoketQzxw1KvKeKbKXzFLxLZLfK4pmEmlxKfK89aQ1yArXLdSk8lAuK5QHLJKUq7KrKwrYrR8s4TKyRxy+8IqhYorBdjtlyp9gqdylLhK5KlDqzqiAqJL9yqz/LaqcqlDMrTZmrOraDuq9YNK6r45MixiorxIzKVzML24ArBM+M6cHRoxerHLRrIrlrkKI41qOqVqNBrVjKZLeL6Kug4MmKexwE2KxU/Y7ZSi1Rll2Z6Nu0ZQmc4p2ZbEKgaAnrz8Xr7qrrxYydxxvq3qGhClqFctVZXr6Mw8QbnL8DAayM1Vob+CZ47rTEKh85bRnKnc4bJV6R/q45416MqzPrNl8bqEyMZDiaIRSaelllb5PrRtF4Cbab0wMbxi3hGbqFCaQT2ZSjowaaibSjqajrGLBVBokNPZ2Lwotl+B+h0tAaLtshpbYFZ9brXqidFaWQZaASxwjEUaFasktbUDka1a2dxxJVKALjwb7qpbc0Lb4S4bTaD07auDjbrbFbbaZqvqUb1a/lJBlbAcSUtI/lzbPaPd5ag6HNDbpcKAOaekI6SRXwC40jY6FaZCQ6mkw69aI6PhE7ei0dA6BY2Eo6sNw7C7ON/aotqbU6jjc6pM2MCbTaXha6uCq6I7y7ZaSbY7haTrRazrxbRUBR1aN1CrYki54Ce1hktJcKQQU4x62YFl1bXgJEckx7ZZGkFbXh1As4x7pthZ1blSXzqYMw3gPhLUtJzTnhDkkcBZNMBzR4h6Ew+ag1j7tYp6KdERIyY7LFj73hL6VB96kIPr9U24+5k5fCP6JwgHt7SQi4O4AHIH41OYC5QGJxwGtT25EGb7k8f5wHN7bQkG6R84cGH6R66UQHX694p7H7R7HiA5KkFb0GoGkHaHC4KAAHG5WZh4sHox/YtccUC5XrmGT6/6N7b57Qp5j7YFd565WE9ElUkHN72YTF2H0xH0sGPrbrL8P6OG1HWZx7x5mkBGOYQGtJWHRHl6nFJGVQ5VZGMyeF1HvgD1F7VB8GBZvSdZKGIlXGk4ERqEwdnHR5aQbY3HVAPGWdMFAnVYkGLC/GSQVHOGj73G37RG5H7HBZQm36AG+NSL0mxsyEGHaAL4uG9GxT/GqHwQBAJGWY4op0CmjNimkm454ndHFqToI9RGt6kHWmC5a5mmGmMnPHvTVHimYmLS47MFUnq4fHSm4mqH3kEF0mJdK4+GD7+n7Tanz76I6FV5onsHWlNn+AVA0ndpf6i4H7JmumCJrGZGUJl1sg0nPC7737+ZxZU1+5b4xy15NmSRtnS10n1mBYCnDm0mCzHHJVnGLmBZfaembncK7GpnoWI8IX4WkGQlOTyQFa4X7mpm0XeHMW7n5GBZY9JZhF8X5nZ7fEanAXNnyRaxNVDlQUzHNmkVv0GWdT2mDnv40mXMq4DHqkiR6YkGeWJ7FDdlEhVkiWZwYXRGKmTEkGqa6GMwOnvHKX3hqWJmUXJWlnSXbHsXUXrVeGAH6mj7VQwWtHVnqYGAAaI4kkAGWXLErWKHwnswuXq4rWZ4bWocaXXnNUrW8nZFKUk5ODClaAzWH7ZWp4/WVSA2NW9XsgOiyF4GMHgGrWXywGCmEGU2fYwmRrbnIWrXTH6G5nNWchTn/7dXCWrX2Xa4UmS3/NPm2HNmYsaqq22ma2rFxG9YrWAXbFNnM2s4q4PnCkvnY3K363h3G2P7m2nNB2NGD0ZXO3OYcgnXc3Xh83qAPXJZRW12S3umkW5mZ6B2WGi283D2l3QXNHw3F2SgpWOWP7jWl3qAe3nGCFBHsg13eXJ7aEYSyGPq9nG5zmS3FHBYk1NmH333/3eZNmdGuG/356R2hmEml20wSW79+Xka0k/253JUF3Kmu20J0Xy3T2ZQU4/2eGWUyWz3shcLP2vWP77W3WCO8XoPhnLWaORXnGLHMPzTzwG7R37HEgZdE3i243BPtXlj72inLW0xrHfYX2jGu2tTV4t3RHSGg1BPawMbngr28PkPhGz6P7snsi/2ZnxnGHMG/2uyMip2Y4W2N3lOklu7nZTrVQDFGTkN2LL73QqVi5BPoVT6GYvPvgwREhGA/Pd4AuvOjmp6mBBOuFm5GYZRCQalNQNPBKI5AuLDmZTZBAyPBYanMuERsvBYwvSQPNTEkvV4UuwvHie0Jw5MoutMI4auQSVRfMguXyUkWvYFKBL7AuqzGN0huuIu+uBJa5Ck8gcg+C2vAuGgjn0wWvyQY70hZusEJ7fOyudMKv/T0ghdSu+h8v3hVv0hBZUvzT0v64xvlkNAUg4vbQEv+vvOhZfPqnevbFqEDuYv9uNRYEjuPuNQvucgevT7SYAt2kXEo48vfvFkwfjYGBIfavluGv+ZrvJun33gZuweZ4fPhu3vAvsw6tL7cfIuBiPqi5MwpuMeWRAu0ImvYupAlBZxQeyv4lIfafofAuw5BuNuDvofQe1JdvzkwvXvIuBf1vFu6uVvlEER5vUv0fvRqfpeBGbvifRuuecegeRv3vNNBY/YRYoeCvzkpiJctIwu6QTo+ejelG9f9vLDLuKJivcv2fDe6QQRudvvDuYexxKBtTPgTOddLvDNBeefZxUIXzAuxwi5Tv9vsuUJcFawM1o+cgfcekE/fg9uch4fZwI/pzfeWvpvFfXeZR3fNe8ejfkhkgSvS/IudeTf9f5e2vSYyRQ2lAiQPeOfm+PrW/buYwtem/ehR4/6KfnejvvREUyee0JekeGYx/TZAeG/qex+ZRqvq++ux+SXJZfPe+8fm+wRWf8+qffNO/axQ+Wus/1N25ykqVh/eeCvL+dMV+R+2HL/Dlzkifwud+MC3+5eZfp/L/F4QuuXBfkf39J09Vepie/lwnzjgDQe00E/m30HYxYZ4jqLzoUnzi3dXeMcZAbAPHDwDbunWGUH9yhTRgk4YXAgRHDYYCRtYEPM3gRAYCCx4+jyGOiqD97kD3gOA8bir27bKIiQl3ZQJwLyBstTYl9egKD2IHoDGAIbQ5BqFtCrcFSp/ENpilgTnIxBWyQAZIPHzOZzkhXcVgHEzCKCtB/9DruoKtbvJFeAFHriIVMFN144xgrrlayGTvAKuMhTrqFyEGswC4qg6Lh1jIGhsPqPaQrpQjz6ptvg5ySgfuigGah3BIgnQZYP0EiYPBogpLtQm76+DzklAQWIVxSEKChKs4CXLYJcEmCjsHwJwbEOkYU9ihtYfOGUL0GSCEhIg0Ho8xtaxd/MScRBFkLwG+CNAr/Crijwm74C/BYQxodJmaG0DSEDAx7t4Oa4FshYSgRLqdGyAB5fBGjIYUl1pBJ9KhpQtYbLzqGEhEhHQ1IdEM8Fg9OS4sKIfYjaFghAub4SIRoNUCXDtOJwwnqlzfw2D8eCYb/rsNXiJDQe3pVwblx1o6x84iXWvjbytbpDgRvwthCYKDjCCC47wopvYMBEZDeY0vaMOL0HbjDkgnPa1OLxDZHNMUYIUHqCNN6DstuMQq3rr1JHIjIRRvAVsoheFvA3hdI24UcKSHB10gYISQVCirgZhtuoTGgezAcycMUBc3aPkKJpg6Y+Ba3PbqPGXTLJEgq3ZRHiO7SrwSQ/Ik7gtzlFLNZ4q3agfD0kESpNaMPDkTrE+ByjyUSSeYQRGeGGiM0AgREI9wwbk87RFaMeJMLAHajJYuorzssjr52j1AzMUbicypEiw5RyCatB6K+4SjyQUop0RP30FVkTo4IFAbtCSSfChRo8I5tUK841MzR3I8ftmP5H6ilABY02Icl1ICRNRUQtMRmF9ip8dueIydBODowCRlRso0ZtGmO47CfGGYCXEoD1HFFSxPjHePwHj6miuRPjarFaMe7pizhkgjdNOMdFednRk/EceoDHFRifBvY/gLXHa4hj/R0zahF2N9GhiCxy3VsbtCmFMAhR6YdIC8HjFD8yx7MfuLONtGZjeR+cYYUEJYEFic8kqePn8PUFCj/xRIYYSSH35TiFsy4uYu8HzEWjoJiXWntGMXGITQeaOQbuaP3TggH0M/R5BPywncwH0/fUFG/yjhCi+cAWOTJf2CphieyH1b+CRMQTixyJu0SURlxomLCCx7E0QWP2YnfA7ROo+EXxMJ6sSPmDE/+rPya7Fw5RlAfsUf0FzFcohRoseE3yprF9bUXo2BMJPUnrIFxBENCc319iciUgsk3cQOOb71dsEgk70Z4JElkSbJ2k+uJxJfKOTdRLkuieJKolN8qyEuKmAWPgSvhFkMddxCZICkoQgpPk3IGqxvE/ANx2I/ONFP8lCjApPaKKYkBinPiKxuCRKRlOSmeFzJ8cRKe2KMq3i6xD4kKXmPsJlT7x2nYqYL30H8CXqio+qRPX0EAUyQJ0JvvujgnVSOp9zGfn8ksGCAdx8k7qTaIckUTGa38GfouNEn6SlxvMEKXOIEnrjowCUi+q3yiHJF4pF/XyZlLlEvZNxlU3qaZLinrScpPUsKSlIilpTlp80qaRJJn6bTZwNYryTNP4B00tpC0wycPQIl2ieGSae6ZNMeS2TnJAFTCXaIjGJBxpwXcOK6PPDuiQpq480U1IVGMxPpDA25DVPrHPTeAzA/oI9O8khS4ZQ6BCQ6Ixlak/Jw8cmTOM+m6DJYUM5qRjK3KuDTJp0F8bqROnXT6J3k08YeLPiSAC4oomUULzHolBhZqgtAaQPFlCz6EqAkgaZNJ4bxUxoU+CQWUxTKIYe3aIceRNeDMxsgu8JUcH0kFL0BALwd7rBM5HmjlZws94bAnzhJ10mKVO2U8IzG08Xy6YBEf8NNkyw74iXUnk+L0ZJw2Yl3ZCduLK4qwYe4c5rsfSrhKAHxYPJQEHIKCJ0iQ3s4CR8XSDaC3Z84seiyDJ72ySBTswWSrPeEMBrZkg0ua7MWq6yq5M4QudsPFFZzxYDXIoibOPregCR8fYegTPNFSBfYDAVPr3Lz56MPgUcwrj2jxGVFUIpsS7rhR7GvABY/s94XD2HEezEQvQyEJXOdlyyocH3V5goI3a0gL4OI7uHnOPnFFmeKWd4OROrnyz0e/QyQbbPlmCyg598qHGPybh+x65Es+hF/KpHPz4CZc4/t9OPqbVT5l/NrkLH0EvzHUUCwbvoI/lN9+BxXUyZfMgUnNUeUQjBUVOBom9f5e8wabgMOFwLZpT3ShIQpVnjSUZQCl2f/KXnYKqFksj4AiCYW7yQFf0v+uaI/lOcBUbsP2v3RQxh4hxW/K5njyurpAXEL3RFH3wqDzc/YN/H7gV3kVUiKe2/EHqopN439Q+wXB6uzRqSxcl5AfLms5jVCpcn+XNWebZ3b4qKZCzA7ILbxMW01KEPaGOvtyTjLJT5Li3bu4tX5vUiiZPZZLYqO440L4Ig1Lub095kZAlESpxbZnriSxeeiikJS1ipkRwnqBvUJRfXiQ887e9GbMCfyd60AiQeipJXVwzIx9Us2Ob0g4oR52EaahSuYWf0Z41K6auSg/gr0GzpKQQ4AgpcksoB9KwlQSn/gX3YwFA/JH1VJfJl4CTK/eGiy+mRk3qE8jFt/UJcsrf709f+9XejB+zBCHJOlM3AkES3tBDKN22XHvuIoC4Eg2svSynl0pmW7iMGLSugOZjfCo9Vlyi0JZHy0wCBUlYWDcUG2F6yKJFQcRWUAO2UrdCsiwpavcqOXe9OuBy/xathfGnL/F5NfDHcswEP9cMPUkGrQKQG7wMVEmO5WwJax4r8GUbQgWw1po8DKlmI+gdiNpq69nlVKigRitcVBDfBrMGOhlx8VuLTJ9QzwTjRer4MpBQhWQbTRJVPUDByg/+jjRnjoCRpmguVf0p+4pLZVtoeVckXBW+CzB3SgZRUKZFGJ2MOqpVb4McHVCFVuqtkTErEabLlhoQgIUkvNmsrDMTqmlbEoEZfC4RiSxamop9U/Ckl2XUlX8RRH9KQ1Mq3IczCUB2rFVQKhwSUKtX+rtFFqpNajRTUaqhVogpJRFOUQtDb4DwiNckFDXdD9l/SuCVypCH+CaV/MKAQWqxHY54KDqmYXQkVE409BRTR1TWrIxNLQuiaqoRmqOLNK2RxajJYKr2ENDyMGk3zmODLV9dUMcytIUCMyEEgiQyQUyQPwlU01qIL5JarauOW/LcusI/YdOo6VkjfVWWaMMgMh5WQ6AWkLLEXGkV3DpBINVbIsMvphjs1pMI5gUnPojTmxX9BmDpkNUFjKJM0kDXkMPIFi7xuMkDceJjg3jANdGEDRUscVEyINuFXxezP8K1Sf1BPPdTJNBlOTgN3pOrI1LNrGjgNX0EQWdPtEzjxYysFkB6FpmOjGNTy6zHKLdFPlGNf1RDW5PhGMbFM9qAMWqL65Cailnk1KYsl40aSkNhYvkaRtviKzCJi06jd0TmFhjUJFMn9T7BU0Cb64PaN4DCqI2Ub3R2sEsvsvImNoKZwG+thurDE2aGNQcEtQFgRlUaLNksW+RRqEmGa51cm0TUGNMS+xca/Gm6TPACGebJliYhTdUKM3ehEgjOKCbZpC22h4kN47TVaLIzj4gldGy0Y6LciX1U1rG7bPYguWOazNT5NyN6PMUGbIafQVzSNNVFBb6tiIbzQWLoAijWt0W88S2MGxrhGt+ksUl2Oq2wJato0vcfRjK0Ob9Jo4plUJQDXJaZxbkRmgXFMmZaCtqocjbNt2lTbQUhG/SX2Mm2Ix9NR4mUNoJC2Iy2yvWoDZdsYxJakxXWk7egNRkuMWtbkNnH+Dq1uROua4lSVVpy20a7R+WgrCIufUlb9FzcKzT9Ns1SrBtJW3tUV0MUw7ltV42XqprQk40kkB2pbQVrmk46nNeO2RYlro3oZY49GCla9uhnbY0dp3c0X8luk0ql692vLYhN2UJg91FGkHezqUD7KKt3GlrHpDiVaTdRh6/9YFvVEzKLeGqx7SmKl2LbkNg2R4keqG3HjtBBIFkMLoKnySediKrTeOF20vAOdMJFHQVuZ0k7Td22Astd0IlzbscS80RYdsKns7E6qjVXedrkxJLK17ioUReINXe6cNnWuXUbtd2swJdC6h3eDuI2i7rd+KrjYjKq3m7rtCOhjHUr/Gxh05tWPXentrBgSz1Ni3HdtgohwS6AwOtnfZlRV/LC9fCukvCAZCsUPOYqHILrXm5hdCww23zFWyLiKq29pEvnAzC70P8KebEjvaTD87VlS9n4RBP3vH2SlIeySJcmSAH1akUhdCMLlvkfI/JBO/ALvql3DTHjO9lRCfZD330z6lEEVMPS+RPp1jeYs+7IJD0YQfwNOF+v3u3oP0D6j9c+3vdProxwcX9vejKYzD/Y77awqXG8F2VUTAHm4oB3vUczihmE/96wv3gq3f1/tR4X+q/YAeX3KakD6+6KUAZZjH68D2PWWDXpc63whF7FSRt3thVv7+91BofWFxH3v70mQiLiVPo70MxWDE+/Xswb5xkHe6QlSg2Khsgt6q+dBujDfA1CMGOD7+qQzQeH196T40sMQ6/qUO+YVD/+k6OoaViqG8DTgsbJbHH4YHT9kh4etAeCX5Qf9Gh5Iqvti4b6b9J6dA/frwNwHpsV6HWB9Vu6x4IDuCHCF0i8O97zkG4x1DhGcOT7x8OpRAjhFQhVDYuj+qWOYd33f7OD0scIw/vUNGG9Dn4QAwIbdj16IEEtMVLWSYQ97ZD/ekowoaYOZHkgbCSUvrwkO+ZajbB1ydoesN5HOQBRi6oPRhIG6BAtBzI70fywOzqj1ht7NmE6mtHGj4x/Gfft4PqGOjde4Qz0Y/oBx3gpY8o+EyUS8jMl0xqxDsdu58HF4ixnsCLHc5FHB6Y/HTDrC3g60sUH8MftIYCxVI7jswxLm/gPhcMA4dNNofHzRyb9RYjWLSBqAq5o4Y45IQEy42+BL6E+1xiE6Y2NXLcc+vsb+EuwPB1wfkCfSVG0MtaFgC4RiHKQeCLjPG0Tv/TrTPzK03HSTS3TrehP6xUnFhZJpNLCfBNushK9x1EWCYZOfg9Ev3Ck/SfhM8nd4fJsft6GLRdt7EFSJfUv3mROJPwa+EE/yZJCzgU27Jt41iE2ADBvIN0E0BEAcBOAsQbgQwGEF8D+BoYPQVwHYH1PRBDAcQBPlDqnDe9owFAIoFftHhnGETMJF09UDdOuTnoakZ00UHtN+n9E5SShE0CSinHBgwwUYOMFGgbQ9TUQQ0ygBiCeBvAzQeGOuETNOBUzcQVhTGUdNoJwzPp3xCGe+NenXTpZj07NBVDFnYg+ZwjP6bDMummgl4VaIWGjMjBIAcZvlD3QQyCBzjA9FgE3x9hGIK62jd4EkmcmjmNAstW5sZKnMz8ZU4sUWEUUnNyp0gJSislUlwoGzLUm59mCkNhSLUZ4GYHpAea27ZFVj32VRJubn53VRYhB3WkucTgBxjGEDc5JKmCmaZLztac0paSBk68jzj52ZbEfgXm8CMTmbRg5RfMRUaE3pdc9ObtiznjzrxfgAHCb6R9fzIFhcxuaDjaYVz0HRC5hfcSEWJz6F5yXOtpA0I1zFFmfnOpBMCTNmVXM8y+fPCeG/zMsEkLefwuyl4LMvUeOzA1NgAtT5AHU6lHujpRIwl/EoYVDiITgMIHgGS7WEKjGKFLbZq6CWXEulgYIj4baEpbOQvApwal700dHrOiRVLMsdSyVE0vZBtL40LaCOCUsWWpw8l0yzFEMDKWjLgENy5GcLA0B7Lm0SS/pfMv0RvLhjayx5ecthW5LyeSK8NFOMBX4zskbM84EtOpneoB4DM+adCCWnIgOZ20wYGWkqXXLcV0y0VcnQlWfLZVooIlNkulWD45V4q+FcLqNWIzgV1K8mYyvuQsrZp7cBafCBWmoguZoq4uKqtxJTUtVyqy1f1mTXqgdV8a/w2sujWYrxlqyy2Z8CwZnOghrkMseHNSrBY45r6AbMSVVlDrc51pidasX5x+LwERc7Sr35QXFq7cG+lzTXx0sQLYIR8vzVmXLIrzcxUIfxivG2gHzfbFmqdahOg2P6SzL829YlxX0QL2c1jG9cQSMzoOZo4ZA9ZlBPXhGENicGHtyR5C5UB1/o7CmOtTm7VS3bWPxdMb8ByVtAc66hejAvlLUONdmNerNiXX7rY17WPY0M5E3ElW5Zfhgmess3Pdw9VG6hdpuIEcau4hG2Bw6wfxZb8N/66ER1Ko0JbYINGxA3BsU6kdH1KpOTeJvmG/rtaI2/QGEuiXuAgVu6HpacuxALNcfWK+gPctvQDAjt0pWtYjR+WtLyVoKLpcBgeAPbqEL23NbMsGAKgAEyy97Y0v4Q7LftiS3bbIiR3Pb1Vl24pYdtnxU72dMOz9H1BJXiwt0AO+ZHxCoKQ7gEEyxnYjtl3nbudhK/5Y6tDWDT6V40z1b6DZX+ruVwa/lZtMeA4gl27O4XXTvVAQtTt0q8PYdve9B7HM5awPfLsR02rTQRuz3a6ut2TT7dvq11ALB5XrTI1ue5Zbasj2p7893ZGHfdvH3o7Z9/e6HYUtL2gE21/s3tbJiMbc9UNhoIuTlSMbOGNCH4LEd+yMb7m459+1XE/tLyLec5sPB/cM3M711VSSByA+gcER3k2tsPN6FNhyYX7+Nq89En3CIEX7kqKG1vgFiDJ1Nr998yEm4tTJMH+cK8zqiSSCal6yD2FDqlrgqhEHsCWB6LF/u54AH4D5hyUqBJGbKmfNLhw1oqa+YhHEiDBMA51iiCjNFY2kEGi0hYIqHAvb+GRcbTA4jNZDs2Jo/yyW3tTCdnS5xBLtB3UUXI6q9lFdvJgHb5j6O5QHcv13fbhd/2yY4ehmPuY9jus1FYdthxwQXjxx8jGcd3hjHE0KS4YG0f+PSrVjqu4xpzixWYnsd/OzbeLvuPfHdNCx80gcexO/HmTwuok5stx2C7NJPs6xCfvDCHKdcURwQ+0yFdKnXxhoMyimRJdkgNqUR9Ql+NZDPM0j+iECOHn3DB0ojiRExneFilqsQztUCM7B6ywc4QziEanyplSJ/Sl9AjO8PqdqxGn4sZp1qQjwNP2afsMwljzlYR1V4wghZ9JgfRKO2J+J2RGDzGc7I2JPack0lyOaDOI6NJ5k1uW6c0JrnTdHuQRFQZ82/kDSTmkl3WfVOI42mKER6yF5S1hniBI51IljzzO1nuztWGHmBP3UseaL0WNEilMoDFnZsLfJC8OcswhYszx2iC/OcfV60ojvjLZlXmQYqkOqG5/8+mzNdTaBCAk4EKLjwI6XGJxLl87Hg/3CQZzwrq06YS4v9ntTsFzi6lpb1BMdTuV8o4VNYvFxgLreMi76fiut2UF2PJM9mzYvDUosG8Ci6NdVOpaXL1eNC+Vf2ImE88s2sa+BMPYi4DrvnJQhoQuYSXbc7Bny6lqnPWY/TsbJfSJdIkCTBjsS0Y4cvBX7bBgE4XQDtC/EJw3jt2/G6mWAQJj3jpx/HZceJ3A7sQD7nQHTeUpKE1jpsGP1HjFvMEY8QJ+2eCfGQ83pj+swPwTepAk3pbqu2m8TcbsO3ST/0MU4behPHLZECt624rvtgU3Njoqy2+Lftus3QTnNyE5YBrACApkE8E27jek8q3BHbx2DDdi2gSuhT+kltf4VlPBzXsSyQqWMa/Fc9i53fsvM5i/EXyRzX7Fcf4AV0b3kqO9zEVJuPulEX7jc9qAglOYWit7wD9Ji1tpIWiX9V683x6by3oPC54KdpCvd6wWi2sByhjJQ+gG0PekMbEf18Tjdsivxe5n+jg/pi0bJH70Kphn5AfsbLCJ9+SCzH8me0v73o8+6zEoKIPH1w4mB+cnRJ33stUDwB/49F1qbj7x4tR7I8Ce2PJHk6NJ5Poc2JP1qVp/Ap+DGx7GvxC6dKbVRVcU4cn+0nhO4+UfJPt2Iz/B+I9SAAssNl/kR9LS/EOHNGczxR6g8xg9x1E3T4qqzg3uFSRntULzerifurrzfDHjHVw8vxgvMnj92HF89GTfghFhz+54jfW2o3QVpO4pFFNju/wDWyQFXcy9VuBtuXvt4lZSduPwnSl/igV5y9lvPLaqLL8o8kS1vbLA7saGl/zdFW6vs7m0OqTy+VfE33Xor0e/7elewnIVjr+Pyq+Ne8vnX/r9V59uLuGKpT6SKx/KdG7x5EyR9/wPFgUc1vAWDb1VV1rWuGMp3Fgn3m4Tjxdvd4oNGd8qTggwsP3fb8Xgtrr1jvV3x99EiCYTh7vJ3677HkFjE3I5j3v7/dbXaoQ6E1MYvAFnBB0YNdWszVMXlLfztjlRmSxMXjnILJkvZAEb8O7Chix/YzAS/oXCrv6x8f2AUd+qHm8teNott9ryT7pRk+0wJ0Yn3j/p8hS3zlP7HzG7Ij6w5YCMCiJO9/BixeftNU2E16Kec/0vFkIX/T6TzZPcoxQaX2cfsw6YxfyT1LzT43eGyiurPxnxT/l90+zjn0kxBz/V+pPyveUVULM+4BPeBfSoRX226przu63C31rxr7SfFAr974Q3y271/h2DfBPn3yb9zdDuufGUCKKz/4FM/9fLPw35H99953hvpvsr2N8ZNe+Cfcf4n5795/k+g/S7tr5r6v3DNmAIvjMMz6DjC+OZqvxP8H+jeS+Fof3+n3hhgVl/20jf/n1X5K9J/Rvsbxk0X75+Gkavx0Bv0r8r+5/B33d606vY8AmmO7W9rM03d7uxA4gTf7i22+SIBwigvfml2v6kpQhqgW/+n0b21h7+aQFEVf9gCP++wIzxXxhHUBABDAuz1INQCe9r2nHv4bnBvRceHNcxHM3CRgC/1F8JOH2ErcmAZvhIEXUBWns4UTT4AACMwNDjXYwcIdGb4mMJhFEZd4V0kEBkAoWCYQTjQsHf8BzT/yHMyYH/wEA//EKWxMIA7KHuE6AUAPsU4AvhigCc8f/13N6AiFkQCUgNn2wCDONCH3B+gTgJtROOdAPsJ6pegPMYhAjgK+cI0XAK5AVvc90lppwDuA28klCKmYRIAzdDe9lAk+Ws5zeDhiIQ2bGh3CY1ITeT0CCpK+hoBpA8+A/9CjIgPVodAjQOUhRiGNjsDHvIk229xmIwLe9vcYk2oQLAggOsDmSeoj+pjGK3nm5PyXCifVsiOkUOQcKevCWYWEOkSkUbGSilrMuGBINfoZGWwiYwWJYyjfBogqClCEh0OrGN4XgcynX8pGNJCN5ZwZm1MQ/CHlWJMcghrWAh/ycLCIZ8qYEBIEMgsoOMRjKAoC1tACWww0ZdKMOE65A6TIOe4mLaXmgN0HFcgV5/JL6yQh0gmYK80nMaXnq5ZHYigiChgugTZgwgt4CCDBqGMGYFZsEYgZFCLSYKOCfiLUmcxZaSYK8Mz6XaiSRgIA4IWD1grohjpXnauFWDEgjIO9IcuFOFuCdgmY19hTGCoMOCZ4DIl2ovFE2B6CvpEhy6IoQyIIKBsba2l2pgQyZBhDKYeERGI9BZyjSDXgyEM2CGgtYIDhMfCX1p9bCTeQ9ME+V6Cnc/CSkPyAQkb6GzcqfIu2T8e/FonpDuAKBW+g3bQ4k5CtbZaGZDArKqE19dqfkL4kw+ZIHnAmoByFahtJFCGLhJoeGD3AGWTMD6hlQm+E1AhvTvxr8QAEUPd8uicUJcwIuVCGlDmoRyHlCY4ZyBytsATUJ/B4YSVjVCE/HULz83fc3yUhP6f2kZAdZW300gd3L0MRAfQjv0YQyQ0UMj5KEAMLB53/QfwQhwww2m9DQmJ300tEgUMINC4oT0P6B+INMDcVmff0MzCwQbMKTD8IFMK78cfKXx5Z4w+MDCEYwhXwrCAw2smrCfbEsN1C3QlP2VBgFesP1l3gGsOdcUqTsOAVgw3IFTD3Q3sL9p8w2sl8VmfOsPzCqxHMJv8hw0sND9ywjsJnCbwZv2j9FxMcIHMlKJjEHDmw10LN82w6cO3CrKJFGZ9NwysNPCiw+kj+ha/Wn3bC+wmcNjw5fP31uZ1SSMOfDrw5ilvD8/A0IfCtwtsFrhfQrIDfCAI/iC3xuwpsJ/DWwnv3/DLw4GGAiFfC8MjCEIvcOgjDw2COPCvgObkQiqGd8JnCcItCOHC2w7SDAiqwucNfCsIxkHNIKI50JDDFwuv00hkI8cJojcI5R08x6w1iKIiGI+8OYiTwtcLYi+Ir4HHxII+cP3Dx/X8JHDQIy8LXAzwjcLoEZIwkC/CewcSNd8MI7n2kiPwm0UEiFIrSPVJuIlsPUjcfISPAimRHSPwiTwkJEDMxI9CLZCNIkyJC4kIcyLIiBIGOGUj6IwyLsjjI3SIIjKgZyMrCmQRsJsjiI2CLzDtwspG1g2IsKK+BCwgyLz8V3Nd0sBNfapAjCZw2KLNDZQwaCjhtQg8GeAQo7nw9IaHZgFnADFeP15Cs/A5WwASoyVA1AoI/KLChCoyqMxQkdMqNpDGos42qjTzOqJ4jRQmIiaiqaLqP18Kos42aiIpePycdVI6nyMiaoCKH6iWozP1miOo3c1qjgo1LwSi1gddwNCr9IxEqiSonWBWiWAPdzARsouiPpB6oyMGaiZQD0zSB1w8O0ujGzVhCRRBwl3ymivIi6N9proiZUQj7oz6NmV3I+tzUi3owwBwgGAa6Onpvo5SFtRAIcGOeiWQ1x278yIEGJ/ldIP6JrCkYsGLMjYY86OBiAKZGKoC6bNGMhjfogmLH9AYhGMUgeMcE1UhUYqu0pioYg9n+iXfEWgQxyndQAFMs8fzA5NgNVwJJMFQsRjeN6LdmhxNuMfzBWdbzf41RM+Y1VwgEuTeExvgFXaU1liOYxEzXg6EV4klieMelx+Q1Y7E0xQ86MN1kQ2Yp4xGxveJ5yTQ2YuE1uImTWxDZid9SVAzpXjOhEZgLY4xDIYncMWNwQLY1kzSImnCR0pM5Y14R4EZNSUw0AyGLDAFduY2ZQYBr6fBFZdI454zQcpMD52C1TXFU3BxCwM2JTjd/XWiTi44tWMti+sY7F65BYguMrpM40kJ6j3fN0wwxuAR2zHgq7auMVC+YkoDQikgbGI8BG41IDrjEInWHzwm47uNbj24+swohMnT6WW4awzc3TFPQdoMZi4Yxt3d9J40eM0xk3PLxHi7QShE3RZ4oeKKswTdeOXjEIxeL3jEUFePnCXo1kPJjIwXuN65p45dAPi14m+MpgsYyuPdCr45CDHiT48O0Pj8gbMA/jTos+PhiywiJ0d914n+J7jgEh+OsicogGNeiL4oBL7jUgG+BbiG4wjybjEE+uJsi245+LG9e41XAQTS5GsJwSa42MRLJ/oiTGFCAYDd2ajcE/iHwSMo8GGt9IYCUGVCQmQ8E8gbQncGlgkYOtzITUvfUPdCqEohKN4SgdDDoSYgYEEVIZAKS2YT0mVhP6h2EzhIwTyEsyHd8BEpuKET0Ew6JlD6EtCGtDO7bABVDFqe0PkTDEqBJ4TdQvhLG9VEr4FLkRExqHNCuALBUVJdErewMTfII8GMTfICaOSAlE9rysSaEkhNsTNE+xJwAQkZxN3AWEoxL0SOEkxNOizEvPwsTY3PxKKCkEuxMyiqo8pBVBd4MJK4AFE9UJtCIk0xO8TeEihJUSUE6xJIT3LI6JwB90bJOqSYk9xL0SCk2JKKTzEkpP4Syk/xOETaQURK4A0ITJJZBak20PqS2ExpJkTFE4pOUT2k+BM6SNEkACqTsAG0EGTckuGHySxkwpMwTWkyZMsSOk5JMkBAkuZK0TVwA8H6SzjKRJtDlkhpK3smkrxI2T4o1dw2iko0pOmTdk3d0OTwIU+Jf9yDRDDkDLqWwyCwmANmL9o6EbHFOhofYeEBS6bcFgVUwU0AMaxvhTmlppj/Y5DZjiHZZBpVQU/5P/84UsVxFUsxYpAhTZhczDTEZMZ5DVjBLNPC5pfuaQyxT2wQlKsUYUmlNwcSQelMxTNze2NQhcMNMTihqUzcxV9yTZmhJTMwTc3B9uXWlV9RGZYVKnNYsQDShZ//QhilSadUJgjw5U+vD+c9bDlL1iaUiZA1BBsP5M1TJUgOEbgK4zyNgSlLD6A9AL/OaWig3bRKQnwtQtmKvpSYmBMASzUufHtSt1a1Knd5Fb0HdTQiaKCFCsE2Nw3izsLUKN54EPLwF4LUtPhQgnU8+JdTQrENOYBo0z1KbBe4yQCjTDMGNNPi54kP0YiE0n1IJ9llFNM8tI0rUM+lofWNIASlwuBPTTQ0zNOLSg7cSAtTZ+LNKgT/4+eJfim0stPO4G0/NObSe0ytI7TsErtIJ8B0+XzTSC0sn3X9/UhdxzS7wjdwvh20ZtIVRe092zXBJ0kKTTZB03NPa9F0hEjLSV02JxOYN0w9OzTt4kDQzBm0oShlBYnAqWbTbDGdOd850ySOwS70g9OupYnDkmbTokG9LPTA0siAvSN0h9M/TIye9NwFH05r3PSWYSdI+4CMHJyXTQ0/WVbS/459JgiAM6DKvT2lWJwwzEMqSggzxff9MUhG4UDLLTgM8dJwyCfN8GQyA0k1PjT3bCjLJ8qM1dKM190yjLwzt0+dPd8v7DdOvTmMt9ID8sMv9Nozq0jx0vTSM8DJAyxMgTOPEOMl9NjcQtENHfS4M8dM3oT09jKEyDwoGKeBu0GDKtS8vc1NDS9MjTIki0MxSG9SLUh1OQy3bczMMybRfDLV9hMvNIjsqyXTNBRV0q6kTTLUtzNkzTMyMClUYMzsirt/MqNIsJqM2dM+Sdrb5MIDhFXxlpZrvKyAjCWsNcHjQp4dMLHJXrarSnQnEdMJ5pElexA7hUfb3iUAnPNyEdkGAR92PtkbQrV5d4fSrK6lCtMHFO8sLe1DyykHb4TQ8flPlREipzKD0Mx8TTG3HxUGfTznVIXWLEGy6bbz0IZz4OzG6z0Q7LwS5WLNyAlx2sx91yDsMT3SEpGs67x/MWsvbRFZGyRCFgZ7rFzCyyoPNbIyzksn7DQ8KIRIEWyFWReGvpEIMkEcJWtOOEeyRsv2FixLsv/0sgGbPVFwwTsm+l6ypiLrNb99ECrIzRdshrJ+Z4syHIpsrqT1ko9/wRLPq1lmYj3OzWbZJBqymkQ7IcRibAT2h8GPHbPusN9IHNWzE4dbP0VpGIpHJzk3OmypyUs67MNJNsbbBCRGc8nL8YToVGhCQA4GnOy8PGP9ARyhs7z2az7rNnKuyIco7JJC7IES0MdHM9ryuoqUD03TDsEGsMK0eGNt0awtZHzOmj8QIDyIRrfLXMQirqSmGVyjcp+PlyN3RXIHxAIIMKCyhKDXNtzEwi3M0zTUmkH1zrou3Pl8Tcx3NNpIol3IkjOrFu2n827U0xYBMzHe2GtCrRGElRE3NHBfDz7B7Hns0siiIjsB+EOU1yDdOszTz3EZPPjzwzO+17MH7fUHKdNzCuUFYETKVFMYXzcvLRscjdMTowDzZOGM4B+aNGolNMQuGMZPwNbQxk3wVjxYJMoAATws1uCVkHyXyYfMoQsxTDgH4v3F8wvhuU0tG7y28ufItJI2RhD34j+bNB8wzYZSCHzeJQzFzQMEXfPHzKLO2G3zITKvI3Mjsf7zVg0ceT0ViR8xsm+M/UHhkFjJ871HzoQbEuNuodmBE0+zDPfONXyJTTdAYFgpNHCALSTe1H7184n/MXzW84Izfz84HJG7zZ8tWOVFR8wbJPzBYguC5zgCy/NPza86fPzxmYQWNnAvzAdngLtYY1Ndy6MjePNl9oPYMiteQsYLjBpwOKkHjCM6SxjAJcBBIQCmCqdzoKeCwCFd4VfKCNuSTM3XOit6C56D4KCE/dCEKUIWQrELz0+QrjAKYUQvHTVC3gsYKOCy3K4ytC56AXl+CpsAYwFC9QvisgnOJIkKtM0/wa01CowrVzuvNQqULxkvQpHCWChgvYLifDwpkKdC5Qs4LXQRcTMKXC8O1MLnCvwtcK8/IPMGsMrdM03sYYSPIKs+7IqycLUgNow0KEIAwvuYZeZa0iIzCubmWtNzDQDUKCija1PjOzWM1CAIslmJ+TB6djSThogpdnDRFMUh2/gXDe/XaQ2tZ2KXp0HAm3yhXwLovU1qiP5Q6LTGWsHU1TuPopYd1HCYsDC3NDoskA1QJfUY0x4LWyaLxwUPiocCyBQgYgOiphCIZZi6A0w5/SPXlAdpMQ83WLsEQz0Y1hi44v6xMhRjUr4jmAdh1lBil+wgpIsfKFfolmdTXQFGijoq25ui/GSqC3WVUWSBDY0kHbgItdYv2LLUd4ra4WEfKFhL/6IzXPoGJdYu+KP4VErmK7igYp+KhHKEtfAMSiuCxLDgkEvWK8Sp+CM1JYC4oBKSS52OBB0wKYs6L8SrOyj4XilkqxLzeNotL1RigOHGKLNHmn+KrDTfgwdNMQksRKfgduFfyLNTFFnMu2aaE2KJHKjPlKYS8njhLxSqoMlKX4cKEM0deOfiaR8oK4r/QLNRLXaKvinLjs0iudkuJK3ixktpKvi+kosDWYsFRqZLWEJHpLgNfzQ+AQ7OkreLOs4Uo9Kui7LQa1PDQ0rBKPWPbWY1NdDEstK7tIWDSxHS/0r4QRipMvxKgTKYNjKHinWgLhr1S4oZETSnWjYc19Dorvhq8kLWVNebNUp7Q4So7FkwjmdYoeyuyL0uU03S9YsWKZSnMsphF86Yu1gWy57MCM+SlopC0XEVMqDL0y5dATL1OccqVsDwD4o5Kxi1rI0Awy9YqxQxsEMsbgVygEpu5ZENyHnyYygEstLSs5rETLXin4sK1BkO4sxLStG0UzLDy1dXHxcy9xQ6LjS1rO1J1jdYrLLibAfnrKFS/whrKNs8LFlI/ypspmyAaNsoWLpSpfRW0nynsrYUZipbLmK4Kxcr21vgPCgpLPS48qnKMKwYr3L5y1cv5LWszcvNK6HVxQARqis92iz2KEDTcinMC0VHgnPEDXRZr6eirVAUNIomHZIsBCU+znY3cwnAhMbUX+RlixanQCKUOUSQLGKkSvJAxK65zYqJHPis+xMxIxGh9gNDipowWEIURbFDNCW2h8mkMqTkrVKrPLoraxAysAyp8pBg+gMuSDW/hlUqFnCwc4T2IhlpK7elkrGKpyrPxxKhivYrcgIHCPpHkISsdQzKlek0dpKwytoqNKhGjkqf1LWDpsLK/wlMq0wf2BYqTKySomkAcYhymIoqm4v7zn6JqVNRAqzehyr9Wc8HyrdNUMtsr9Kxiv1kiquyuLQqqoypYJWKxirUgbKqXCaqT4AkvMraqryokdDgrqvareqh7F8r9WRpEYqbQTipxYM0HiqtK4+RSv8r8qq0rVBnK/Vhwl6c00taq/K/rEvozCdauGq7KiLjWrzeUSpcqBHZj2DtFKqFGUrVECzRkFWWSysM0fYDariq6qlDT6qV6FKo6q38JKr0rIqkrKJMaMSatGqYfQsGby/mEKrGz3QaSoiq/KbasArEtCqseQrq7HC3VdK/VnvFQqtyFf50qlKRjpWs+GrariBBap+1RKjSoWEUcj7VBq4qrSqjKJq56p6qWyoeGSr4qxiowkoaqmtxr+yymrsrMUFHIUyaqzMQCqWyy+gBq4q69T81C1EWoyr0an5D5q6bXKvogHKzmv4qwamGrOrWamqm4rQqy7W+qRqnqo3Laa7moccZbexH5r7qvbINrKq4Gvxl+qs2r3KLasmvpy7ayWstr2MbSB4LuqgyquowhYNg+r+tFxjZruajmt+p3azSqNqks6/XerTqswgqBbq7+gZ1yakJAtrEaxWpNykCyxlUpYa+rUZq9YTWq+z/ajWt+qYfWPDTq0kAavq0Y1EauBC865AQLrVa6Ot8Qua7USRr6tJOGVr9WHTEzqEckmuKrm6hHJDr46x2uLqba61D5U8XAOpxrR64zWh8c6geplsHDYKu6IU6xOudru0VCE49aaYot1rPa7tCTrMqkrIaAdajKtdcMa/0hDqM65jwqAN1HJn9Iw6/RXCr5ajuovrpoU2tkUiax5EbqHamW39Ju6wOr5UD61Go9r969mjbrAGmHyGkj6W2uYNsaz+paw2JEurir1UfitMV4G/atvraaRBGxq8qpBo3qz6raqfrgG6+sqBpqtGkPrxKqutZzlNcetXrO69+pAbwxQWoqB760WrDqMVYWtZZC6wbBkJd6hOmh87VIKWDYOGvW34bGq5Ot4aXVJKpnrmamH0Srp6repowllA7hoxNq0pQvqYq0qkrriGgslErAa+mqN1wqn6r3qYfc/WkrAa8hvZ1rPfVhUbo66iFkaMqnhv4wbGuyjlEeBRJXJJNqx+ujqBiNOpOqXqwbEcaeqUBvGUp6pxpgaZlFUnZq+VMOH7y9K32pmUByZ4jprPa+znHrbageTpsYm+ypUqCQeTyao7KlUwvrJPLMROqDqmW0KaEmjKo8bPdKQE4rNq1atKbCmdJv1ZtJbBuSba64+tiw3qwizLqblaJrkaYfR6s2r2m7bA+JbGrjTXqq4Z0tqL9rCKE5J3S+4u2xiWCsivLMKkRTfNpyjJnPLokHkvDL5m+rXrEXybUpmxIyk3IaLHFF8vh5+MLfFOadmvbx1I9ml4AOaYSoXB+otmrcqRL1Sz3VWa/rGEpYEi6rZHQqOiyULXgrqAQAdLFS9dT9qrRdEo6LiTWWHLqdiuZukExSeFtmb2y0YhJQQWnEtXKYFPOtBbmSlCq9rLynCs2a2EBEuJalbK5oNKCKxTHho4rCsQxKdy7HBOLguQ5qPLHkWRzGQ/S88v8rsKrlqVs1UNTDHLdmioEOQji/MvRpElKUrJBtSr8sla/svMr2KPm/RTaYFW2qCVLlWhQm1KOy6CowIxW0YtFL9FYWWZg7iglp5aY6dZspKKGtooVFyWihpUtHmocvGK0aU5r/K1ygDhF9tm20vPK8yaVq9albH1sGUOiy1smaqK35JnBUW+8u2wsuJZr9ao2qYjWbY29VIGLeSi0tXVkiMPkDavixlvVTLzHZvbhedJtQN0qW0spZok0BVQzbtSoZFeck2t5pfwAKvWxfFvmvYt+bdU6cgBbaoFJGBaLCRi0bL1WkVQCxoW/KFhaZbIwgjah2gPARTR2tYoWL0Wmmmwk9Wqwxxa42oQnxbCKvW0oB22mcrjbL0zWltac24tqsNCKu1TdxDmzCsCVfWoNswrFqXrl9L+iq9plg3zHZoJa5iZNqfaDWpJRVMHW/KG1bcMZUjn4QKvtr/b6WxVvraP2its/LTiv1XdBa2o4glb+lIlhtbI2tVRvaOS68r1sT22NsR0bK1VtPrCkMtq8ayWktrw63qRKtlI4KtDqSVKEPCgtbMKtCHA6+W8ivvtT3aSHKdew/YM5hZ+b4IVohKdMCDRHjTXTQ4VVboOvQXgmxnbClBYToT5iQm5kFxlg+IKshFg51zRC0bYM0BDewwkIFCEy17DY62YQah1oT+D+B07yxYynjzPZd+hVxX6XSjfwOg7jteIQQkzreB+jP9GdcnY25BE62uWTFs6JO2Wn46NGIjl8RTg/KmKFwQ8gnYjrgioKOw7gvhmfCnghzuk79aKNA+C4urjvlc/goLu2Dpg+Vz14VO4Lu07lHBEKs7YQwzvy6NOhPh9KmShLuU6Iu2+KxDlHQ5F/oWETjsU6Suyzo47x8b4OoLrCt3KjBHiXjq+AKsVdN6MjQuox1ybCnrq5BKokTqEQpwibo9MrjJkPCyAizSDwDJutPh5C2o3rtW6Bu0bu67nXYbum7o/FbqpDtu4zOOpi8ljqmayYcj3htdHP6Lvc1wVt1NoQHTj1FMdMIBzu6NzQXDe6IHD7tE8Cwh8ilc6be7tDYQbWFDxd6HaiUpZouWtC2agU2j2kwbuqVy/Na4LDwR637dxFfApkOD0TpaHGXmfNj+UHtEcucmj1342sKCziliHaiS+7mYOcwp6XuhfWTk4HX7vM8cemHuZ6QvXGttROXbvR09QUE7i3gWXFXzU8+4NARFdaWMjx+BlK7Wx+B2YEnt09oe0RyzEbPeXvltFaH5ic8aJKXv4cfsMwk4lRe0R1UxnJcNH56De7APA8X3ajlN66LZvhutxPU2kN74ez8wNt2nb4AmaZcq2yx8lu5txQoq3NiVmSbUvry9tZkmjJoKRM73vbht3CpOm8JvaO2D7FutwrG8X+erz96D4wPssc4+p9O3ik+yPpSTP4mb2icM+yDKY7X/PANW8RMIhj1gmu9YNKyIpNJF86P8FbV3ERiqvu/KkIJZmq74uvctjAlqAUM76XMKHWZgHOqYNZsXMICM+p7TC4Pq0FkKPgc7shClqUiZ+gUM8NAwvbQjwfShzsxDWsyOArIN+pzqIru+xruOS/OvbVQYAW+vt+wTcsftLQW+xJVIjXnLOBv6yMDF3BC2u0Ttv6EwF/t76uOr2tjEzmhPjhkMW/V1lhCu2ZsuaNi+/oc7yuoS3d65c0PqcyjNNNhnCTu8OwQHa+/IHyz7M6vzgHd0qQDQGuQjAftzQGfMPm7MBl0K666Mn7TwGBQ15XgzEBk8OQGUM7eMoGX+/AZG7vcrbRYHqBhbsz7i+r5NY7lHWR2skHHXxhIKpaB5vhlhB2iTE71PHhmpgN4qQZuYfgOTo47HibGwVo1UNLpUHSJPstNphZObODTOucJgFb7O3rngJl+LRg0HZYB/sUZp9dQchA4gjjtJB5uEdhkG5g1hWBF3DR2hbwAm1hWCNDPMQfC7HBj5i/z5XQLqCH4bV/PlccQxrq7CTuGoIEHohoIex4fi0IdaCgh6WWs4iHcoKCG8pAzh5zYu0wYUG7B2cCS7ChxYWkH88EwdYVchojnfsuyOQYLJyhxQe6JBgrQaKH3nPrtMGKBatojoGioZDaGmh6ujaLlEJpGqGmhn2mM1sh0wYyHQuk5gKDr+/sicE+GeQuzlRhxoawKqGQZDc6xhjYduY9BtG2qG/JAzmSINO1hRmH8WGOF06khxjGK6dpK4a6G4JN2hOHWu0weX5xitujCHJBwYaoZLh4zq+GT8zrrJi6Mobr66uQoD2MK6IcUK3xWneb23iQRybs74YR6P2SRQR+MnwxnouEZI9UR1hTIQewrEYRGueCwud9MRzbo9NF0gQAhGRIWbq7jfJIkdssSR6kdrjaRnsOUc9vMkeZHYRr3qQiUsBEfBGWR73mxG+RzkYT7YIrclRHf1CTH5HGRpj3RHhR7AeSiBR3kdlHo/RUbm7oRukbjs4R8s2xGd2SkZAjVR/IEJGMRrkc9NxR7Sj1GFfA0aZHlRttIoqLu0NsuNswVuTIY0s0t0QJy07uFSyHAynKN8LZbLM6znJKmRA5AvIrIMrMZb+HKzfsuPmRt6ZYWtqyiuKVFsRMZCoiay4cjczmIF4a9wDG8ZQ2Tmz0wtpmoR4FUW36Hfs5TlCrPpZmxLGns6bKP5+YJaqRy6BO8XPMMxyviZz0s/cxZgUx7bLTHAx8RXBzsvKXN7GJcP+jOyKc2Dx44QuJnIWySUMeJwLHsqbJezZx1vhxyPs8sYnGfs/Mf6yixpBxHHJczxTxkeufsZyy8c3sekEPkSXJPGm+f90nGLx3bNYVcxyj1FyMLVhXBDkEW8bvd9ZYouCZccu8fLIakbsenHzzRodbGOctUBUr7x+sdHHOc6AcOjZcyNxFGR3dxhDMVc7XPl96Zd00zzVcnbtoKkJs3Ng6J4pegwnDc/Cewmw+oq1wmpwL3M/i5iIib9zaIkPvIGyJz6WKJPc53Ly9CJssyonGB1L2iLrAFMzXtvADe3DybQ+fx7sRrZGX5LM8oESatkiNDEzy3ImScc7wrFPOzyJJ5SfzyNrbeM9903TqIOifHONwe6GQXSfGjLC2yO67tJhkFGjBo8Owsnio5aJMnuEsybozbJ20IGi9J1N0MnmAKyb0mvE7eKsp03bydaimwfyaMn7J7qN1D1ozaPdC5QJsjsnVAIQh6Sso+cNtA7RqM0u6n+iWovaN4x63q1J8hMoGGsCmOun05B3AcKmdUEGx77sptQYqAF4aAy0HmJT3XU802Ovr0gN85VpZAd+0weTljmuhy7JrB+4VsGapiqZiHKgUAqpzipoIY8H666ETfMghvwcFzIHdvrmmuEd/uVFaS1hQiHoKrHJ4YRp7oZebMpwNpfGbhhZrW51pyohIE56lCiWnCho4c+aZp4JTKGypuwtlIchwYfeoOpwfpumlh2lqbgJwBoYUpq8tGmBFny+Qben+BZfjr7Yh6tvQaK+KZX+HAZ4Qg0Y1hgGYwscaCuUX7QZwqcnRADFqZRmc1fdAmn4Z4203QxSf6aKHaabuDn50hktQxarxE/Mr79ZMbSBsrps/qhmYJuZLgmUvBCaIy12CGfyAhRlTO6JOBkLyRHbRrkYk1hZgWdCKTSSWZtG/489N5nhZ3UYITFZ4gaNG5RxifgHVZ7cPJHRZ/SYln8wiUb1ns3BWaFnDZjke9yZZ82blmTZrkehTZZyUaCyi+B2eNmF3JgYfTrZx2e9znZz2ddniRu2Z9ntwxEYtHCsPmbBHHOjUf1AmBwOfyBlZp2bNmg59WY+SA5hOa7jzRxwtTnrRr2bFnuZy+J1pi3CKNojrMo/TtBC50hKcmyJhTOLcowouancq50ua4nfJ8Wfzm7QGueNyS5mKIMly5pgfATqIv4mNze5xCiCjCknuenJS52IbVzB52shSo4ozWYVyp5pwYHmx57CL8jZ5oEbImrqa+P4gBItXN7lW5nefCn5R9303nkIK8N3n8ZVudkju5u2cHm5QJJGNy95tsHvm1551I3nb5iCIfmL5wCNEiR5m+eXn+IVCKCzH5gBaciX5uNLfn/5xyMnDvc4BagX6J0ydHnlEUua4igsqeZQXVo3OfxBYFwKNrmTC5JGQgcF6+cwWngWBY0pdwoBa/nt5s2iIWj590NltT5q+fPmPXNsAWQwFqtKcz6Fy+e0imFhhYUi2FodNjdOF7+c/nmFkBdrN+FndKtzSFwBZgXKFxyIUnD5ueakW5F2cJEWCF9Bd/niFmkA7mEw/3KCydFgsK7mJF5d3uSopsbyN1B+TuejDEps6hOinHFKd4HIsvwO6NhzR4vzVr3LuACwzi2jG88N2cxX/sBiF4Gi9XiLxcM1AlgLCE9N6IJbOKWWEDyiXQloYowZKPUHzTwMHJenMViPNdkUU8HJencXwvV8HQwgSn5lBsn3J0gkd0lgHns8n2cVkQcEGEz0jJ00xB1iWGPPxZ1SMHcJeCWV4TjyM0esER0OJ6xRcwQGM8/peiWHqpElZgcclJdesjNbJgCbiSOSRk0sliJdc8rLFSqE1bOBL2qW+TdZeoFfF5kAJNyl41WCXY4HarUhDyQoN+JrjMZdfYmLS5dGXgNapfWFAvTxcGW/Fh2T2Wrlh5cAYePS5YzIMHGMAyWql/Zeaq6BSpeU8wfWGx6WkllZbgCaPHpfFZ9PLZZNLHlo5meWJ3JBtRKBGW5akAghZYrOXJSIFerQTSpZeCXYV4lfZpdl8FfzUJwQEdfmtZzxzbcBvFWYZXAIQrwDz15+lficpwNlfgzCxwqB5XTuulZwGMnWbym9BZrlet8mV0ifgHcnflbm9x02VcZX5VttJa9mYyiv8D2KNWPSBQYjZ2lddezrB1XTerZyP40cCbj5tlnTpx1jr+EVyLiSUFFMAFV0fCQ0A8HQbM35+HeF2DjghilzV6UXW2Oj5TaDp1WdbYlxD2dDmAdsjjtVi10VoanHasFx/VwugDdOaNmOX5vV3525c2Y3gXGd3nTOMjjEEbJFFhHnCPplj4CGBR+cDYnKVNXuhLeGBcxXLVZDXdVmNZRLNsvbjhcDXT1eBFQ3W1Z6Rg1w1alppYiNfrWpXBWMCq41hbjEHvXeON94lHepDFc2YjdT9R+XQ1OdiB+SvifyWXNVMBSvubno3W5ygPFrQQkCOKtXS1ulypcS4s1c1c9V6iQNWo1vF2hN4Fa9a+MMXFdrPWq1qVy7WS4zkT1dQVpjBIsp5LFClcrXCtfuFX1/10PWH1tWFH6g4t/MHWXO32JfXJXZ10DXxY9tBiQTXfmKdjBYpwQ1Q0N99aNjv+M2FNdtXTdZ8FENrmJ7Wb162IHXe19sK7XaV8BfgG1wUOLbce3MBPKRCUDN3xkt48WdjwmN8dxrdsM5TXY2S3Lja0X6MwTe7dQF2J0Y2hNud3ZWhVhdPNJeN4TYITFNmTZY25N2SEinHkztPdAhNlKNeTgks6iK0xI1KdL70pu+cMJh4JkFdduXASHq77YxgGs36xW5wVRfURzavIl1uQVkx3NyEDFcBIR4M1SmQNYxldHkSzaYAmQFUGNWvNpeFqM/YTp1cjhMYuGaNnjD+Ds21jJHGaMukElAs2YycLaKIstx4Ri7Atq8RS3EuIras3PCPWMxMt8bbxthajGzducrmoHEc3KtzzdCo24EWFqMVTJE3a2NvWo0i3w1uUC8VjkEFDi3VnIbdq3wtkrYFiBIAYpV9HNq8QK3VuezYy3Ft7VwS23NkFC2cMN1yO83Rt/uFUR/NsLZa3ykKLaO3ctk7e6214XbZi3Wthlw22ITerec2kgOjfYX2vEqOEFmAEFBwQG4k4edswsxyfEKOV97b+2vtydCsyp3DSmWQGQb7YB3kwlpNoWxvaqLD1rfKsgh2mwZHdist0yIqUWq48IMTc0d1dOAxodtt0J3/C0TeJ2UdiOmx2bJ/HdKsad5pKB35NlRJDEsd9HeBjWd0ndAZydxHcSS12FHdh2id/nYZAy8uHfwhh2FQG3ibIEnewBBdquwlwCkGHfB3SBgflXhJdrkel2Ud0XaF3FdttwPqVd2RRjgpd4XbYyGdt2wV2Zd7XZ9sJd43d13GM7nfl8LdrXfN4xdzkBt2Ndk3et99d+XbfwqdoAld34Qd3dE2hYNBEKhBs1dJD2KiPXaOIDd9tMkX3fSPfwZqrU53l3HiJPb7WA9sgeB2N3b+EThYrFPcd209/PaJBpV9rwV2qEaPZ9LU90Pcr3f0lVe3jy9/VEAhw96vaj3m9vylj3UMyQtiBG9sPY72fdo4kTczkTvYb3fdpXY/6B9y3Zd2DdoPd52yIJ3YZAk5Ovf0nNdxfYGJl9m5NH27dq3cd2x9yvcz3Vdo3a5GF94v3Hxl9t21X3T9iTJx3s993yh2qdoe3Z2O40HbTsD9/DD8mVcf7dXT798fZ+2b9jaASSyIP9m28m4rT0DcbF3xEGSeoNxJGSt7RGH/3ZIQA8Ug/2bE0zzoTaKHmTIDpUPYT4DvJL0TcDxnZ8TKErfHKzrfPBltAIDxFEGSCDy5JOB00zxNMmmdxA7aTLEqyM8RiJo1soOtQs5PwPYYWg64B6DrhPh2mDk0C033t86dAP4Kb+BsWbwYrzXBArMQ43c0DIktZWhqmQ4Ig5DvoAUPTF7TdYP6IUEEyDKkt5OShND5/zWidD3xMRrQQBIboB1DggISt5D8w8SjfE83g+tZdmiMSA7D57M0PdYbQ+cPKE1w8ZkyfI/S8Ooshw+tK/Dh5JcOW+AcxRSHEUI/sP/IAaPVBIjsxcSTAj7cI9InQIJLSSbwbw+1Dkj1I90PY3XPeGKvt83l2wEjnw9NgijsvbfBBkAn0nQKQeZLyOwjpI4iOnDqI5z36joI8XSI+vgCqOCjjo4imLD7o42Kgj8TGaPjDgKHyPnQwo8cWBFMoAdHhzPaOMkuRLrbnkBSSzg63PgDY/xN44VY7VZdj3ChUsSUbY/QoTtxTCQXsDatB377yD1zOOkMi46ZBbMa48OPOSHzdeOPgMfSKI1j3Y974XgfgAH1fjo48c2lECIP/p3j9Y4F4HsxZHOOPjkPevVZwOE8YVrEKOGnnQY2RDI5YEcJonCjmEoOwMS9bWDBPC1V+khPQWcikc2ZUJoI/1j4qekEBc9kLnWD4T9Y80xowB5tpP5CVk94xmTmeXpOqT+KeHHD9UNkpPc96gQq6TOWjE1Bc9koMMJCT7VeJOZTlMSxPClZrGlOg4bWAlOQThE5tBeuM4+1PuT2U+tdt9Mc2gEFd6Lg5PBOV5zuPARdIXrhBOc8Grxdju4wey5MbE8x7wto7E1lHjksgaLHNr06+sekLDgtIzTl05KHaTy4UH6Fdt/l5OpKZ49NX+S4U65PPgDSnv1wztA0JFB+jSgNs7ZYM8pONKUYktOwHP040pJSCU7QgcTngtLPsgCU4GJmsLkQLOemLY+9IXxLM9NYy5E07VPGAVM6LcrSTs4HJ/TgactOaIn0kHOYzuVDS5K+Mc7ey3T9BhZBFTgM7eOXmTJPRPFzs4/9V8sT07EZXT4E5aGXp6M9bkJzg0+dOhzrY+PPuz/y1eU3Tk48XJi4bM4ZF6EQTn+Rwmxs/eRO9Zc7a4LzqSluzTEOLgS1iT6s5/PsDCph6pXz4c7+JRz+847PVTgc57Orzn46VSPj8ShEEzzxC4bPR+6QVv1zztKkUDcEFk5TO7+9MDwvUTz8/rBXnR84rOPT7s6ppYGPs68af4O84wvUwMfQ3OXzqFB7QLZXc4eaXp1AU3lHz7C45EtZXc+P8kL/gQWy8Lm854vgabnGwMYSUC/ZbATuE7mIEuaASO3CqIM7TB2yJgFcj11XUn7PVL1SjJRiLxoJfPQt9S9pP+S0i4UuhLjM/5OqxJOFPl8L7s7Evbs4y+TPuzwS6fJbLnft4ubkR1DzPYL9i7Qx1QENo1Wm9MFSfUOAtdgc17TiK4w9//AYhiuB9U2Jjgw9T6RJY9Y5K8KZazKK6v5pDLK/PIYDBsyCW4T8MN46o4e8fS0gDMq8aLqhtxSmRu2PZOCUzhlxHtPDMV0ncUXxkGj/QC2a4zSv9ZbVYQM4rxnBfHBr/+hDY24R5q6vbQHq4wlIr//1msZr0QUdZpDEa+ivDyNq5cZ5r9K6SuQ2F7DzKdrja9JgQ2cECTgiS4q+eMuDa9JbwhUvpPMU5MENg1x0Sw68yuQ2ZbDSvErja64M1wFEwwx8zZjUtQGWSa8GULrxAiBu+rmAKXkqr765yLniha5KVsMUxCBu4AkG8qJWrq6/ohnuUAPWvXrqmghv4bjK5JDTNhEHKdGrkoU1BNzNrHyvU2dAz+VKbtLQnO51X6+Lh6bq6Niv2aHgRFhKb8EstQyRK0Q9BhUiOD2SB9Ya44DYRA2Twv5U0IUwC51TxXZunrtzTViHHFXxFutr+K7JTzkQS1VvG4ZzApvlIIrWGREBMH0Iw1Y9RDdOmbrzRZuiytm6yvyQVK5gDrbzK7Juiro7BmLu2C1EcVTb8KHNvIycq8ZTXFNeF6v7b/2/LQ2GFa+2vHbxm7VuRr/zAZv64KQQ9uKryO/juB+RO5VTlKvWOOu7XXW5pSM7uVHxF+bim9jubbtlmZv07uO5huToPIUwD/MHm4evSzcm5VTca4W4ZY+xWq/FukkXBAZZF4egS5vZbmC27uaAg5SVuA7xZFbu07jW5fckbhu5dvcBG80rvabmW/kR679pEtvc7iu4Luc7tArjvQrlxbJgyRVa5SBF0/5CdvRbxgF7iT7qO7tu4bi+9bqo7/a/cUL7+fN5vI+Jq81Ar4oeUQJ3bv27TSShp/RqvHFHBLh9O9V+8bve4sPhrZU2Dq6PuYu58yDub72PAjGhr6O5gf5ERcizuZYF60zBe4x4Lge5r+K5weKiOKDH18HxnGPu77za/UB5r2+6+u9r6B/PvZIo6/Bvg78h9of2TM6+LhWHzO/xFZUUvS4f87+xF4eo4Gh9evJTah8d8qKHpEeuClkOwnT7ULu/YfoSnBKWqhLYm9OSwrwekHZCx3dt/UEyp276zq78+7TFeVDCyNvOb8+8XETH9m9jzzWox8NIjr91jFMkkOx70eBHzB8eaQNVx9EEJrlG+wfjHr68cfnVkWE8erH3e8b1NHgB+EfaGAJ5Gy9BAFPBOL4X7APvqH6J9PuUH8+6Xk4+K+/xuAHLJ82uH7o+6XlHGF+/H4wHrRpKuCrtO6/s1d/+99vGim4uTcGr0B5gNHi6onyf6Hx4t45Zr2G7D0X7WBmQeqHgh4Sf0Hv1hkfPgXJ7Ye6nwB9SeMLBO5/vMnmJ+ZA/qcZ5meLbNR9JvRYm6/Pva7gJ9d5sTcZ51okr52+CULNNrG4fVQRe/PvXbz7Ixvr73p+tuHrg8D1i19BTKOePjcx9efFnwZ7IeHnrK67lztK55tEmyfy/06tnkLU1ktb8EX7giSkLV2wVbqF44fAX0JEgfQXnR6DhNNPC7hTln7Z/rxJHrK++ej7whgBufbmx8IxTn3a6ee4nnF7Oe3Hu5/GeiX+64xuq741pxfca542OvtQS54rKTeFe7pfAX5SpXvctl58OfJn0l+CeRX0R/SeFMrVQxv/n2R6Oxz6YZBOu6YazHBerNJG8UeYXirDbIx7zV84embzbAxvtH1V/Rf5H2V7GfWX7zSkexHgh4Zf8rt6+NvgnnZ9xvCQKl/JfaHvG5Ye7XwG85fDHizTZehYMJ6/8yYMeT0FSBbL0qQ5T0N6cF7PWW8Kou7pDIoEVxg7njeuDSonJ4L4cnIjw2HNN9kUtVInMXr4cPRg0YCFfnL5Skbi9lLenstB0Bvzp/N45z2Use/Tep5HHNrvxHXN4Ixb5DnNwcm3hMBjfu3mbDYY9Gf5AGTSx7VK7u0wIXEoUx3+N+OvvSG7g5dEISN9kRWDBd4h843wwjneuQSNYhznUKN9rl9ldd5Tf93tjfiQs31hz/QfGQE/9XEIJuiLeaOOYUC8NTyBiRu1zRBCZykCzLB8Y0QonnmzMUbby4MH3xLXJzXXFbCveGRMdcOzUUxmBkSF3p99pTfMGRLNEk6CN/HeuDfmGe5Ixpd7Q/0mWjFHel3nfXQ/2wcfNHGKxEh3+YW8bsdA+fkf5lSvXGRCECwAP2j7gNJs5PH5wKPjqfJyMPduCRu5iF60QxsvO99URcPs69bemRc8EveMPnd5nfN3qCWX5uxoT67v1XOA1HHs3y99kmSP3d5w+AKZD6Pe93ld4hl51894k/47mJg7Ws33WmE+LCeHkljEIbj6TRpmGz/g/1ADhlfffGcz+y9c9ZE8A+tkXgVY/l3pT5LJH38nIC/jrumb8/acqHxJRNKnLjmW3wKL+04QJFgQS8olVN4okzrrhnTD9Pru8uqPP7D/jeg3mwJBRX+G1kHOHZCLQRRfgFIAV2r3bIEq/TzHZgV3zrSQHq/bqwc/i9WYSr/LRBzx63ZQGBHgoV2NPHpAxQ0BJLbnUxtALARQuWfH0G+P1dFDTpeVTMFm/Oueb/6xaQGLfG/NddlGTlpGQc6G+8EfdALk6t73mxsBECITa+Fdjr+G/zv4dkHPmvxZH62jvrc9q+mjOYczOyv69VfAdEG78a/GsFlXRQfvlIFTO/rOgB0Q2qC77fxTvg7+S5bvi3dO+wf62r/ovz9QC8Nhv8H9u+TKTXVQhvv3ESB/2TA5qm+QbIhFLOVv0xBBRlBNVi/Pu4BUQR+qgjH+SRFVTFFa/6fgSwlx/6EFDp+dmNKkWEHvwH+ovvzygARQdv4eDlBreOhARQpRH+H5+8pX2Al/soDmBimFFdn9BTIogi/Zp+jMn5V+J6Zy/H5sbbTg5+GvoH5/S/rMn75+BINxlpBmfrn+mgsf54EK+vYYr735GZEDRyvXwLr7Ie5hkH6t+j7q8X6MWvg37a/f1VxWeL3fn3/aUBABFH6+AUtMV5s0finKG5dHib/ZRpvulF0e5vhFCqFk4Fx/T+ttzaiXhE/rb6F+PqXb90fY/6H7a5bqOx+PEI//rcN+7H4P86/a/wP99+xtXn6v5K/39UUw8g0bauj7CF38+/2fvn8g1/v8v7r/4NEH8SR0fnZhoqofpv9u+Z/41oR/J8pH+Iy8O87W9/z76plR+cf9ESPv+YHn8J+qhYJ5o4tbTX6uYj/zf6kpQDSf4Rv5/qG+vVHUAP/n+aI3XmV/b/6f4GID/uf4//jNAn9G3i/8FItnPySrfSX75/F1hwSEAHy/d+4v/Nn4I/NvKTgBp4a/UlDBGBAGb0LwxxMJ/7T/SoigGQFjf/Qp6FqNn4b/ITS2/aQL+Lcpy1kG/IQ+U6DUWRv4HvKXD9UQ+jjFCgFTmCHyVbFmi2ICLayOVgFHEM4QCISogsAx9zD0b/gCIOgEQ+HZyWlZgFrGR9ziAwWCkAnVLkA/gFSAy1y0sWgGdFKXDKOQLAtFSQHqArfC3NDgGiA6px3UI7icApQGK0J9RFaPBCKA9QGNoXgG+BVmInmCvoNBKPiYacT7r9IoIGlQypg4SmBEhLjpMVfxy7FPEKf2eCiv0KKi5BOr6ePC3jPlSkTDjQKqyTa6aVBRVTmxZIi8iAmxhpMbRrwGiopAtoI1dbSpt9AFrS8UAaOVOgTADGEIADbtbBAzwwwhYfoYOIQGkzGELxdVDQH9eoG+A6ei/0LYLVApTTT9BsrzBLTqzYYjJr9cfr/gRYLEZYRC0lQIFyOAnif9cYFKaHBA3BHtzDA87ghA0oEjBbta6+fKbzBQoFKaUYGpApEJkoEK4wDeCZz7IjIAUKgbUhdbqppE4HCzRkIj7cWaNDK4HLQN2wrFU4FzqbgZF9TZK7pDMbCzEGqdtSg6WhRUI8HFxKOhSJIuJO0L17CZIfAogZBzY0I+8Z4C/Aypb/A9qDwwUEErJUZJh4U7pqre0YaPfax6pTL46qOlIi+BlKZEZrBQpHEFUA+4Q4pNHS2VW8hoVDMAYqDVKZfK8QNFSdoHcUnAMePEHApONSEgvvDpBWLCkgx9z4oNoQBKXASYpJQiBnGtgEgkUG0EMUEQ2A5b6eImj0CWBod4Tu78g6TBAiRVLLcWVJKEIy4CwV7YCLEdwGZZgCnPEvZoTA0HW+dNo3A0Ta2pSdKZEY0GhFHTIWpG0EWgo4FcFS4hahGqa2g/SbBpSdLMqD0EMTW/buhL0EWpH0HMZEdIIwKFC+g+PrOgktKugttxeuVdKBgt0GNYCME8DUTYTpIMHhgkMHtgIMHquJ0G47HTa1pYvxJg+MGlpQsFRoXMH+g4dJZgxMFlgqTZVg4vwO8csHM7F+L2gt0E9FTMGeZCzDJgt4FRgoOwtg4vxtgo9KKeVsEAuRsH0bXdL8ZBGDD0SVC3pEjL1gpByjgt7YLpCcFG6ZbCSZb0GBLBcF6g44Gzg/vyWkNcFBg4vSbg+PYvxBjJLZD0GPAn2Deg8AxHgzjIngncGy2acHkZe8HXg0vYKbe8GHggTZSZL3Yjg18FcZBjL34c8F1zS8EOgmAhdggjKpgr9JugqcF8Ze8HQQ38EvxSCFzgvcGCzL8EPgm8FyZADI60b0EDgwWasZBGA4QsEGibGzKGg+tjxg00FGg9CG+ZUuwIZHfxEgdzJ9ghZKkQ+CHmLFzIWZCCzuZddJsQkpSUQ7vbOZOsEIwFvbe5ViH2pdiEc+ZoAAAIUOAeYOwSdZ1YKWFgtGFminMhZh56zEPkyskLSKM6xU28omUhGRW4mqYPUhEgE0hsThHicYH6KycFUhAGRMhOkJDmjCjkhGaEjmWA2kh8mSshhkNFcBCRchCJhUhgqzHBC6Q8hZkJshbClMhRkO8hi4OPmtkI0hbkP0WgUOshGm1Ch7oW30Sew3if+xsm2YCT2K2jf2VhQrBsbgShIu16Cq6VnY5diShGUIR2TkKAOqUIZAgKSlC8vgKhFUNv8PO1KhyB3KhV+2UyNkwgsDIHShBu0yhTYKR2bUIJ8eUIbivUIEh6mXWSEwENA9/mEAiACmA6MGJgBAANMuwBAABwA8AJTnO6b/nKcN8FxqUuBKiTsQw260MqcenHjYULhvgCbkFMfH082R0JpcbrCnBAsR4wx0MuhsQR2hFWBZQenEEwtmGfgQsjdY/5noEcmHOhT0JrO90I/gP0MFMtPFdcn8HbAAnDAcBzm+hmmDTYsHCXk2CDXgN8E1kvMSw4r0k5oN8CSQuqEw4BZFRhPSBvgRiCnQ+HDHmSJjxhErkNKEMNqc60J1IA+WBhsv12htlStOnxj8MhDF/owTG304JhJQ8sS7IDrFShzq0WQN8BqisRj04A7S8UTMFlu5LkXyn0JFhPGAFgB6ENKPMJGc0sODc6nB/i2rhuhF0L04W3FWcasN+hZHArgf6EVhYOHU42MLOcb0PVhEHGFh/qEehQMJSwX0NFhDmB1hakHZgtMO94SsMfYQXwph3vHtI19ByAepwRhYsMTiN7FeUgblBhg8nm2gcJxhoMN0IOcRvYvsL5hhDD2hMcNBiZhEphkbzdhIJlphDL328cHHGE/9G1hgpm4KT5DzhbrHNQUG05hzcAdYPsEZhIcK5hbrGBALEiX060JZhlrBtAesKNQ8cPphgskhhoMLawO+iXYJcOJhVGWoQM7H7hCMOhhIoMHYB0OTh5vCIYfcJZK+sIqODsL2Cd61Bht0LdhCvAVh08IE4XPF46bcPH448ILhbDGlhXsMNKZ/kLhLsMNhs8LHM9XTthq8O0wzIF5hN8LNhiAmJMHqHPhq/njYB3BBhR8NlhS7CZuzmCNQ/sN/yBbCThUMIMUgsI/hk8NARUcNZhf8L5MgMOLhNoki2oRgXhgpgRUkMNNhv0PFUTdClgVsKmYW6mwRj8MwRO8zthlAAvhMsPvhCsKZujSBzqsnWuhIhRc+pdTK0nTkbhOdBNYdnUVMJMNQYelUEez60Rh7rm3oTCK1h7mBKqeCP+hUsE3hoiPXh0RhQRoiN3CK8LNhWCLHMb0JnhjoWMQ0iPth8JgZYV8LlQ8CPlYeGS24K8JURrd0su4iPCwIiL0RL0PFgkcIThDLEsRuMNhE5cKmYviBMRIcPZcGlVEoWAkLQprzDhWiLLUu8Le6i5D0RUiLjhUaAqqYeHZh9iJSwXCKCRESNBh5smVBkrDsRz8FDhjZDlEeJWQRGiMBqLiPlibiKaaMCgwRmiP4EL8MLQuCOKqxSIKRCLEQRAxUjhTcNFqFcChwRcOeqspgyRPcPpYRSK2ctiF0RdlS8Ue3lcRrILiqPSPTA5MFKR3SOKRJCNdhdlWBC/yBIRx8IGRYyINh78JAk9cI0MIyJAk8yM9hP8NGRHSOSRuSPeYdiL6RPiLFGX0OGRmSN2YBGAMRmoU04DzH0RpsEMR1yLD4YfHkRmCKCKhcJkRuzAthucLHhmqRCYciKOhRiMSqSCKeRmiJZgIw2z4XSNw+VMCsRfyLSYdYwOcu8NZg5iJYSTsPoQfCM8w29AXk0Jg0MOz17h7zEGRXiNxe0cKve8yPoRmPV2Y1FkWKdsMToglkuY6cJRRb8LIY6TEnhACNORITH2RjSJCYPKleU4yLIRizGaRMyM2RizHyR4KKfY2SMzhjVQQCmKIqRCjES6DjkIRmiNJA7ML5hqyMeIScOZRpCMWReJGEESqJlgAqJxWhqVxhgCL+YIqIIROSP6RIDHq6Y5hqRrCKEYbKPbhbVU1RPKkjhVMOfoKqLhRTqNThy8hlRlCGfgCWn28P9GJRLKP9R2yPZRx9CvhWKMdAfqOBA6yMDR08P1RUqKwYYaLlRUzFjuxaDiRNMDRsO9GjRt8OQYtqMDRQfDjRmoRhhvRHwRlqOhRWeFc4+qKBR5aPdhDACrR3GCJMx9TuRUzH+MQhCZhZiOpSBCH+hkSNnkeySQYSYOkm3cNJhfaIoRM0hYRhKLhSzq1ARJ8lJRnaPeCsqM1irzgkYjWEIQD4gWRDKJbR0yPZRM8E/hwISTR9aJrRaqImR26LZRGyIc2EUlCI2CJORt8O3Rc6NeRV/15iN6MVRoMPdM3yJvRK6MiR70P3RmsMdEXSO3ReKLrRQWAPRTaO4w2oFRhISJfRXDGaiuaKRhI2GcRJqJGRVCRMRWIDxgwgFsAsA0W8K0LM2yxzJgecAURSg2uha7DGc0NUGQO0LQBIoItEVcJsgk+UBqfsA4RpIDwxBumXhVGIYxSC2JhkJTSYDQEhRmsGhE3yLlEsjm5c0uyIx7dVBRhaAKADGPFgRa3Jg9GMwRJWyLWTMGkxmiKrIK6N5gzGJkxBkn/h68AURMfw0xs0C5Y1KO5q9cNCMG7CXIljGEIvCPOUq8GAYQohIxPKCz6RNBasW5FzsNqXsxhUBomDkNOMdmJb4rmIZsFowWsLVjcxxo0tB01kKg+6CcxAhVyWDmIO47mMLAnmPqs0MULUvmJcxU4Ecx0WIRAsWMWsLZ0Sxw6hCxUWMCxPYPrMEWJyxQlXYmq1g42BIjyxDUOkshWOSxCWIniakEWsKWIqxWUJHc1WLKxYWPLcwWKnAmWKax3UKDSSiAyxPmIImpWLA4ddjdmXI2DSDWNqxEaXpA/mMGxGs2axGXnqxs2NowQ2JSE3mJWx82ITMC/in8sQBn88RQGsfEzEmhVjZ8k2OKx81jGskWLOx9Zgux3mPKxtVhiYs2LuxrZjbSFRW7MVRQWOYCARBe9yb4fH2EEq6H3+6iGCkv2ImWq5gTAgOLxkCKJosYOPf8eMkZoYXlBxL2kyEn0lnkqKwRxVFAgEWpFRWOyHy2oSEpkVzHoEZsF+O3oCuERvi0Q75j4qbWlhxWOKZs5ig4kK+lSuW8EWobZHTkyOINsATUM4QSxykIKKMsNLHtAAQnpkYXiYsqxj5xz/HcYT6ilsIuLxkAWF46nFn/Ud0iaUNNklxY8RKsVDGeyMONnGzmFrQvciFkUuOWQyNFBx+0QcQUuNBaV5kCUtIHzgR1F6xlkI+YJ9kaxxkJtx62NGx/s1TBpEMdxCkIvsXWLmxyc1TBHuPixV2P0mJuUHsoWNSxnvR9xCYxyxKznchDuJqxkeM2xPkK4yvuOg47WIicieNuY/uNtmREOJctuNyxqC2Aat2Kdx9Iz/mUdhjxyeO0yHewjxBeM1GReMHs3WNicqeNrx3uPyx1dlFcbuMnmeeM9xG2MbxlWOohdEIrxIc0MureLjxcUPMWA+I7xpeJpAM60HxXeNa8vEyNM0/jiKwkz0Sok13shVgrKQeJzxR9nbxfuKvsHxhPsDeMnsI4Pzxt9nm8r2Kf8xNxUO2GJDKhAhBxvOPBxhWgjgN+NuYauOdUikl9KT+Mlxe5RNChOLisFgLtqTyzRxOuK764pwNxf4HbUMRDoQ5OMTCu8Bpo4BKhsFOIlwe2XUcOyFaY/yCIqquD5sTOJ0wmeklMPvE5s7iDawe2l5UiuLvxQlAfxQuIBx7/gymMglV65hkswftWU4j+OHoIclXUP1xjoUFglsd+LxuXfFhQHBJhxiuSWKasCYJa9ROmbTFRxquNUY3iiA8wBNVxiiihUUhM1OBuKFIVqk5e/+KoYkUWgJU/TZwwDGFxnBJ8qChNvx7/ktx8eIQhflDxiZdBfC+sxxWD0XMJjMVNmvAmuiVwR7i+skhcpVmkmQ+K3Bl8SsJ10UW2PcS8JnuJ5qPWOMJ2CT8JHGwCJIGXsJ/hIsJGeOWhzHSM2rMTOWIHB3MfxFnWm9BZozjzUJvXF6YMyxy4kWDzY8bCVYmDkSJoOLhRBRKUQORKSJOdFICpDhSQBiFVxrymGQL9jNEvJSfx/yGuq1EDVYW8C3I5Im7WkJTf4oOPK4SayLSTAVVxrRM9iijG1I3+Ij6HKXU0HDA0ASjiEBzqx6JLrjmJxRPyJbDHY0QuChxbQm2WCRPVIoOO2JxD3eKZ7x+GPKgyBhGOkYWuP8InmyE0AeElQoONJwgbiMJw+Njc/3GeUxEy1kNYSxMbxN+yHxPcJx4LG8rxN96WCEQiXxKBJvxOnxVuMUggJKKxvbnDs0JLQOsJPlmXI1gy1FiVWiWmyO+kxRJK5neJlTD+Jt4IBJXYWxJfbFvknbkJJOWPmQGJOiJ3eI8AWJO8xSb07cAZib2xJPbgeJIwhUJMZJs3nRJpJLNoRJKXeEY1ZJVEJpJHJLRJ/JPl8aIgxoaB1xJEJKCJLxOFJoRJJJYpLlJVDApJApN4h1IXqCkqx8qGJNTcst15Jhz2bgqpLG66pKJJEDAVJcJN1J5JLa4hpO66xpLpJZpMxJXpyZJppJZJ0pOeJZEHtMgsM1JXJLFJFpJFJF8GtJdGQ9JTJL5J/pJ9JALmDJ+pMpJY2NE2QZLtJLpPNJ4ZMtJPoFdJHhMMAoJLjywJM+Jb+G+JaeMRJVJIWxkYHTJNWOdMnxII4Vbn3QeZOjJdyX8Od+yXoOZLgaBm1yOtAGnxGIMSs5TkmCf1BGKitHQEVmBxEzKBZeptAjG0xOl44cC7J/lWXhBQJyuojjHIbv2l4HDC4kugwjiQiU7UAvUqG922nhK32nJKyAa4y8Thug5Pxc1wgzQp3yGcQiGGQIQWPJ9vQcurYl3JBNkVoAuSxcG5Onad5JzWy5Lgkq5LmE18LnJ5V2nWJa0/JqcgVaz5LkxI5MMefuUxcFXBjAnZP4cPZJPgVvBbwn1A0BS5JvJNCG2m1SPPJA5JVcp6zQpXZOiQba0PJDl1vJlLQMRlQResuxQ1oYFMPJkyA/KlLi7hYaRy4GGEdoZsXj4wIF7ujq3aQUxJxEHribaGtAnWk5IApPOWfWwFPQphFNuRHZIvJAg1wpolKEpZYODhglOwpEtVQpfjnQBb6wFcxIiPJ6FIuEgKKwpYPQaarylUpxJikpy5UG2EFLEpA2jO2/5OfKyjn7gRFIKA5NyUc2oHIpc5LMUyFJ0ps4CeJqZKUsCrCySmpJ30E8Suazj28pPXhTJ/xKDSnlOuiK60G8noNCpSqx8pAZKYmflOVy8qQipNqXipU4HCpgRLdJGXhSp7e0SJeXiip2VMCpOcxiJJfXpApeTDwaokiw6YR7gwcOQCtfVhyIBl6YNvXKpDHjBMEBOQ8huz2Jv2RV8aKXh6w7A6plVLwozKTg8kQOByzxmmJcHkZovJUqp3elvMviBCMIYzEY0O3PM2kDrEIuQWp1VIigSzFWpf9FWclkm9EHoB+JCZWGQNVPBCsOTpYVROOpKxM6pf01pB2PS7IzVNyAMdCOplLDupEOWTg3VN2pUjA6yuAmHIqPVP6FKDSy11LapQYnYsr1IiojeTdqmnHmpV9G5clkib6q1L2SIpm0ge1K+pVKDGpf3ntIR7yVQO1KyQrznupWNJmpdNDZgyb1RpT1PfIVoV+yCNIU8aDj6pkfEUKsiEapL1N+yyNF7JzfAtI5NIBprVMd6x4k5aaWRSERqTUezi3Ce3/m/anDGeQhWi7kznSsMmpx4QF5WvhoxWRow8CWy0gFlwVhgVpTAB+001AuwUtI4YxcA+0seRsYItIqYmYApq5BCHaCjkEAMeS8UihDVaHTk1AltKLg1tMRqBDkYAJtK1pbEjVpLtMFwdt2WIbRg9p9tJ1gROENp/6xC0OYB1Y2tMlcCmQlpMjFVp9LkBe2AWrwWtJ1QHtJC0svQHgoxWlp+rxKUnWi1wQdOeQo9n1p0dIRoBCEEAo9i+YNtJDcgL30QidLCszXHzpHKWjp7tNjpIdOoQCyDdpSOiqcpdMbYMdI7pN2SdiFOG7p4KVyCJRGrpsYgjpOvGW4cdFzp2Dx0CYxGrpnMmd+EFmzp1dKh0plBxeAcHrp1dPMk+qEdsBdOrp3oilQOLzCQSqDbpYmk4eM9NUC2RW+oOL1TpgdF9pTdKHpOCDbpEUh7pCkTngl9IfMpzxOgBtOBcx2GpeUdL3pHDiRw/r29pOdMacslFZeLdLLp+EiW4Tr0H2rdJha5tNZeIDOrpyYmDp/mH/p6dJ1p1Ly/phdPbpg9NfpnRH6KH9JaqvXH7pUKG2Yff3aCvsGtc8tKbpGsiXptDI7p1EFHw1dJwklkAyecDKgZNdPieTEDDp0DNXp7xTlpSJWfcRCC/sjcBDgexVfsHDPjkF9PygbDJtgKxR7uZ9CNK9zHxSjCg3pHRX3pQDPUZH6EvpQYk4e9DOPp79I5gKxU1p2RWfp4KTRuv3F8Id9KYZWyCEZwdBMZzDLDpP9KF47GkgZXdJl6RtMv+cxIMY4dJ4QxGSKQlDAHpAKThY1DMvwITIsePJ0lpOqAzpUTPjpS+hna3jIiBfdLnpiDJoqVD2to5dJMZO0hBMNQSRKUjJSZb9NsZgAPcQIsPMZydNyZJtC+KwjiPuPUnKZNTIkQYf24QGFgqZTdIsI+tNAZeDOj+s6H2YJTJ6Z6pEjgyGNQx6GILJdvnL8rPgH4RzAWiV/298ifFipTmR58rPkCUQkFpC9vjJ8UzIcmheNE2XMGh2I/moWMzLT8YYIOZQVPxJsEVd4nDFjBBum1JazIuZjfmoB6VPcp+oyBehvhX0QU3GZYOQJ8KzIWZ94WKEpvGt8CrBZGdzOVy4+FDJhVOpJeUFEokzPmZQ0ShZrzLnuPzIL8cLNHSCLJVGLzJRZa9URZW0XD8+zIoEhzN58svkoAWLJHCWfhl8T3iJZaLOrwyuUBZ82NbJWGKxBxAW0My/A7pVDPyY2RWZZ4KSfYGYHfAgdK+cTdOGCDjOCGLLPsZrTJKiHLJ4ZO8Aho1HCFZnLIa0vXC9YYrOTpZXAJMptJ7IdDM4ZqrNGmzC1k0M+DbpHFz5cQmhJAJiDbpycgrpMy3vm4IHt+ktH6K2/kyIBtMrhXZEEBu/kDpDrM8QbPmWQ1dM10XNw6ZvbEz4bRSdZmV0Dh/rPdZvrNKAXPQPIBtKUQnJBLK7BFb4LwBdZPlWu86/mjprrNckDVDjZ2nCDZtqBDZWtNTZXN07G+9ITZZpWYCbCnyZUbK+soAQLZHDitZYqD+hsrEVp+WSCYOdPO4DonVpW2ifoWtPCW/FU9pI4PnYf0PJYIsBW0djFNpdHX1xmNWKK7bDI4iihtgP2ldYWtId0uemNp7bL8Z+snFYSOEoGHbIg4FjB7ZiWmUZuSzX047P7E0dKUQ9oAbZANHuYI7P5iSkIaydLGtp+7LbZlQGfcx7NBWS8DwqTbMDpLbKUhFZUUU1LEnOX7OUgM9BsZF9ArEmdJvUSrD+hI9DzpkfGGYzbJcY/YhLpkfAnZ0dK7ZojMMwc7Ig4tGBkwgL13ZOdNXZHDmEeiHKPZ87JfZmdLp0GLC3Z+akBeYHMvZ9bIBSAHJI4NjJPZrbLjpP7LLZWzDo5fxFvZxHO3ZIdKDYl7N6WQDINWuqGI5mHO3pd+SbZnbONU3bJHKQpDd+f0JmwKPUBe2q2E5EHJhIUHLisGRA04n6gCZtpxU4dbNPZHHO0UAsEDpFS3z+iaAk5FHJeehDCKYsv3NhBnJxe0ijk5f7GKWDnKCELXy3ZaoDM5fCBc+xHNo5DnNk55bG30anOnp57KLYWnJA519Jg5knL85u1WUZn7PwZzGj6ZwHJvo592YpHDlNpBPHWk2D0vBX9Fg5CnOd+PsFk5yHIJYJjMK5QTGfZpzgUZOXLDpTHK/ZNwk1Ok9Nq5srMc5azw+x/oFY6NrJdGybK1pU4IHaAbNFZvXM8Qyvi4ZXrJdpLVN5ZfcCySdrOjpJwKySw3K7ps3KTZu/jbp3CEo56bLIKmbJKie6iW5gbK2hQSzTZsbI25E3O25Y3P6wptMG5B3JOy+XHUw0rJO583JW5yYhjZV3OrZ6z3SmmjMi28PlkqHLG0MPzCUhooMCYvTD2KSgN4IhVBw42RVow0lRVBln1s52hgh52WX4EeiEEI2hkgYqPm/qn2QbpNonoBiNSxQbdN+5mXzR5KnJ+5wPNPq5yCc5H0ECRhlD4wMPLTEyiD+5Z3ip5ogkkZFFne8KWFJ5uDLx5EPhZcm2Ax53wlUwm3hl4OcC6ZZgk55p6G+5qCiF6/POdQfjPF53bIoIslEnpCPOjhCPlOcPtOBcl6Qh8KIzZ5T9NA+DHmSQ9LjbpSKBowLPMs+GPJR5gXk15MaGyKAgIoIKvJzpNPOZ5cvL1Qk9Pt5dPMTqHrmtpaYmJ5ovMnZ5PNR5AvJZQgdKakmPRxy5VDYqmrI55j7lD5C9CB59ANH68CDIZPmMh5jpCMw4HNh5bQmyyDuTrgblOCpBUU3C9MWDMg3V2orimO6dAlj2mIzz5ao1L53hQr5/XSr5pzLZJFkCL5nIlr5NaG8KExnpiyAVeBVeJ2ZTfI75+rkL5NfPDmrfJbJS3jOoX2KFpxAV2ojSF/eS/GLkNQSn5EEmv6C2mSYIxBR+HLlFMg3HMoLMDX5cg3Ko0jBmM32Db4U3U645HKn5cPFf6h8nA5u1BpcS1Qv513C+YYoWs8M/JcwdWGZSXRAPQTcFf658jf59RD3EEhCuM9/OaCW7GVEF/JP4V/LhYr4wv5J/N2CS5DIKr/RloSQV+OwEF35joATpKxCq47tSX4TXBiCKVFbkr/XxhJtHqIvwFhcLaTGYxFAwFKAuV4D/KQFcApE6QbB1YthFgF6/NVAE/HIFkApE6pCIMYRAuzk1cD4kJajgoJ9Cjkr/ROU0BG6YUew4F2ApmMH/JK4HAv4FkxF5ctAtn4XCE5oq/OQFwguwFdgLe53xnS5NwXYuixIVort2ZexlDOsJQhuYhgvQMxlAR5aqQRMOgoqCTUjFcleXJcTiCoEPzBHYkfBZQjZCoEfGAk47qhbp6lFVEXcM9MU6BYILgqg2npkqQmqDG48KXGYc6mFgwQSsF3LgRM85wSRXnF5ycnLYKLnxU6VZHnJfDAuZhV2MFmVW6p+sF5c9jFQEM2Df504Fy5BQpqyFQvrYT12qFgTHA5PqAjwATS84igXI5PqBMQhQVSFEn1yFysCMFjkS3YDLi5gR7NaFAQqhcNgoWQNwUVKaoIMF/QosFjkXaFfDHMF3QvqQcmMmFE+AqC0I082jgq7kWwuXQDgu+MnDDDh4lFcFoXV8F0cNOFYQvLMwQqDQQ22iFcwovZkQu2Fwwu+MT9HiFSkXJMSQo7gkQRl6pgoVoIhVfAKnUiqRQrYKjSH+CjaH0FxQsGelgvAGckgBFUaEsQrkRAcQJ2DQqDAmCkIqqJIwpaFg1BBFTQrP8AwoEgt3nbYnQsJFEEWsFzQveuzVDOF6tBWFulGNChwrpFAVCGy4LBsFXQt0oVNF6FCIrw43Qs5FkWwRFt7K56ZF146fQt+YqQVmpUIrFgJQs+CG1I5BaIvqFO4Qh58Q2L0VIqUoLIq0YBIoWFBZ3KF4zE1F3QpBqKplFYKotQOSlAWQXwunADHKYsFuzMEGosRFymDfwCqQRFqKw7RFu0dFuzMyFJWFeEFIqZFO4UKoo8DmFPIt0wDoqXWtIvmFhQQV2JiApSIwvZFmGEi6goO5FMYra0hTBFF3IpxFsYqK4hooFFW7C56g3xR5yovrwF23Pg4n0SFGQqBFJWFd4bovLMEQqewFYp2FRwrjg8eD2e3ooBoseXBwI2XWF2gqmFnoozF0xLZFAwsu+OQoDFiYojFSotDFgYsww4iWbF44qLF1eB1SY4uHFzgQ6Feot0wi4r6FgoqowP5klFzMMLFpR0hStoudF9jFz2s4vvo0Yv7FT7B1FCYrPFyYsOQfQtGFJmEeIXIvlFypgnFPYq/Y8cPjwakCQE79DyFvaKxQnwtA4Nwo62L4rNFAEvcFdt2Ywn4qwE79GUgTgpKwjxAeyX7COwXYpfFaQuWFYYt0wA8hTFfYoWFIexqFMQquYmwpfF6ormFD5BnRIe0jF6rDAlYcPIlfougl05CAlf4pZQXiwRFd1F/FIeyYlSSARFVQr/Fx4u/FHzAVF5EqVFqYtVFIe2Ilp4pwl54sWJtgSQcIkrQgX4svFOEsYU/IvEl4YvTeCoOElJotrIYkotF2YqowdZKEIfErFFCuBPZWziNFewTLFEZBSy5wt9OOKIbCP2GslZgT7IYjFMlJEoPQwDBKMtEoDFyEsQo2kp9FFAMaF1kunFtZGJFZgoIlYpgjIB6F7JuwrIldHQ7FCKj7ET2Fil5oviltkoLIZ5kB5pIpwldakzFKkt0wiwOYl3wp1ueUsJp7nNLFKJh/IHErMlrEpTgTIAol+YuqltpCWFLEo9FP5FQlcwuSF2RCC2CEtFYKUs1QEW3klnkI8Fb5Eil4TBglewtal3Uq8lhErjIj4u0Fw4uVIWErml/Yt18UYs7F00sCitLE4l0UqcQgUXslwzLQxhwMDy22ODyu2NDys/gSKE/ijyyRUdoqUXCiHFWzyN0oCioWIelhdCRQ9YWel5Vl6Gt0s9A90s+lGtG+ljIF+l7Vh4mx0piKAkzOo50oOxqVhGsj0vrCOZRelaLACiQcDkiIEXIZSMvuEL0rRlcMsLUCMutQAUXhlmkxBlK9hOlngDOl+2K7sh2JXx10v+ll4ROGuMudMkYS4amMozCJ4SZlf0qxlM4Tplf0sRlkYS5lwMqLysRPpZ32KoC/YnClO4X2i/oqoCJHC1Fj5VmFUsvxs+ovdAykp4AospuCcCCglagWEczgoPApVAAlG7Fxw8QWOSFIqfY/jmCYGlDYcJYqs8l9BCFOso7FuA1Y8ZVDQQGsqoC8ZE1B2Z0ySDAV9OKQpnykorUc5UrVFzCDB5RUCMw/wRvAPNHVY/O3VQnwW8wBko6YdYn2o6mJ1SqnB6wEwTDl8YqsQBDlaFoLLpSViAVl9IvzwkorKJSBXzlgYV7FmCFfsWcvKQfzmcY0svDFWEOhMagVrlQYsTgcsomY7NkPFB+X+F8suLl6Yuaw5oqLlOEvws6CNzlPcpnF4cviGA8vDFHxEOFekE4w4OAgsXcuDlc8swwZ8DV2hgRU8/stz2FspjYKqP+8GEu6IdYvtltkunlwcKoC+jMbIIezUwp8pVlEiB2l0oEPlMkrFlW8riglsv4lg8qdlUUp4ATcpXlBcqxFKsqAiHdD7yOcpvl/nnLF/hEFBmgsvxnn2VqvnBOYpOADY6YXuYTsOqM7LhoZDHynM+vEuB1eTLeNaFS4hO2wV+YyhqfvCwVrTPbCSCp4QJUUlEfDExw1eFi4ozFPIvu2eIkPBIVGQVNWHwCHQW3KCwSQR1o5BQp49CrewR2BR65WRKigMkno6YVbZ8xhZhoHHEVSjXmMY2FacAioIloMWqMlElYVysADg8xi5hgBEEVkcFi4UKFjAowR4V74EUMNLgOKnVLPMHCvwV3CoKQTCuqMMMLE6NCv8ksPJwkBnH8sr1FgVsij9Ek7GcRDtNy4LCoS6IHMQwsPK4VjPJVcEn36AnCsJENzDDw4Sty4ViuaGnDGM6kSuwVZgOnqeCtAYpjH2lozI2gihzTCq7Mqix9DGi6hzb4UCXoAtR2SipPAKV8Er0mLRz8o84TKVbXNWhWgqU4vXD94LrCiVGbBG4fvH1kHmBjYZLgIwN/BTENLjqY2HVWUD6DQYpEkkQ+3DHEKSpQJ0ISgMUSucYyAgr2CytmVwG2QVqytIVmTzHMbPFAsKSu2VUyu30gWDE6X0AGKt3AQsVQjM4Ja36GDp0Z4LuG0Y6qAoVtPHWEIVwFp5AJVw1rXbKcG2zwfiFg4PwG+Vvu0+VjJjcU2qPWE6DiXYIik/aciAB4zWAhVcVgMRz2DQqmHAX07FI2w/skNKKKq5RqCFZgc8jhV0FLJ+mgggolrEhVjyM4QQpzdYAnifIZKoeaoJR8qA7TsQBSCBVmBgBVjKtkccKsS09Kt0QvytxMj7MeRPyqZVX3ShVXKoFVfcFbRdsL9EbKq184+X+QDKolVXxj++niPFV3KshM+KoZVkpDYcKqqvJBKu/OGqs9MYsVeQHyslV5Zn1VSqqBVxqu2JsquVVwaEYppqqNV/mBtV/KrtVphPjY4qoJEfNjZOmKOhV2ckjQ0qt1IFCCNarcBNV2KtDkrcHuMw3xvAzNifyZ8DDVciCqEPH0DV2xLkQbahKCdqExc5CBNqmby5gINApRwqqdV9hNrRuaq+M9qqmJOiFkiqYCqQaXP9F1GEwuFat8YFqsLVgKGQEnEobVvCFvkXiktVZqqUQDqsBVRqq7VqKsxwEmK5Q2q1JVhYBVkZtnbQVKpYFm8jNga7HzaZzBbVuSBRcaKr9gmqGhsILjYYy6sDCmiCXVhqq+Mmly1RJyLlVasGUuUW0dVXxkcxBCOxVX1hYIebDnVcmCvVWsnmJwG2qRwatxVquK1VciHVVwTFuYYQixVEaqhKSRJQuy5EWIRl1XQF6stR+BHBCnRP7mf6oFEYGvhVtyIXV85m3Jj/13Vx6tBQAsXwIxRBAsvqu1VD/Eli97F9ipas+4sKp+GJLnRQZatI1hdF/VTPCQ1p0AnWZ6rVg9Gq7hIuB64v+XycXMUY1BvVPJTRjQ13Gs/aHaqNVlKoe+hKt1VAg1LcciFf4ChCR6t2TlQm6tXVjIQfh8mtYpuGsk116p/J2atIwWGszV4msnVrKsfWJ9FthSGp+A5FO01rFM01qGvrwQ8g019rljV3YSWc5xVl+IuGAgOyF08y8PEQKsG0JJmufWHmsuGzlLbVlqHEQkaqZ6IKsE1Bmo5VjKAzVq6F8QtmsWICcjIY7EWFM+sJ7VBmqbVxDzM1aGwyUSJiQ1N4AjiOWt5VwyAy1SnU4p6KFk61mrQ2H5IxYEOCJVFWtk196pRq0muK1/wuU1aG2HVhWtNYK6tXQuWs82D6sa14nUBOa8Gq1YmtdWtTiC1AGsy1E62c1JQ1hQPLBFFWSsOlYzI8AzUXQsnuIrM8vh4wG3g42a2vBZi2tiAy2v8pVAQzIaMTDwB2tWMkCSRJFO0bQhUBi830RO1v0SO1xLMsS4YQcJRZkJidZGpiJHEeZOfIpiz2o+1v8Qv2V2r+1thMaVQson5SsDoAyKBwstxyNQMpEh1rCGSApPL8MH5yfyXav+yRhlfAAKF4Q5aCNQu5kmQq6EUYu2RwgHdVIoESGh1UmNPQ36BxQVEg9QxijCQrKDJ10sF9g5YjwJ2OqyMypj5sXYWmqNkD9o3qE510lUgVDLMPVc/E+CzOii2EODRSdwrhhO8KF1N4uMoAxDgC2fF0Qwurl1BSH7VQsXhMH3BvFxcXwIeFDIYsGQO26arO5Z6NgydMHuoixHVIv+Q+4OJ3DWzmvYKxlFF1NupvAdNPUoPSp81Z+3Qw9urjOqznF1+3k11S2x91IQvl1Jaqww01PUovfFPVrwiJK8wQ5SHCI+MsuvmCWuo5hceo11eJFth2eBBp8wVfAgKKww4sA7RH3DioCKoziwiU91aKVg1EyBxRB8mc2AiCd1qEDNlhVUvVguFnMzgv52autdI+mPz11xkQ1gj1ICdwrUgrpB1gciGxMKeocwRmq9c8eqV4/uu7178NWCpurw1f02vokwQKWoWCV14+qoynThX1w+tL1iuvd1UuDnJVerUQzuoxCCusN1ypgp5YaXQMApHEQrvSRF08KU1NesuF7mEw1O+vUoa+u91qdzkkoQOFBipljirMBWC8Xzd1B3FZIL+q91qiHT1Ueqt4pW3FVyuqKC6aUoR6us+C41ShVYBs+CUaLV10hm+Re+svRkGuBSn+qANViJ11PeoaCx/gg1Y+o11IhUVVG+s+CFWFH16sWn1tNO1c2BuN17gqf1UcQDhUnQN1sasOp6XTTwb+rsylwuYND0PgNDQWBSjqOzw0BvYNvxgZVXVIX1y6K1RciBRMdBv6wlaMoNG/WP1g+ugNfEg9upWtoNZDDH4sBsQIjBuvoFbkn1rBt/yFbkgNrGsepD/R/KLBs7u0cOMNqsOT1VBqjQPAm+hThtf6v+qdi82q5mTeMniBC2lArG0QQD8VQmO2shJ0ln5868TDgBVM9BERuCNwOstBmaTm6OgTvihpEiNNsK+1ZzIAyKBjiNBCWyNXIWSNGRob5cCSCN+RoaaE8USN+QAKNtLNH5oOuDeJyIaQw+s8NAMNaEnhphCTRtMRpRlSCG7A4NiMIz1M+t4RNwnH13BSYxgxuH1j1IHhlGhQNShoZc6MND1MIWINlaBaNvMWl4W+pKRflCGNqutpMG2vn1n+vaNdsI1Q0+tf1oBt3yq+quYEevWNZBpcNxMMj4uuruFsIjOhkfB2NRBue2N8It1ulAuZcmOlhXBoaCqxspRh+qKCCxrbRDRoQNoRFVhoxpBNqxoF132OYmG7XBSj1EWCMJroQ4KRj+0gi5x+Mg9AQfwykR1PNIMtAEkv6iKYtY3iqkzjsercnWCyOMhxfjzPysjivGi9W1Zb31ewrCi2cEdJOYe/H3MkJQxNdMzq+vg0kADSCr+J3EbyHE2JNv6mFqPHxn4s1lOOVfzQEXUhfGb3RXM+JuCMG5jRueuM4enJqP41ukJE9fyxN8Cg1khAmCetYhVgGMh1NLhIlGHUyx66ptN4v6l3ggZzFNU1Qcu5934ErJuok1VWZgcpvhNZJqjZygmEebpsVN6JvfuDpsBCjJulxATIZ01ppxGRLDzpA3DM6Npri2wdP1NK2EDNoLRVNLMyOp7JvfuqpptNtPIqQJJoVNzkmdNzKGzN6QRHMxmlFalJrym1ElHMiZpJNwVBn4YmP8EepqpNG5mGCvKjTNDZqQsWAnzN+JurNG8VdcdpsxNMQJrNdJ3zakpuqCA5ujiFpvo1NJ3kG5tHrN6MyQsbQiHNv6gqI8OG7NvsF7NIZuuOG8XbNrpqnq0wQ3i6Bx6oe6RzNA5oj66QntNrZoHNTJoCZ/pt3NHxBLNZ5pBAwRCbyFtB6ZbkQA+Stw1AKzjser5rJoasS3N4z29NhmjgQHgj9N55q1WBaQlGFAgfyMZojNJSm7CI61O22GwlGTgkAtYjgNZ4YKkYKFqEIZrInN3nxRSH5pMZ9igJEfsVQtff0nQwIgwcxyXxOJdPTNOsXDNlJtJNV+WlovJvlNCJuvydAH6AnZq5NkMRdN4zzItfiB/U9iCDNSZqDYObznWlbg4t6FrYcAlqJNElvPNYlvYtJdIAtwGkY2VFrPNDFrkc8DlPNv6hEtJpVmpyprseOlo0ttpqtCLFvWCOCVXNJlqUtvcUvNnDwAtP6m4cxptOgU8iTWfyFzovFqzy23h/U9ik9NalqPNQf3AtVlum2EdOvNcJRZNd5sXSD5rwccw2dM7luKKJDn7+qlogtcFsMqkW0QtTluzk3a2itdJtOmKGjCtsZutqEGiCtwZuhEEjjItHJrkt3lqzNpls/sxj3W+YfwJNwGhMqQpr4thVqLaHZsItmWF/UwgkBOX5uctmVrz2PVqStChEatbVrlN4DXitTVo4t4MxC6I1tmEQiHvNjppGtmZrxNdlvg0PJoPNVlr+kdZt8twwPy2SJoBSIVpqBdsErNEVohmMmlwodFrsecVqxKJxxitdjzIKw1pA0TdGyt35vKBxZvyta028qNlvr+5Fs8BsJp6ZDVqYqCbltQ1VtyB+5pbN6lsMqxaGatJVrCqspvctZZrCqFJr5NRFsMqPZpMt6VoA+F6QstSZoetyxT+2g1vGtN1tGt/5oTm51pktilp3NcJVZkzZp2t1JuIy31sPNCwOMttlrktHmwXNklpNK2/P0tSFo3gWwPht91sgtgVWzAwNpnNQtqU0QIg7pSmL5tDNqEtBlpp6XNvetMFoFYuFs/+4Vo6tKGm9Ictv8tfiAlt/1qrN4QJFt21tBt/Np4tBZrMt3NrXNsNtX+PNXKyOtsYkX9lttL5r6tXyywtpAi6tfVp/Uq8uAt5ts/sMYHEt1FtbNZVUltyJrktPsH1tTNrMttZq0t65rtWTZuYtbEhBs11X9tClrsetU3ZgXtoGtRlEjtn9idMPtpztepSzt9Fr8teduwtrZu8NoeN8N9ihCyE+xNBvGF9SU9Ee1QaWrtDdqf2E+PrthoPb0ZfL/mimSTSEtjIhHdq8yyUIu1TeIqAvdov8kwNzx49qS4w9vzJYRuoh49vtW9EMHtTwm7tAsuKpUWUF1i6UaQxJvv4flsiqu9p/ShZoit+FopuVluBgPlpokyFvstIGArpRkn3tmVV3tqlCaCXlsKYZtpC8Z1pGtO9r4CRDkBCXVvWtFNyPtZlopolZvvtwwMqsd1pC8i1vxNudEwCugJmt+JoTowgQocCcmdivvyMQyDq5AewJGtLn2w2V9pltZ1glNe9vAdD2AwdHAQAtUJrB1ikLIQkBP7ghdrKyghJl4u2U80p2VBxiqEGW/mglyypP3Go9jey8GqCkO1RO+cWQLWTIlMqQjoNgIjvrEgYhbKb9GvoZdGFMSa04dP2SHsNyAyBrvFYd2dAPcO1Ws53KSY1KWARIhdrGYN6pkIwJkMd2OREd6ogxWxehWyC9nOQXOStKy2T+Gr0vzaXJVJOUyup2boxk09qphyIjvk80yx0db42zWzDrnUaQtrQjzmCdsWQkd1O2hQZzDXxIDkuJdDqFqW2TYdJ4wZqt3ihx7Dtb61OXY1FhH3GiMHZyVDAEdgFVkdq6CwUntS7tYSEkdI+F3KuUS4d8jqbIMBM3QEnzCdsyjW0Mmjfw6TpEdD6DVqyeECYIjqokcKxzKM2FKdYjEsgLZUcd75hp5C1Tid0IVsdfqGC0Xp3idIjrgCKPXGdNDrNgLmV5qQzvcdhdD8dtZV6dkY3ycqTsu0GjqOdUOQqdcjrOs62SvxyTojoyp1ayEzo2d9ECJq4BiWd8dBrGJ/SGFsKFOgYE34ws2W1s5DJZye2jRyLTprcxtTayTjqudGWU2yPjqCdx2TByT+XCd8LrVY5KF8dMTrum2TtBdnjqn6BTucdQLo8yuLp+dKdTXAoTosdHzsyyZOXjokeIByCLqqQJjrGd0OXPGdztMdwLvWd/Tvf8guVedszqHsWjsAqiOW+d/tRkwnzp6yIjr3Ef1QBcbzrTxTzkAqjzrYdeTphdTLtuYmTqIqwsCfyFhFSdFLtRd3DsnqmLtBxRTpxddTrKdJWW+yUiGBsDTs0JzTq6dvLtX6pzpkIHLpVdhOX6dpjoymRjqucTDpJylQF0dIjuVdezVVddLoZslORNynTo8d5NVJyWrrxdqzqKmlrqpdb9SadfOXqdQrtTqlLsLoYrr+arDG0J+6Gldvrsdd2rvf66QC9dypI1dC+lhdSrqLdELtodeTp8MkrszdEAQRyXztFdxWT+aYDAwQZrsTdKHgmyFjupd5dXrdX0vxdVbu5dmzsHq5bqedezrumrru9dl40jswbrOdYuT8oHbrhdxNgFaKPX9dAzsFyqlHnd1GpZdl9WEQV5imd2DTm4BbsLoljp1atLqddDLrj8Fezud9rv0UKLoecrTthskdltdojqAa6bqhx+ru9SObqVdeToPdgTtLdUOXfq1bvddi7rndJYy/df9Xzwy7r1d0roxUsroXdMoNudM7uJsTR0PdULtZsdMx8w1awncjtSvEfruWdLjsVSr7s7dRNTgVZ5jLWscETdOHs/dRrrAabCAw9UHtrdyHt/duTr5UMhAQ96rqhyaYjZdhbo49ZtBFdubqsUwuXo90dWEIkHojoqbs4a0mC5ymHvI9CKX0VUnqI92DRE9bnQjd/rRA9Lbqw9MtmoBfHt2d6LspSXHsQ9FtiEAKGIOlPhohZOeXxhYVO84auRVwyE3zo8RtHtDuQNy9vURJ1mUc9lns85hRsFJNIBs9eExBVueNNyUk0rJzuNHtW+F9y6YT89ls1virE1Lcnnt4hPuSc93ZJc9XqTc9lE042TWLpZDWjL69sOUdPG0SVrWhKCT+W0gvNkAGvjBLdbtXF+m8zWMX63qMedSBF5NLq6imGBaA2mjdDXsXZVBK/ocjsWimOT2El7vYiswk0JfTptoPJrLao/WGdUrkDc2DVG9OzqA8n3gG9hzs5Fmp3oJovm0J6kmzENNHXSD2Wi1s3W69bjDmyllN46O3qi+dlN8Ya3vy9n7oW9ZWEVyQdB2QM3ukdV3uTdAXRI4uGE5F53o2KX9FRo6kjK9HKAq9NF209XXoxdHXq29WDjOYV1Feo83oEsWTQbqdHstcmtxK9GYBa9VNAO9d02Nae3sR9IHPLqCHtW9d2SuYh7rxueXsxar3sQG7/XTE/Y2UcmxQRSPG1x9kIHnOLdVwcQPpoc3XpJ9hXqQgIHModdRstN7tVG2GqBqtWDsJYXPqGFI1rIKCCFG2plFCt28gry/W1NQUVuPiIDVqM8bFWd2ls7yJmE8IYfMCqiMzfYtRnUQQru0tXNVqMuNUYq0tol9RRDzQgvsPy4ODfehmjYklcEPF4QQF9HPoVwtvsGW4MwsVmGAt9wGn9NdlGaMJvqZtNaFd9oSMYqreG5SJWCCKYOG7WgfsdOfvq8qyxXhNvvoXgQXwV9HvoCakvqGy7vu6ILvs3kewSyyI1s3qGfqKwFNk7NQfr99WBJ2qJWx8wumDd9Bfoj9cfrz9PPvfyhFmaMu6Er9HdGN9pLCb9wfoKQQwp/UlW1l9jvqCB/hD+5sW259YNoNqDfr796BQvlLfp2qvci6qevvj5wWkCUC+T99jwUhWC/rIQfvvl9xNrr97fqEqeDj+kMmHBwJzFF9R1rYa8eBDEdvpOGQiswwZ/sGW3ftIoIvqz9kGgx4aNmT9a1QAoZvvX93PN4qsFuF9eRBjQj/tUw7frXqZ1Vv9nUrmkB6HJtc8jeYmvuqwSa0cxktWgDofsMq7cH39S/ssgGQOn9IBFsMjSCOt8+TX9cfsswhxJxNgYmYw1/s/smOLlqV/o79gyxZgSvsoD5uOmWV5B79uWLwccxHf9cfoccayxfaAdXq2WvOIyS1RqoevorQmtu/9NUsn97S3F9z/or9NAdwKfvpr9YSwMkL2Ad9VAbIDj+WYwUgaummDC99rfomMM/uHoQgYkcOgcwDiCMhWItpQDcfqUEcKyIDErB4Df/uzCigcj9qvqU0OBQ19KvoWQwtokD7foID8gaF9ogako5Lm8DP9U19aAfWJS8mt9ymFIDiDgXgfPus+EeF5gjxRvydAaH96mibgXDDl9n/rKqyAdBosgaSD8WkSAWQdz9Q/szt/AasIvfsLtxQZIDygbkcB+S/M7fuL9GDkMwx1SL9jfvG+e1UH9dvqL4Z5iowpQatKuAd/yo/vodeQfclvXMLGVpXH9ageZAccGC0rQngDYAchW0waXwv/pNK6DOID6/vd5nsUIYgwfN9V2FYsFml6DumEP9D/o6DsSH59HDvKqVBAiDLZWKDB/sz90y2qDqDD99O/ppUC2ngDFwbwqi/oKDAvuq0h9Xv9F2RJmNvu2DJXuXKtlS62LqDswplOBDW5EF5J0ytN/wbQwIwa+DADX6De2VgK2Qc+DzwYWDlQeBdCQbj9wITfKPTD6lwwYGy+eBkDcfquqENWcDxjBBDBWRP6+Iaewmbtu8WIYH9BwehdEtSXwEQYymFsmOD3QYRyNVTaDHrqYaHwfhySgwADfvosDa7tZD8eDKCqmFpaW/tRDs7sIKcoeA9CocFDwHtlDKoZzUA3G4D3Ic1DAgdeDHMkv96ocpSP8GCYPwbQ9qgYeDfqFpmGgaGD05FVdb1hQaNgcFyfFqMDy/uBa2MzMDs/smDXNDGDfvrhDmNhj+9gZxDu6BL8Bob5DSHshqAgdKDiOgFDYYcFswTST9UYY/agQe5DXAd1DmIdzUGNFSD9IcWy17RvoXQdtDWTQuttjS62Z6BI6Z+Vj9L/plsn/2LDzIdZsPATzDiQc+DGsnIKjYZB8Mvrv9tYc90lRFoDcfseD7OkgDBIfj9StlmsoYYAopYfZ0FIeV92WEFyfwkL91fqSDejVpDioZzURgQbD+Aa15K4IkaDgbcD7OlbkFYY6k1IaN0vQfb9HAYcapLSr9aQdiDu4dXy5fuYDLWEIxNYZuDrNlXDDtNbDxNikAgQdeDDPBFDufqP9Mylbqd/uDxjtXR4JIcvDkbpAjLgYLD/GCfYuvoPDl3u/DRvvH4O4eyayYenDiShfDOYsWDrjXjDU4bFD2Eb3D4YqwDqjXPDzfvkQibrQBc4cEDZCD8a5YcIj/WFJYm4eLDbvo1013vzDcgal0qEfYj2TSf9tQeDDMEaYDdQf/DPYaojJWQgjlIZD9ibv4jgEbnuBTQ8DooaxQguQ/DWobQjYWB8D1wa4jqRUNDBIE5DVos7DMymzqDwal9guhIjJ4bWDjym8akfo3DNlKKavof0DYTR/ytQZN906jL9TQffDafvYVy4aywUQf+DGkZEDWwdxDWWGVDWgejqy8SYD+vph8oUekjroZaw5vB4j8kf8DgUbYDjocSUX8FYwymFcDLTXcjVooyj0FVHMLkfXDMaHIwDkfijNHlQwFkbj90Ufuw5Qb99ixUu9DQeUjcgbmw1st0jdnRSj1ofGDZIe2wjxqYDnUYrtUGRPopkMxw7wBAy0PkLMdENi9Y3X6Ba+gkANWwUhXjUGj1qGGj9fK897thPZ1h13yAUIIQY0fMhy0bi9xijsh40aihW0ZmjERVCNMpOTs+0bSKs0a0hH5ROjXhRH5mGN2s6Ux+0cUfIiaIbkjPktYcVtQAjnUsYcDEZnyoEbKJrfRjDqOvhdPoaHmKJlb6aoYbCmVzeDeAZKM9sUAqBEbLIjrnFdyMYqlkMZzU2oCSjNEU+DR9uOcOCzxj/ftSDBHGQj+CxWDiFDOw2DVQcM/syehUZwp7wdrIBYVKj+MangwUt1oTXtojKMYcoxrpIjBFHnB002hjQMdWm+bovloMfxyxIY194sff6QUeFj9WjUjEZAAsKgGz5mRoaij1S26ozoGO+vjSyqI3/659CbtBUXVjc3UfKAWG8KRsdr5KYi1jZ0YypjfJglGsctj3hTtjxsbz2VsZHtZnqZp2IxNjrseYK5sdYGwgldj+ZIy9SeygVDH3Y6InUmcKVDewb4E6GjxlqmXrEOy4wVGGlvnyEPxFvoqwwc6CnPc5DH28GenTg5kcb/epQ1hMD1tPIvECIY1XSwJBcijjBknuGsJiKYp/IogYcaxMOBTjoDH1OC1XW7C32CrjKsGQVAoXmYGoC7jOcdf6wpgNkVcdlg2QXc6ccbpwhDFK6YJmx4ThHlS6caX6xcarjrnRWCGEhTjVcaq6GcbitqcfgICcgzjy8cE+qV1KFs8crjgnzbjGcbrjn5CL4ZcY36nnOpYt72Pjzho7jP/Kmyv9GsNum3zjt7wvj4cZ3jKsaKNHlNBQXlLbo/vQEKWVJAT9nrM997mATEDFAT5bjypECYmj3XRC8/3lcJcCc8s4CdgTkCd21RVkwTWpHQTgCeBML2u6c1RsejwccF1DNI6pP6v2eS1Lsyl1PnMTV14kZVMZpebCHubVN6puRJo46ktupVCd7k+gqGpssB4JbHzRpx8SRmCOI4NcHjmp/RJoT8PVF8ZFi3IMidhpm1PETlqyRpn1IRxF+vgUz4ROpaOP4T2ifoTXCbRSaknapnCfogz6x4TpieykBNOBpUetuYpSiRMlkm760Goa2OUg2pwxL2G/N1E8NrBVA3+MaQIiaZKO6H2JEiZxpsvSCTqicJppsHg1fidJpbNOcTnifh61NMsTLxsoTpie0ksv1ZpFGGg1mgO1iySG5p8Gu4sIJn/jK0epKzwM1jdeLoT9AzKTu0cmj08uIGXsfgyamCQGVSetjTzMTyndyaTDsfHSCry+BLsYNjRGW6TdSd6TCq2M0PSf9jpCcFlJVPSmRoMcBv8Y3jikLQGE8Yr4UOFlKv/STjn8Za+KyaWBS/R3jDjrXwD01hMOydOe8BmJOS8YoEzsX8wKQPLjKtuVKb8u6BtcfHyYpVuTucaKwH1FGDlyY36eU27Wsd2mwz8YfNUwcNIpjEr6xGCWTVpX/elQMWTBsh/ULwNecdfWTjkcf9eV/Vf6EcckAmdsaTsKfWTXjpGTNwXXj8KfL82rAzjIpp6DN+nUo1nUQQ5ydVSbgKxM98deVIOqejIcfLI78c5gq/10ZLRDD4P2RGB9MCSCpIBSC1cA5TAvsOIq8azgzKa5T8zVqJq/zZIb2CiWpjFLQfAd5y0BClT69KZTdY15c7pE3ofwTSQgTKlILcdEQyibtu5kthsAqZ5TTKfCC2AclTiCMqdeqc1ONHkOI3nRlTHFUt5LRDqCTiCYquI3MoDKcvd4/xMQ8/PdTwDE8eipFPI2ANvjeqfS5EISQyUjDtT33teshxEeCFqZoqnKYyCCqNxpxqZbFi5hGW0qeTTD5BvowJFeUjiAzT8aYeIuAg0YesD5TqaZvc4NmpgnqfsdvRkBKYqaU4/KcQgAxSZdcac79EbzyEliGIyIad3j1FkiTSqbClxwXzGbad5TdadLTA3VzTeqYw41irHM5NObTI6fvhOYAzT1eHuC/aNCTwaYWQEIWXRuqb9TV4d+ygqeTTuXOaIy6dmQqGl5caitmC8JlQ0zCGc6lVJu4vKZNTzHgppg6eTTKNEE6PI0CTeqf3T5nVfTUuBLTpCpYFXZFvTdotlw7YRzT7aYBs8aFFYrnDTYLCGFTMnRaCWrp/TsGZjT19AQztnSnTQ6fCwDiq/TFac7GwiHVoP1y+sQaBgzCXUyJwTBQzUtCdTGqeHTYnRNIRad7TCTAS6SGaaQfAfjQX7Bi6saYzG1EYS6bKangxGWxYMbAC6QacCZwsGbwZPsfT0lWtQLKHAYVNHh42GZnAiAf9cZohYIT1rB90XU6KTad+OCUctcMmb3TrqYS6IGYAzH6YCVP8aYq7ZHfoNGfZTU4LcDeGYKQLwzIzLXVmdM6dIVaqGMzVGYSVxmY0z1qbMBOISFTlmaQaT3TEzJmepDDFIIze6dMzCXW7TxjBdTO4bEGGnWPTqsHVo39RVghGZk4Kft6GLmb7Tk7BkIN6eSzKabE6WWaSzeaf5TZdE0G46fzTYnrDjNFUXTywzUzSmaCKDIeVJ2mb1TJHBUqypJKEpGftTznSVdbWYrTC8nAD+LHjYkY14zGpHiGmbpCz4magYX7EP99wyIzbdBKzdmfyzVMXEzE6dCVG53cdgWe0IhnDOumqAQz4bGyzoWaCzP6r2z42ZYzorDFGBynEz9GdVxT8d7Ty2fxYW8aWzZWbzYFWZBRYnVWz22ZwzaHHl1tmdczBTAK6yaatTnWYQsJgyizfmY/oq8egzegYOzqm0Wz62aAzAKNekOmaszTbFizL2ZuYvwSsGN2cez0Oa56dmfhzATRmzH5laGx2fAzGbHmGvafjIyNm+Yg8fEzT9BEz2OZyzyQpUF0FgxzNOa1Tv2dizvWa/MnHETjmOaKzPSqJzBObDTwnWYzJObmQUw0czoSu5TzNl7TnabUC3GZlTKWbps0ksyJOWduz+MVrMTGZ+z6uelzpWZbTdaGAgEaYBzNzBPUMCn+zl6dCVIhTZgCudyzxufNTR/LszI8QNzhWdTTGQqtzzudIVykGuCQqa1z3xm86PmZtzcwrZGU3IlzcwtXjAGczTBnBbRkk2DTJiALovu2+Kyaeaz9yrfwQQUNzJ6bmFEWYjT5XLcFNmYrg5OeGzcwuU63udDYoue+MYebozujO+MQedVzj2c9zUjGLzy2b6jJo2uIAPHyA5hgtGleVbzXIXbzSCeBGLeYRGjWD1mzBR3YCIx7zfScb5I+bm6g+Y7zvua7zG7VAsvebImHQyVGY4hZGVvsm6fRz9m2zKbxneYJGcs2HzIGDm6tQEXzizNnzA+YXzzPmUgc+eRkW+e75RVK+SgtLqNUQwa6Wg0LG0SpaGEgyShj2dcGXDC/zRWfwx2w1ycCSpKze5olTi5KqGEJE4z4Bf0GfixVTdgz6GKcG7NbOae6yg0kGqsBcGSsrcG1TVNTXgwKG2U3Nz4WcCGwgxvonWZ/SaQ2EGC+USZCQxfzXU0jgbtBwcNBcZN/qcq6nw0ZNa6dC6WQ2E67gyqzdg13geBe5T/+ZKUpQ3cG3+cqG+gxIQWWQSzKFHqGk01EL4g0KCf+Zdz6+b46WSy9T1dAQLD/VTkRWe0xIw1kLeuZZNUwzYLqWZTdZOdMGctWOGDWkXjIhaKzuMQcGZhceznhGy6kMz+iUabsTpwzwYxhbuGfwyYL26bsTYcZxGdBZGzLctmd2U3TzHw3ILihbE6XheMYkRda569ofzpeTR2IE349iUj8QhzvY9d7k49u4249mRZ1KyjuY9zkjiIy4yE91EiaOb/Ddd4nuIUPAoS1V4mqdOUiKLFqYTdnNGKknoyedFqBs8WRfDdk6GtdtqS/GejtXdhRbVsirvpdZHiJoE3BGdx7vgUSRchduAnmdxCk9kMxZWdDxjGLOzsHd7oyhQXYzRdPo1OgfRYndd4x7I2pBadPrrqszozddo7vGkX1m5dBRfIUZ4xvVGRY3Myn1699xfBkNuPjd1xZJkrRZKL5Cg3gjReo9R/CYJxRbbodRfIUd8GUdrbuaLXzkOLXTtUdwUkeL2hO6LmdRCkaRf6L17s3ScYxGd9zvIUCxcmdzzqQaJ2LCkczvsd+JYHdDS1Wdm6UzGI7uxdaJfGLWxdg8jzBcQexbvci4j9GAruOLAJd+LAbqzTyY3/GZ7rI8LYxmLkxZzGyol3dt5TKwn0gfGArpXg4EzrG0jAFdSxbxxlxZFLYLqBxfcGSLOnp9GnYx5LcHoPGVpsRdQHqHGLJdpLHY1eL7GrWLKpdBLprtJLDxnXGlpalLt5nNIArFNLopax6KHGyLR7q7dpOKnoK7pZd3JeGLozr5LqpZmLAxaFLBJZ5diJZlLe3vBLzYxLIspYbdYY35gwpcuJ+rvpkFJblddOKGLdxf1LOpa9LKTrvGrpfDd7xYdLUJcKdWbo9GN4zE9jbsJNFpaedMnujLxfHjdCJeY8vozdLdroMd2ZdJ9Ixd4kf4z9Lxxc/Gy2T0dvZb7GepdHdNpqjk8JY09wUkYcLZatLhppNLLTsFLvg0dLLTtrLo5cNLFZbDGPRQnob7tLLzOhzLKRb7LTHqzLZw02LORZ9N2Je/xiTvvGiZa+LEE1jL65Y16ZZNA9UZZtNlY3U9C5bAcd5ZU9s5cVLWLpRyYwzVLqHqdNGZbddyrqLNY5bLWxxYF4VKAgrqToMGNrBXdqJagrT5f9LSFh/LCnulM9nH7L6FfgU2/A7LKFYHN4FfZdbZboKa5ZUdbToIrpFb+LBFbciGbrYpuvVwrarqssbZt2Lp5dQr15dYrA5tfLGTv3GcFeU9NbtfcLuwArR5c0wJ5YM9L5lfG36sAr4lcngmHuVLL5kPGepflL8lZorZawXLDvC3LkjoUd55gogupf9dlRbvMMlZvLbqCwrKRZErWpb/dd7kErTjueLL5glLaZeckNoGQDGCH4r7eS/AynqorG8Q7jQLkFdzReBAk+W8ralbcrUFkBdZJccr0Fd8dVJcFkn5akrouyEryrqbzloJomZZkt8SVIEKVsCc94XqC92+agTSVei9SXvLcuVdSpVnvHznlnSrvnvyrnlg4m5VewT89qUsVVcC9B8XqrTuRi9JVbqr8VTyrB8UKrzVayrd+YwxEyczCl+OYm6YiRcVzDy9zE3HyzPts4rFjHivHBvV5Xt7GvKmU9olGfceOJwQ9XsI8i7KlxD/HY1G1a5zHo0BL7EQZ91EgvoGlZto/XvLSsDHRcb3pjG5pHk8q6se9eJdurNJaloGUmkdF1YZLlri0CVZbCEK3pO901Z44B1bR944xroqPu29x1YLFirqx9M4yAkpPou9LpfuEbpdu99NJbOiNfCwT3rxkdccmrw3oxxENbmr33oWrGDpQcLPuBr6GEaL/3ppNXCsmrR1bxkm/HB9wPskkdHQ6JUrnprL5YoE8Jn296PvzMdDE69bCkW9NNdV+zlKHuuvUSuH1bJ966h8CbyvSm0uyk9+vBiqkZVmg+IaIQusOYE6mBsgP8DAoaBhocOiNUG3SGBUfImrys0FzQUTE1rWmFEEmoWXdstYncfZU1CPWV2V1aFMRP+UZkJtYNr0avJQN/H1r2tZPoltftrDcAmyuyvk8wyvLg8TosUXFjuaecGGd5yuAaCivDrkiEjrscHGKQdZNgZ3FGdabF9rQyEh4iVT8kuML8r+vHwTJAlAR13ueQfnC1ru8MdruXGgyptefRtteBUK8AOK5tcIQuddmLssBOR+bt99xdcrr2eCVrFderyWGCuyMilrrgWsLAhOTaVt5V/ociDLrwKgfQzZQ2wujuKUs8EMM+CGHr+3ADr7WvpA3CB54Ptc7r3tZLrdsNbrHCo5IHdcBEjiG6V4/Aj+PGGWyau2Xra/1CMizqaoeXDgkOCIldd9fKhzZXPrzTpkUVojHrTuAw9I9YHrbhs9dbde7rGFhFwpHop4QDe0NzUaMoJnHCUdGBFwP9eXrwfyTVgTAiVR+hr++WSTrHih3r1GDiyqyg9rFGpNQO5DQMjmDcQSVUnAWHEQbmyAnr0Da8MTRm1As9b1rJdeI1lcGfrkZErrZSELrYDdYbpjGI16tZ6oztbk1OFIwb7dcyVRnpGZC2pyVoxyris6oZAhSusmByUM2g2XqV5Svd8ejB0gsjZqV0x0UbpSuUb/CS8aMjeqV8flqVJStOiDSpGONZPdC9x30b80VSS9CS0bJjclrl+Ni2foZa4wEB7rWGid5LXCIYkZUH9YfJa4IQMK1HFTZ5LXF/oZ3xfgoGFoErjbk1zJdMoGAi/A3DZeOUfpcb1ZDk1VMmqw6ijibKTYBofqDEUn1L/Q95C196Tb6m6KCtgPMBa44IVfyXoFxDZTdnMS+hdIdQbKbFhjwQ8ut8bmvBkExTYGjiDCB4eFEG180c6bwARxVTRmabqyFLYspHvV7jEPQpbHHkTTaIaw8EHYkTfabDokFYczeSb7TeNahDb8rk33vIoSAoVzFOoEbPpsCADjQEXIguzH6BWKwM2LTP2ceK0+nQzt2ZfsFU2Lz9GZfssM0ozfqR2q3KbTY1ucPo9VQS0cfHJzSqAhKUSIS4vacZzSxKl6rjCet6BcWWQLz8YT6ZUzExRPyTGY8z5K12wJLH+z6eYAccQw1TvmeWKxinI4iecCL6mhlhHx2DTzBYxbMKeTTsuZWKgBgjTEebSWe8LoY7ufYc+Qkn4uucGW7zd+b46aqzZVR+49XEZbXyyFkA5wezdvo3Y5gx6zL8DUL2jmebvOdeWrxA0YhGZ1UnfpuqoBXQzlLeZhRDE1zGWahTvPF5bQrdODPLaG4rLdztV/3xzCrdODGMJhbnLYf91z15YFLfYLQtXubFLdJb1t144+2bKw3L13oaLb/9Cr1KYZuYSjarzZgsLdNTqWmVbgbfXqZ+03YrrbAqs8mU40rdRmRJlacBmbCziMBDbxOfhDB4DcM0GdRze2lIRSjFjbrWXdMDLd1bwMdZNFeeBjorbozbJA3KycjTZRGeq0U8ndqKGZPm5LaLbMsfObpbff6BbdLEqbcxsVZkLbsqc4ziuTbb4mb4z2OEd8zbaEzkman6KbYnbGNS9cwEGBbbOb3K1bflbBSFNTS7blbvrdKjc7cKCIOa2m2rYNbsOb9qObZkFh7fljQ7d3bUOEkUFAk+ojbfCRbQMZbtLWPbLzduzNU0xbm7fFDRLeObF7apy07chzl3o+8G7ffTSbZiVMye/bV7fvblqZPTtLU1kVM3EzsufQab7bg77BbpBrJprznwYWEbMBXbL7btdfUz5bLiiWGxaeSIPBcRSy7YpbseZ+sNUR3bXzjtDFM3rbYredFENnNx4TT1T2ecVBlHetzFObLatRcA7IufhDGhFA7WbbFSuHZbbVilQ7ebePaCtsRbgGdba33VHeO2YVUYnaA7h4fX8mHd7TE2dxU4GVlotbaCKPybzbeth+bn00bbU4IE7GGbjDsnY1bZgXlUP8Qg7jbes7bgIvTCUco6H0yxbBYuwaim004EOek7EakU7p7aSUnbcI7rndIwlHWvb1ufozSSjJ6cM1s7xrfOzUXf877bf6UArefKvHcxsfHxKBw7YLzfnfpmwLeEz22CuCqndZziAfC7sM2LzILf6UuNXs7nOa+8FiwVNGrZfb2xTS7tbexh102S7uGCa7ALQlzCjXNbmbYyzUumBm1uc7TZGDrh2cj07BIC67I3YhIX1gfbFmBPyhuYILrWFhmnnaNzYWF0I3ehG7Y8MVTInem76acNbbUZW7RuA67O2EAMDefzTh3c3TpreJs+tx0TO3dWwYLfDzxHbhSabH9zeHAxaSYJCbiea982OGXRXjc9bguS+7q3ZY7kLZBw17ZebnHdRoD3cUKanZOzN3Yqm6GbC7l3cupjbe1ewxIQzCVabx7GioGN+ZDm9aWIGY+eqT3XXR7ws2nzzK1mBQc1x7LSe+1l8WoghPYvz3uWx7QcyJ7rVfbtkVv5mNPbtBmc0VQrPbdjOCZ2wGPePzIGRJ7hoxtmVZLM9PPep7q+aCydPbbznPcDjNRrpTguq9qRzca6QBdymfXa0GAAeA9VppSEavZO75Uw87r+Y/QNU2K7r+YlT702amWgynMQDXvjn003N/zaZaWDrqmwgynyCKV173gLQLfWaKmdQMkGcLd+oWXeILc3cWmZ/WV09MdOmBNmDSumYV7O0yCGQiv2mIpsOmUSyvDXtTiG/U2IDl02QDrMxcL3XrrjD02sLs7ritJyZz7Soec7k0y5bl9VAK/03V7crTymIMy0Ls7uZ7tBbULMM2E7sRa5ozcd5KBffxm28gxmNffDDafeb63fY77mvd2KzfZFUhM3b7XNEpm52cZN5Ha5oWfYZm7NBo77ofT70fZpT8RacWq3kHznLTKF+guV8SCPUoJgvQwCOF37sIojwoqQ37UVHsFwcPswTj0+C3aDOFN3dbR5/ZcYXcJxwwmEt14wujqnueos+VFv7UGwr0UxPiCF/YRSr9zD4N/eLFu5SD4CvD37bCn5Fh3aKwBQqaltWGkmdwtHQ3VPswS+uCCegqqJhWDhRFQUwHzKSGw2CPiCKA6VYQ2E8RnwWyFKYqGwR/f2U0A7d+VA4GK/gsc6nm1IHW3FAHqsChcV/eLQsIp3dQJx37DA9hFCA4wk/A8ciIErB7rTvGoTA4ZcV/cnRAVBodQA7EY/yAkHjWWBaCrwC21It/7n/e28sg4eFf/deU8QReFsWGAH3mxEHeYtWwY8F1VRIvSliSgqwcA8cijSFQHpsQccdwsxF+A6Zue3lxFcIt4Hez3jYdgs8HRehCWpGrs2F4pYH4KrsHAUqyw/etSCfwoP79A8lVQ2xtFEQ7IH6g+W4f2GoHUOx0HQg7iHsoqhSmQ/FFtA890rpSyH+Q6yw+z3+C5iEoHupLUwAVDwlq2HQHg1GyHbygCHKwVUI8YpCHpQva6+IMKHqQSmZ2/a6H6lANF0xLaH0cv/FqNHRepp3TFJ/d3K3g4aOSYqGFhg/aQ7g4mHjotgHKH2tFaqT4HcQ9aOSco2HqQeDFr0J2HCuDjFFKViHuw+KBxw76H6YoQHsIlYH6YreymNkwEPKjbFIw9qHx9RXFYA8+7DmFsHMp2WH4YT0HP8rmHXUfogixRMwTYtP7KWDQwVGHbF/KTP7tw8mlBw8uHg4vhHSYrqlqQ+EHl8oSHSI6PFtEtRHkqtz2Vw5cYaI9XFJQ61R88ozQ2/cqHnUv/A+ILcHTJR/lvEoBU1A9wlwQ4uHf4vxHnesPFD4pgHYw9I1kezhH0w+f9kEt7JiA6cHwEtMH9mCq27krOWcmPswpupjigo5h8cKXUQKErhHMI7/FbUsxHmEpvFh/bRHkkqwHqo9Ele4pBwMg54lQkplHD/ZfFvEtWwEo/BwYcE2luGEcHjWvYldo5KHOA4tHnkoIH4w5NHrQ+uHoQ4NHnQ4JHuI91HcTCGHEUvklJw+MlxQ/DHaFHCHIY58lho8KwJI8Vj7o4pH/McqlZg/oEEY6slKKn/7lkvslq2GVM8aqHmzo5lHswjDi+ku2H+o4Gu1I4DHJMcKFJA9yHEY5ClIOC4HlMbDHio8litZFEH2Y7+HlMbFHvw+RO4FCsHDI7RH2UsGHLI42lLkp2wlCF1Vu0oblKw6VIzkuYlwo8dHK0sBYy44WIC0q1H849alXIqnHkA4mlmYt0HA4/jAI0sGwdxkUHP5FPHRo6VHcZBVH4g53HMA4bHP5EEHNY4XHdUubHnLQnHS4/bHymAvo0JlR7R0uJlYMpDy69jDyeoREmiRUX8cQGbxli0BlGMvKsIrQLmH0qKAtKiQnKbwQnLglLmQMuqAiE6wn8E/5lURVBlfE26soE8hlFMuhl0eTq8pcwJlKE6onnoGRl2eVQnpcwYnGE62Q1E5xlCE7onjIBonheUInQE+In4Mt6si+Ln8kE5GsuE6+AfMpwnXE5oH1stYnoQi+AbMpQnmE4knicEYn0k7BcZ4V4nfVY3tj+ZsC5GHd44stjl5GE343Q5bl8IuMnQKvdlMA8rhmatTOa8qV0BI8li5st1lqNFTkRF0dl28uxwto74L+cs8ncTQVCwDGcn0o5Fb42qUohhCFH3RppVCcogodA6fY0pTNlPsqwH1SzfVpZ0DlXk/bAj6oTlTJWOHtXGnVWU4llDk4KWMw7IWBU550tGOaH4CuOHoPgaKww/ywwKV3DJk/6Hv8vwHUS0sneAUPH1U9CH5spflR3lanuI/rlLXwsn/U7MnvA9yntI6TFyJxiHXcCBVg3xcnDU5mnQ8o4HeJE61P8r8nQ09SDNoB6n5mDVTmarxH74HFBNYGm1P8rqnOHFG74cDvldsCDiRSd4hDTzxiT2WiNF4PbAD0XunEVLnt50Z5mzqqKrOVMFmERICpr0+F7OCYQGtjz+nBCRCJzrm+n5PdVjnhKenlnohn+s2cJZhLSp4yeKp5Ce+x2RKKJPxLfMgxOWJ6RJVyFhjkcuxIqpLVO6phRJppRutKJQ7DJnZ1OZSL9hqJI1MOpBVTDUrvQhy21LaJfb3nTmM8WpvxU2JLM6xnSxJNgwxKmpPJBmJZ132plVIZnMxLSJp1IGp/M6lnEOS6ptINJnRM4yn2yzKJGM5yy+M+qJVKGByT5SxKXapC4yb2ZpKGhgYE9GByb1IpnAs/+p+tx+p6mmvesyF5pNs5mWN3B5pu+U5pMy1D481OEQsv3RnZM91nDJT2Evs7ppnsSig7NKD4ESzGWxiB7TFNIlnEmkdkeNOmpYxPbQt1ExpCc5FnExIhyJNMZnls/hp48nJWrnSj1OWSDnvxS80Bc5uN7JyBK2c9epspEQcBIh8Tr1MBpMxOlK9AOtntmGunk0Zi1MmywhPcWUunc8zJjPbXSCPVis4JJQGPc6HnPVajm3G0HnxZIqrjaSnn7xPHn/oHPSqzU5JopJQGy88lJBpLx7dGV7ilcnlJ8ZP1m68/ixKpK3nlc0PnzJJuZqaTiks2PpJJ8/gGV85XnYLIPnlQEycIZKjJwXrM9i6XjkD84vnETnvnG87fn2VcBnf873nP897BhTEixx88hnACYdsKvpfn3JUfnjwNgXGZOlxAC96rgM6QX/hPtJiC73hSZNQXE89TBGC5AXM4JcQcZLwXi8/FmZuO/nM4PdMVC9vn44L4QtC5QGlC//n/c9Q0Q8kwX+8+wXJC5qxkC657tVYdso84RJ3c9yAemwrJNVfenl8UEXfuJnnDtg7nMJPEXoh0kbOmwWwCTkRJtSrsWAM4y9jiimTj1C/cUFKvJEjl0X6FPZamYpPt77iGcB5Iit2Yn3WFOTd+i5s4YabLMBEcS6tmtBOTTi+uJxKQo8W5P5FwporENq0sXFND0XJ5NMXgS+MXCGtKthagfcoFOfWify8XdEzkxLi/i81Tlk1lvr9kC5OjWKS9T96wgspPoXJMZi7HJ8UxiXRi4KX0FPjgujwVE8FMWaDLl8XUS9ZGKGqWtt7m0pzZpctX0ikp8+RGcNS4IpBSEVVsS6fJ/FMVMXVvvEJZW4pXcO0tDEnopGtBtVEo3uYZzUmX7FPt9XFPqQoy6283LLpc5FPyX2lOVNtyMPNQS/lcuFJ2XUlOaXYftviclOFq1SIitQYk+mCFJDFFy+A8Url5YXKI2X9y4nWBy7kpz5rhKxS5m1ewShVTy97Cli9QUdy6U6vqw+ie5PbCcBnOXwdBR+nrmfVA+umXX9K61Z+WLiwpsaX43syXyK92XYK5Q1+za9gTLP88IvwtwLKHtO/pDxX2lwJXuqDH0Lgn4Hje0VIA+mJXVK61yNK+0MSjEMIg5zOcnNDkZJK56+eTN/OlK7ZVCuxXaGdtxXVK+9tENCFXfK/QZXvgpXWyGFXU1VbpHK5lXrrjlXZyEeHApyglW+lv7wIWq+/PjoLtK+XQiw9z2QcTu8KjPGHIeyLWbp2WcNw/YlE9P8udK75XhwR1X8q7tXdJ1JYcjPK4SWykAG9ONXsKsj2k5F1XHjAaOke2sZneiak+q9669ME70wLjgHPq+FIA+l5XVmyRCjK7jX4WzDXkcClXDBPC2dZIdXrlpFHDYWtXuq5JYW6onCS9JqZmq5JOpgsge3aDZwjMgnCppCJXHwm9X9GOPprq8tXUbK98uq8cYfK8zXxrMdXVmyVNSq7poLa8hA6ea9XzyGClnq8rXPg5JOS6yX0Ja6qHTMd9X+UALXniDHXH6G0M1jGk1wUq8UPV0jXSdAoB4TLhOO64zXhpCzXoUg1Vua7bXvtJAHZa+LXZ1i/7Za9rXsa4pybGHvXia8bGqJiLXTa+MeYyHPX48DFXva+PX3a6TXJJ0VXgdy/X6J1j0MaB+5jmCS2OponOHMgvH865jXafLvXiG4Tpl6722sG/tOHIjPXEG+3XhICjXfa6+8f6/C2rAdXXQG5dI8rMhO5G5bAcqfbXnK9ql9XSxOyq6QWPmzvWv+g1Xc66NtvNxDXtI4o3wmalXCXHfXb/rI3hpG/XuMWHX5G7+2BNGI3J2x3hWJzA3J20NX/lw+gEI5O25a6w3kOXjVmW2Ezj67oYA4+S2secfX6a5O2xqyVYs6/sI2m4o4RpUvoLG719D6+bX4KtqMSm7o3VK8XEjG7wutq4q2ee2k3Fq8c34m8g3/9W9Xwm+lyLAGM92SokXhgEj2wZNbwEezhSQ+zYGUC5WjUW8KgGgxP8+k2S30ewO6iW94hIe1jgqXrioreydJqW/7n5e3T23IPOBkW7i3+W50wJW6q3TuQK3he39q1W7XtaPdQkEfv4gkXWYyLZ3a3mnS75+C9a3Bkh63nfJgh2HUqTw/Oy3k0e63TSfG3+sym3Qc375rC7m3LPZm32C9G3y27635C9X7+7nH57PpoDfiHwFc/K2BGQhQFn6j3gIwKiVKAoS0CdPO3pjEu3lgiO3G8CgFeLGZT3YVAFZjFX+96nSJAAonYSmgTccWy/5r/NWBXIANNAO7IFgTJNUjZG+3rdMCZ77EsQVxjAF5NqCWuqvm6z29x1SgNFM926etF2/gFm/MMqSO+CYWAuSYELbJOB28dkNsS1I2O4kFRO4p3t29f6msn8YN2/R3rnGlYWO9p34cY3gNbBh3fnQ8N0As6BEO8P6ZiPoYgTPw1H8fp3JIGxXmqzI0+1r/cTIgRNUu4tcvxCnQcpzHiBaWrT5smxNKjizNvRi3YhJuhtQnnEScu6LtyniUw1JpxG+MP08MqBmtCZoQ2DadnkbJt9Nxu+x0GZoAdynlwdApoptynhzoopq6uEpt6MXu+lNeZs2Wsu/dNLNsd3XJvNN13keq/ZuqGs8h/kvRiHh8ZqNNce7RI7pjNNvm1N4Q3W9OQE1D3vRksxu5sD33niyWCJo9NWu+JIxe4d3ue7t3QFe+tme9DNhGLvNvRkaQK/TDNDe5vcbWG1im9Dltau+j3qZrD3aps132K2D3Ppr/Nxu5Pkz41vN/6213P3HLNx1pt3jJS5N0dvDZBu7JN8drmWy+8bNJNr73A5vRtaKwWwBJ27NTts93+MKBkDPA1NvRnJc3nynNZ+6Tccsm33h+/Y8CKNvM54v0tte43NxmLNtle4DNq+7Q8Re5X3PvVPNhxBN3G+5r3Wnir3A5ugtLS1zyj5uXiz5uU8OEjfNpdvDeN7lIRP5u4t+ZsAPY+8wtp9pl3QB9Py04/C88PuGttFtb3cU+StRsVgd4K1v3RsSQdQK1QYolqAtFdPP3CWgyBDB48WLjFRt1B7Idxu+n3kcVSt9Sx13mG0ut2u8wPgsXBto+9YtHu+13Tu9/NAtqn3/FotiXe/bcGFsjieu5WWdB8OJYctTtwh+GBmh+JNGB+GBKluw2+h/ptmlqX3bfVEtelrtNQxhlohxMsP7NPX3hmjsPgXl/3n9h/SlZuMPGFk/nse8j3YjAyt2frctcB5QP2nGFNuJsmWQ+9SX+B5wPIh/lN7h9APf9rytIHkglr2E7+5u72WuqHith31Utje90I+NoQt9S3gPLS+etiK3YPnVoSPkB5KqrVpAP8+4iXkR+0PwDoH3OOQcPs1roQ81qkP4QMmtKywqPGDictH+9+WHB45kvu+QPfh66tyNuyPZB56P6B5I8g8ixKHR+U8B6GSPtVtaPcR+mCIR58tHh7kcNNt5N6x6QDotqiPu1vim0u8/3Kx6KIih6SPu/qVtkB/SPxNqKPey0IPuR5uPgR+GPF1pIPJR6+tpx5AwLgJDtEPmqPOx+2tdR7H9Lu/+PuQNUPW+4yZvR/aCutpoqox76PnVs8IONsePWNrhPL+7RIOR9iBRu6G60x6/9I+9z3NUXOPIJ6OP1NqYtcyxcPEwNn3mnhJPTgfhP2x5ttsB+sPyh9X+VJ5v3Mtsxx4J8jIZB6NtAB5RP7J4OPCu78WzJ7JPaK3UP8gYgPyngv3GQLVtk+5hPwgaqPHx/EDXx9BPHJ7MPuB9Ntkx6aPDJ+RPPx5pPQ5rkPDtr5O2p6GPWNrT2HgiBWBR+CP3tsYPvxGVPQjgDt4h/pt4dsOPlp+iP9p4V3FJ9yDfx5I8We6+WYh4f3d8GDnkh6fcb3QztspWhPrp8QPP+/CPoKehPap7DPtp5C3IADC34jYi3rqUXt4t30yg9r8IofH7n9UhAhb/uXt49ozPYEP63IvfwWXEKwJaZ5TP9Ef7nY9snSI5UAheC0HtuwcLPm29HtO3BzP3EKCyrZ/tSs8eRnCRZ0Xj9v6AK4OiPB9oHPgS2PteVQrpg5+GBF9qzNejTlkN9pKqE59HPZluHPFtLrJL9sQdXB8nP9R9Jw+Zq3Pnh+MeHoD3PqS/JcdtKXPPProPAkiN0QWGuO2lpaPQ6CN0yYnhwEowFtD58DPryokhhgE2sY0IGAKABQAxgDMAU0JFAqZlAAmpisAAAFUyAFiBkAOgAuAKAA58QVjXXoWZttRzNbAPBeDADuBGEMwAML7kBmgEsAAAF4nAAwCzsL7atMMif6JRGBjQomAQAYC8CTmkn1HD0zd5REn4Xwi/RIVICqAMi+CHMUCdAYQCabJReteDkBCAaYAxmWADcX3i/mNoS8jAZi9KgdyBrgZoAoAAYADAM4CRgTKxCTEABYwSUAgAdUAAANX2BLAFsAwgHYAYACmAqZgWhWIEkhzQDMAxAEgvh0rQv0sHP8WvieiuF4IABF+kvTcXYv5Mqqijxi4vPF8UX5jf4v3QEEvU0Mkvol98vXRxYAEl9sAUl5TAMl9Uv8l8UvYAGUvZMpYA6l6sAAAHowLzQAAACoAADQAAIliB9L4ZfjL4YBTL0IBzL0ZBbLx9E0iqndvHFFesgKoA2LxSB4YJxfTgCFerALkqJIgJfwr0FfIr21eBQB1eIr3VfigDFewJ3FelL4JPVLyleBQKleAAEoAAUQZgAAEEAAJqQXoQCFXoy8mXg4BlXkACbWQMC2X0FkMXmq/uWIa+sX7gDuX4Sd0HLy+tXny/tXvi8bQLq8gAQa99XkxbiXnq+nXka9yXhS/jXkCeCTMCdTXlgCzXha8rX8wLrXgy+bXkq/bXlgDlX/a/8TDwA/0B6KMX2q/OXli8NX869NXm0ItX7EAvXkAAdX/y9YgZ6+3X/q9KLwa8o36S9hAWS9CAMa8JXia//Xmm8CgJcBEANYBOALGBrAYwCQAHcAAACggve4BoAO4AAACk1ABYAABKAq/g34q8eAUq/Q33a8VXuG+xAdJjICaq+f0E69k36K9uXjG96JLG8iXom+vXsK+dXgK/dX4S843ga/vX1W/1Xim+xX76/0306WkToQAA3kAAAAcQAAcvlewb0Vetr2ZeZb7DfUzHxiZfEjeVby5e1b41eOL9dfsbzrfcb/dfZII9fCb2Je9b6TfA7+be2L6Nerb4lfbb8lfrbyABGb8zeiAKzf2bxAAubzzeBYALehb3wBRb27eIb5LeobyAAYbzyA0L1IIQzP7enLwnfhr+reQ77jBjb5HeTQNHf3rx3e3r8Jezb8NeLb8nf4r6ne/r80B7b1neWb2AA2bxzfub2QAdwAABlXK983wW8QAMEBl3vS/i3j287Xva+13uW9EXgoD0xRu9igAe9nX6JBt3tqC93vW/43wK9G38O8m3/u/N3tcBJ3r68j32m/j3jO+T3nO/T3vO8F3+e9L39UDF3te8UADe8gADa8S32IBS36u9e3ve+pmQTjVkJW+OXk+9P3tG/n3jy9a3q+9RTG++G34K/33km+m3lB9D31+8/Xm29j3u2+f3pm9T3me/53ue87gAADCpMFyvQD/JAoD/Af29+lvu97gv+96NKwCePvpwFPvqD4uv4E81vod+1vsd6wfD14NvT157veD77vkl4EfRD6pvKd/fv5D40vfAC0vYt/dvkN89vnD9ovBbiSYiD6YvAj9bv6D9EfmD+022D+kfd9/Ef2m3jvqN8UfLAGpvo94hlqj6sAX99zvs955vM14XvmV6AfNAFYfW9+0fO99lvqZjpEIZmlgLVeQfqN5Mfl14EOZj9kf198kfBN5kfNj+Sfj9/sfL96Ufb99+vLj/TvGl+dvrt83vWj8rvOj5CfaZIMfz0EzcAd+ifwd9Mf7d4SfEj6jvUj5jvoV6imdj/JvmT8cfyj5yfQk7UvGd9mvdD/gApMAAA8gveAAJKaPiu+QPqu813rh+hP8MHVmKp9N3mp/o3i+/gIcx9YgSx8tPu69yPyK8KPzp8gAJx8qPvJ9pX4Z8MwOa+5X+AAL3uh8MwSZ8QPgwBQP2Z96PuNw4EhBJLPqJ+uX2p+xPkJLxP1J9CALZ8pP1p+2Pgh8ZP86/D3kh+kytO99PjS/uPn++eP+e+ZXtABMP1e8nQAJ/FP6Z+lP72+Rb1w6LPtL3LPz5+rPup+X3hp8WPpJ+333B9/PnB97Pwh8HPo589Pya8UP7O8ePmh9ePpF9+PpIBovqZ8PPmZ8wPuZ+RbkW24vyJ/8PlB8xP4R9b2DB8kvzZ9kvql9iPoF9pP+R80vsF/EP62+Qvsh8nP6a9nPi59XP3K+LXu5/sP6B+6PtC8goLpBvPvF8fPoO+Ev75+eX+p+Uv/W/yv3q+Sv8l/Uv0F+U3rp/ZP0h+5P6F9WAAp96voJ8cPsp8eAEXAPRCJ9GPkV9fPsV9XXm19yv/5/Svqx8Uv6N8yv/Z9KvrJ8QvlS903jS8DPoZ9jPhe/DP318lP4J9YvpbWrywV+hvlZ9oPq18Sv218Av6x8JvuN/Ovjp/Jvt1+pvpK9ev6a8zXwZ/XPgADSeb4xfBb9gfwMTTAMvhDfyN7Dflr4jfcT6jfOz8SfTT/tfsr6nfbT5BfDb9dfhz+6fHr96f9t8zfdD4XvPb+5fmL/7fNJIWfhj5HfZb6EfzV9+ftb+rf8b/nfwL/SfS78tv7r9Vfnr43fdD7ofa16KfXL8efvL+efwGE4+lT7Nfwr5PfGt/Ff57+vfUr5nfTr7nfxN92fH14cfK74ffab4/vML8of39+off973AFACAfhSE5f9z8/fhr/3v26Kpif76Ff2IGMf4b7Pfk76g/0767vzT8BfoH4g/Sb+XfdL7XfDL6Q/TL7hfLL/nvYIEw/ZAGw/+r6efdd+BAwb/efAH4Jf5b/HfPz4o/ut8af1H9nfGz/o/ir8Y/q78ff67/6f7b/gA3j8yvO79w/Ab/lvLStNfxH4+vor/I/xL6rfsb+2flH4Xft7+ivsH6Y/yn5Y/bj+Q/zL7Q/agEw/6oF4/fr4NfOn4MAvt5Lfx79E/p78xvIH4s/pL/A/Mr7k/ib4U/97+bfUL4nvjn/Y/aH5XvTUCTg7n/zf/r8Lf8t5bcvn+qf/n6A/kb5M/F77M/tH+C/s74Y/UX5VfCH9cfDN7i/qH9ofiIEw/pd60/PL7w/cD8PvWX/xfFr7E/xn/Wfjr5YAl74dftr/af1n9pfSn4q/6r5YAsL5q/PN6Xv899XvrMBS/vb7S/+79iA8D6E//75I/o786/gX8k/Ed78vhX5rfdH4i/Lr7K/zj5U/rH6ofv99ofS95c/s35AfjX73ffL47iDQGATw7+y/HX4C/Ij+2/eN72/V7+K/8n6O/4L/K/Lb9i/bH8m/895ufnb8w/KgHm/u777fD34Lcrz4kAx1/a/9V6M/W3/y/B37tfEH/C/db5g/w3/g/QP/6fL79Bv775w/TX68/eI79vSP/NfKP7I/aP+6/pn9C/OP+x/g38Tvjb7g/0X7Vfrb8Bvnb7mvq17u/sP+efXoAbvVP5E/b39y/E7/R/v396/33/6/tb5Z/g97x/HP6ff/T55/y1+J/YD8CfqX88/6X4MAxr6PvIv/W/gH7Wf3l4Z/Mn6x/PX5x/pX4B/J3/s/01/OfuV7ffGv/RfMP8W/cP91/pBKOvyt+R/Ld9p/H38l/Un5C/Zv7C/Fv/l/z97Z/tn9G/XP5AAqV/t/6v7YfHn/4/+H+LfR79e/NP7HfXX5N/BX8Z/5n4D/JX8i/1v+OfUf/SvNABmveV/5//r8mAMwDmAUAFTMzQHAfVgAOARkFAvAoHmvewAAAVG3+oL6gBxAG7/cpNNG8YZih5wGABUL/veOEs2T9Ena6NAN7+3wAT41bK7HMzFodXAE1Ba/4FfZgMQAa/1JD6/wKAq79MA1/4EBYL2Z60+NNH2G7vA0z9IAvJi8wyANbsdYJoAjIFv+WADv+q/+v+D/zgmyunxAykAMVO3EhKDbIqFNkB8gbrE2Et/6BgPf+UD67/tX+L/78LuN4DJa2hC5osIJ12rPAXkx/woABd/7i3g3+yT57/lAAEAFJnvWYRSIyAIsQrMBpnrwIX2z5ZHABpiRAATyAIAGP/hgBWAE2xp5YfvQyAJoYV/512riqQySUNMgBwAGoAdv+6AHgAfNCOCaJSIoUSwi2hAiobDhpbs5ilQzNbEIBe8J6IOwBFAGcAQ/+3AHP/rwBkAF9/gwBl/7TYuf+suzlTEwBUCQO0uQBoACUAQoB+/5KAdgBRVhODHgBQZTTYs6slbhfbPgsGQikAbEkegFO/kZeaAGr/jwBloI4rOYBaCDaAQ6S7YCeAQHgPthtxCgBRV4uAd1e1AHGAbqYRE5oXpH+EeSXSkkUS/jjeFR0iAFFcNoBFVjq6kZQMAG3lB9QU1iFMFPcxAF3MCj82QHcIL++IuBBMPnA2QGa6Ki6suyx4MwgVsZQAQMUOzCy7GHKfwCpAVVwXih5AcRUpoTzWBsWX9BqhNLCXhgxwLVYLDh3wL0BdxCFINMy81iR+BAYXkzwSjdYIECpAdbKA5y2hDMBOKrtWBMA5d5TAGgBTf6czCAADv5d/jBe80JoXuKWk2J64pUkw/5oXjuAcAhYXog83v40cMwAbEhkXgeAlF7L/lJChwGe8pFiJwHe/i5gbF4Ykgv+9P4mgFMAKACM3tMAP94amJo2a2AxvrdAeABjACm+gP4xfhne6j53fhZeVl7oYocByyjvAbnYQ15fAedePwEiTP7+cySAgVSAmwBs3qCBCjbggdL+kIHQgU2+sIGc/vbeTt4JXlzeDv47gIte0P6mXptYlf4YASv+JP6bAYGAzf4sAMveewE9/s8+Z4LZ4h8BMuQj/qmYFwG4CFcBysA3AfAQdwEIgA8Bi/7hAM8BS0LPPrsGseQ1YqKBov6nSnGAtACKgX8BVgAAgUCBRIGPgOouoXDkgUFAUIFYgBH+BP5qPho+6wEe3kiBRADWXqZ6aF41TBqB8WJagYb+rdi6gTiBS+J4gUaBhIEggTY2AijmgSZkVoEwgTb+6b5WAHSBxgAMgXzezIGIgWsBoQHV/pyBTgEbAVwBWwFW2CAAM14vbEIA0F6CgWheOrIR4hYSmwDigYYAe4D0QFheglre/n70bF77zsqEFF5L/tReLwH73sWB49gpUJ8BaN799Mb+N16yQIGBwIHEgSGB9JAQgZaBlIHs/tSByv4aXrGBXN7DPnQ+iX5r3iyBBwBOgS6BldpqgZ3ueTgU7hFSmIHdgY50vYFh3v2BBIGDgaaBYIEnRK74EYFUgVGBiH5WANpeul7pgY6ByYHSPhyBn57rAdyBPIC8gSAAc4GO/gWBB/5oXmGk9XjCakP+5YEeAGP+5diSgQQB1P7u2HKBtoQoUGReTYHKgS2BqoF/gSQgVbitMH5+Fr5CUHBB234DgSaBJIFNklFk54HjgTaBcIHTgfSBnN5fgcw+S4G7Xq4AyIE2XvveafDJyJ7ixoje/mdemEEeXgQckH6HREeBuEHDgfaMhEHWgSN+toFpXvNeS158/g6B2j7NfmmShmCMQd5SsySGfoJM9gHwwBxBON44QcGBORy2NnSm/EGRgYX+tIFkQRRBs35UQZJBNJIoQbN4VFCp/j7+PYCKQTaEykHh3qpBQ4HqQY/YFoFogBeBE4FXgZV+LAAIgeJBJT5sga4B6/5pgQYBWYFWADNeACD5gd3+v4H73p3ys7iGCqcBwEGxAJWB7GzYXuLAtYElkPWBfoEuJPBB1gAqgbEAvf76uF14nFDmQfYggkySwPuBnEH4gcaBakHyNk2SZ4HU+C5BxEE0gRneM4HkQa++mH6GQTRBzoEogRFBuUF97Eg+2oGkyoqEPYFEvgaBAoB2QSeBpIHVQRSBAkH4/iRBMYFkQQAAivPe4kKGQY+BYAF+QS+BXIGZgTyB2wGZXt+BYUEHAfveK/hkssmyQEHnAZhe+iSMILWBdZxqhEyukVhKQY8BzYE0XmheUqpW+PNyLEG8APWBZF4+QENBsEz2QZj+wf4Dfou+Q37h/oJB00ECgLc+XkELfga+bUGrgV5+T0GN+EIC5kFogude7lgOhEbEmf5WACgAYW6jgVYA3d77flL+lv75/sq+bkFjfiAATt7l/tr+S34e+N8Chvg+sq9BaoRh4B9BqMF9gf8BFUF9fqVBD94Kvv9+hME6QfCB9oEk/nx+X76PQVPoHKQE+CiM8fgfXnTBvAAMwdt+GMEjMljBAoA4wT9+uf5/fne+Bf70vtGBAoA+vuDBLv6efuyBqYFrQemBb4EgXtsB84ECgeFBqZiGhJ7GdfKwTLFB6F7EuHV60oEUHJBBaOikIoqEOqBpQa5Ad0EIQQ9B+94WwUqMLYivQRbezMBYQQGB3EEVQeouBARaQZeB3MEZvqr+cf6a/hi+K4EdQebBYoS6xsF0AcFsXkHB7EHYQaHBP0HhwXLBpwC1QcDB9UH5Pi7eSYG6watBHgB1/nIBpl6BQQKAC94AAOp3gT+Be0Hmwd2SdB7hRJ3KMUHnAT0qA5g7gFp6LEFiXEmke4FZwUqBmUGIQdlBzz729C5EyE6QQckgMgDdoGlut0F4gTLBaGL5wQxQsn7h3igAiAC2AE4AmAHKwdFeHUTygNpBasHXgVV+IP4Xfg3BgD6r3jx+ZMHmXlDBScF2+O/Y+MoM2OhB9V58QAvBwcFfQYc+mMFOQfLBNH64wY4+28G7wXn+qN6HwTqAx8HMfurBLAC3gbfBAsE+wd2SZES1GKL4CMEvwMVErxCfwWjBAoArwWB+Qf5M/pvBQCH7/vvB9V5gIWludUFTgWleL76O/vH+Wv7lXuXB8wD6wQFBm0HZgQAAUjtB+wEUwTD6BSp/IOqgx0Gj/v1qWF7clK7GQ148mIe4mCAJcFLBo8FUXt7BrcGVKmcY6jZiwQPe1ALygRHAEiFfwTxBv8G9fv/BisE7fnHeAMH1XkQkewRcwSfB7kEgAGDBfMEJ/tRB4QC0Qa6BPsGspl/SdwEGNslBzXDYANQCqiGYIcu4K4DGACgAeADJmEdi10pRoO+wdQDYXlPQ2mCb+NPgxSBnQcfE7WRhIQO03qiRIQnQBzhhIUay3wjVgbMYwKRhITT0VQ6RIY16n0qtEN5YlYHOYOogYSGFIaiY+iTOIvyURQAuYIuy0oGZIa2kpMqatHcSZSGY3N8IlSEK1Ac40oGxIcsgrSFnXMZ0TSFr4MtYXdraYNKB5rReGEUAwSFBYEvAfSGSkHXs6F6t5CtkfSFelmMhprjeCh0hJiBdIdUA2F4NIUEhyLgcOL74syEaaBEhlYG1IXMBBSHK0KUhlYGm1qQBtsF5IQyApyGTomMhbtRmYKkhOSEPIc0hPVCRIVshryGdIVqE2F4JIdkAryH9IWqE2F49IezAAKHTIUEhgyFVwGChgSGCTCEhUKEbIU+sESFzIeWIXyFrIVqEyyGJIQihbyHooWkhj4JxQY8hWSFVIV+YryGXIWxeJSHNAXchSo7nXpchSyEHIRLBxyG0oVshbF7JIabAtKF/IdlEKIxtMHshwKEesBzASMGLIRshkKFuXiMhMyFCofWB4KHdIbyhWoSIoeVYGKHaLpyhAjCtIUyh514soXshRKERIQShdSGI+jIO1KFjFGEhpKHnXuShGSG/cPYQPYAvIfv42KGCTJ8hFqHfIYJM7KFhIYChgkwgoXsh4SIwoacYEyHNAa6hgRiRIXChGQDPYr9BeCH/QVZ++iFuXt0kECF2flAhJMGwIT5BKYEVwbEAVcHBARtB74HbAcwheYEsAM3BFME/vmWYHJC7uGcBfCGxBMMhxUFOwUg4hoJYIJ/BTwHjwUYA375VXuO4PUHegdFeEsHIwdZB2EEswTL+bMH4PsGhCv5AwVNBxcHevqXBWsG4fvfBdEGpmHZeMvgRMKW+0l6NoRghTMEY/qzBzP56IV2hin49oeQh014ZXjlehT73gRYhRkF7asn+taEToQ2h70EjwV/BX37Z/kV+SsGHfirBRiGQIafBgN4ZXqX+G6HUIRDBtCG+QfQhlcGvgUmhRsHZgRlepsEtwZFuOyTqJLmhNsEXAf5YQKETXNuBA97HomUA2ZxVQla+0BxmHF7BrYGpmPnE89jBpBYS4sGHoVa+n0HuIRzMP0FzoSH+C6Fh/kuhSv6nfsJBgz5bvtGhQ6E2IUhhu8RS9nTktMEYYeJ+tcTSwT/BAaE5/johln4cwZeh4aGR/hu+an5dvtGhXn7IYevEVzSvwcNeU6EeXlhhM6FYISxheGFBoZxhgMFEYZOBJGFtvoM+Iz7jPgJhOv5CYbXyfBAoIeJhmGGMwQeBJoDYIWvBCsGy/hj+of6fXtxhQkEqYVm+Ob4aYRTBWmH8QKkSomGIwfTBEmEGYaVBxmEaIevB5v5yYfW+CmHHftHBDn7nwZ4+fN5jPjNes0FAPg1+A6Fk/pphNGH8QJ4QaGECPnphjGGSYYZh6MEyYW2h86GdoYRhgWHGIcTBmsHmITQhcCHUYVtUbYAGfslhDGEowcxhssHeYaZh7aHQflb+V6ERoTeh0f5qfhp+9mG9/vFhE04oyvWh9V4pYdVhy8GZYaehACHsYTe+8mGs/ophRMFR/jAhMWGlPnQhG/5voetB8gG1wSwAnb7q/hmhbv6wvBukTGS8IRKB2EhYXm7BQiED3udAv8D8QH0YqiEVodIheuT8Qv/wyGTCIRoc6STz/vkkHmHY/rJhcv4EYVQc1KHNYTxhGd5mIZuhxWHboUVYJYL27C1CfWFEXo9hjyBuIVJh56GsYWehY2EgIdJe0qGIoD9h1mHjftV+F37rYcw+/j6dYc8+CYJJpIm83v6PIGghz2GNJK9hFv7vYeZhn2HI4fH4ZCHKYYDeDMCIAGM+pMFzYQL+RYFB8M2ku2GQQcThT2HQ4elhw0E5waNBVUERwVlh+GE5YV9hviCo4SDBHkG8wQDhT6GWIdYA1iFrgezh/EL66tFAD2EDmFDh7mGffp3e2MFaIWZheMEWYTThUuG9oQKAjUHL3kyBVEHBPgth/kHVwY3+TCFWALNBG2G7QRTB1uQJeg3cXcH5oV+40oFpbkNetRbygSkg+oFXYYhh+IAlol9O+6H1XvcGlkH6gdhhI0F4QRpBBEE1QURBRcEroSwAjUFO4TuAi0GIgZRhyuH7QWHhTuT8bLPBbfQKQTHhMOFlQUGBucFggYnhE0FWYdLhjt79oUVhCcFefu6BJ9ge4a9BUeFsQVa+2cHlQZXhpIHV4WOBk0HEYbb+aeFkQRbhiYFzYTGhT4F6wUthBsEfoRzMX6FNwS7hbv4eZAoU4Yi6QmWB5wHUatZgZSHWfOZBfrJ1ALOwMGGMYZ7BY8HXYUHYHq4LRjggumFVYc2hAYGtoSNh2iHswf5hk2F5YdehJiGFYXLh2sF3wVYh7UHDoSniRDRK3lfh9GFIwdOh/OGOPsNhuCFsYU/huP7doUPhkaGeQY3hX+ElYdRCfTqI/h/01+EgEUeh2GFeYXDho2HQEU1hteGm4YDemr6XPtc+/2GPoUgRQOFhKHxAWvhAEUXhA2G34V/BOBGU4Ybhn2E2finh9OHR/iQR2r66vqzhFf4voYth8aHvoSthDuEt/s7h7CFu/p58lsEXQBvh+aEJQTWBxaHyobBB2uGSIVlBVaGPQa6MHfJzlOrhA96FQWahpOFXJOThh4E94ULhGkHjQQPhhBGp4STBZEENwQmBrUE/4dDBOv7VpiA46AzLQDuB/UHDwfph3eEV4aYRAihrwbAAhcHLoZwRs2GIEayBy0FP/q+hQhHLYTXBohEsADNei+ESEXjhXUEx4rMkshESgci4qSFJQYoRHKHKEbBhGUFSISHhgCblwrFYKPwFQbuBRaEVvkF+XEEmEfHhfhHeYQERyeFBEcPh1hFxgU1BM35C3vYRiuG/4VRhGCZ0CKhBHKDgYc3eehEDQZUR3hHHgbURI4H1EYERcBGtYSERn+FhETbhDCF24fRQH4EzXmwhhYFtgVNkPSYyEXmh6RFVgZEhWRG9QXWBSMHuwd5ARsTB4UhBbYHX5ENu2hFdgR4RFRGpYUYR/wGC4RMRzFD+EdMRSmHNEY1BDcHz3uPhoRHLgTnhXn4sZNQyUIJuEboR5REGEScAaWGlQXHhvEEqRO8RjREzESYhcxEUEQsRAhG24YmhIhHJodmBthE/oRwh+Tg6jJz2aREVgdyUWF5oQCxBS9CpAH8gQeH3QYURCECT5lL24vaQQTUkMEFgTr8B2GEnoZAR8OH4ESg+HpgKgZYRnBGpXrHBFGEOEQ/BmkBX5qPmnPZDXiyR+6Cl4WARCOEmYfrhDWG6IeLhfJHeAXThzRETfhfB9cELgTjhfBHkwZIR/eZT5lKREGHuQLKRHl464bt+D+EG4bDhFmFqkSbhVhEf4aiRsWH4kRKRxpFMkb1BMpGqXuyRZeGckXrhG8F+YR9e9pECkZqRGOGz3rYRFwFAPhy+uOGPQQSRG+aNOJFYD2FhACEgcpHKkdJ+/pG+YR9hnaF2uIJMjcAOkYKRsf4xkfAhyhYs9h6R4OGhJOkkbJG4gcehuuF/wQGRWZETYX1BA5h2uPmRXxE2ETqRluECYYsRM+GMIdiRjuHrEWbBpVahMGWYbeFigZvh6vw+4clBvsAB4Z4cFpGqEZWhvf58VN1BEeHDXh3ht8CpkSpBLxFwkVhikcGuQUFhZuFzQQtBnRGWXt0RueFIYUuRqXqF4b1BG1Il4XORaiFbkQ5BlFS7kRqRkaFOkfHBu75A4YyakkyqHOeQKCFrkVZB/oH3kTUR25GaQUnhg+GfEZGh5uG/EUtB3ZFREbPhWJGfoVYAzCEhQemhS+HfvvZSMjbcITUquxEVgd8YxyD6JIIhtYGAql8AjYyXYbSRlxGpmJY2DiHWNkcRZtDKIYvBL2EtobhhouGBkQI+BiFhoVHB+WFR/izh/xE6PoCROv7SwL/Q1FFFKsWhziGuISoRx6GeId4hviFUyvEBXqFPUD6hHqEOoTmWkSHOoTEhaKGpIfahFqGqoakh1qGR4SahEKF0ofqhYxTSgUahFqHkodKBNKHVAOqhQKGaoXMBguDStI0h8UERLKyh1lFtIdoulYHfIZKh8yGVgYChrSG+ocMhEqGCoW5kQyFTIYEhtKHOocMhAqFxQXKh2USeUWihjKGOUdsh2KG0oTkhNSEGUa8hFlFNIVZR+KE3IaZRZyEUoXZRzyGLsq8hOlEfIUlRqKFcoZpRlnzZHNchjqGqUVKh0KHeoeMhkpCFUQEh3qFCoQChKlHIoaChWKG2oQFANVGlUS5ROKF6UdchxyFFQSVRWKEGodqhRSFYoVlR5SEvAKlR1SHnXgyhwVHKoTshLSHBUeyhbF5eUcFRkVH8ofogtKEBUUjBQVGnSsdR8lH2UVEhvSEyoa0h21HnXrtRp0rrUSlRblFpUStRGVHmUQVRbF45UcNe01FcgPchFqHjUWahk1H1XmVRDlEbtHMBCqHBKANR3grKUeDkPYBqURahIqF1AJ1RiNHgoakhvqHX+HVhSpHZYY2RNWxsXhxRe5FcURu+jOHDPmBemn76kYn+Pt4DXFY2IlG0UWJRZtB84WzBUlE+IaJOhVgXUejRSlGI0SpRPKHRITahGlHxIYNR2lHDUbpRFVEA0QZRxVHEoRahBqGUodIcH1E6oRcheqEvUctRRyHvUY9RSVHSgaqht1E1UashXKHeUb0hvlHRUaTKx1G+UadR+yHG0RdREVFSoVFRh1FbUdrRTSEPUfshyqHOUbshS1FfmOlRZmCZUZ9R2VGK0blR0tEzUbLRuVGA0dhe5qG5UWVRmyGi0blR/VG/IYLRuVH1UTzRKKFYoUjRHNGtUU1RClEo0bHR3VFXUb1RkdH80bFRQ1G7IVahEdFjUeLRQNGS0b7RJlGGoQVRntE6oQtRVyHB0ctRdlGJUeDRzKHDUWyhdtGQ0dyhPVHI4X5RwVHnUe1RoqEhUZMhFtFuUftRN1FuUXdRHdFKoerRKqGt0UrRbtFvUR7RctFUobXRxlHfkf7RnqEcoE8hpdG5FJahPYCjUR3RdqEx0WJhmdEI0f1haNHuoSnRqNFuoS1RoSH+oSwRtpGfYexRFIAvka1hPFHzES6Rbv4oHABA8iFOITIA4lFeEXiBawDM0TJRV0pyUf3RhlEY0VzRcNHx0dnRw15R0XnRQtEF0eVR4NHGoVvR9dFl0T9RFdEy0RvRWVEK0RUhc9GHIY3RblFO0RtRrlGnSndR8VG60SPRVtELITbRZ1EeoYFR4VG90QwxYVGjIXtRNDEG0XQx+yEUMZPRa1HT0c7Rm1ExUXSh7tFqYNXRVKF4MYtRU1FYMevRryFB0TZR+dEpIcgx6SF9UfzR0dEw0YnR3NFd0anREDGc0bHR59Hp0XVRJ9GNUSoxVVHQ0ZihodHC0XvRRdEq0VvR8jFSMWvRf1GzUblR81E3Ia7RGqGb0aIxfDHN0TPRLtG20Ssh91EJUewx8yFj0UIxfdFI0f5RLDHD0adKo9HhIbKh7lE5EQ7RYNHApC3RvjE6gQ3RHjFaoY4xpSEr0VLRFdEyMWLRtjFGUYgxijFJMXihcDG50fExsNFIoVnRLqHgMbChujFiYefRN9FQoXfRLFENkc/hw15P0a2RkaEx/sIApNHk0bxR1uHokUsRmJExEX2RdcH1wQORv6Fl4sz2XIQkIJFYxJEgQaSR+iTkkbPBlJHcANSRd5EXERPBRYFU9jj2JpHN3l6RVZGAURyRtZGaIfWRVOGqkWSh3TGtYUKRvP5UIe+Rg6GikX/hTwCS9t3mBzGEXkcxG5EU4W0xlzG40STchqE3MSYhWpHhkZMxfj5W4a7+64Ef9MQMDPbMkWaR3pHVkacxVpFckXgRHaH/McGRnFFv4QVhDeHv0fd+QoFvMfPmZZHSkfCxxzFz+IAxZzE+YX9B7TFBkdcxIZGRoSCxND4/EZGRq97RkRTRyBEzMWHMHPZEsSdh7kApkXeRSLFUfhmRVLF/MR0xOZE9gHmRdLG3Mfb+DzHO/tp+Ov6R2JyxNvR6zEmRaCGksTDA5LHIsUKxgaHUseCRZ2EtkZKxJiHfEWCxfxG4sUMxsaGREQYACaHOAXPhH4ENwWmhIACbYUKBivKegJ3Be2EVgT3BWF79wbPBg8EX+J4RjGH5EWoRy+H8CKfMM8HXkagh6SRX+FgRZeHMEb8xWCEEIXvBF6EHwWgh4CGYsS1hwLFhkYyx9cFJAJRBIpFdEY4RruHBsexOlSAoIe/B6CFRsfKRMbHWkZ5h8bGI4Umx6SQpsYTRWLEzYTpeRZGpmI+6eE7IIa9BpbGRsVa+NkGyQJWxKLHaIVvBO8GEIYmxxCHJsaQhHBHNEaleRP5dkcMxPZHLEathOYF2/KFBiRG7MbOgGZKVMJ7hexHyEXbAyUFKEQ2BOBwn4QURFFEROBuBpkFyQbqxRUGQkRL+QFE+Ea8R8JFTEYiREFGv0XpB84EtQdnhzzE9ER44BsDLkaJhwxF+sRn+ZeGwkY+RbxFPseBR02G6Qa0RGeFZ4RPh4RHPgQuxozH24eMxLABzgeIRGxGpmNpaSmy6atuxFYG2GIdh4WDT/tBBf0jloeRROzFtgYnUemxoQSghHhEAUXAcYxHqIZVBCeEi4TXhqbG/YaRBrRFocTmxE+H8URTBITxUceG0NHG3kb2xDHFhwVXhLHEWEWxxaOFtYcDeav5JgTr+/HEXsS5hu4F0cR7BIcHAUaBxTSrhgc+xkHENQW+xC4FufvJxfHGUcUpxQnHR4eWxMJEPkUxxjkHacRBx+5Ey4WXB87FwUb2RiFECgGBeKFEOsWhRaF4fbALsyuxusSBBBQCHIRE+GJJDXnOS7igZAeTwZF5wYdsx6hHcPtI2haT97EXh24QEQCVBb2GxsQ/R2ZFvAEVBQLHEwQyxBd58AALeewALgTfBbLGJwS8xy37xcRkBDsje/rXIX2ztIKlxPzFVsTjRHTHv1CTh0UAv0SYhvTH9Ma2xaZK2jovshOGQQbVxsuz1cYNBArHpkXWRmZEisRrhB+EAuDlxRf6M4czhPXFLak5alkw6VuZBQ3G1yA1xpv5asVARaLEtcQC4bXFzccTRiADdcaVxXn5f0SLs5BqvQclxN7ESfnfhzFFNcWLhjZFYgS5gR3EZ3m+RsrEf0c8+F3GGggtuSXHMoVtxWf6DsTaRCpFjsaTKMgCvcQaxuXEZsflxhXHtERAAhnFncTr+P3ELJNhIOhEoPjdxgPGzoelxoPH4wYReL3FvAG9xGb53oWX+SPEUwSjxdzbo8ajemPGjcb6RFLH1Yc1xO4EQ8YTxUPFF/muhpPGDMZCx3nGVcaXSVPHSXjTxoxEasYKxE3HCsawRmXHM8ZOxTRHwEbLhzpF4sUa+uQRyrMPa6GGYEQAxaiH34cDxaZHjYR0xuWGqwU2x9t7kEY8xX3Hy8XnsO/gHoMARbmGq8dgREBE7cdyRe3EwEVNh9nFRoWTxbv4jkhY4woE1ce0gdXGvgFjxeMH30bjx8v6tcU9h7XFTsT0xDMDCAItxZ3GwUZaxwhFjMa5xLACvvniRW2GfAoMmM26LMblRNURM6g7B9gF+4RkwUihoIf8hR6ExcUnxkIIs9v7BReGBwbdxQ0J3seMRIFFhgc+RIfG3Mar+MrEfvgCRX7FnkRE4yfFjbjHQ6cFvUaARlnEacdZxN4QIkXZxRNHvcTixsvGT4StBFrFWsRmBCFHz4VYAnb5TMXxxHOHSoaBCGBw4USBBB2H6JEdhROHptieEF2ESUUXxQoGhgkboG6hE4ZDhKXESUWNxgf428aixjWEoPsbhrPH68UtxfaSr8bQ05/Ga4ZfxlvF08ZqxIvHasVNxAj6P8VJxdeF5cZzei/HY4RCxBpF44SDh7vHc4RfxlfHQkWlxj3GsUQ/xX1FE8WleYfER8ZzxUAkq4QWC34Jn8XAJn/EICU8RhoFWcXnBWNEXMWLx/zFACY2xabHEwQgRprEcPrxxW2Er8VfsBAm9QTzhWuHf8fKRfpF/8btx9/Go3jQJHXHEwVBRnZGR8U5x0fHREchxcfE5gXNe7f6d/quxGHF0Ab4BXkz1sN4BafHoXgBQnrF00ERxdQAiolP+h/FkcZIJU+FxoVWhIAGSQgIRNAGtJkf+fgGn/mhMHgFfbFoBAQGOAeYJhgGYAeEB1gkMro4JnRRf/vjiIApVAVggdgEyAfoB1cEWCeax7glBYioJrAFdIL4JGgEn/t4BTji6AUEB1rHS3pYJHgkU9soJhIgSAX0BIgFpnmKQggEbal82CQmWFC4JoQluCVYJGQmupE1QrAEYOnkJw8A1CXYJZAHJCbPx0D5pCZEJj6CNAcng9gFiAewynQnhKMEJ8FGtCeEJFQlQzsoJQ5oZAWDgaZ5KQpIBn/4mbM0JVgBhCSYJRgGWgmYB3gmzCZ/ELVTQ2jYBgQkAAXMJHAGjMYsJU/ERCb4aDgmaAV4BZ/79/moB84RJCfsJKQlDCUsJxwmATpP4JMrRARBOsQFQTnmYZFoMAVPYKQGX8ND4rziqCZkBVyG5SKccaoS6IOgEyZI4Ad0ut0YlAYCo2QG8dBUw2wlpNrUBdVibUN5Y4iBFwPCJ16ACSH0JbRSdAfWY4PyLAX0BGkj3YhhmidBJATx8idCFATzQ/f7LATMhhPhyVL0BdIlzgEvYj4GuCY+BlwB3AP1AdwAv/gQAxgBb2CAAAAASw/6zQrAAOr7DPk7ec17CWHjABABLAHNCLABYgMzeeABEwBwAVgAE3sTAJoCecs8AGF7ZsZQABYBkAJgAqECGicrGojZTQgEAGl68oA6x0lHzQqgA+YDQTiAACfHFROVYDonE/n6h1QAPPvERNwAUspA+uYE3AHMBOYEoUVchy7E3APpARQAeiW++NEA+icT+YIDPYnEAOwFvvrVROwHE/hT4YYkgABBeNwC+AKmJ36FpFLGJDz5gXrpeiIC5iWmJKFFZAamJPxEhiYmJuJGpAFCAZYmNwTcAJ/gPPnaxIYkpie6JIACL8SGJzQFtidGJLYlL+J+Bjomy7EUAfYnE/p4cqYnzQSGJYeQPPk7hXoksia2J20E3AC2YrYmsIV6JmYmLiWmhWkBFichRIYlX/v6hsADLAAQAZgAWAL+AxURpbkMAw/7jwaAAagAlXnNeC9783qPA2AC5XmAAeMCdvnyJdD7YADNey16kwHQ+YF5YgNeJt4k0APAAD4lPiS+J6n4fiV+JCuHmBJLeZABO3uci9cFYgKQRwz5MPvcwCuEhXJBJ0EkKhLBJQgDwSYhJJ0AK4S9skEndvkIAM17wADNc6oDwAIJQ/9AJXlNCQ4DNAAAgkt4MwJleWl59wckAAzEgADm+HCTwAMkQaAAnMHgAeADwAPze79Q8SQrhdvz4SViAREkkSWRJRiAUScYAVEkK4RQAJV7sWqlefABVRLwRLACZXjMA0QA/nlMAlwBTAPAA7FrwAHwAukmLXkM+KAAQAEuAJ4DNAMrGkt6FgEuAVd6DPlnqBklLVPHAlEnowArhFtiS3gveC97ZAA7+agAO3h5xDcE7gJlegolXPoKJpNE7gIKJi15O3lc+nkk0AN5JDt4vbM0AyoAlXoter4lYCQ6JEolO3gFJQUmCieJCe1IeSWeABEAXAfzeCuFaQCVe/N7M4YKJlz5kAFxJQz6oYtps/N7EAMKJTUBGXmRJaAAagHxJAkm8SVpeRl7GANNCaGIJSRBJPol0PuXCokl7AGM+lz7tvsNJCUkoSZA+zCGzQXQ+fcF7AHsAGF4aAHuAAABaoknD/gZeVz783rlemV7wAIKJu8EDAMIA8ACzSfNJ6oCLScRJ2V7ZXmtJxUl4SZA+HkkzYJeJQgA5vr4+OEkJSbRJkD5VIQAAOiAA2ABjPmM+r4kkERIAf1BYgNwRbRBJAPAA/0l2Sd0QxUnCSZA+7FozXqJJxEk7RBJJX3zOSdRJQgCUACVeZAAESXERyMltSeRJpMDoycVJlknwyWqAiMmESfjJpEmEycTJCUluSfdJ9cF8SSuAnQAASUuAqGLwAPb+WIANwXxJYF4L3kFJ2V7zgRbYzQBqgCVeD0mzmFzJwz6vSSFcwskugQ8+yUnYAKdx8fHpSZlJ+0k5SVIweUlHYBwkRUnCyQNJjYmMyfzezMmsyezJnMnPSfrJvMn8yYLJ4EnTSY2J0UmxSX5J9cEqyXzJoUnhSZFJHkleScqAcUngSXdJDz44yUjJ4kk0ydJJLknCyR9JDz70SYxJDAgsSWxJEMmcSdxJvEn8SQC4gknCyXDJDz5jPoHSOsB0PliAqcnaYGQAGcnCyXJJVkkIgDZJWIB2STNgukkZkETJgckYySwAEzSS3qdJC0lLScYgN0mESZtJ7ADbSbtJ+0mHScdJdcnnSXsAl0nXSWQA60m73qZeyRQOiQmJzokmwYaCRYmeifkAg4m+iV5Ms8mBibPJK7FVRDOJvYlrEV6JnYkzXtGJsIKpibsBxUSDifyBdwFFiemJ6ZhZidGJrIBZiQWJAxxZiSWJO8mtieWJxUSViTqRXok1iffJdYnF+IOJTYnFRD2JcYnticVEnYnrYV6JP8kPPl+BNwC1AUOJIYnXya2JY4nFRBOJIABTiQgkRYlziQT4G4kRiSuJvYmpoV6J24mLiSWJ24kfnpXB355OAMYA8ADcicIAsF5jQtJJwgAYwAsAw8kTwSn4lywuEawMNISxQIVy+fK0NMxAgOzIkS2xRkCJ9N1h3xidcHl43WGXfL1hTjgEBPbeMCE8KeyErClUhOwp1fJ0CB6YwinlzHf44incKYGAifTJEaESD05gJn0Rllg+JmMBYhRcKSv2iwDyZB0y7yFcwOuJaEzxwgwUFinrJIYp9FD0KZuECil9ZGxET8HYysWxPthiKRneEilqKUGkQinOKXIUCgYusS/Bg4SeKRpe3ik8gMESSqSDJswpETjZsD1u/mxgMAYpxMHhKcYpI7hWKcIUoKCCKWVhgECZpPYBoil2KZIpAGSoSByhiilq5IWxQSnuKfOEoSk3gaopESnyZHEpvkRX1N7GdczFKRUpIimMHAUpPinuknXmINIZKTYpMRpRoNYpxQl1uNUpAoApKQGCGim5ICCY3vFhkkoIvSnmKcMpwhydKXUp7pL0XkheynAzKQmScykqHAspHinLKakpH06/sf4SnmAzguvS0qHTgP0pNyT7KXQs5SncTsEpcikOmHcplSlQJKMp0CG1KQcphZJrKWgRdaGpuF8pnpgbKRwpmlivKZpe7yl3gnQMpfHd8YLMAvZchMGxnUJLHBu+TfH2KSUcsUbSoSZw/Snm7Di+aRQEcGluVynEwXcxfP6FKR9O0KkW0CfQzGR7MaT20vYdKXipiKmEqZGAFP4MXtip8uyYqd8pC84qRPCpKv73MUip8+woqVipdBBMqUOuvKnhQD7Y9egIqZyptKmugBh8fsGQqX74RpH5AEmIcKnKKRypcnHiqS+ADJFchPKp3hRqqT7wlKmcKdSpvP7mBCqp8t5OmBVCaPFV2MgwJRou/NKpjOydcSTx+V6GqURePPGmqfL45qlJ7C78G+xUqWzxJf5l/vapiCQwJjmhaMS7oQ5erKm3+DapXql2qV0pikDmqRY4lqmrpFGpJqkj1MKpoan3oVypFMSDvtdE/qm0xGmpKf5JKZ6p66EpqZGAFPHn6LGpxqmGgkWpOakbvuzx4akrKZGpJakLJGWpzqne8NGpa0blqf0+lan5qYYAcamlqducZqmNqRVCzanzhCKpralZXt6pEal0qUwITcRsFLXA8uzT0Omp1cYtqRm+IkErXpBe9qmxbGYSS9CHEZiSsJBmKWIhG6m4qUX+i6kEqaOpvXF0tGtYzKCxCTJBzFiF9MWE7KkLqbJxy6lHqYG+46meFFOpjuxPqRkpEeCJqXipB6n3qdWpl8T+VFDRh2p4oZ6CZlzUxGbxGCSdcQepBqkPqTAuhpACccxB46T/qecpkErzqcJBsnFQab+ptXjaRKBpQGk2pCBpKMRgaVAkg6m3qaJB6GkfKUORdtylWHXAeXgvMNYcLJo4qUE4RGl9oVWpZGkkLHsE1imQiQHiC8jsaWQulkHv4aXB9qm0dtxpQWSH+kJpA6l8acxpdCwiaSjELeDCaWxp0mkcaU44jGkawfxp0GnN4kQkFykcadZkW3iiaYRp4mntqaxp6mlp7KAuNIBcafJpPGlCGNixEmkj4nJpLsqaaV6k2mlmaZ+pUf4+vvap6oEn2GUW3Ql1zOi8IoGV4jeEiql2gfppUIkfqJeRIRqegm8BQ87PGChpAoAIgfapFPHH2A3ET364shv4xXgVkVH+MWmqadthnOHDQrNuysDsbIuk2mAd+Klp9t7paRhpQdhWwHlpbsE9oAJsHlDtQuZyWzLdgEVpPMGBae7Y3mmFQHfk7kx1zJ1gl+F0Mdap9AkaPvap1IQ3WCFpB8RuwXk4kvRKKSYhJWksaQ7YJnHRUgQmM2m88BmSk5h5KR6pxWn9aRlprAmg4W3aCvik8P5Sd5iZ7I1pAWn2qU2wImhbaYN0QsHLMqWykZiHaVYAU2kBgsPQEgGUoAYJGwkn0BOpWjQBxqtpTWkrqR6UhoLxabvs7iALcAsklWmFab5Aa2nNaXFpCYzy7D9pCyR/adqEN2nRaetppWkCLrlptWl8IO8yQdibaQBCpAzw6Q5xrmkq+hOpkvSrMqmkcU4pbiKcUWm46Rlps2nETMtp1C5D0YrQ/gjk6SAAd2nYJGbIcYBr8eUmeAlY6YzpzOkvEiZBmeQ2PL4JJAik6QbYrcSTaYjp02nu2FTpnLhl8SgMUulPZFepfmli6eDpiWnF+AsIogFTuDw+nv51oQlYOOlM6eLp0Ux86bJBIJKG6b9kAungaX1pzWmJSFOYOWJegTakD2n4UU9pH2m6qWlp+unYJK1pmoHj4i1prxAn2O1p9WmK6Rbp9qmeVkNwfGzPafrMUumK0PogCqlK6a5pcun1YlapjwKs6dHs7Am9aS7pzWmDfDSUhoLA6dVppASZ6SWQVWkpaaDpX2mqaVbpa9HUapFpddrW6R7pqWISYNHplOmLaXNpPcSx6UCgUekB6RlpJOkhaUTpETju6WnY23jc6a7pfWLqYiz2m/AlYhg60qEoJhNpX6mqYaM+Ez6B6UfodMEizJ3pbVb+suHMw+nm6fupU+nqYbPplDRj6SJh5RrZKWiMaKSi6ZPpQz7T6c1pYPCv0Pp+Mi6buBkwncyEIIzpmb5qYTPpqmnn6fnyiVyfErVw0qHS8BlI9+lqfo/pZ+kf6V8ApQDq6cFMABn8QEAZTmm8YRvpT+lI6aYBpTxD6QHRnoJz6fAZgKn4QEppgN6/6afpA2lEvHTBIip0IAPsQIhUkeDM9GnO6Ru+3BFkEWnp+eSEGRpo+BmDKBsxRBkQGf0+ZBk3Pmfp2BlpFBWSwBlpkqwZEgDsGQwZGb5MGbc+K6kCvlSR8XzGabr+QhlEfsGp+GCdcWQZOr4sGcyAOBnoMJ5pTYBC/h6YY9Bh8PfpMhm6vlgZ8hlpFIoZnbhcGX9C74C8Gac+9v48EWnpHv6egDpkShnHqSFwdMEJ8DphP+mqYdm+ub4rqRYZEhmIREG+CilWGY4ZtmEuGc/pqgzb4QKEDhloTN1h9hk/zCnpkBm+GWfpxQjPIO8xdGEhGfvpIUjxGbYpx+n8YT6pgakgoD4mvgnYBPPpskwT6evpVz50Pt2+6RleAZfp30QZGa5afunfhP5ppGGFGcUZqmmjoW1+62pZqYyAlRk+GeRhPqktGRn6WRlhkjkZgvYHVO0Z274DaTEZ8+lGBAfE3WGoYfkZkRkdGcXpSBmmRC0eJWKmoJ/pqDhTGap+gz4dYfapCN5NGeHYWxl4JPIgPhkbGbMZx8TQCPMZV+mOYS5Qkhk16cfphxkwGbsZz0Bn+IvpPex43FSEMSooGf7pBRk3GRLpJND58q8Z8uzPGeVhBNGKaRBp6xk+PpbpcxkuUATRNqTgmXKACxliadcZoJmuaZtpqJQPEY8Cm2mwCSkZ3FGj4dBRzWnH3H0SZoLbnAQkbOTYksQCpfhr6VBxDIHYmVvp/GJSTNbKsThEmYm48FDV6TepM0GtEYyBiYFUmaXpo5GfxGiBGZJnCEfpmJmsmZSZRxnUmT+R82mwGSKZczC+adUZhrFYmZ2RiJmyKABAJJkEJIhyipm9dKsZHHEUmXKZG2kKmRVCapnKmfxCyJlO6UspIgmymeyZ2pn69HWpIGD6mRaZSpnGGQeRgplamTAZuJnEmSPmhJn0gC6ZVpl2mSPhDplmmU6ZGxbZRGcMqVappP6Z6fgNLFUZbKk1GfaZ8YGOmRLp2lraLi/wPHwc6QFk2Wl7qeSZnN5j4aLeAmksOK3hpTxlKWwoPmlMmZGZ3pnRmb6ZEunUEWzptdzZ0QHi2ZlyrL+RjOnm4XYRzWnlmV2prcgULK8wSqzuDvWZo+GNma5pIZnBHKU8g4KNFP2Z55BemS0RJZmZmappzZmWma2ZsiztmdOZ5yCjmQ2ZMZnNgvXpHGzwaSgMGxZOks2IyiBdmZxx77HXwROZTpnLKHps25nMrEcpadidgWSZenF7mcVxh5mxmZuZzthg+CBkFcCPmTuZV5kamU1Bt5ln6Sbp/NggkuNUD+ynmbuZs4HNQQeZchk9tGnYT5loTCaQW5lXGkBZbRE5sYHp0Fmvmb5SOimuEprQcFn6QR0R0RmQgHlBZkG5UqhZRun8mWmZmFkI8XeZEykEWeDOZxkXkdlSlxnMmVGZnN7zQZnhZFkp+EyufEAFAlDomqkbFJVEsNDfANdpB3EiCc1pNqb2IX0JFSCcWaxgciGOIQXpdFlp4YJZORjPQfDBmfiXVDIAXtQxkHxZ0llRocdprFnKWXryg/5DREpZSaQTKC+QallFmRpZGWnnseHhxuT54ZRZ6pksmVzeMHHMWeyECnTOxjEpmkCkRAyQ7nQbbhGZMpmtERGRpZlSRG5ZoICPGBVumkAlkeHMZZGpmdeZXN6+WQ5ZydicvLm2TCnBWUz2irEnaoWZ3llRWcaxMVn9Jv4QNxEPAl6kcVmiIUFZLekCmelZQplOmZY8MmwbBk4SG7EN6URZkVmfmR+xj4GSQqqB2CSkEtuE5qlKAN4UlvjSoe1Z5mlSGXiplCFn6Ye+J0bUCLE4rVlUkaGM9+kDWcdpboC1aBsxE1nR+K4p44QYuMssk1kJ8cdpCCEBRMtZytDM+ItZd0qqTrVZGb5TWc/pQ1lBqSCSJ1lX6CNZ75kUIWtZGWkxKufQCCRn7KIZ7bGegAz8FpCrWaRpNynCMC9ZHzBvWd7ktynmBu0pJBmE/ibBA2kI/qdZnxJg2f0UhYlXWdNes7Gg2U1urkLCmFkpJQwPWYWm71mW6QfkqCSPWbWCSJrfJOei6hkw2YDecNmqaXiOAGloqd4BGKkCqRIAmTyLKagZnXE0qWZZ0LEUqWWRCelM2T9KzNRGmdepJln4qT+psZnkqezZdVTNKcoZPKnU2XyphNnR/gzZMBmAHtfmZPb6TNLZGsYsCLTZ7xmiqcqpqmny2SXyitkULO8gN8Q7oPfpwpGCGShQDF485ELZ/L6G2dmp4tn4qR9Z5izT0KXMn4ocGU8AkpjhRHbZetn6qU2Zjtk62S+p4dgqGRFCSNkW2frZGWkocCIQtcQJkQQkjzg6zK3k9+nSsWnpjzhG2Zxs8uwx2ebZGJnE0Rc+vNkvxGHZXcQR2eOk6dkJhJyIkdkp2TiZ2dmBhM/O8dky8LHZtFnc2VHZWZns9pvmc0aPymnMOqnGmfNx+dmuGR8wsdm+2V7Zbhng2XnZ/IEx6WgQnoAYdvLsndlQ2ZzZytn9PoWR01lWQBCYtcTimvBkZ5hdxDPZFtnj2W3pkZB2gDcUEEGy6X3ZtcRU0Appn2kZvkvZUtlxkWSMIdmOxkhAU9m0sHns3dlW2fJk9SAcoVfEdmmXzpvZGfqayJfZzWmdqajxCakNqaRIhoIVkgbsaBnR/rapr9m9qd/ZH9l3RDsQboLB0ErZ0pl4qQA5JRmypLWhD5C0xIGp46E2WauhYanNaYgkfKEb1H7AiDkywOcpM8hCwPfpMDmqaW/ZL9jbaSQ5/am6adA5w6lWaYkkLRk4NPbZe2pdGcg5B1lpXm2pmxlAOZaZFaTNGWYmqul2FIQ51Dlp6W+puzKe2eluQjmTqcQZmlh/2UDeokGp2ZYkjhZB2cI5DDkGAFmhWunl2RBpd6mCOYaQE6lNirTE8jl0weI5P+kaOYHpeGmAafGCJjlFQEBpQJlfqWhpaemsBtuEFjkR7N20HKEKBKSZSdmqfjY5xjlYafhpOGlTuEyAeQjYaUVZvGEeOSTZTjkMFJUgtMTErrQZP/iuOREZ7jkkaeg5kTn6Oal8tMSHXonZsTnEaSDeluk0aZRpyWnUTDkUOTkSOXTZlmlNmaZp5in32VgsNmkaab1Zf9kuaZOZUmllOU9Z9TlVOaOZtTkwGYJpjmlCQpU5RmktOSppbTkOaQ05HZ6VOavK1Tl6aQJppTk8ADJpsiyGaWggIznFOVXZ0zmTOWz2Czk72XW4NTm9ORLpxWq/RCaogzm9KCjE2zkF6euA9t6tORs5F1lBYCLBPIyZ+PhxU6SQgD2xzoS66cc5/CQ1ocoEDbEX7DWhj0RqOXM5atkfbCLsuMS3OeVEVzmREALAfFmHOWPxNDkAZBfhgBE9aY8CG+gKOfKYPWkRWSXBYLlEZDC5OBle0r5i2TnVWFRp4tkPOSxZALm2ENhgM3Sr0ns5Kzn5gPc56zkkslTB5zl7eDMyJsCG+KLBwLmjOappKPFspDVu62pPOa0whTmj2Yi5/+kCWIAZ0UgMkry5YBn8uXCZBRl/6Vvp55DIGYsZgRkL6aOZD+mYGcXp0SCZvCvpCBlQmXAZyrlvGVA5ornyuTAZ0vBMeHy53+lQWcORkrkW2RgZm+kk2ZQZdBnUGf9pBBmWuYpgsrn8GXIZ1HhsGYtG+hk6GdwZLrkiuaQZphnkGQNpJ1mqNushcJInWS9+GhneucwZVdmoEbQRULleaULMOBk8GRbZDrmuac7MsbkeuXCSBhm4GZy5mrleuVq+PrnmuQceVBl2uWKSfrldhOGZIal4qQm5z+lpuXoZYpKVuQVA9rneubIZAmlwIJQoEgBVuam5brmGGR8AIbnZuQ25k5knHt1pIcxNuQoZtbnxufW5Whkk2f8Z8xmQmb45E7kQmRq5vGnwmZp+4rmBGTCZU7nluNCZvxmeuWsZ6n4ImeO5pdkAmY8ZsBkSuZO5c7mluR8ZO7lOmSqZfamemV0mOpldqSVUg4R/2aIJflnYJPSZd7nOoHSZ7plXufe5i5mmmZlZf6mfuW+5MTmombe5lpnfueLZT7l/uRE4fZmBmaHZoRABmXPpP7msmT2Zvbl2wDIAsmgHuVOZ6HmIeeOZTZnTQHlpne4HuXGZAZliYoE5dVkZmSU5qHktmQuZf1kcoFe5M5luOR+Z5Hm9mXB5fULSFoOZ8ZkIeeB53ZnLmWN4pRwP7M/0nbgxbnTBaJC3ZMZZJiECGc/pQnnMbKfW6Ok0gMDYpAjW+Fss4ZmB8VH+EnltOSfxBEIB4r8EBuSn8U2eCySF6RpeanllmQKMXlIvQd7k2nlK+Jp5Oun8Wap5TZnyeQYcSnlBZBZ5bbjKkDGJUlkmWUZ5dCyhgndhhfImOkEcPnmRmIskxMGeeSxZlviN+C1SEvZ/UUr4EXnueeJ5gllTsMJZqZyGEMz4siHCUXI2CVhBebZ5AmnOedb4rnnWGU8AOXm6edjpNnnP8dNZfnkDmAF50fipeRf47eirwIF5BnlWACF5giyFeZp5zBTleSRCsxgraatAmXmleWrZTBDohIxCnXneFO15ZPinpNqEPXl/YZo5ybhGTDZSs5Fe2YoZdwEOUXFA9XkgudOBaekK8abxPjnKGQt5ALJWWGJ5AlnTWfkqElk0UeluO3k/0cV4E3lreZsZ1NFpeR1pTYCqNt/RpBJR+ON5DXlm4bY5T0CPXKpg8uxneZJZL3mreTGBr9k3eS4hT3myed5+jxqlITkAlCBzec6El3kA+QbZWUBPeEnA33kfeb95dzkleQ1BgDnHxBD5s3km2Y+pTkQzecCUI9k4ALD5b3kDaX1xBOHZaTakIOFq4ZGYOiR4qQtxpMGdGV9ZtoQ8BGjEK3GAidVxxXh0+fNxJ3Fk0eg5eja3eaD5glEAQEbA3onOhNz5x3HdcbFplXHowtGADcSVced52oQS+WPZfTF8+WT59qhsCXWe0YIdgi+CXPmveQzh4fGM+UPJeF5OAHAAB/6LQuRxfiHxAVfopjAEiDViJkhXITb5E2T6OYEoYPqVmErKFGnxYtQIaGDu+RBQ9jm0WHzgvvndBGgR8FZLRst+nLxEEoAR7CDUeeH5atjXUTyYqjCSMbH5cpSa3FdGf1HrqO75PNQkmCdGe/BQsO75pASpXGn5h1hGWSWYKFCeKGn55cIHNO75grTpAYyY2jxkMURePOQ9MAxeT6wJaK6YR2F1zidGQuBAMO35JZDZDF35djrUIL35NZyRbGn53fkx+Y35JSiHWKCAF1k1IIcRk/meKJ+oafmskKJ5PpgmLiVUy/narL35EYzzKRdZW/lr+fFMyCA4GQJ4YLJEXkNIyYhNxBdZZZx7IbDypgocoVfo4/nNAcjydXB8oXX5dMAN+UyyY2At+X0RVfk+mFeIKPrH+Qj0JfnLfiGIJQwz+Zy8/RgNidoYTHamoYyYdDBlnj6YKwx44Dn5zoy1AZQqem73+fZSX5gpAZQqL4iYBQzYkAWumBYQVFBCbJgYEnyX0EQFhYg2bmn566jYmJQFRTSI3ih4lpDlWD5xotIV+UW4dSElRBT8wem9+O+40NnLfvBQoiHbRBXI2DmIBcyAoxCoqfgs8SKUBT6k+Jhp+bTyw4wyBTSqpkJlUji0lAVxbDG2Xfmi+PwFRF78wGgIPAUP+fv5y356Bc6YKgX4yKf5fnDY6A3eqDgWBWS4aZxj+UYFugW9OFuwY/naBWgF7fLKVPIF77gVEU4Fk5gFyBX5fAVoBaEGh5jbhJ74MaiLwK6Y50zFFidG7CD3cJEFUxAgmKEF2oCz6vEFKflKuXAFgDJBBd9SVppp+V6YeBk+mIRMyphJBV4BT/mMOF/QuQWt1M9pDqmjOrLqOfmZBfEFnUi9wjEFEnwB0dUFjQWkBdqA5AU3+QR51AUnRrQFH/k9BYwFflDMBfEFTgiIiSdGlfmcBWcsVQiX+cXUFMiumJt0xQVoVEiaCwVT+XEhdfneBWgFHq6jEB+AUgWKBT6YXLKyYGYFYpiuKKsFZKCaBYyYYXjPZKsFIaCuKA4FFgVhwNR400aXBY4Fy7AHONYF5gW1UW8F9gVd+a8Fq8qQxq4FEyBoBSJWueq7BSo4SzCumCPEY2j4BfHSOgVaPHdQbmh9BeEFXwWwiNEFjJixBabGPpjl+IkFafk0uCCYkIWOdFqo+AWa4pnBy34MWBg63/l5BVAFsQpFBbkF6ASumJ7C5QU5+ZUFaAUCjESwswXp+aSFRF5ocjzquIUtBU/5PIUa4HyFLAg3+VfmZwhghf0FooVZNldENAXhBSwFCrxsBRMFHAVzAQ4IrzAGBXMFVogMhWE2SwUiBTgFnWASBV4F0gU+mPqFcgUnRgoFSfncha348chj+c1gEkCWhZwIziGXBW4FRQB7XF6YHIWuKLVRroWmBfcFnoWPlHMYPoUuhX6FRbgBhdUAJ1yIaAdqD/nOhaGFdrighYaFEIWhhQNo0IUBBfMFCYUM2CEFsoUAWC6FelqVOs0FLAi1Ad3cK7TFBXiFsDHd3Lxw6QU2+fUFqYUI6jkFOfklkg2JWiJNkOaBcAX0hamFWshI4MyFArD5hXPB7IW5BZWF8t4xKryFuYXLlFmFVmpChUOFFAWphTFgvQWp+OEFeyEMsFOFQwX9BeVYaSLDMMUFkwVzAbJIXfDqhbBpmoWhhTL0QgVZIOsYKQEWiFzkZNl7BT4FJ4U7BXGFFoVcaEycxwW2hc0B2ojs2I6FkYVAhS6FjTjOmO6FjgXiVA7IzwWGBaf54YiTGN/5HoXvhV7WwYW/BQBFjzgAhVoFb4WhhcIQsYVmhZsFLoWcekmFEwWBBchF1tS/6hmF9sQYRQnIOYXoheQF+YWhYjuglIVSMN6J3n6ZuttUdIUdrC6FFhDmyK/5NvnYYNKpFEV9wFD5ZgVQsOsYtEUM2EycvYXXMFxFZBQ2tDn5O+hAuaGFF1pUPKi5VzCFUI+F4QQOyKEFeRwg2HOFIlTcpJ7+HmDUeC6Fi1BFYGTZDlFUdPWFL7QdXEre5Ihzed5+p0IKFJ+AoIW8WaJFymgOXGuFn7BERVZF+WDsBVuWXEWg0AjmaEU4nNJFdsB+IGYFtPLEOOpF1qAlfICFCbh+RewgbKq/BdnkvKI0wMBFsJLGRShQvNjFBWF4QUWhhV9mQwU+RaPALoUmWGCF2AQFLOlFvNb0OI5FVCA5RUussAWF+J+wVyGLMMOwNsBoEeZFnoUocPB4BkV/YvmFqUL6RWgRMXqe2TFFscCBJmgRqkVy+UlFl07NKGgR5LigGH5FvNgPNEreDsg2Kd5+ZshgTGCFH+p1IXowwjhMkk75UOhzhWuecAS8RdIwOUU1Erw+29k0RaGF/7i8dMUFAeDcsjlFctSUhei09YWQlLKY60W5OZNFSc5NBQRFxiCPhapkftBghRiFc4WzytOFYQWWkO9FcmYyhUiFIwWhhcroioVb+PeoG4UfhjMFyYW7hfLeIqIHhf80KwWAxQDQBoWIRUaF0MWIxaaFGwXq7i6Fx8hHBTaFagUIxadcFwWvhdcFCMVwGHcFEEWehcAE3oXkxS6F3Xj+hdTFoYW0xeBFLwUARa4c0EVOhbBF8t5DAp4FyMXxhZzFmu6l6G5FUMXefi5o6YX/RThFoYUMWGiFZAV5hS6Fstw4hTEFKQUSxUAmdjq8RRn5SsVikDWFzYWluPWFfWS0hbWFkYlg+dvI7YVwBSyFssWtELUFGQWnOPmFnuaDhQ9Fw4VKxZKQY4V2xROFRqm9OJ9FTAV0BUrFx2B/RTOFAMWuxQyI4wUgxTTshsWPUnBIkMU6BcgwHDA6hUeFZsXYmOsF20RIRUrFccXhWAnFmMXVANuiH5rWhV35D4VFANuim8iExeEiHMXKOancn4UhhXtqJcWJAfTF5cVIOHTFzMW1UduiJvBMxf+F9cWSmGzFRMU6Bc1E6ATcxRjFvMXKOfZSqEW8BSmFe2qEeKLFvsXixcPFALhSxZ0FMsXpxcXU8sXohYrFE8URLCrFdQVWxbnFZVIUhdRFVHTrxfjIesXNhQbFzUTWLsSFpsWzxQ9gPYWrxWrFE8WRwPdF0sX2xVfF74SvRV0FucXlTOKF2EUN+cagf4A+xV9FGDHGoCzYgcUlRaDFz8WFMBDFgsUdxQK0sMXLBaIFe2rP1EjFPcU+Bcagx8YpxeeFVyFFoOwq05HZxXjF0CVhNgXFdpDExVgltGJkxXXFQCUEJX+FNgX1xdc4tcXNxbnFFCVNxWQl1CXHxG3FhcV4Jco5xKQIRXAltQHAYIJ4AsWDxULFlOyjxd/FEQXpxZm6U8XU+nEFQiVAJvFZC8UrtLnFHTJEharFXIUgxLXq/zJaxdvF4iWitF1w+sXNAWEYbnIVBZ2FMiWVDBbFFYVrxeIlQtw3xdPFd8XKOckQfYSPxSKF+iUygK/FYsXvxV84f1Df+UuF+iUWoP/FuUHBxUTqW4UchbCFHCUmptHF8MWMOVKw8cXnhRwl3TDoxanF+wUhJXms6CWXBTnF6cU0TMOwxwVRhSElNPSEJVQlSSWb0ZXFRCXZJR8g96hlxco5OJo/BXklISXUCC4FMEXMJUbA1Fjp7NEl8CXW6APFhfjoRenFA1z8JR7FgiV7atsYIiUYhRwl5JDzxZgYi8XKOTAwciUXxQolTgybxbWF2sW5xakSe8WMRQfFhGJMhSbFeiWtJX+ohiXaoZfFyjmOwrbFt8WtBTWY55AdBaIlLsVbJTLwDiVjxe/FtXAuJW/F5VizQPQIniU/+XUhCtar6H4lLSV7aj24ECW6hbnFNYCwJfUlHCXfJVElyCVfJazyWcUJJZglJyWT5DglVwUdxeIkpcVVxSclrDi5JVklO6GiqoUlcKVHQmzg3CVIpco59RyMJbglHcWtCGwlvyW5xcjKTSUahR3FITrtJcMF48XKOSd8PSWERbnFRWQDJckF0iXpxRzhK8WWxZslhQmTJSol+QV7ajcacyXb2QfFY0rGxTb5J8V8pafZ6yWchRwlxQg7JeYleyUypU7Ft8XHJaNgzxBU7AIleyEqpVcljiU3JaaswMUAJd4l1nQgJTwlOgUJ4B8lMcXVAPggIJhnheCFPgWWpVeFPMUWhfggygW4xacFFqVbqCklgIXMJRiJsKVlJe7+/hBUxb6l5uqUJXQlbqWzKKUlWKW6IJ+YEYVMJSalY7bdxUSlFqW+IDLQmKVkpbUBmyB4tIiF5yW1UZsgqmD4RUqlaaVQ0EylobAspU8Z8UyjJRylXIWbILVsyiWMRdMliaWMqhol+8XNAZsgQEQipTRcKyU97PxSkqUkhWml4aCypaIlrQXsNiUAhyVvRUUAZSD+CO7FVKUN+eOlb/CLhXKFY6VqoDdYeNn6pXUhZSClKGHFoCW9pcrAZqXBJbr+/pDliNal5oVbpbp0SCU2pVchZSA3WCClD/mJJZ2lyxIvhTGlaaV5kD6lEaVPpYilIaU97EpiwaWfBWOln6W0Jd+lFqVcpLilUKWPpUxA8aXhJT+lkwz+BZulY6V4qFhFjiXZpW/6dKUzxT3sHUhFpcWFeyH1bHKoxIV9hbr+OqjcpbWlqiUoZW30jaXzJc2lbm5LJaKlHaW4Zeoq3aU4ZU5u74T4BbEFg6VHIoql5iXHJc0YBSxqpR0lGGVFEDI8riXzpRalzx73JeuFMGVLwhulxqVppRpFO6VQJWIZAlhhJTalkmVyZael5oXnpXx8OMUYJa6lPex7bpClaSWyZXTAmSXvpXplXpjHBY4FLpDRBB8FIEUWpS2c4aWGZZ2O4YXARbplwUrMoHUl4GUWpYzMpKU7hSal4JyUpf0F2aVmAXmlbGVppcsoaGVDJbWQ1DLspUYlmyXTzEollIV1hWOlHgQkZYKlzaUC8BRl7aXghPFl7iDnxRWlaaUPiv2lTGXJZWwoL0XChQe4GWUOXJOlkoWlZb8M/GV+xbr+AKyDqOHF2aV1ZZOY4cUYZU1l24X+JRllRrJOxBX5uiqtZfaoBChmhZEmb5k97GHAkiXXpWCl7EpjZedwNJRzAU6Oviq6GZxyA5AZZQGQO0QLZcEYD2SdZc8UOynb6Inqm2WswAMkLbnJ4IqgBWVdCgpR8nJBCBxRtWXFAtv4h2X1XCkBokr9RRBwOqSbyBllQtyhBQ7ocVDnpQCsg/AMqTL6iGidZVXcZ2UZnDT092UQUvtl9/ldhBFwjWUGSPtlpkKQ5dJUy2WdSL9lwXCykIjliwioqdsYA2YZZdqsTrmi2UgU2cjY5W7gv2X45T2xV2VxbNCEotnP3A2Jl8o30IEZwBzmKGH5uv5OFJtQvKmL6ILAY6VOFNpIrOWAqOVYeI5BYIDpEHB68A5QHOUZKqQFhGImpdPs58C8qXrwaaXilHbcM/ni5bLldZBvdNLlMXDU5Tdk1Kjc5eAEIuUjDBu0rOUM5bNlEVxXpTAwvwDq5SMm94i8qSjlpOWDfOywCuWUaBu0Y6X+aELIOBkzyLwIvOVUWEIFH2VWYI7l7iCe5SyC58A+5S9Q72X+5QIAgeV64g7peXCeyBhlTuUzwrdlEYT3ZTHlrYBx5TLQ0eVX8OiQh2U0OD/AgeXssEO5meWDeLr+DFhtMAtlmeWrpa7wU9D5hGJwOeD4iUzlxZpW+H9ClpA3ICLlx/iNIAtlTCADtE3lChKHZbgqy3kWpRqcZ2GgpZplNeXsWJDyZoXqlGblOeBsVD1l4wgi5Sj0UGUSZT7lGQhwZVmlPuWBMAFlRyVppdByIWUlpQXlFOQRZRsllaWQxPhlO0WEZTvlNWlNhaRlPuU4SG2lVljpZRalOZRZZZFlB+VsfGYlA6XNpX98RWXjhanluyxcZVOlX+XU2HOlNWXWinqlXiV1IebKzyXhxbUBqZzAiPIFnyXVAPecPyWuZfD+obD2pXAlVyEFnJWU94VgpaWc6ND3pXilkBUyUM+lhmVDUI/EJmWn+VDsGKVRRWQVL/I2Zf+lBbjSZkBlumWi/MSYLmUKZUGYwPhz5c0lQ8UGTPOgS+UCJbVRyFxIZWIldBWvEFvl+IVwFRvo5aWP5ZAVjIRH5a9qvKVxuAesAqUlBUGYpFTX5f3At+UFuDqgSu4chT2lKhXEfC/l+WV6FYsUrGVHJXshyIpnJeqlehVrkAAVGDH+bIeYy6UgFXMBbYhE/C8lXBVViG4wMBXmpZoVW1zyZUelehWZMspl3gVoFQvB6mUD5XaFuYgywrgVwGVBmFc6BmW0FXG4sRWkJfEVXnAGyKilvqUpFVYF+AWWZQW4FNAMFUXFUXDZyCwVfhVwFRWSHmUdZSUVuQA+ZciFQZgKtmvlvSU1FU+usMXoZQ0VuDzlhfvlkBVjWLIVVIUNFQbc5+VJZT0V7wBqFWKlcbia2LRlxiUFuPlseWX8hQ0VnhgmFaOlFRUj4OVls4UNFYsVNhXLWLDwS6U2RYAlcBV1qEalnBVCxWDwt2RBJTJl0zgHpZIFrBU7FcfEKBX1JWgVWpATLPEl42WD5VGELNBRFYwVExiEFckV7xVvpZ8VTIhfpdkV1+lCPFkVjgWFuGWKDmX5FUhkhKWIFXG4THIcFamlQZiiIFUVmYVwFaD4ghWYhQW4s6qiFbAxaIhYZfIlkBVF7JrFBGXyFbq5T1yHRS2FBbjVNKllN+VVBV/p9Dhn2VIVQZhPsAxlxWWtBUrwD8XFZccli+oWFdxlDJVnGl/FHSXlWK7xwBUPJU4VUTR7FXCVcBUKYNJlKQF76ggVFxXklaEw1xWApRKVwjBXpaoFTxUyoB6lVSU6BbBSHxX/FTqV3xV6lRRA5mWUFfwVRpU0FYaViXSVJezFzCVG8JvwYGVylXG4AoxlFa8ljpVTEIiV1KVSdIPI1+X1FXAVkMSt8IAFhhW+lTySp5oxBdOOzEX2mOCUNaWcvAKwApX5zBMs4AUOYKPgQZhH1pqkCsXb5WV0egjNuYyY7pimUMmVZflF+Zh4zQFldC3AEgDhfExgeZWyBcultRZtaGgVhzxzEgxeIYjAiNKVR2AEEALl0AWQMD4F9pgOOLC5LJqcYHmVO8A6kGkUvvwEOPwVCWQz9KWV9Ji41P2VVxSX+f/5/RhFlfFAj5BDlf1g/RixlQVAS5UTlW902kj9laTyft5llQQ5QZUQvD2VHeB9lYeVh7zLlWTooBWv3FPIpkI08qZQzZWFiMN2E5XHYGpFQZUHNAaIE5UPkCzYeZXvlcScn5WlUA+VBSwj5dkUkOI95QW4bg520BOVoFWmlQYoPXDLlfaQbDEFuJgINTzwVfAY4IBBmNZybZChBS5kErFIVTLgVmDLlb8AkBUXJhXAs5WCQMRVWyAVwNhV5FUYVSz6EYXECMnI0pX/gJ4oZFUIVTMhVvC/AHTlSln7OXhV55AU5SBVKlhgVXG4Z8CAnDWl+KAvWLRV/JS45dkUX5UiRXhVwfKfIM+VYQg9RfJVPmANlb04a+A8lWP0lUXsskpgoBXiJDnQ9/lp0Ot8ApWoGt6h2RRvdJtQWlVwBHuVK5U4nFpV58BmKdAFIopmFdmwQbCX+QTMv3AilRkw3gLuudASIww+5WOIuhaWubrAlMCX5XdQjoVmSD8W4VU0wN1ZWhXloKnlXLA4nFQZaxg0uD7lXLAs5SFVe4gzITV8dYiBGYdIw4yQiTvlciawBQVVd7wr5f+MqhkaDBJVd+WyKLcFVBmmoN+VtVV46opVGVQumq+VPexFZI8pbVXv+BNF/K580DpV2ohzkKulTpiGVVQZNlSnlZ1VnwpnZZ5UJahv5dNVVVXJ4A6IgeUFhFQZ1DIvZbVV0BJtWcC45aDnpVCOMvjWYi5q1OX7VaCAh1W6CAvlA1UcoZmI7MLZpaNVOcQbMeGCNxgb5fBUIZiaVG2o2sAL5dv03VkfQHhFFVXnjA9VbWT3iD7lzzzyoRRIP2BlMTV82NhROb7oaxiOwVNVCsruWb7og8iHIMDVY5B0wUKIPmCJaMDV5KAHZZMi5LjZ5NZsyc5XVX5WLprU5Xx8LqBxgPnIiqAdWVZlaYX5mhsxCsCrgrTVXOTjOAzV3MDvIGOlCZasYN1ZZ8DPGNblCZYcqsIZ05CzwBhl+/yqukLVpuU5VWLVAZAS1UMu2aVSZW1ZbqDSMPLVvuXbhDEYGSjABbJl+dZ42ThA6YhD+bTVg3DhWLrVGDpVBbFsrzANlIYUx66v0KJl1FiDFQgkljwnyOelvGVapXHwzIBfuAhl7B7ThThAqmBBiKJlA7ROxUTq7g5O1eoqo/l/vsYgDtKiZTaw/gkVkISAgYjB1YzQ93CmvjuURkU8BsgFMdUfTDdFmGV7vEnVVayiZaNUTJLqFKJUedUMVJmlhdUI5QBlPxijRX++9iXxyBBl52iPZXZeKvgqVbr+2mKdRTHVE+BDRRXVtnC1mKa+SKC1CRXVfIjjcL3VVjggZaiaS1B/vtHEj5AQZQ/WrVU4QKEI21TT1TCg2ECoSADw92Xg7KyQ9tUG6JrovOWAZa3oltX1GGUBFdWgxCa+ltU9QS3VlxChRa7VZ9URRAiJoIAxGDz8GGX7pV5Fm9U7wAbYC6Vzulzkm9XfwADw56WNoNZFm9Xz1SjVFqV/1Q5FltWANdmlQ0htaKa+k9WuOXulewTNRTHVWmARhO/VNZRD1X++fdWNCXA1+bp6IKa+HdUBuVg1zmBucDHVOrzN1WUgw5DOoKa+NdXU5YyE43AcoWXVuFVwNVogAGn0NVulmvbFuJwk3QjyFS2lyphG1SeYgYgFpaEwfjDSoZwk4JSHQLr+OFIbLEnVMMLNpTg4bdUcNXeI1OVlUv6Vm9UdIrNliDyHmMI1w9Af8uel6jX7bpbVPtWbzqWlfYiMYF/VLR756UY1yaV31Q7V1NhjpUmlA8W61WY1AjX+CA5QX9V5Bpsp4jXTkGwlMRgtHnV59aUoHg6C3jVBMBhlVSEomHQ16/iv8mOlgloDbJvVa2hSoJE1YaVMxdol8ZJ+pSzQhCVJNdml4+ARjM9+cJ4+sPE1FYirIPvVzEhppUBa6MWBNVQ88TUrtMw1skyfeAyleq521ZbVc1rmNTSlsUU+xd7VH/L1xXcQZyVtNV+4KCUKpUJsgdVMlL01zOT3RQM1bQi1NfxUFsUcNTawcwGUxG1of5Xp1e+AHTXHxAsBSdXfyA2JN0KymlI1O6AapWyl6QVTNSSwtTVa2AOOltWqNSkB0sLwCJo1x1qHmLU1iNxE8Po12jU3NVCw2THdNV2QxKX3CGNoatXWNU018sT5cO5ZDjWO1W8183Bz5f81mpxvNS6gLjUNNW41WiUEpd3FZTW+Ncil3CgBNdU15TXpxTilqaCFNRE1qLVIRgUsMTUASJ0l2KUopdwl6TVApQilPAXEtenFHxDz5NWYOTV0sEClEKUaoffVmLVvJc86pTXItQdEJyXqiOsFcLUzNSbKmfymNSfINyWXJa01WjXu1UClsYhe1SK1vtUUtSyCAdUnHoM1QKU6pCM1crVjNaslJvxn2fs1MGHDJe2gbPyoJA4CFkVdJVCYfYirNbrw6zUKoi6aWzXjcDMlyeDlpRq1MzXdJcc1rtWnNVa1aFSuRY61QdVWtfjYHgib1QY1KCVtJXo1rtUGNfXFjSUmNQ01ZjU3JcG1fzVfNb619gzAtV81fSWnJRC1rtUJcJJJVrVwWOns3LWptbUllzV/TCi15SXH+OwcrtWEiL9ZISX5uji1p9V4tfXFJSWJNQVIyTXSwBklZLU1tZW1kZBUtTE11NjwJcklBTWFtUU1ucWRJUbVbLUapb212bU+NTM1sSj1NUm1YbV2JVVl3rXtNZO1XTWStSSA+iWmJf01yrXr2ZYlZtC2xaM1ull7ao4WWWW2tfol1vDzNZwkizX6JUAwRrVh1Ws1J7VqiLq1M4DbNfolvOTspXu14iVAig61m7VnNcIlrrWjNau1fCVetfc1PTX0JSjQzzXzteQlsygfNfy1kUT0JVwlVjVW1fP5nCV+/GE10HUcJT2QUoj2FI2MKbXpxawlsLVstTM1GHVItUhAQTX0JQ5c6LVdtUy1LCUI3GW1V9UVtfQlRLDVtZ/Q9cUOmj6l5LVYJaist/Kn1W21HCUnFBOwL9XdtenFMCWstXh1ubXKObx1VTX8dfC1gnXAJWO1ILXfNS/FwrVu1a81PHVoIHO1snULtafF18XLtVc1X7XQjBu1yrVbtX3FZ8WTNSJU0zU7xa50h7V6tfXFkDgrNee1JrU7xdX817XMaJa1p8XLxXs1BnUHNafFJagvtdp1ZzU+GN9IJzXutafFRjB3NQG1DzV+dXdQgHVKdWZ1qpYhteO1ArU7xZ7I87ahtQC1p8WxdUS1cbU7xX+AibW61VC1O8Vdxem1WHVZdeL0Q7X4denFrcVEdYy1xbXFxffC5HVhGJR1RXU1xTR1SKAtxaBkaTWNtbnFS2Attax1uTU1dfnFDLXhNWV1yDDJxcvVInVzhXHqXLW5dUrFocXhcVF14HVexbOl1LVhdWbF3sVU7C81ynWuxY7FanUdIqu1yDCrdfB1TrVKxVpg+nXlIIZ1SsWOYCfISdXHterFfJlq1UziVnXqxXkItnXJzkN1ysVOdQd1LnWuxWw47nVXNTp1yDBvdWYpn7VlRSLFP7WBdX+1DMUuuP61S3WehegyoHXxdVN1fMWZmpG10HV/dfzF8HWNNfmFvEDIda41CdCPhVzFOXUidRuFWPUFdQJ1Y9D+CCV1PXUMNeLI1iBEklV1dELg9XKydXVQ+VjFwGxNdbR19PWHMCx1V9VsdfT1BMXddVJQJHXgKFalA3U5tey1vPWwJRm1CMVgTBJ1XzXLhR9Fwb5AdfT185wStUp1ZUXPRbK16nWK9XdFBbWvtSdF2hU51Yd18t7UQDq1p3XsKptFa9RENSI113W69QZI5rVh1fd1OUWDRU91RSAvdbdF8ghc9Tt15vVO9Zc163Wq9RWIAPVLdZ71TzWoJDL1e0Wh1k2FknXLhcYo6QJgdfP5JTC/NUj1jjU5RfOc6XWbhBj1fkU9Itj1AvUbhV9mq2X71T41ikWxRcT13PW9dbdW0TXltVT1fkUYwrT1yTW4fI/E/vVM9b1Fz7is9WEY7PW9RSQInbWldaT1Jx4oFXC1c4Xt9SN1OPXORavoUHWNNcuFO0gu1WD1XEW2cPL1PrVcReCKa3W+dfLenhAHJdt1e3ifdQBQFYjqtc51mrXTMLuIJnVKRPq1LEUVEGe16dUXtZZFVsV3dbe1x/Ug0Hb1DnAbhXAqyjU+dURcx4U39R+1K7VlRXxa3vXztS/1mEWhdYG1GEU6iMH1Ev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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) {
|
|
var name = node.firstChild.nodeValue ?? "";
|
|
text += (output == 'csv' ? `"${name}"` : name);
|
|
}
|
|
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,
|
|
valueAltRegex: 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"] = {};
|
|
var allList = getBomListByLayer('FB').flat();
|
|
for (var id in pcbdata.bom.fields) {
|
|
var ref_key = allList.find(item => item[1] == Number(id)) || [];
|
|
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index], ref_key[0] || '');
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseValue(val, ref) {
|
|
var inferUnit = (unit, ref) => {
|
|
if (unit) {
|
|
unit = unit.toLowerCase();
|
|
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
|
|
unit = 'r';
|
|
}
|
|
return unit[0];
|
|
}
|
|
|
|
var resarr = /^([a-z]+)\d+$/i.exec(ref);
|
|
switch (Array.isArray(resarr) && resarr[1].toLowerCase()) {
|
|
case "c": return 'f';
|
|
case "l": return 'h';
|
|
case "r":
|
|
case "rv": return 'r';
|
|
}
|
|
return null;
|
|
};
|
|
val = val.replace(/,/g, "");
|
|
var match = units.valueRegex.exec(val);
|
|
if (Array.isArray(match)) {
|
|
var unit = inferUnit(match[3], ref);
|
|
var val_i = parseFloat(match[1]);
|
|
if (!unit) return null;
|
|
if (match[2]) {
|
|
val_i = val_i * units.getMultiplier(match[2]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
unit: unit,
|
|
extra: match[4],
|
|
}
|
|
}
|
|
|
|
match = units.valueAltRegex.exec(val);
|
|
if (Array.isArray(match) && (match[1] || match[4])) {
|
|
var unit = inferUnit(match[2], ref);
|
|
var val_i = parseFloat(match[1] + "." + match[4]);
|
|
if (!unit) return null;
|
|
if (match[3]) {
|
|
val_i = val_i * units.getMultiplier(match[3]);
|
|
}
|
|
return {
|
|
val: val_i,
|
|
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 resetSettings() {
|
|
if (!confirm(
|
|
`This will reset all checkbox states and other settings.\n\n` +
|
|
`Press OK if you want to continue.`)) {
|
|
return;
|
|
}
|
|
if (storage) {
|
|
var keys = [];
|
|
for (var i = 0; i < storage.length; i++) {
|
|
var key = storage.key(i);
|
|
if (key.startsWith(storagePrefix)) keys.push(key);
|
|
}
|
|
for (var key of keys) storage.removeItem(key);
|
|
}
|
|
location.reload();
|
|
}
|
|
|
|
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;
|
|
setHighlightRowOnClick(settings.highlightRowOnClick);
|
|
document.getElementById("highlightRowOnClickCheckbox").checked = settings.highlightRowOnClick;
|
|
setDarkMode(settings.darkMode);
|
|
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
|
|
setHighlightPin1(settings.highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = 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: "FB",
|
|
bomlayout: "left-right",
|
|
bommode: "grouped",
|
|
checkboxes: [],
|
|
checkboxStoredRefs: {},
|
|
darkMode: false,
|
|
highlightpin1: "none",
|
|
redrawOnDrag: true,
|
|
boardRotation: 0,
|
|
offsetBackRotation: false,
|
|
renderPads: true,
|
|
renderReferences: true,
|
|
renderValues: true,
|
|
renderSilkscreen: true,
|
|
renderFabrication: true,
|
|
renderDnpOutline: false,
|
|
renderTracks: true,
|
|
renderZones: true,
|
|
columnOrder: [],
|
|
hiddenColumns: [],
|
|
netColors: {},
|
|
}
|
|
|
|
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 (settings.bommode == "netlist" && !pcbdata.nets) {
|
|
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;
|
|
|
|
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
|
|
if (highlightpin1 === "false") highlightpin1 = "none";
|
|
if (highlightpin1 === "true") highlightpin1 = "all";
|
|
setHighlightPin1(highlightpin1);
|
|
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
|
|
|
|
settings.markWhenChecked = readStorage("markWhenChecked");
|
|
if (settings.markWhenChecked == null) {
|
|
settings.markWhenChecked = config.mark_when_checked;
|
|
}
|
|
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("highlightRowOnClick", false, "highlightRowOnClickCheckbox", setHighlightRowOnClick);
|
|
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
|
|
|
|
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);
|
|
|
|
settings.netColors = JSON.parse(readStorage("netColors")) || {};
|
|
}
|
|
|
|
// 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";
|
|
if ("svgpath" in text) {
|
|
if ("thickness" in text) {
|
|
ctx.lineWidth = text.thickness;
|
|
ctx.stroke(new Path2D(text.svgpath));
|
|
} else if ("fillrule" in text) {
|
|
ctx.fill(new Path2D(text.svgpath), text.fillrule);
|
|
}
|
|
ctx.restore();
|
|
return;
|
|
}
|
|
ctx.lineWidth = text.thickness;
|
|
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 if (pad.drillshape == "rect") {
|
|
ctx.fill(getChamferedRectPath(pad.drillsize, 0, 0, 0));
|
|
} 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 == "all" ||
|
|
settings.highlightpin1 == "selected" && highlight)) {
|
|
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, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineCap = "round";
|
|
|
|
var hasHole = (track) => (
|
|
'drillsize' in track &&
|
|
track.start[0] == track.end[0] &&
|
|
track.start[1] == track.end[1]);
|
|
|
|
// First draw tracks and tented vias
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (!hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
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();
|
|
}
|
|
}
|
|
// Second pass to draw untented vias
|
|
var style = getComputedStyle(topmostdiv);
|
|
var holeColor = style.getPropertyValue('--pad-hole-color')
|
|
|
|
for (var track of pcbdata.tracks[layer]) {
|
|
if (highlight && highlightedNet != track.net) continue;
|
|
if (hasHole(track)) {
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
|
|
ctx.lineWidth = track.width;
|
|
ctx.beginPath();
|
|
ctx.moveTo(...track.start);
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
ctx.strokeStyle = holeColor;
|
|
ctx.lineWidth = track.drillsize;
|
|
ctx.lineTo(...track.end);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
}
|
|
|
|
function drawZones(canvas, layer, defaultColor, highlight) {
|
|
ctx = canvas.getContext("2d");
|
|
ctx.lineJoin = "round";
|
|
for (var zone of pcbdata.zones[layer]) {
|
|
if (highlight && highlightedNet != zone.net) continue;
|
|
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
|
|
if (!zone.path2d) {
|
|
zone.path2d = getPolygonsPath(zone);
|
|
}
|
|
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.renderZones) {
|
|
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
|
|
drawZones(canvas, layer, zoneColor, highlight);
|
|
}
|
|
if (settings.renderTracks) {
|
|
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
|
|
drawTracks(canvas, layer, trackColor, 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("user-select");
|
|
|
|
// 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();
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
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 setHighlightRowOnClick(value) {
|
|
settings.highlightRowOnClick = value;
|
|
writeStorage("highlightRowOnClick", value);
|
|
if (initDone) {
|
|
populateBomTable();
|
|
}
|
|
}
|
|
|
|
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 createCheckboxHandlers(input, checkbox, references, row) {
|
|
var clickHandler = () => {
|
|
refsSet = getStoredCheckboxRefs(checkbox);
|
|
var markWhenChecked = settings.markWhenChecked == checkbox;
|
|
eventArgs = {
|
|
checkbox: checkbox,
|
|
refs: references,
|
|
}
|
|
if (input.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);
|
|
}
|
|
|
|
return [
|
|
(e) => {
|
|
clickHandler();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
if (row.onmousemove) row.onmousemove();
|
|
},
|
|
(e) => {
|
|
e.preventDefault();
|
|
input.checked = !input.checked;
|
|
input.indeterminate = false;
|
|
clickHandler();
|
|
}
|
|
];
|
|
}
|
|
|
|
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 updateNetColors() {
|
|
writeStorage("netColors", JSON.stringify(settings.netColors));
|
|
redrawIfInitDone();
|
|
}
|
|
|
|
function netColorChangeHandler(net) {
|
|
return (event) => {
|
|
settings.netColors[net] = event.target.value;
|
|
updateNetColors();
|
|
}
|
|
}
|
|
|
|
function netColorRightClick(net) {
|
|
return (event) => {
|
|
if (event.button == 2) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
event.target.value = defaultNetColor;
|
|
delete settings.netColors[net];
|
|
updateNetColors();
|
|
}
|
|
}
|
|
}
|
|
|
|
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 (String(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 getBomListByLayer(layer) {
|
|
switch (layer) {
|
|
case 'F': return pcbdata.bom.F.slice();
|
|
case 'B': return pcbdata.bom.B.slice();
|
|
case 'FB': return pcbdata.bom.both.slice();
|
|
}
|
|
return [];
|
|
}
|
|
|
|
function getSelectedBomList() {
|
|
if (settings.bommode == "netlist") {
|
|
return pcbdata.nets.slice();
|
|
}
|
|
var out = getBomListByLayer(settings.canvaslayout);
|
|
|
|
if (settings.bommode == "ungrouped") {
|
|
// expand bom table
|
|
var expandedTable = [];
|
|
for (var bomentry of out) {
|
|
for (var ref of bomentry) {
|
|
expandedTable.push([ref]);
|
|
}
|
|
}
|
|
return expandedTable;
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
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") {
|
|
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
|
|
if (a > b) return -1;
|
|
if (a < b) return 1;
|
|
return 0;
|
|
}));
|
|
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
|
|
return 0;
|
|
}));
|
|
} 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][0] != b[i][0]) 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;
|
|
var style = getComputedStyle(topmostdiv);
|
|
var defaultNetColor = style.getPropertyValue('--track-color').trim();
|
|
|
|
bomtable = getSelectedBomList();
|
|
|
|
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 : "<no net>");
|
|
tr.appendChild(td);
|
|
var color = settings.netColors[netname] || defaultNetColor;
|
|
td = document.createElement("TD");
|
|
var colorBox = document.createElement("INPUT");
|
|
colorBox.type = "color";
|
|
colorBox.value = color;
|
|
colorBox.onchange = netColorChangeHandler(netname);
|
|
colorBox.onmouseup = netColorRightClick(netname);
|
|
colorBox.oncontextmenu = (e) => e.preventDefault();
|
|
td.appendChild(colorBox);
|
|
td.classList.add("color-column");
|
|
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, td.ontouchstart, td.ontouchend] = createCheckboxHandlers(input, 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(String(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);
|
|
if (settings.highlightRowOnClick) {
|
|
tr.onmousedown = handler;
|
|
} else {
|
|
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 " +
|
|
/^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("topmostdiv").style.height = "";
|
|
document.getElementById("topmostdiv").style.display = "block";
|
|
break;
|
|
case 'top-bottom':
|
|
document.getElementById("tb-btn").classList.add("depressed");
|
|
document.getElementById("frontcanvas").style.display = "";
|
|
document.getElementById("backcanvas").style.display = "";
|
|
document.getElementById("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
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("topmostdiv").style.height = "100%";
|
|
document.getElementById("topmostdiv").style.display = "flex";
|
|
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 childNum = checkboxnum + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].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 childNum = checkboxnum + 1 + settings.columnOrder.indexOf("checkboxes");
|
|
var checkbox = bomrow.childNodes[childNum].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";
|
|
}
|
|
|
|
function topToggle() {
|
|
var top = document.getElementById("top");
|
|
var toptoggle = document.getElementById("toptoggle");
|
|
if (top.style.display === "none") {
|
|
top.style.display = "flex";
|
|
toptoggle.classList.remove("flipped");
|
|
} else {
|
|
top.style.display = "none";
|
|
toptoggle.classList.add("flipped");
|
|
}
|
|
}
|
|
|
|
window.onload = function (e) {
|
|
initRender();
|
|
initStorage();
|
|
initDefaults();
|
|
initUtils();
|
|
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);
|
|
|
|
///////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////
|
|
// EventHandler.registerCallback(IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, () => {
|
|
// for(var tr of bom.childNodes) {
|
|
// tr.onclick = tr.onmousemove;
|
|
// tr.onmousemove = null;
|
|
// };
|
|
// });
|
|
|
|
///////////////////////////////////////////////
|
|
</script>
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="topmostdiv" class="topmostdiv">
|
|
<div id="top">
|
|
<div id="fileinfodiv">
|
|
<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 id="bomcontrols">
|
|
<div class="hideonprint menu">
|
|
<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="highlightRowOnClickCheckbox" type="checkbox" checked onchange="setHighlightRowOnClick(this.checked)">
|
|
Highlight row on click
|
|
</label>
|
|
<label class="menu-label">
|
|
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
|
|
Continuous redraw on drag
|
|
</label>
|
|
<label class="menu-label">
|
|
Highlight first pin
|
|
<form id="highlightpin1">
|
|
<div class="flexbox">
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
|
|
None
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
|
|
All
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
|
|
Selected
|
|
</label>
|
|
</div>
|
|
</form>
|
|
</label>
|
|
<label class="menu-label">
|
|
<span>Board rotation</span>
|
|
<span style="float: right"><span id="rotationDegree">0</span>°</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">
|
|
<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">
|
|
<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">
|
|
<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">
|
|
<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">
|
|
<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>
|
|
<button class="savebtn" onclick="resetSettings()">Reset</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>
|
|
<div id="topdivider">
|
|
<div class="hideonprint">
|
|
<div id="toptoggle" onclick="topToggle()">︽</div>
|
|
</div>
|
|
</div>
|
|
<div id="bot" class="split" style="flex: 1 1">
|
|
<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>
|