Skip to content

Instantly share code, notes, and snippets.

@mjcoyle
Created August 18, 2018 20:24
Show Gist options
  • Save mjcoyle/3b8790bb45c628f4d4c599b68553372e to your computer and use it in GitHub Desktop.
Save mjcoyle/3b8790bb45c628f4d4c599b68553372e to your computer and use it in GitHub Desktop.
Filtering Nodes on Force-Directed Graphs (D3 V4)
license: mit
{
"nodes": [
{ "id": "0", "group": "1" },
{ "id": "1", "group": "2" },
{ "id": "2", "group": "2" },
{ "id": "3", "group": "2" },
{ "id": "4", "group": "2" },
{ "id": "5", "group": "3" },
{ "id": "6", "group": "3" },
{ "id": "7", "group": "3" },
{ "id": "8", "group": "3" }
],
"links1": [
{ "source": "0", "target": "1", "id": "0"},
{ "source": "0", "target": "2", "id": "1"},
{ "source": "0", "target": "3", "id": "2"},
{ "source": "0", "target": "4", "id": "3"},
{ "source": "1", "target": "5", "id": "4"},
{ "source": "2", "target": "6", "id": "5"},
{ "source": "3", "target": "7", "id": "6"},
{ "source": "4", "target": "8", "id": "7"},
{ "source": "1", "target": "8", "id": "8"},
{ "source": "2", "target": "5", "id": "9"},
{ "source": "3", "target": "6", "id": "10"},
{ "source": "4", "target": "7", "id": "11"}
]
}
Click to view more!
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<style>
/* style definitions */
svg {
border: 1px dotted #777;
}
button {
position: absolute;
}
#blue {
top: 1em;
left: 1em;
}
#orange {
top: 1em;
left: 8em;
}
#green {
top: 1em;
left: 16em;
}
.node {
stroke: white;
stroke-width: 2px;
}
.link {
stroke: gray;
stroke-width: 4px;
}
</style>
<button type="button" class="filter-btn" id="blue" value="1">Filter Blue</button>
<button type="button" class="filter-btn" id="orange" value="2">Filter Orange</button>
<button type="button" class="filter-btn" id="green" value="3">Filter Green</button>
<svg width="960" height="500"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<script>
// data stores
var graph, store;
// svg selection and sizing
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
radius = 10;
// d3 color scales
var color = d3.scaleOrdinal(d3.schemeCategory10);
var link = svg.append("g").selectAll(".link"),
node = svg.append("g").selectAll(".node");
// force simulation initialization
var simulation = d3.forceSimulation()
.force("link", d3.forceLink()
.id(function(d) { return d.id; }))
.force("charge", d3.forceManyBody()
.strength(function(d) { return -500;}))
.force("center", d3.forceCenter(width / 2, height / 2));
// filtered types
typeFilterList = [];
// filter button event handlers
$(".filter-btn").on("click", function() {
var id = $(this).attr("value");
if (typeFilterList.includes(id)) {
typeFilterList.splice(typeFilterList.indexOf(id), 1)
} else {
typeFilterList.push(id);
}
filter();
update();
});
// data read and store
d3.json("blocks-data.json", function(err, g) {
if (err) throw err;
var nodeByID = {};
g.nodes.forEach(function(n) {
nodeByID[n.id] = n;
});
g.links1.forEach(function(l) {
l.sourceGroup = nodeByID[l.source].group.toString();
l.targetGroup = nodeByID[l.target].group.toString();
});
graph = g;
store = $.extend(true, {}, g);
update();
});
// general update pattern for updating the graph
function update() {
// UPDATE
node = node.data(graph.nodes, function(d) { return d.id;});
// EXIT
node.exit().remove();
// ENTER
var newNode = node.enter().append("circle")
.attr("class", "node")
.attr("r", radius)
.attr("fill", function(d) {return color(d.group);})
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended)
)
newNode.append("title")
.text(function(d) { return "group: " + d.group + "\n" + "id: " + d.id; });
// ENTER + UPDATE
node = node.merge(newNode);
// UPDATE
link = link.data(graph.links1, function(d) { return d.id;});
// EXIT
link.exit().remove();
// ENTER
newLink = link.enter().append("line")
.attr("class", "link");
newLink.append("title")
.text(function(d) { return "source: " + d.source + "\n" + "target: " + d.target; });
// ENTER + UPDATE
link = link.merge(newLink);
// update simulation nodes, links, and alpha
simulation
.nodes(graph.nodes)
.on("tick", ticked);
simulation.force("link")
.links(graph.links1);
simulation.alpha(1).alphaTarget(0).restart();
}
// drag event handlers
function dragstarted(d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(d) {
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function dragended(d) {
if (!d3.event.active) simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
// tick event handler without a bounded box
function ticked() {
node
// .attr("cx", function(d) { return d.x = Math.max(radius, Math.min(width - radius, d.x)); })
// .attr("cy", function(d) { return d.y = Math.max(radius, Math.min(height - radius, d.y)); });
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
link
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
}
// filter function
function filter() {
// add and remove nodes from data based on type filters
store.nodes.forEach(function(n) {
if (!typeFilterList.includes(n.group) && n.filtered) {
n.filtered = false;
graph.nodes.push($.extend(true, {}, n));
} else if (typeFilterList.includes(n.group) && !n.filtered) {
n.filtered = true;
graph.nodes.forEach(function(d, i) {
if (n.id === d.id) {
graph.nodes.splice(i, 1);
}
});
}
});
// add and remove links from data based on availability of nodes
store.links1.forEach(function(l) {
if (!(typeFilterList.includes(l.sourceGroup) || typeFilterList.includes(l.targetGroup)) && l.filtered) {
l.filtered = false;
graph.links1.push($.extend(true, {}, l));
} else if ((typeFilterList.includes(l.sourceGroup) || typeFilterList.includes(l.targetGroup)) && !l.filtered) {
l.filtered = true;
graph.links1.forEach(function(d, i) {
if (l.id === d.id) {
graph.links1.splice(i, 1);
}
});
}
});
}
</script>
�PNG

IHDR���D sRGB���gAMA�� �a pHYs%%IR$�]AIDATx^�݋_U�}�����9sf�6�Μә̙��$鴏IڦI�[���K'�6�4m'm��i'���f�(�"�
��(�����*�rE@��EQ�����}�_�[߽�7��Z�g�ǣ�|�{/a}��f}�w�O� ��@��
`�+��@��
`�+��@��
`�+��@��
`�+�l,�.I˓9�sZRZSdG���'{[����rc��-���0�Ņ� �+ߑ_:�K����nXv�Ϥ����э ��ܮ\�x��mC�?�N�9t��~7@4"Wko���~�6�n�~��w�v�V�; ���k��>eb�Q\ ��C��ёa\�Y�n�ҟ�`�:��� ����d���H#W�:t�6������՟�$0p����X��lCj(��9/�D
����5�_k��>
@���+ <� ��[�o�D��mCi8�����G�0p����6�����z��n`�x��m�h$�������F����ǝ"��D&�E���KmK� ���]��>*@���5P+R�C�̏�l��"?�9�J�EN��ȍt��!�B x�}�۶a4�� _�G70 4T�M��}�ݨN���`�~#`�>{a4��'U ����[$�����6�*�S�����͋� ����ʂ>2@8��S���Av+�럿���"���299)CCC���----R__/RTT$999������ u��.�F�f�f��‰ غ������`Uc��08��ܜ<}�T>|(��ݓ��f������r),,�'NHFF�$%%�����?�醥���7N��m�T-�.�#��5+�"�>eZ�]����"������Ą'�vuuymmm�'О={�h���=�v۶m�v����J�`D#Q���>*@��[s�k�a5T�yV0����מ@;>>.���r��]�u����HYY�Hvv�<xPm�h$���O� ������ ���?,�C}T�p#6�>�>���v�"�� P���233#O�<����s�ܼy�hKKK=�����@�g��p�ڵk�����ѣG%??_JJJ���J�_�.���Oh�:�y�6�F�v6��G70`sƻ�j8��W�A@ڗ/_zm�'�655Iuu�\�xQΜ9#ǎ�HBB�m��t�޽�h���<��… r���q�ܾ}�s5wllL^�x!�˛�w�c��6�F�.?���
n`���g�p��I�����x���Ǐ=������^�� ��O��Ŵ�4Op� ��.���୎Wqu�*��?�
��ϧ����˧�>mH�Y��`@���mJ�Y9��&��+�*Ъ+�*Ъ+�*Ъ+�*Ъ+�*Ъ+��h�RhuYZuEYZu�YZu�YZuZZuE:Zetd؆�pV܍8}4�H W�w��4ܥ�a���Ғ<�\=z��T�s��=U���{QO�:�7u����{U�e�KZu����W����U��{��&W��`�镺WXm��� ������pՃ��h�@.�=��4�U�[��-..����'�޿�h=�����@{��O����� ��,�!���z��ڍY=fH�ά;�vkV�!R�7������h7#�v�m0 G�7��D
���0����>�w�@���3���^ioo�k׮��˗�ܹsr��I9|������Ν;mCe$KZ�|\h��rU�U��U�V=OWZ�|]h�������J�Wlj(�����%~^i`@`����h$j�?���h�J�}�vINN��� ��ɑ��B������:iii�{����А<}�T�������5�%�|�m�j��a�A: ����T��}�TM��{C]9� �����8ٻw�:tHrss���H*++���^Z[[����h''' �Q�r��6�������"� L���H��k���P���׵jǎ�mff�'�{mCC�'�������LMMɫW���� .�_� ����{���р ��/��H����sg�����7//�s��K�<����y� ��'����_�j|�(+��mx�J�JޯH�@��@� s�+�A4R���>0`s�^M�����m��L��տ��/�wD0 0���>�F�F[�[����7mC�?����凗�����x� ���ǽ�{�Қ"_��%۠k�ϝ��$�J���6�j@4#�u�>�F����>( 4^.����v�����g���@�ʤ�I�<{�L V���ybF#Qg�X]����رc��Ԥ�@4 �� �@��8��r�ԩ�=f+99YVWWui`@�n������2�1Bt������8�Y�uuu� �40 p+�"��>���*��.���F������y�D��'O���ܜ�/�a�}0 Gm��D^������$$$!���Jw�D���˗RVV��_�l�|ӌ���P׵}@tjll4���ϟ�. R�+++RSS#۷o7&�����+����5���%��@tKII1�Oii��"� 0ܼyS�������*..�_eq�}P E�~@df\0ݚ��}���8�/D�q��IOO����-�S_c�!�>����[��.��@l�S��D� \���_N�8aLҭ�����
壑2Sd�O;:;;}����� .�vv>{�����m���}��~`� Ԋ���!v�u�"�8 �deec+??_w�F����V����M���������:�q��J��@�����c}}�h�H �K������aue8(��<+8�?�ܵ��W�I e�Mg���3�Zvv��‰ .���Ϊ�=��^��y�+��΄���"'�,r�E2?*r��"g�X�z�;��\dqV�p���A�q��Ŧnn`p��vv���X{ggAUPP`��Ç� \��@A��@Ќ�������v��$$;;�����=�<��ج��cL���� ��a��9Ī��=K��ooo���199i�KUMMM� 50İ���B����G ��***�s]ݒ������P"@�����A���m�ڼ p������3����:��b�Swv^XX���LOO�.�,jɿ�\������y��
b�vv>~���gjkk��Y%!!�8߫��t*`�r�?�����U[[k�ي��tp���F�|W�vA���vv�����KLL���RRR�s���Tw�@�(㤝�7�{Y��������l�����ul`�"N��y3
�?sCC���佩K� t�����f���v�'���4�yU�v@�� ������l����r��΁�����>,--�.�LYYY�9����;�`"@�ig��8p����������zzz�s^U__���� a��� ����ߣ��J��+//�8���@p� ܾ�s�����?p���A�W��ե��` @���������j( >ߧ��i���{�Ç� �"��5Ǐ7�_mmm�8��ؘqޫjoo�]�V� ���98����[aa���VRRb��iii��*0 ;;�z�������;��MNN羪��&�l����C'!!��>�����lƹ�V�����.`���I�����b�544��l333g������`��9<ZZZ|���[TWW�||�����.`3�vv���)����Ғ�Φ�u�����t�`��F;;'''��s�8p��^�����|���������� ֡vv���Z��z�����\m�IJJ�1JKKu(0�`g�����m|��t�M����1�j||\w� �;;G���E����������@QQ��A�������Ǎ�E[[������i�U��ú �������ݻw�W#��O�?���B��#++�������k��s�PW��?���D�ܣ�������t�0�ag����<���Q��#//��x���;;�6����gU__�;�{ �@UWW��6B�x��� ---��LmJ���
�Ç�`#`��������3����Ғ��166�3��C�H���L4~������KII�1���t�0Gaggg+//7~������1T555�.`-`��������m�\�U~���/���A����;`1M��\ZZjL�����cqq���;==�������H\\�1���t`� &���{y/qomm��}�����/��� �Fs�����.�ϻ��Pw�Q;�'$$c���Jw��b;;C1~�{������1��[�@�cggxS��z�����N)))ƘP{#|�D-vv�Z����s���^wwjnn6Ƅ���q��Eu��iii1�u�7�v�6�(**��[`Q����gϞ��j3 ��:;;}�����0���������s���Gw����2�E~~��0��bgglVyy�q�TTT��^���ƸP��ק�0��`ggl���k=g�a"yyy��P�� ��vv���cgg�eqq����٧����������]p70�˫��5�%�^���9�}J��K�H� ��_:��P�^E��ڪ;��y��133Sw�����M�MH��l�F�7�}���f�w��H�G�{�ߓ�r���P;;WWW��3B����8�
up���1cl�jkk�]p/0�@_<�7��6��S=�Q9�yD��汳3Bmdd�8���٣;JJJ�񑖖�;�^`�a2:2lC�f��E����U������'z��
�D&''������Iw����C������� �[��d�)��gg�[�n��C-���g��������jU����������-�]�������ӟ拝�Ij�+���#_�w���x���u�<��q�fɧ�>eZ�]?�����w�ͫ�+�bgg�ڳg�|�;��$o����#>>^���u܅ ĸ���6���RZS�'�������J;;#�<h�===�`iiI�1RU���` �����6���j�k��155��I;;#��ˍ�}EE��P�1�jzzZw�=�@�jo� ��ϝ��>�w��ֲ�3"F]�N��a���c�������Qߪ��m8 W�t��#"O��k�ثR�xWss��8�]p0����mCi8Km�D�Gp�ݡ��sح㤨�Hw��@ �~c�m( wy� D�z��ub�6b`���4Ɖ���a��#1�g>jH�]?n��>" �FFF�I��={t�UVV�1V���u�� Ę{S�l�h$꓅��GDz�{��z{{�q����Ow���@�)�_dF#U���Ȁ�S˞��z�,����<c��{�� �@��ײ�6�F��������6�bRllpp�+����t�� Ę]��m�T]��� �<��#�I�zD_�X����p.0c�[�� �����2}d@t8x�1�����Vccc�XQ��ƪ�Fb�~hD#U�^�GD���
cB_^^�;�����%--Mw���@�IlN� ����'��Ȁ蠮�Z'��0{����xQ��Ԥ��<` ��w���H�����Ȁ谴��3�W��WYYi����$Y]]�]p0c���m�h$�g>��
�.'N�0&�jwh�fff$..�3uuu� �BbЯ��U�@�Rr�H=��:�W�����jc����������s������pWi�>" ������={��;�ց��c�\��&��� Ġ���@��p����;�D+z��y������3����u�� Ĩ?,�C�`�Jk�Q�n����D�{�����㦴��>�� Ĩ�CWm�i8�7N���-��#�����:�����kinn6ƍ���q���GbX��.�_���^j��D~qqQw�%##�7EE���9�@ {��B>]�iې���k��?�~����D���Gw�����7����ub�q�����mX v}���S��PQQaL����u�z���������;���\{tM>��A����z�����K��@lPW|����������cGՃtbp����w��6�n��W�=Y^]֟��lS�I��g�t�z����Fr�� 8��Ҭ��ڏlC�f�}���Lx�N�8aL�[ZZt�z������Kw 6�jm�ܯkj��7�X�_�� b_}}�1�?{����HAA�1~233ubp��'Ͳ��6���߲ ���� _��� ���ľ��Qc����;6266f�Ummm� �� �ă�R�_*��3%�V��l�)��ɞ%�5�52>7��p���Dc?22�;6RRRb����4���C8^aa�1��������2Ə���&���B8^kk�1yg7[ 0����JJJ������A8����1yW�����6233#qqq�b%�XD\J= ����r��)**���
��)==ݘ�www�TWWch�Ν2??����Ky�{��!��I���zΗ���,--yvQ���˗/�.�0�R/^�0&1j�\��z{{�s�����_����8R�n1�XA\l۶m�$fyyYw�QW���*u+�����㨴�Tw ��ۻw�1�! ��N�8a��---��_j�XǑ��q�% 6�;z��1�������s��ٳ� �XR�)@, .v��cs�����{�7����uvvcI����@�".�+�z,�tj�7�yϤ؜��,c,����D/0�b׮]3&/����8Waa�q������@xאַ���� щ ���6��������u@����񔝝�;���� �� p:��R�y�jqqQw���U]]]� ч ���Ԕ1iQ�v� ==�8����u@���!�x�����>`�Ŗ���I����up6� ����u@���ƌ�J�jш ��z �u�233�;�syo�s����%%%ƘJKK��.`��222�IˣG�tp.����-6���UMMM� у ����===�8ۉ'�s���Ewl�z��uL%%%��ʊ�@t .w��c�r��-������8�
t�f�[h���q�s�D0�r555�d��ի�8���q���lMuu�1�v��)��� �G\���՘��;wNw�KLL4����a����z��/_���y`���߿oLTrrrtp���"��g�&�u���ƸR5;;��Y`��<ybLRx �D=��z�?~\wlEJJ�gL��#�����"� ���ܜv�ڥ;��MOO翪����Y�CCC�� z�x6)��W�^��|�������ݭ;B�٠H� � �9����$�Gd�{E��ș���&� pK��#���T#LLL��|��.-++�A�Bo�'E~�s�מ)R�� �Q 8�$;;�}}}�8_oo�q�s<d�D���>�R�Fd��~S�0��p���up>�����jjjJwl�ܤș�ۇ��V¿�S�?G UUU�俾�^wwP���������)�Z�s�w�����!���&c�_ZZ�;�;444c���@wl�Id�?����K��?�G ���3&���������1t@@��E��}` E��� �!���c򟙙�;�{$&&�`xxXw��ا�j(������ @^�xaL�U��{3���Z������5Ե�}"� � `}`���kc�jeeEwwhkk3�����u��� ڇ�pՕ�����x�ݻט�OOO��ꜷ�U \U�R�}�`�����y�l� ��ȑ#��hhHw����0�Aww��X����lL�Y {����<Μ9cL��޽�;�{TVV㠬��u� ����pW�G����<��ˍ�����up���^c8p@w�����i$jj@�#�v�1�t���l�USSS� �VR���Q�>�
��xܾ}ۘ��={Vww���1�Bss���1;aD#UU?���<�I��c�tp���c,����h���O��=0���Icҟ���;��<z�� �w��>�k�h�*�������Ғ1鏋���}�����0<<�; }��A4R�����=0��IHH0&�333��KQQ�1jkku�a�}�T���>0�G�3���ƤllLwwikk3�����u����}�TU�@�#����<c���ӣ;��<�� �t�!������f6p�>0��)))1&�<�n���a��{����.�B���[�����㺣��G�0�z|[�#����c���U�ܧ���eee�8������zƀ�/�T�����S��h�k��k#�5��NrΟ?�;��ܿ�iii�8�����'N�0�{��y6��C�@����`m`?�=������}�U�m۶cbjjJw��6==-���RXX(����y�Q��_YY�朗ݗ�Bi8k��l� �g?~lLr<�;�;�_Y���#V-..z66������n=��)��z��А~G/C7�Ci���������~fnnΘ��ڵKwwRKB�c�g�'�FFF���N�����؟:p������n�w@/�K�p����"2կ�G`رc�1 ��/p�G��a��ݺD�gϞy�r8{���ٳ�8w7�������7���մ����>���n�����RSS�I�ӧOup'���Xs (f���
myy�犭�<��ԕau�X])����!5Tu�/��� �>/����eep7��S�P�A�2<<�9�����Խ��`u/��'8d����j������� ޓ����ܩ���ǎ� �&''=������|빸Q�e�j�g�۳ZV��Ck�����@`� �/_6&P��������ύ1��{�*�^��{��Iii�������F�����V��������حԕm� p`���&c2�v�.##�*�����C����.��g�Tzz�TVVJoo�,--�w�"+�S����֑���W�7��!0tuu����|��K ��C�
���[��̙3���Yϭ�JmʦnUikk�N�="�+�O���z�� �ۧ�����n�����Çup�����B-M�5??����ŋ}v�ߨ�m�&999r��5�c�b��ȝB� %���w�?� ���y��U�>�'w�  8� ��;�� ��-//{��ul�͉�� Juu�dee�?u��!�t��/��s��g"/� �3ODVB�;5�� ����k�������YDžڙxkbbBn޼�m$>>�8W6���d)..��8��� ���P �&c��������ZDž��577'w�ܑ .�����sc�ھ}����Jcc�����w��u߯u�6<<�;�{��/��B=��200 W�^�#G��?����y�܃XU�uϴڏbq����� ���ӧ���ݻlB(�x���8������p�N���;w?��j�޽r��9�}���|�R�#֣n3�~���Y�� ��zċu"w�� ��M=~�:6jkkuN0;;+���RRR")))��z������'O���������������m0 �$D�F
@<�Y�Ʊc�t�Hm����/W�\��ßR�����z/lMii���UW� ��|ttt����B����1a�^�z���O�<�\�UWkw�����\�����:������wD�����ou�4��ыu�U.�]��`�ftS�ߪ�pϟ?�/���ۨT@V�r�m *8#���+�p ����Sc��� uK�u|�e��j�徾>��C���g�O��Ւh��@��|`>ԣ'���� �7�߿o����4�A��g�g����y����|6*�ٕz��z��� �399���`#���qj��01�X^^�m۶�CM�>/^��,�U�JNN6~U||����{6X�����h���d���o߮;<`���Ӎ���ޥ�Wj��ͺ�PXYY�x��:t����SG����j��h�g��g�3�����\c��۫;�]�f��3g����ѣG��������F���*/^��w���ܜ~G��_p�����-���$���Ew�pf�l�zĔz�rQQ�$%%�ߍj׮]r��i�y�g?�.���g�.��� ��Z.h�����.�644�;����Z�,����y��?���%555���C��p��������`"����Z'!�0�wKvv�g���Ȉ��;X�Z�����s�?�v�Vᨫ�K^�z��NS__o���� ��l�+3�I������°���iikk���BILL4�N٨Բruo��`�]��C-������`"��v}�NB<�;`O=Ʀ��G***|v����?.���,'w���~�8v��@p��R���NB������i���� ������?��gh���j٪Zn�;ß:p�����Iww�,,,�w���M̬�HJJ��@p��)..Θ���0-,�Ja�|�d����W��Pj[��/�/f4ʾ�^�7�B�:6={�̳G�ٳg}�ٺQ%$$HAA���SSS��w�g������u�� `M���7&"<^xc��+�+�'����w����Mr�޸~�覮̪+����+�ֿ�)ue���N����;�S�(��C333�[G�&u�u200�;�{e���/���6�Z��i����["�ª�Wݓk�;��R�����f�6���X��,`kR�oZ'!���ә���[�Av+��Uȹ�Q�)��vYV�-����W�6*� Z�]����Y l�ɓ'�sL�@�`!XӥK��I�z~'�F�O^�o%���`UFm����S�ѽw�g*�|]�8��N�8���J=���/��͛7u�� `M7n�0&!j� ��Z����WmCk��P]����S�������R�4����<\=�%uϸ�������:0�5ݽ{ט��>}Zwwx�Z�si�l�j��BGp�wT��ݺuKΜ9#�v�2��F���(EEE���&������hoo7�Gu.@���Im�c��>|Xww�aq�mH e��'�2:=����������Y>���j�ݍj۶m����́ �i������6c�`!X���ύIHrr���W�3nP�Qy�M�����Z������O��v�}���ߗ��e��@�� �sU=��� `M����$D���7�Bz�m8 W]{���퉉 φ@�v���x��^�_`{���x�B�#}�㳬�n\\������+))ɘ���€�]����o��N4�yceeEv��a���j��풛�+���266��� ޏ㚙���0�u��~��������[y���4�545��� ��^�x����L�|��<x����ij������t�B����|c�6����Ҋ�����pב�}To477�q�޽r��9�}���|�R�N�<i����ݺ[C�.��_�$���Iwg�����o돏��G���Ǐ%//O�_�����R��[��Q��@0�����ޘ��啀����oF#Q�n;� �T[[k��SUU�;�5`����0&!����8�_�ن�H���>2�=��ڌ{�� `����7&!Ǐ����r��m�T�<��^�O__��oOvv��������ӧ�$d����8��\� �����i}d�{�g^[��IMM��0�u-,,��R�ɾ��hD#UwFy�6܇{�
��v��mLD���g�N��ͶA4R5�l^�.�������l��<hLBx�
�����HԿ��e���IOO7����<0� ������������*�i� ����Km�G��z��ߞ�����#�����IHKK���gyyYz{{���\����ĉ�����Y�0��v�K�>.\0���u�����l���ژ�����Ԏ�7n��\Qھ}�q>�����ׯ�W�������4����>"�}jkk��z�����#�Pss�1 )))� :���Wy��]���:T�oH�YM�Mp���6c��l��T8�NB�U4 ڨgV755�ɓ'}��W�k�_���南���=?�� �᪣ �hw���3�jvv�����lH��i����9�H[]]�l�VQQ!0�эJ]VW��/w��b;��ܷ ����S��p/u�uܦ���l���.��IHBB���599)7oޔS�Ny�ݵ���նm�<+�}�jR��O쫳 ��� ���`��;v�l�_���������*oee���7*u����������f�蟴 ���w�O�{�nc\{?� E����c�����٫���3��������ݶ.��C۠���#M�S(޿�R���V���رc�$dppPw��Q� z������vww��Ғ~��˨�� ���/e\����]��J�R�:�Պ�
0��={֘�ܾ}[w��MMMɭ[�$??�s_���ڨBq��'��l�k0��s[dqyU���c���_��[A��K�.�������i��#����\ڨ���/���!�����)������J�~�������W��l�_�7�$D=BXϳgϤ��YN�>-;w�4Ο�*''G�ɓ'�ݢˡ�>y��˶������V�~�R�#;����� �Ν��0�ܽ{ט��Px{{�7##�8_6*���ŋ�޽{1�����kɹ�P�|�m���_��"?�pW�>z���z��ֿ+N�8�;�9`~2&!G����V���k�������b��̂T�y,�����
:��N4˟�%�9�&�/vI^Ӑ�}����Խ�ֿ7���t6� �/����$$99Yw�6���r���-]�]XX��k{������El�_VVV�I�*��8���GKK��9sF���}΃��IWyDƮ]���W���tG෤�$c���1:����TUUɡC����F�o�>�p�tuuq�w ###���^�{�������B �V��-33Ә���<�A]�U���\m٨���=���TTT�;�x'�S�������^�����-??ߘ��{9�6{�w�޽RRR��\ݟ�����{����;֢������l����*�$���Iw �?����������#�nج���{�2h`}555Ƙ�z���@�����u��"� ʕ+W|��oT֫������ �W����֦~qg3�Ν�����ۍIHQQ�� Z��������ٳ�{�n��Q?~���ap��}���2h`}<0ƌ�]6� �o����I�
L���z�>|���lT�Y��ϟ�;w�p�7�X �o||�/iii��#���Ą1 IMM����*�w�ڨ�;&uuu2::�� ��e��� X��l�:^v�ܩ;80���Z'!;v����V����:;;ennN�"�e�@`���1��g6� ޻3 ��/_z�.,,��U^������c���}��8p�/�?� @@�'!O�<�l��АTWWˑ#G���F����U��2h�999�xQ�(`3��$$xfff���ó������*++Kjkk���X �Om�g/---��!���h����3��*oMM�=z��>nT*��۷evvV�bˠ���1ֱ��6� j#&�$D�9�m+WyUHV����a�np�A�QW|�cE]�� ��⫖ߪ���.]�����[*�n�*�
�*0�� �c4�ﱢn��� ��%�ji����
0�I�F�U^� ؘ�p�:NԆ��`����ڄJ] �N�6*v�� +�A���7Ɖz.0l��/�3�6S��N�6*�X#�a�� �潴S���/z�cE�b@�ƻD��\? R��M�H�wA�s���*�cnjI�F��� ������./_�����e���x=�` ��
��*���E~�s�W�/����ȃ*��ذ���������C�n����A��`�9��� `}�Y"����T�GDn��o}FGG���n�Wy����ŋ�݀�QW|��ˠ_��G�q���"�7rK���؇��T�D&"��$u�؝;w<���dc2�Qq���2h`}j/�Q� �"�u�}��j�����!����#�����Ǐ���j���r��Y��",�����eЀI]���L��&�>���2􇅆��{��])))��{���*33S�\�"����݀�`4�>���=�(0�w�'��PT�q����٫��v풂�imm��ϟ�w"#11�8?��x����:>Ԯ�(0�7���P�@�����z�jKWy���d``@�X �M��\`����ݿ`RCYiY]�����1ihh���lc�QY��NOO�w�ˠ���ܹ�#ꗡ0�7�� �ᨪ��𵰰 ]]]��`���3&=աC��ʋ��2h`miii����p�G���4��|D�*��8q˜�lTj)ܙ3g<��r���e��ڼ�m�qaE�����Ci8��*���1�Y�222������߯_ �>�Ak;w�1>ԭ-0�f��"���}( g%�k}@�ڿ�1�Q���:}��477˳g��W��2h��իW��QSS�;�0�fw
�i$j�^��ϟ�Ln�U�K�.I__����2h����ul�'@ ���]��}�D՘��P�p�n� :!!Aww���5�Fnn��������}�D��O��(,�|=~����p�]��>�F���>(��2h�z"sssƸP�y�@��ZY������ ���{�N�Y ��6D���W�^�l� ���}�T��?��x�eЀ���4c\�=#�_`��� D���Rc��2h@�ĉƸP�������q0�X �:w�1.Z[[u6F܌]������dL��c`7�z��1&jjjt6F�,���N���A���f��M#nv�}�D ��`�2h��VAX�Dnn�������-Ίl�G��4�������2h�]�?6����u6F�����Ci8��'�`�a4���Yc<���-4�G��Q�}( g=��ˠӎ;�1����;�>0��߶�ᨪ���A�JMM5���Ą����Df��$��}@ e�}PduE��� xWvv�1�* ��w��Cj(k�V8��x/�޽{���S\\l����6������>�>���Z���/�Ao\�r� ���B��L5��k0�)C�@x/�>����r��-c,\�pAw`}`�n��[��"�Y�?@�����I?ˠ�V===�X����X���["G�>�n�r� 2ѣ��f� 3�Azz������ל%���P�Oe|D��i�f����̘�� n4;;k�VC���])�S��?ot����o�-��J�@�� xcǎ�XXXX�X@�ƻ�<6����w&ߪn�� �O��/ZK6��INN6&��~H�mRSS�q011�;�60�����&��� ���6ƁzV6l� ,��ꌉʡC�t@�X �㠭�Mw`m`a���Z'*�nܸ���2h�]UU�1jkku�F6/^4&+�v풹�9��A��n޼i�� .��� lfffd�ΝƄEM��e�p���nc ������ �� ������A��=zd�����k#��� c��o��a4�L�*������0���^�����Sw��{���p���8c ,..��#��ӧO����T��A�����o��O�>��GO�<1&-�x�8�e��Ν����?n��jU�� b._�lL\�m�&��Ӻ ��8b4ܤ���8����u��D��Ғ$&&��^�c4ܪ���8����t��DTss�1yQ�6 0�����Ip��7o��ŋu��D\VV�1�Q� �,��[y?U��ɓ���"��Q.�ZZZt�?���k�! �{��qޫ���z���Z�i��$%%y���AÍfff��>!!Aw�@Tx��1�Q�v���Aí�}�<���qy��~�Zw�@�P��N�U���ˠX@TIMM5&�gΜ�a4�#�*����^W��� ���D���\cϮ���X 7i}�*�o����[��/�o��m��ӿ)�8� �J�W��?�]'���=�
nGuFFF� ����F���A���f�$�5�vߛ�^����?/Yw�dniN�7"�Jeee�$>>>^fggu�ZX �ZZ]��d�pH���_�cw��w�6`Qinn�z����R���A�i�=�&�)��m��l}��k���W� �Zׯ_7&񪆇�u�ZX '9�}�6��>��A�2tE7 �j�2&�999�`-���ƸQ�)�X��ٵ ����r���� ����yU�o��]ka4b]��"۰��1vC2'#�z�D~����`-Ƹ)..� ��yz�6���~�����´>NE���Ǎ������`�eЈej�*����a��p*0��PUUeL�UMMM�.;���3�̽{�t�^�{Nۆ�p��G���p"0�����,����d�%���X�X���O��p՟W��>ND3Z[[�ɼ���>���eЈ5j7f�P�7�j ���bʱcnj �ѣGu��A#�|�����4ܵ�u�>"NCS�ɼ�[�n�.o,�F�x���} ���4��� _�G�i�b���� }bb�,,,�.+�eЯ_��] z���ۆ�HՋ���8 @�y���l߾ݘ�_�tIwxc4b��޳�A4R�:ު� ���Ĥ��:cB����Ǻ ��eЈimi�A4RU6P�� ���Ĭ��4cR����;�X�X3�6�F�����G�I�b֝;w�I����.�`�2hD��M;m�h��t�i}d�� ��<yҘԧ���+�A#ڥ����HՅ� ��8 @L5&���]�����^�s�N�A#���>eD#UMcM��8 @�+//7&�;v쐗/_�.��X�h��]�TM�O�#�$`1o~~^v��mL�/\`�୲��'EEE�D��Ҝm�D}��3��8 �#455{UCCC� @y��1FX�h���6���v4��G�i�#33Әܟ8qBw�� ���Mԣ��i������8 �c���{U���� @a4���ʢ���_� �᪯�~E '"p��g�����Y]]�],�F�XYY���zy���_�H�H� �᪲�2}$�� �Q�>}jL�UUWW�.E�b�:FX�pR�pQ��KLL��W�\ѝ7V_�ʧ�>mNC]߼�M}�� �q�d�:�W599��X�H�q�$''�_\\�����x�z��6���~��/��g��p*0�Q�����kL�
u��2hn@(ݼy�g偵�/e�l?hTCU��ן �������g�u�>���b4¡��ERSS�s�Z�/555����_a��gV�]G�՟���+;;ۘh9rDw� ��~ y�����Z�|��Uy��~��n%؆�`U��l�I܀ ��}&]j�A#4:::$##�8������2;;�_���|����ӿ)UCU������������8n�2h˝;w$33�8��K�:x��~E�L?����W�a6��q�e�Ք~gnB�h���j��uVQQ����� [�~ir��Q�<򮲲2���֯غ�G����ml׫�e�O���?�ݧw�;p#0�khh𙐍���.�^�ˠw���2h����G�;f�?�u��E��
�U�'sO�L������Ϟ���?��F��P��%_����?�b�E�Y2����\�{3�S�N��n,�F �n�� z���dbbB�"�^.��,m&�X �+ܽ{�g���7����A��l������\�\���by��~D'0�PW}��5uUp���!c\� Vj7��'O�w�_�p[ �XA�j��=qS�n� ��P�9}��q^xי3gdddD�b�����8�C��)p�K�.�e��5::*���]����� �� �U�3�ճ���9�a �f,��Z!�~�a=�+//O�+ 6���͛7}&v�>7�����o� �A��ڴ�ܹs��޻rrr<�`���ґ#G� �z��f,�v��O�zV�X�ޥ�^T�='!p%5��쵵��.�>vˠWVVtN155%�����ڻ������[��� ����wۻw/~�ˠ�����R^^n�|�K�����үg"p���I� ��+Wtp�A;�˗/������zסC����S��� �ժ��}&���8��X����RUU%۶m3~��JOO����
p0WS�zٷo�1)<{�����2�ئ�v��U�//�?Gk8p�=��뵷��L{{{up�AǦ��E������x��g-�ˍ��f�
p'0��ĉ�D133Sww�^�2�(�~6����{�n��f-��E=�@�I����&�܅e������r��5ILL4~V�JJJ��ׯ�W0h/^4&��������� ���ˍ7$99��YkϞ=�p�B2�DM=.�{���L�m����q�2�蠖1{o�g-�K���:Y^^֯x#���j�=��]�=X=ZZZ$55��yXk�ΝRSS�� �>0xQ�ƴN.O�<�;�{\�|�,�?��"��"���Z�ʼz�z��?`�r��=���;wtp�AGNGG�ddd��R�����կ�� 6����fZZ�����_�����G�Y���UYY�ٯ�9`����c����\p�A�GWW�9r��^{WYY�LOO�W6� k�~���ۙ��U�A��p����ȱcnj�w�dzMMM�W�� kXXX���Dc2z��y�܁e��w��}���6���URR"O�>կ �q��-���������2�������\���]�������
@��`G�5&�j�"�,�޺��A��Ԭ�G�*,,���1�
@��`ꪍ�d���Ew�c�� ��(�]gΜ����
@���jY�uҚ���U0�ˠ3::*��̻T0V^`��څ�{[UU����� �?j �Z�l�^y�Z
��D"� ~����̎���.�l,�^�ڴ�ܹs��ǻrrr<�S"� ؿ�1�U�7`�/��"��"��Ż���c�с �}������Gw�R5Y���۷�v��%��ŋ��û������[�-� ���:�=t�����e�ϟ?���r�{�]G����.�
@�!@��7Ru��u��Km�f=��r �˗/������{Wff�tvv�W�6���Ԙ��ڵKfggup&�-�VcZ��m۶nk���KGG�~ ��`��8>>ޘ����.�\iii�y�ī��^���W�z�d��Z�����֦_�`ؤ��F�I��B8���A/..zw���-k�������+�� [���aL�sssup&�e�KKK��VVV���^v��m�٬�o�>�y�~ V�` �cN�'��QI��9e��ׯ�ڵk���h�y�����&w� `آ3g�f���ɜ� �ƍ�pk�sXkϞ=�p�B2�9��EO�<�<����.�<�e� RTT$������2f���:^���A���N��܌ Ap��e����g�tp���
��������Uju��8}[;w��l��6�8�@m���dL����u@��G�GYǦ�ԣ��#�ԣ��G� iii�\����.�2���Ԍ�������٥�Z۶m��P����(++˘d����m���"���H�/�l�G"?�9]��H����"5�"�M�E�q�����4ơwUVV�˗/�+nB� RW|�'���C��Z��d~�v����4���o����.9r����Vyy�LOO�W܈ Av��9cҭ� fc8��soB�]� ����;!��~��Q��>v�1���ŋ255�_p30��¤�/�N�ս��#\�+�0��:�G"s�����Kvv�1μ���D�>}�_BB=�{2�� Ĭ��E�>a`�Q�yܩ?lm}}}����3���v`g��� D��9z��i�b�̸HƇ�k0+�� ����r��IcLyWaa�����W�� !����3A�w��1��g�k(J] ����Ƴg�|ƒ�
dddD5k#@���u�\R ��}�>����=�^***���*??_����W�10���*�=ioll�] ��V��pT��;�/~6��Rh�$�@� ���ʌ�s�N����] ���3~�U�~��%} o\�~ݳ �E�����]�v!X=��jw��i8�q�>�� ap�� #��]
���}( g�}P �A�09t��srrt�2/��H�� }Pl¤�����:::t�"m��a4U�S[G�0R�+����y����Q��_ۇ�H�Z� @�� �&&&�����Fw�(��I�0�J~�>(�� aVUU�����t���kF#U�W���5`���eINN6pQQ��Q`����Hի���0D@kk��U=x�@w���}�/��H�`���Ǐ��ѣ����<y�D�ݻ'���RZZ*������*۶m���i��Z�/��H�O�g}Pl"d``���nݺ��@`fffdxxXn߾��X���X���$))��<󮑑�.���؇�HԾ�
��#@�?�g!D]�������)����9���,�/_�ӧOKFF�����6����ԟ��}�>�F�N~Y[G�z���$&&J[[��_�f ���c������ �����:}Zg�}�D�'�`��a*��enyN�VIRs��E�_���}����-/��|���囗�) ��r�R^,�QP,x�� IGGG�K�7[۷o���4��˓��2�~��tww����,--�#�������G����:0D�c7��uߗ�f�7��n�w�n��j���Re������ҥKA[��^�޽[233�����閖���gϞ�# P���p֡_�@p� �t>��\� ���7*�!���V�X�*_�vM.^�(999!_�����W���e���]�����>� �_iJ�Y��\`��av+��e�~w�{�rQQ��QU�m�p��.U.//�7nHOO��K�C��g�i8*�� 0D���~�6���u�[2�4�? o�������R���tٹs�m@ Fy/Unmm�<��Y��`�}8 G�9���!@��E�FVv�5������Ҍ�T�x�ꕌ��IWWWX�*�ݻ�g��������/"��������@p� ����omk(Jm'RK�>|(���R]]���qqqr��9y��R���e}dr���j(���E^�� ��!���P�����R�7oJee����e���Ç��ٳr�ʕ�^�j���p�|�WE^�� ���OZmj8*��T�… r�� III� ����K�KJJ���^�ܹ�K�CM��P^ ���;����0B� �'�bN�Qp��Q�׋/|�*9rD���cN�Q�K�������W&&&��T9���ح�ſ�o@h� �j�kl�i8�b�E}4����"O�>����K�<(;v� �������ʃ�����s}d���"ٿgf�C�.�]����#@���տ� ���\���F-U~��ܽ{W¶Ty߾}�����Ty~~^"��B��W���z��Y���&�����S�@�x>����v�r[[�\�zU
òTY])>u�TTTK�ՕeD�� �ۧEJ�V�اD��Wd�?{��o���fg���i���/ ��F%}%�a4�{/W����p,UV�Zk�Y� ‰ a���?� �����~O������5�z�TY-�VK��Ri�d��� � ��Z�U�0��ܹ��zC=��.�ZK]!�.UV�]�M���W,Uю a��ۆ�Hԯ���>�7T�U!W�����.UV��{�b�H�N�0�ZZ]�G�������F���m�T-�,�#p>0��o��M� ��w9�N�;� ����؆�Hԧ
?��
��F_���a4��+��G�`�Sݧl�h$���C��܁ a4�|�6�F�nO��G�`����6���>���h܃ aVt��6�����f�p0D�g�}�6���~��o���>� @��ۆ�pTAo�>
w!@���ᇶ5�����?�}�!�+��� _� ����}F�^M�Op0D��哅�� ���_?��ro��Tw"@� >�/�|�6��>U�)��ҟ�^`��K������ح�w�|G��?՟�n`�"��+��m� �>��a9�}R�+0D���+r��q���߳ �땺�8�v��-��w�[`�b-OZd�~�F�7<Yy^u���_��d�1vC�
v�C^-���ӫj~y^����
`�+��@��
`�+��@��"�?�S����IEND�B`�
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment