{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"type": "text/vnd.tiddlywiki",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007\nCopyright © UnaMesa Association 2007-2014\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of the UnaMesa Association nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n"
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z M85.1274062,95.4080042 C81.5494069,95.3047989 79.9756384,95.3136745 78.1534289,92.2560668 L76.733228,92.2975844 C75.0801573,92.2226776 75.7690718,92.256631 74.6662332,92.2006037 C72.822332,92.1273894 73.1177105,90.3396383 72.7933215,89.3950941 C72.2744094,86.1888106 73.4800004,82.9659571 73.4419681,79.7590415 C73.428503,78.6206623 71.8498363,74.5912119 71.2858469,73.150598 C69.5178104,73.490271 67.7401827,73.5550323 65.9465048,73.6462337 C61.8120677,73.6358996 57.7056703,73.1192806 53.628962,72.4632293 C52.8345141,75.8119659 50.473106,80.4990751 52.4249964,83.9024219 C54.794228,87.4227874 56.45684,88.3980868 59.0339286,88.6103485 C61.6109895,88.8224384 62.1929077,91.7913467 61.5694236,92.8517379 C61.0175661,93.5845847 60.0476425,93.7176093 59.2235739,93.8951553 L57.5752147,93.9742093 C56.2780933,93.9296822 55.1187057,93.5723203 53.9629071,93.0211763 C52.0327307,91.9217335 50.0392154,89.6360411 48.5580719,87.9950695 C48.9028934,88.6503604 49.1085703,89.9296134 48.7958122,90.5249222 C47.9200982,91.7907825 44.1326257,91.7830485 42.3980986,90.996433 C40.4277043,90.1030197 35.6664658,83.8299171 34.9303347,79.1316435 C36.8887135,75.3525836 39.7416856,72.0607931 41.1850909,67.9459622 C38.038852,65.8974525 36.3537697,62.5626501 36.5725198,58.7851619 L36.6514762,58.3478913 C33.5557196,58.9392548 35.1611076,58.7192345 31.8308843,58.9762949 C21.2252017,58.9431831 11.8983553,51.6054609 17.1501626,40.2013394 C17.4916881,39.5260388 17.8165752,38.9120742 18.3955298,39.205288 C18.8602051,39.440565 18.793457,40.3843583 18.5597268,41.4309776 C15.5577203,55.057365 30.2297484,55.161659 39.2489049,52.6401668 C40.1440491,52.3898612 41.9243599,50.7040626 43.1576153,50.1452033 C45.1734825,49.231769 47.3615008,48.8611654 49.5329344,48.5941256 C54.9337165,47.9661653 61.4247946,50.8693254 64.7228943,50.9641212 C68.0210328,51.0589131 72.7127563,50.1582941 75.5928121,50.3479196 C77.6825379,50.4454833 79.734518,50.8303777 81.7507717,51.3786556 C83.0558682,44.8897102 83.1481363,40.1071855 86.2420439,39 C88.0578592,39.2926449 89.4570618,41.8175853 90.4927503,43.1666676 C92.6062592,43.0809984 94.6134653,43.6270518 96.6091885,44.233091 C100.222332,43.7098824 103.254293,41.6394732 106.445091,40.0288813 C103.211767,42.7223157 102.77315,47.1042714 103.142605,51.1564486 C103.280001,53.2591496 102.697713,55.5420684 101.977868,57.6949551 C100.630795,61.2025356 98.0292951,64.8997754 95.009908,64.7101481 C93.868464,64.673306 93.2053722,64.0138 92.3570101,63.3096933 C92.1924386,64.7358711 91.5456263,66.0084523 90.9221089,67.2697748 C89.4822206,70.066388 85.7194927,71.2987762 82.2354164,74.2849828 C78.7515768,77.2712347 83.3502408,87.9363951 84.4652464,89.8796277 C85.5800708,91.8230453 88.6922789,92.5339992 87.484639,94.28798 C87.1151913,94.8672415 86.5502884,95.0744181 85.9465544,95.2991347 L85.1274062,95.4080042 Z M45.0303574,86.5575217 L45.5828655,86.699414 C46.277142,86.4290005 47.6727292,86.8469317 48.4130246,87.0512628 C47.0498362,85.7357167 44.9960929,83.8038623 43.5164417,82.5859671 C43.0307739,81.1115156 43.2380006,79.6278431 43.3424927,78.122648 L43.3634516,77.9981264 C42.7802099,79.2030731 42.040056,80.3743566 41.6422405,81.6426885 C41.176708,83.3537773 43.7112632,85.1999538 44.6940603,86.2580263 L45.0303574,86.5575217 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-advanced-search-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M74.5651535,87.9848361 C66.9581537,93.0488876 57.8237115,96 48,96 C21.490332,96 0,74.509668 0,48 C0,21.490332 21.490332,0 48,0 C74.509668,0 96,21.490332 96,48 C96,57.8541369 93.0305793,67.0147285 87.9377231,74.6357895 L122.284919,108.982985 C125.978897,112.676963 125.973757,118.65366 122.284271,122.343146 C118.593975,126.033442 112.613238,126.032921 108.92411,122.343793 L74.5651535,87.9848361 Z M48,80 C65.673112,80 80,65.673112 80,48 C80,30.326888 65.673112,16 48,16 C30.326888,16 16,30.326888 16,48 C16,65.673112 30.326888,80 48,80 Z\"></path>\n <circle cx=\"48\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"28\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"68\" cy=\"48\" r=\"8\"></circle>\n </g>\n</svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\"></svg>"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n\t<g fill-rule=\"evenodd\">\n\t <path d=\"M64,76.3137085 L47.0294734,93.2842351 C43.9038742,96.4098343 38.8399231,96.4084656 35.7157288,93.2842712 C32.5978915,90.166434 32.5915506,85.0947409 35.7157649,81.9705266 L52.6862915,65 L35.7157649,48.0294734 C32.5901657,44.9038742 32.5915344,39.8399231 35.7157288,36.7157288 C38.833566,33.5978915 43.9052591,33.5915506 47.0294734,36.7157649 L64,53.6862915 L80.9705266,36.7157649 C84.0961258,33.5901657 89.1600769,33.5915344 92.2842712,36.7157288 C95.4021085,39.833566 95.4084494,44.9052591 92.2842351,48.0294734 L75.3137085,65 L92.2842351,81.9705266 C95.4098343,85.0961258 95.4084656,90.1600769 92.2842712,93.2842712 C89.166434,96.4021085 84.0947409,96.4084494 80.9705266,93.2842351 L64,76.3137085 Z M64,129 C99.346224,129 128,100.346224 128,65 C128,29.653776 99.346224,1 64,1 C28.653776,1 1.13686838e-13,29.653776 1.13686838e-13,65 C1.13686838e-13,100.346224 28.653776,129 64,129 Z M64,113 C90.509668,113 112,91.509668 112,65 C112,38.490332 90.509668,17 64,17 C37.490332,17 16,38.490332 16,65 C16,91.509668 37.490332,113 64,113 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-down tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 40.500000) rotate(-270.000000) translate(-64.000000, -40.500000) translate(-22.500000, -26.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-left tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\" version=\"1.1\">\n <g fill-rule=\"evenodd\" transform=\"translate(92.500000, 64.000000) rotate(-180.000000) translate(-92.500000, -64.000000) translate(6.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-right tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\" transform=\"translate(-48.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-up tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 89.500000) rotate(-90.000000) translate(-64.000000, -89.500000) translate(-22.500000, 22.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-clone-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M32.2650915,96 L32.2650915,120.002359 C32.2650915,124.419334 35.8432884,128 40.2627323,128 L120.002359,128 C124.419334,128 128,124.421803 128,120.002359 L128,40.2627323 C128,35.8457573 124.421803,32.2650915 120.002359,32.2650915 L96,32.2650915 L96,48 L108.858899,48 C110.519357,48 111.853018,49.3405131 111.853018,50.9941198 L111.853018,108.858899 C111.853018,110.519357 110.512505,111.853018 108.858899,111.853018 L50.9941198,111.853018 C49.333661,111.853018 48,110.512505 48,108.858899 L48,96 L32.2650915,96 Z\"></path>\n <path d=\"M40,56 L32.0070969,56 C27.5881712,56 24,52.418278 24,48 C24,43.5907123 27.5848994,40 32.0070969,40 L40,40 L40,32.0070969 C40,27.5881712 43.581722,24 48,24 C52.4092877,24 56,27.5848994 56,32.0070969 L56,40 L63.9929031,40 C68.4118288,40 72,43.581722 72,48 C72,52.4092877 68.4151006,56 63.9929031,56 L56,56 L56,63.9929031 C56,68.4118288 52.418278,72 48,72 C43.5907123,72 40,68.4151006 40,63.9929031 L40,56 Z M7.9992458,0 C3.58138434,0 0,3.5881049 0,7.9992458 L0,88.0007542 C0,92.4186157 3.5881049,96 7.9992458,96 L88.0007542,96 C92.4186157,96 96,92.4118951 96,88.0007542 L96,7.9992458 C96,3.58138434 92.4118951,0 88.0007542,0 L7.9992458,0 Z M19.0010118,16 C17.3435988,16 16,17.336731 16,19.0010118 L16,76.9989882 C16,78.6564012 17.336731,80 19.0010118,80 L76.9989882,80 C78.6564012,80 80,78.663269 80,76.9989882 L80,19.0010118 C80,17.3435988 78.663269,16 76.9989882,16 L19.0010118,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-close-all-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\" transform=\"translate(-23.000000, -23.000000)\">\n <path d=\"M43,131 L22.9976794,131 C18.5827987,131 15,127.418278 15,123 C15,118.590712 18.5806831,115 22.9976794,115 L43,115 L43,94.9976794 C43,90.5827987 46.581722,87 51,87 C55.4092877,87 59,90.5806831 59,94.9976794 L59,115 L79.0023206,115 C83.4172013,115 87,118.581722 87,123 C87,127.409288 83.4193169,131 79.0023206,131 L59,131 L59,151.002321 C59,155.417201 55.418278,159 51,159 C46.5907123,159 43,155.419317 43,151.002321 L43,131 Z\" transform=\"translate(51.000000, 123.000000) rotate(-45.000000) translate(-51.000000, -123.000000) \"></path>\n <path d=\"M43,59 L22.9976794,59 C18.5827987,59 15,55.418278 15,51 C15,46.5907123 18.5806831,43 22.9976794,43 L43,43 L43,22.9976794 C43,18.5827987 46.581722,15 51,15 C55.4092877,15 59,18.5806831 59,22.9976794 L59,43 L79.0023206,43 C83.4172013,43 87,46.581722 87,51 C87,55.4092877 83.4193169,59 79.0023206,59 L59,59 L59,79.0023206 C59,83.4172013 55.418278,87 51,87 C46.5907123,87 43,83.4193169 43,79.0023206 L43,59 Z\" transform=\"translate(51.000000, 51.000000) rotate(-45.000000) translate(-51.000000, -51.000000) \"></path>\n <path d=\"M115,59 L94.9976794,59 C90.5827987,59 87,55.418278 87,51 C87,46.5907123 90.5806831,43 94.9976794,43 L115,43 L115,22.9976794 C115,18.5827987 118.581722,15 123,15 C127.409288,15 131,18.5806831 131,22.9976794 L131,43 L151.002321,43 C155.417201,43 159,46.581722 159,51 C159,55.4092877 155.419317,59 151.002321,59 L131,59 L131,79.0023206 C131,83.4172013 127.418278,87 123,87 C118.590712,87 115,83.4193169 115,79.0023206 L115,59 Z\" transform=\"translate(123.000000, 51.000000) rotate(-45.000000) translate(-123.000000, -51.000000) \"></path>\n <path d=\"M115,131 L94.9976794,131 C90.5827987,131 87,127.418278 87,123 C87,118.590712 90.5806831,115 94.9976794,115 L115,115 L115,94.9976794 C115,90.5827987 118.581722,87 123,87 C127.409288,87 131,90.5806831 131,94.9976794 L131,115 L151.002321,115 C155.417201,115 159,118.581722 159,123 C159,127.409288 155.419317,131 151.002321,131 L131,131 L131,151.002321 C131,155.417201 127.418278,159 123,159 C118.590712,159 115,155.419317 115,151.002321 L115,131 Z\" transform=\"translate(123.000000, 123.000000) rotate(-45.000000) translate(-123.000000, -123.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M65.0864256,75.4091629 L14.9727349,125.522854 C11.8515951,128.643993 6.78104858,128.64922 3.65685425,125.525026 C0.539017023,122.407189 0.5336324,117.334539 3.65902635,114.209145 L53.7727171,64.0954544 L3.65902635,13.9817637 C0.537886594,10.8606239 0.532659916,5.79007744 3.65685425,2.6658831 C6.77469148,-0.451954124 11.8473409,-0.457338747 14.9727349,2.66805521 L65.0864256,52.7817459 L115.200116,2.66805521 C118.321256,-0.453084553 123.391803,-0.458311231 126.515997,2.6658831 C129.633834,5.78372033 129.639219,10.8563698 126.513825,13.9817637 L76.4001341,64.0954544 L126.513825,114.209145 C129.634965,117.330285 129.640191,122.400831 126.515997,125.525026 C123.39816,128.642863 118.32551,128.648248 115.200116,125.522854 L65.0864256,75.4091629 L65.0864256,75.4091629 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-others-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z M64,96 C81.673112,96 96,81.673112 96,64 C96,46.326888 81.673112,32 64,32 C46.326888,32 32,46.326888 32,64 C32,81.673112 46.326888,96 64,96 Z M64,80 C72.836556,80 80,72.836556 80,64 C80,55.163444 72.836556,48 64,48 C55.163444,48 48,55.163444 48,64 C48,72.836556 55.163444,80 64,80 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\" transform=\"translate(12.000000, 0.000000)\">\n <rect x=\"0\" y=\"11\" width=\"105\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"28\" y=\"0\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"112\" width=\"88\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"56\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"32\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n </g>\n</svg>"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M3.52445141,76.8322939 C2.07397484,75.3828178 1.17514421,73.3795385 1.17514421,71.1666288 L1.17514421,23.1836596 C1.17514421,18.7531992 4.75686621,15.1751442 9.17514421,15.1751442 C13.5844319,15.1751442 17.1751442,18.7606787 17.1751442,23.1836596 L17.1751442,63.1751442 L119.173716,63.1751442 C123.590457,63.1751442 127.175144,66.7568662 127.175144,71.1751442 C127.175144,75.5844319 123.592783,79.1751442 119.173716,79.1751442 L9.17657227,79.1751442 C6.96796403,79.1751442 4.9674142,78.279521 3.51911285,76.8315312 Z\" id=\"Rectangle-285\" transform=\"translate(64.175144, 47.175144) rotate(-45.000000) translate(-64.175144, -47.175144) \"></path>\n </g>\n</svg>"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <path d=\"M109.35638,81.3533152 C107.923899,82.7869182 105.94502,83.6751442 103.759224,83.6751442 L24.5910645,83.6751442 C20.225873,83.6751442 16.6751442,80.1307318 16.6751442,75.7584775 C16.6751442,71.3951199 20.2192225,67.8418109 24.5910645,67.8418109 L95.8418109,67.8418109 L95.8418109,-3.40893546 C95.8418109,-7.77412698 99.3862233,-11.3248558 103.758478,-11.3248558 C108.121835,-11.3248558 111.675144,-7.78077754 111.675144,-3.40893546 L111.675144,75.7592239 C111.675144,77.9416955 110.789142,79.9205745 109.356651,81.3538862 Z\" transform=\"translate(64.175144, 36.175144) rotate(45.000000) translate(-64.175144, -36.175144) \"></path>\n</svg>"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-download-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\"><g fill-rule=\"evenodd\"><path class=\"tc-image-download-button-ring\" d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"/><path d=\"M34.3496823,66.4308767 L61.2415823,93.634668 C63.0411536,95.4551107 65.9588502,95.4551107 67.7584215,93.634668 L94.6503215,66.4308767 C96.4498928,64.610434 96.4498928,61.6588981 94.6503215,59.8384554 C93.7861334,58.9642445 92.6140473,58.4731195 91.3919019,58.4731195 L82.9324098,58.4731195 C80.3874318,58.4731195 78.3243078,56.3860674 78.3243078,53.8115729 L78.3243078,38.6615466 C78.3243078,36.0870521 76.2611837,34 73.7162058,34 L55.283798,34 C52.7388201,34 50.675696,36.0870521 50.675696,38.6615466 L50.675696,38.6615466 L50.675696,53.8115729 C50.675696,56.3860674 48.612572,58.4731195 46.0675941,58.4731195 L37.608102,58.4731195 C35.063124,58.4731195 33,60.5601716 33,63.134666 C33,64.3709859 33.4854943,65.5566658 34.3496823,66.4308767 L34.3496823,66.4308767 Z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M116.870058,45.3431458 L108.870058,45.3431458 L108.870058,45.3431458 L108.870058,61.3431458 L116.870058,61.3431458 L116.870058,45.3431458 Z M124.870058,45.3431458 L127.649881,45.3431458 C132.066101,45.3431458 135.656854,48.9248678 135.656854,53.3431458 C135.656854,57.7524334 132.07201,61.3431458 127.649881,61.3431458 L124.870058,61.3431458 L124.870058,45.3431458 Z M100.870058,45.3431458 L15.6638275,45.3431458 C15.5064377,45.3431458 15.3501085,45.3476943 15.1949638,45.3566664 L15.1949638,45.3566664 C15.0628002,45.3477039 14.928279,45.3431458 14.7913977,45.3431458 C6.68160973,45.3431458 -8.34314575,53.3431458 -8.34314575,53.3431458 C-8.34314575,53.3431458 6.85614548,61.3431458 14.7913977,61.3431458 C14.9266533,61.3431458 15.0596543,61.3384973 15.190398,61.3293588 C15.3470529,61.3385075 15.5049057,61.3431458 15.6638275,61.3431458 L100.870058,61.3431458 L100.870058,45.3431458 L100.870058,45.3431458 Z\" transform=\"translate(63.656854, 53.343146) rotate(-45.000000) translate(-63.656854, -53.343146) \"></path>\n <path d=\"M35.1714596,124.189544 C41.9594858,123.613403 49.068777,121.917633 58.85987,118.842282 C60.6854386,118.268877 62.4306907,117.705515 65.1957709,116.802278 C81.1962861,111.575575 87.0734839,109.994907 93.9414474,109.655721 C102.29855,109.242993 107.795169,111.785371 111.520478,118.355045 C112.610163,120.276732 115.051363,120.951203 116.97305,119.861518 C118.894737,118.771832 119.569207,116.330633 118.479522,114.408946 C113.146151,105.003414 104.734907,101.112919 93.5468356,101.66546 C85.6716631,102.054388 79.4899908,103.716944 62.7116783,109.197722 C59.9734132,110.092199 58.2519873,110.64787 56.4625698,111.20992 C37.002649,117.322218 25.6914684,118.282267 16.8654804,112.957098 C14.9739614,111.815848 12.5154166,112.424061 11.3741667,114.31558 C10.2329168,116.207099 10.84113,118.665644 12.7326489,119.806894 C19.0655164,123.627836 26.4866335,124.926678 35.1714596,124.189544 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-export-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00348646,127.999999 C8.00464867,128 8.00581094,128 8.00697327,128 L119.993027,128 C122.205254,128 124.207939,127.101378 125.657096,125.651198 L125.656838,125.65759 C127.104563,124.210109 128,122.21009 128,119.999949 L128,56.0000511 C128,51.5817449 124.409288,48 120,48 C115.581722,48 112,51.5797863 112,56.0000511 L112,112 L16,112 L16,56.0000511 C16,51.5817449 12.4092877,48 8,48 C3.581722,48 7.10542736e-15,51.5797863 7.10542736e-15,56.0000511 L7.10542736e-15,119.999949 C7.10542736e-15,124.418255 3.59071231,128 8,128 C8.00116233,128 8.0023246,128 8.00348681,127.999999 Z M56.6235633,27.3113724 L47.6580188,36.2769169 C44.5333664,39.4015692 39.4634864,39.4061295 36.339292,36.2819351 C33.2214548,33.1640979 33.2173444,28.0901742 36.3443103,24.9632084 L58.9616908,2.34582788 C60.5248533,0.782665335 62.5748436,0.000361191261 64.624516,2.38225238e-14 L64.6193616,0.00151809229 C66.6695374,0.000796251595 68.7211167,0.781508799 70.2854358,2.34582788 L92.9028163,24.9632084 C96.0274686,28.0878607 96.0320289,33.1577408 92.9078345,36.2819351 C89.7899973,39.3997724 84.7160736,39.4038827 81.5891078,36.2769169 L72.6235633,27.3113724 L72.6235633,88.5669606 C72.6235633,92.9781015 69.0418413,96.5662064 64.6235633,96.5662064 C60.2142756,96.5662064 56.6235633,92.984822 56.6235633,88.5669606 L56.6235633,27.3113724 L56.6235633,27.3113724 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-full-screen-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g>\n <g>\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 104.000000) rotate(-180.000000) translate(-104.000000, -104.000000) translate(80.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(24.000000, 104.000000) rotate(-90.000000) translate(-24.000000, -104.000000) translate(0.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 24.000000) rotate(90.000000) translate(-104.000000, -24.000000) translate(80.000000, 0.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n </g>\n</svg>"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-globe tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M72.8111354,37.1275855 C72.8111354,37.9789875 72.8111354,38.8303894 72.8111354,39.6817913 C72.8111354,41.8784743 73.7885604,46.5631866 72.8111354,48.5143758 C71.3445471,51.4420595 68.1617327,52.0543531 66.4170946,54.3812641 C65.2352215,55.9575873 61.7987417,64.9821523 62.7262858,67.3005778 C66.6959269,77.2228204 74.26087,70.4881886 80.6887657,76.594328 C81.5527211,77.415037 83.5758191,78.8666631 83.985137,79.8899578 C87.2742852,88.1128283 76.4086873,94.8989524 87.7419325,106.189751 C88.9872885,107.430443 91.555495,102.372895 91.8205061,101.575869 C92.6726866,99.0129203 98.5458765,96.1267309 100.908882,94.5234439 C102.928056,93.1534443 105.782168,91.8557166 107.236936,89.7775886 C109.507391,86.5342557 108.717505,82.2640435 110.334606,79.0328716 C112.473794,74.7585014 114.163418,69.3979002 116.332726,65.0674086 C120.230862,57.2857361 121.054075,67.1596684 121.400359,67.5059523 C121.757734,67.8633269 122.411167,67.5059523 122.916571,67.5059523 C123.011132,67.5059523 124.364019,67.6048489 124.432783,67.5059523 C125.0832,66.5705216 123.390209,49.5852316 123.114531,48.2089091 C121.710578,41.1996597 116.17083,32.4278331 111.249523,27.7092761 C104.975994,21.6942076 104.160516,11.5121686 92.9912146,12.7547535 C92.7872931,12.7774397 87.906794,22.9027026 85.2136766,26.2672064 C81.486311,30.9237934 82.7434931,22.1144904 78.6876623,22.1144904 C78.6065806,22.1144904 77.5045497,22.0107615 77.4353971,22.1144904 C76.8488637,22.9942905 75.9952305,26.0101404 75.1288269,26.5311533 C74.8635477,26.6906793 73.4071369,26.2924966 73.2826811,26.5311533 C71.0401728,30.8313939 81.5394677,28.7427264 79.075427,34.482926 C76.7225098,39.9642538 72.747373,32.4860199 72.747373,43.0434079\"></path>\n <path d=\"M44.4668556,7.01044608 C54.151517,13.1403033 45.1489715,19.2084878 47.1611905,23.2253896 C48.8157833,26.5283781 51.4021933,28.6198851 48.8753629,33.038878 C46.8123257,36.6467763 42.0052989,37.0050492 39.251679,39.7621111 C36.2115749,42.8060154 33.7884281,48.7028116 32.4624592,52.6732691 C30.8452419,57.5158356 47.0088721,59.5388126 44.5246867,63.6811917 C43.1386839,65.9923513 37.7785192,65.1466282 36.0880227,63.8791519 C34.9234453,63.0059918 32.4946425,63.3331166 31.6713597,62.0997342 C29.0575851,58.1839669 29.4107339,54.0758543 28.0457962,49.9707786 C27.1076833,47.1493864 21.732611,47.8501656 20.2022714,49.3776393 C19.6790362,49.8998948 19.8723378,51.1703278 19.8723378,51.8829111 C19.8723378,57.1682405 26.9914913,55.1986414 26.9914913,58.3421973 C26.9914913,72.9792302 30.9191897,64.8771867 38.1313873,69.6793121 C48.1678018,76.3618966 45.9763926,76.981595 53.0777543,84.0829567 C56.7511941,87.7563965 60.8192437,87.7689005 62.503478,93.3767069 C64.1046972,98.7081071 53.1759798,98.7157031 50.786754,100.825053 C49.663965,101.816317 47.9736094,104.970571 46.5680513,105.439676 C44.7757187,106.037867 43.334221,105.93607 41.6242359,107.219093 C39.1967302,109.040481 37.7241465,112.151588 37.6034934,112.030935 C35.4555278,109.88297 34.0848666,96.5511248 33.7147244,93.7726273 C33.1258872,89.3524817 28.1241923,88.2337027 26.7275443,84.7420826 C25.1572737,80.8164061 28.2518481,75.223612 25.599097,70.9819941 C19.0797019,60.557804 13.7775712,56.4811506 10.2493953,44.6896152 C9.3074899,41.5416683 13.5912267,38.1609942 15.1264825,35.8570308 C17.0029359,33.0410312 17.7876232,30.0028946 19.8723378,27.2224065 C22.146793,24.1888519 40.8551166,9.46076832 43.8574051,8.63490613 L44.4668556,7.01044608 Z\"></path>\n <path d=\"M64,126 C98.2416545,126 126,98.2416545 126,64 C126,29.7583455 98.2416545,2 64,2 C29.7583455,2 2,29.7583455 2,64 C2,98.2416545 29.7583455,126 64,126 Z M64,120 C94.927946,120 120,94.927946 120,64 C120,33.072054 94.927946,8 64,8 C33.072054,8 8,33.072054 8,64 C8,94.927946 33.072054,120 64,120 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/help": {
"title": "$:/core/images/help",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-help tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M36.0548906,111.44117 C30.8157418,115.837088 20.8865444,118.803477 9.5,118.803477 C7.86465619,118.803477 6.25937294,118.742289 4.69372699,118.624467 C12.612543,115.984876 18.7559465,110.02454 21.0611049,102.609942 C8.74739781,92.845129 1.04940554,78.9359851 1.04940554,63.5 C1.04940554,33.9527659 29.2554663,10 64.0494055,10 C98.8433448,10 127.049406,33.9527659 127.049406,63.5 C127.049406,93.0472341 98.8433448,117 64.0494055,117 C53.9936953,117 44.48824,114.999337 36.0548906,111.44117 L36.0548906,111.44117 Z M71.4042554,77.5980086 C71.406883,77.2865764 71.4095079,76.9382011 71.4119569,76.5610548 C71.4199751,75.3262169 71.4242825,74.0811293 71.422912,72.9158546 C71.4215244,71.736154 71.4143321,70.709635 71.4001396,69.8743525 C71.4078362,68.5173028 71.9951951,67.7870427 75.1273009,65.6385471 C75.2388969,65.5619968 76.2124091,64.8981068 76.5126553,64.6910879 C79.6062455,62.5580654 81.5345849,60.9050204 83.2750652,58.5038955 C85.6146327,55.2762841 86.8327108,51.426982 86.8327108,46.8554323 C86.8327108,33.5625756 76.972994,24.9029551 65.3778484,24.9029551 C54.2752771,24.9029551 42.8794554,34.5115163 41.3121702,47.1975534 C40.9043016,50.4989536 43.2499725,53.50591 46.5513726,53.9137786 C49.8527728,54.3216471 52.8597292,51.9759763 53.2675978,48.6745761 C54.0739246,42.1479456 60.2395837,36.9492759 65.3778484,36.9492759 C70.6427674,36.9492759 74.78639,40.5885487 74.78639,46.8554323 C74.78639,50.4892974 73.6853224,52.008304 69.6746221,54.7736715 C69.4052605,54.9593956 68.448509,55.6118556 68.3131127,55.7047319 C65.6309785,57.5445655 64.0858213,58.803255 62.6123358,60.6352315 C60.5044618,63.2559399 59.3714208,66.3518252 59.3547527,69.9487679 C59.3684999,70.8407274 59.3752803,71.8084521 59.3765995,72.9300232 C59.3779294,74.0607297 59.3737237,75.2764258 59.36589,76.482835 C59.3634936,76.8518793 59.3609272,77.1924914 59.3583633,77.4963784 C59.3568319,77.6778944 59.3556368,77.8074256 59.3549845,77.8730928 C59.3219814,81.1994287 61.9917551,83.9227111 65.318091,83.9557142 C68.644427,83.9887173 71.3677093,81.3189435 71.4007124,77.9926076 C71.4014444,77.9187458 71.402672,77.7856841 71.4042554,77.5980086 Z M65.3778489,102.097045 C69.5359735,102.097045 72.9067994,98.7262189 72.9067994,94.5680944 C72.9067994,90.4099698 69.5359735,87.0391439 65.3778489,87.0391439 C61.2197243,87.0391439 57.8488984,90.4099698 57.8488984,94.5680944 C57.8488984,98.7262189 61.2197243,102.097045 65.3778489,102.097045 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M112.9847,119.501583 C112.99485,119.336814 113,119.170705 113,119.003406 L113,67.56802 C116.137461,70.5156358 121.076014,70.4518569 124.133985,67.3938855 C127.25818,64.2696912 127.260618,59.2068102 124.131541,56.0777326 L70.3963143,2.34250601 C68.8331348,0.779326498 66.7828947,-0.000743167069 64.7337457,1.61675364e-05 C62.691312,-0.00409949529 60.6426632,0.777559815 59.077717,2.34250601 L33,28.420223 L33,28.420223 L33,8.00697327 C33,3.58484404 29.4092877,0 25,0 C20.581722,0 17,3.59075293 17,8.00697327 L17,44.420223 L5.3424904,56.0777326 C2.21694607,59.2032769 2.22220878,64.2760483 5.34004601,67.3938855 C8.46424034,70.5180798 13.5271213,70.5205187 16.6561989,67.3914411 L17,67.04764 L17,119.993027 C17,119.994189 17.0000002,119.995351 17.0000007,119.996514 C17.0000002,119.997675 17,119.998838 17,120 C17,124.418278 20.5881049,128 24.9992458,128 L105.000754,128 C109.418616,128 113,124.409288 113,120 C113,119.832611 112.99485,119.666422 112.9847,119.501583 Z M97,112 L97,51.5736087 L97,51.5736087 L64.7370156,19.3106244 L33,51.04764 L33,112 L97,112 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-import-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M105.449437,94.2138951 C105.449437,94.2138951 110.049457,94.1897106 110.049457,99.4026111 C110.049457,104.615512 105.163246,104.615511 105.163246,104.615511 L45.0075072,105.157833 C45.0075072,105.157833 0.367531803,106.289842 0.367532368,66.6449212 C0.367532934,27.0000003 45.0428249,27.0000003 45.0428249,27.0000003 L105.532495,27.0000003 C105.532495,27.0000003 138.996741,25.6734987 138.996741,55.1771866 C138.996741,84.6808745 105.727102,82.8457535 105.727102,82.8457535 L56.1735087,82.8457535 C56.1735087,82.8457535 22.6899229,85.1500223 22.6899229,66.0913753 C22.6899229,47.0327282 56.1735087,49.3383013 56.1735087,49.3383013 L105.727102,49.3383013 C105.727102,49.3383013 111.245209,49.3383024 111.245209,54.8231115 C111.245209,60.3079206 105.727102,60.5074524 105.727102,60.5074524 L56.1735087,60.5074524 C56.1735087,60.5074524 37.48913,60.5074528 37.48913,66.6449195 C37.48913,72.7823862 56.1735087,71.6766023 56.1735087,71.6766023 L105.727102,71.6766029 C105.727102,71.6766029 127.835546,73.1411469 127.835546,55.1771866 C127.835546,35.5304025 105.727102,38.3035317 105.727102,38.3035317 L45.0428249,38.3035317 C45.0428249,38.3035317 11.5287276,38.3035313 11.5287276,66.6449208 C11.5287276,94.9863103 45.0428244,93.9579678 45.0428244,93.9579678 L105.449437,94.2138951 Z\" transform=\"translate(69.367532, 66.000000) rotate(-45.000000) translate(-69.367532, -66.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(0.049406, 0.000000)\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"></path>\n <circle cx=\"64\" cy=\"32\" r=\"8\"></circle>\n <rect x=\"56\" y=\"48\" width=\"16\" height=\"56\" rx=\"8\"></rect>\n </g>\n </g>\n </g>\n</svg>"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-locked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M96.4723753,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L32.0000269,64 C32.0028554,48.2766389 32.3030338,16.2688026 64.1594984,16.2688041 C95.9543927,16.2688056 96.4648869,48.325931 96.4723753,64 Z M80.5749059,64 L48.4413579,64 C48.4426205,47.71306 48.5829272,31.9999996 64.1595001,31.9999996 C79.8437473,31.9999996 81.1369461,48.1359182 80.5749059,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <rect x=\"0\" y=\"16\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"56\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"96\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n</svg>"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M56,72 L8.00697327,72 C3.59075293,72 0,68.418278 0,64 C0,59.5907123 3.58484404,56 8.00697327,56 L56,56 L56,8.00697327 C56,3.59075293 59.581722,0 64,0 C68.4092877,0 72,3.58484404 72,8.00697327 L72,56 L119.993027,56 C124.409247,56 128,59.581722 128,64 C128,68.4092877 124.415156,72 119.993027,72 L72,72 L72,119.993027 C72,124.409247 68.418278,128 64,128 C59.5907123,128 56,124.415156 56,119.993027 L56,72 L56,72 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-here-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n \t<g transform=\"translate(52.233611, 64.389922) rotate(75.000000) translate(-52.233611, -64.389922) translate(-7.734417, 3.702450)\">\n\t <path d=\"M18.9270186,45.959338 L18.9080585,49.6521741 C18.8884833,53.4648378 21.0574548,58.7482162 23.7526408,61.4434022 L78.5671839,116.257945 C81.2617332,118.952495 85.6348701,118.950391 88.3334363,116.251825 L115.863237,88.7220241 C118.555265,86.0299959 118.564544,81.6509578 115.869358,78.9557717 L61.0548144,24.1412286 C58.3602652,21.4466794 53.0787224,19.2788426 49.2595808,19.3006519 L25.9781737,19.4336012 C22.1633003,19.4553862 19.0471195,22.5673232 19.0275223,26.3842526 L18.9871663,34.2443819 C19.0818862,34.255617 19.1779758,34.2665345 19.2754441,34.2771502 C22.6891275,34.6489512 27.0485594,34.2348566 31.513244,33.2285542 C31.7789418,32.8671684 32.075337,32.5211298 32.4024112,32.1940556 C34.8567584,29.7397084 38.3789778,29.0128681 41.4406288,30.0213822 C41.5958829,29.9543375 41.7503946,29.8866669 41.9041198,29.8183808 L42.1110981,30.2733467 C43.1114373,30.6972371 44.0473796,31.3160521 44.8614145,32.1300869 C48.2842088,35.5528813 48.2555691,41.130967 44.7974459,44.5890903 C41.4339531,47.952583 36.0649346,48.0717177 32.6241879,44.9262969 C27.8170558,45.8919233 23.0726921,46.2881596 18.9270186,45.959338 Z\"></path>\n\t <path d=\"M45.4903462,38.8768094 C36.7300141,42.6833154 26.099618,44.7997354 18.1909048,43.9383587 C7.2512621,42.7468685 1.50150083,35.8404432 4.66865776,24.7010202 C7.51507386,14.6896965 15.4908218,6.92103848 24.3842626,4.38423012 C34.1310219,1.60401701 42.4070208,6.15882777 42.4070209,16.3101169 L34.5379395,16.310117 C34.5379394,11.9285862 31.728784,10.3825286 26.5666962,11.8549876 C20.2597508,13.6540114 14.3453742,19.4148216 12.2444303,26.8041943 C10.4963869,32.9523565 12.6250796,35.5092726 19.0530263,36.2093718 C25.5557042,36.9176104 35.0513021,34.9907189 42.7038419,31.5913902 L42.7421786,31.6756595 C44.3874154,31.5384763 47.8846101,37.3706354 45.9274416,38.6772897 L45.9302799,38.6835285 C45.9166992,38.6895612 45.9031139,38.6955897 45.8895238,38.7016142 C45.8389288,38.7327898 45.7849056,38.7611034 45.7273406,38.7863919 C45.6506459,38.8200841 45.571574,38.8501593 45.4903462,38.8768094 Z\"></path>\n </g>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n </g>\n </g>\n</svg>"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-journal-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M102.545455,112.818182 L102.545455,124.636364 L102.545455,124.636364 L102.545455,124.636364 C102.545455,125.941761 103.630828,127 104.969697,127 L111.030303,127 C112.369172,127 113.454545,125.941761 113.454545,124.636364 L113.454545,112.818182 L125.575758,112.818182 C126.914626,112.818182 128,111.759982 128,110.454545 L128,104.545455 C128,103.240018 126.914626,102.181818 125.575758,102.181818 L113.454545,102.181818 L113.454545,90.3636364 C113.454545,89.0582 112.369172,88 111.030303,88 L104.969697,88 L104.969697,88 C103.630828,88 102.545455,89.0582 102.545455,90.3636364 L102.545455,102.181818 L90.4242424,102.181818 L90.4242424,102.181818 C89.0853705,102.181818 88,103.240018 88,104.545455 L88,110.454545 L88,110.454545 L88,110.454545 C88,111.759982 89.0853705,112.818182 90.4242424,112.818182 L102.545455,112.818182 Z\"></path>\n <g transform=\"translate(59.816987, 64.316987) rotate(30.000000) translate(-59.816987, -64.316987) translate(20.316987, 12.816987)\">\n <g transform=\"translate(0.000000, 0.000000)\">\n <path d=\"M9.99631148,0 C4.4755011,0 -2.27373675e-13,4.48070044 -2.27373675e-13,9.99759461 L-2.27373675e-13,91.6128884 C-2.27373675e-13,97.1344074 4.46966773,101.610483 9.99631148,101.610483 L68.9318917,101.610483 C74.4527021,101.610483 78.9282032,97.1297826 78.9282032,91.6128884 L78.9282032,9.99759461 C78.9282032,4.47607557 74.4585355,0 68.9318917,0 L9.99631148,0 Z M20.8885263,26 C24.2022348,26 26.8885263,23.3137085 26.8885263,20 C26.8885263,16.6862915 24.2022348,14 20.8885263,14 C17.5748178,14 14.8885263,16.6862915 14.8885263,20 C14.8885263,23.3137085 17.5748178,26 20.8885263,26 Z M57.3033321,25.6783342 C60.6170406,25.6783342 63.3033321,22.9920427 63.3033321,19.6783342 C63.3033321,16.3646258 60.6170406,13.6783342 57.3033321,13.6783342 C53.9896236,13.6783342 51.3033321,16.3646258 51.3033321,19.6783342 C51.3033321,22.9920427 53.9896236,25.6783342 57.3033321,25.6783342 Z\"></path>\n <text font-family=\"Helvetica\" font-size=\"47.1724138\" font-weight=\"bold\" fill=\"#FFFFFF\">\n <tspan x=\"42\" y=\"77.4847912\" text-anchor=\"middle\"><<now \"DD\">></tspan>\n </text>\n </g>\n </g>\n </g>\n</svg>"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-options-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M110.48779,76.0002544 C109.354214,80.4045063 107.611262,84.5641217 105.354171,88.3838625 L105.354171,88.3838625 L112.07833,95.1080219 C115.20107,98.2307613 115.210098,103.299824 112.089164,106.420759 L106.420504,112.089418 C103.301049,115.208874 98.2346851,115.205502 95.1077675,112.078585 L88.3836082,105.354425 C84.5638673,107.611516 80.4042519,109.354468 76,110.488045 L76,110.488045 L76,119.993281 C76,124.409501 72.4220153,128.000254 68.0083475,128.000254 L59.9916525,128.000254 C55.5800761,128.000254 52,124.41541 52,119.993281 L52,110.488045 C47.5957481,109.354468 43.4361327,107.611516 39.6163918,105.354425 L32.8922325,112.078585 C29.7694931,115.201324 24.7004301,115.210353 21.5794957,112.089418 L15.9108363,106.420759 C12.7913807,103.301303 12.7947522,98.2349395 15.9216697,95.1080219 L22.6458291,88.3838625 C20.3887383,84.5641217 18.6457859,80.4045063 17.5122098,76.0002544 L8.00697327,76.0002544 C3.59075293,76.0002544 2.19088375e-16,72.4222697 4.89347582e-16,68.0086019 L9.80228577e-16,59.9919069 C1.25035972e-15,55.5803305 3.58484404,52.0002544 8.00697327,52.0002544 L17.5122098,52.0002544 C18.6457859,47.5960025 20.3887383,43.4363871 22.6458291,39.6166462 L15.9216697,32.8924868 C12.7989304,29.7697475 12.7899019,24.7006845 15.9108363,21.5797501 L21.5794957,15.9110907 C24.6989513,12.7916351 29.7653149,12.7950065 32.8922325,15.9219241 L39.6163918,22.6460835 C43.4361327,20.3889927 47.5957481,18.6460403 52,17.5124642 L52,8.00722764 C52,3.5910073 55.5779847,0.000254375069 59.9916525,0.000254375069 L68.0083475,0.000254375069 C72.4199239,0.000254375069 76,3.58509841 76,8.00722764 L76,17.5124642 C80.4042519,18.6460403 84.5638673,20.3889927 88.3836082,22.6460835 L95.1077675,15.9219241 C98.2305069,12.7991848 103.29957,12.7901562 106.420504,15.9110907 L112.089164,21.5797501 C115.208619,24.6992057 115.205248,29.7655693 112.07833,32.8924868 L105.354171,39.6166462 L105.354171,39.6166462 C107.611262,43.4363871 109.354214,47.5960025 110.48779,52.0002544 L119.993027,52.0002544 C124.409247,52.0002544 128,55.5782391 128,59.9919069 L128,68.0086019 C128,72.4201783 124.415156,76.0002544 119.993027,76.0002544 L110.48779,76.0002544 L110.48779,76.0002544 Z M64,96.0002544 C81.673112,96.0002544 96,81.6733664 96,64.0002544 C96,46.3271424 81.673112,32.0002544 64,32.0002544 C46.326888,32.0002544 32,46.3271424 32,64.0002544 C32,81.6733664 46.326888,96.0002544 64,96.0002544 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permalink-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M80.4834582,48 L73.0956761,80 L73.0956761,80 L47.5165418,80 L54.9043239,48 L80.4834582,48 Z M84.1773493,32 L89.8007299,7.64246248 C90.7941633,3.33942958 95.0918297,0.64641956 99.3968675,1.64031585 C103.693145,2.63218977 106.385414,6.93288901 105.390651,11.2416793 L100.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L96.9043239,48 L89.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L85.8226507,96 L80.1992701,120.357538 C79.2058367,124.66057 74.9081703,127.35358 70.6031325,126.359684 C66.3068546,125.36781 63.6145865,121.067111 64.6093491,116.758321 L69.401785,96 L43.8226507,96 L38.1992701,120.357538 C37.2058367,124.66057 32.9081703,127.35358 28.6031325,126.359684 C24.3068546,125.36781 21.6145865,121.067111 22.6093491,116.758321 L27.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L31.0956761,80 L38.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L42.1773493,32 L47.8007299,7.64246248 C48.7941633,3.33942958 53.0918297,0.64641956 57.3968675,1.64031585 C61.6931454,2.63218977 64.3854135,6.93288901 63.3906509,11.2416793 L58.598215,32 L84.1773493,32 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permaview-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M81.4834582,48 L79.6365127,56 L79.6365127,56 L74.0573784,56 L75.9043239,48 L81.4834582,48 Z M85.1773493,32 L90.8007299,7.64246248 C91.7941633,3.33942958 96.0918297,0.64641956 100.396867,1.64031585 C104.693145,2.63218977 107.385414,6.93288901 106.390651,11.2416793 L101.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L97.9043239,48 L96.0573784,56 L104.000754,56 C108.411895,56 112,59.581722 112,64 C112,68.4092877 108.418616,72 104.000754,72 L92.3634873,72 L90.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L86.8226507,96 L81.1992701,120.357538 C80.2058367,124.66057 75.9081703,127.35358 71.6031325,126.359684 C67.3068546,125.36781 64.6145865,121.067111 65.6093491,116.758321 L70.401785,96 L64.8226507,96 L59.1992701,120.357538 C58.2058367,124.66057 53.9081703,127.35358 49.6031325,126.359684 C45.3068546,125.36781 42.6145865,121.067111 43.6093491,116.758321 L48.401785,96 L42.8226507,96 L37.1992701,120.357538 C36.2058367,124.66057 31.9081703,127.35358 27.6031325,126.359684 C23.3068546,125.36781 20.6145865,121.067111 21.6093491,116.758321 L26.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L30.0956761,80 L31.9426216,72 L23.9992458,72 C19.5881049,72 16,68.418278 16,64 C16,59.5907123 19.5813843,56 23.9992458,56 L35.6365127,56 L37.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L41.1773493,32 L46.8007299,7.64246248 C47.7941633,3.33942958 52.0918297,0.64641956 56.3968675,1.64031585 C60.6931454,2.63218977 63.3854135,6.93288901 62.3906509,11.2416793 L57.598215,32 L63.1773493,32 L68.8007299,7.64246248 C69.7941633,3.33942958 74.0918297,0.64641956 78.3968675,1.64031585 C82.6931454,2.63218977 85.3854135,6.93288901 84.3906509,11.2416793 L79.598215,32 L85.1773493,32 Z M53.9043239,48 L52.0573784,56 L57.6365127,56 L59.4834582,48 L53.9043239,48 Z M75.9426216,72 L74.0956761,80 L74.0956761,80 L68.5165418,80 L70.3634873,72 L75.9426216,72 L75.9426216,72 Z M48.3634873,72 L46.5165418,80 L52.0956761,80 L53.9426216,72 L48.3634873,72 L48.3634873,72 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M61.2072232,68.1369825 C56.8829239,70.9319564 54.2082892,74.793177 54.2082892,79.0581634 C54.2082892,86.9638335 63.3980995,93.4821994 75.2498076,94.3940006 C77.412197,98.2964184 83.8475284,101.178858 91.5684735,101.403106 C86.4420125,100.27851 82.4506393,97.6624107 80.9477167,94.3948272 C92.8046245,93.4861461 102,86.9662269 102,79.0581634 C102,70.5281905 91.3014611,63.6132813 78.1041446,63.6132813 C71.5054863,63.6132813 65.5315225,65.3420086 61.2072232,68.1369825 Z M74.001066,53.9793443 C69.6767667,56.7743182 63.7028029,58.5030456 57.1041446,58.5030456 C54.4851745,58.5030456 51.9646095,58.2307276 49.6065315,57.7275105 C46.2945155,59.9778212 41.2235699,61.4171743 35.5395922,61.4171743 C35.4545771,61.4171743 35.3696991,61.4168523 35.2849622,61.4162104 C39.404008,60.5235193 42.7961717,58.6691298 44.7630507,56.286533 C37.8379411,53.5817651 33.2082892,48.669413 33.2082892,43.0581634 C33.2082892,34.5281905 43.9068281,27.6132812 57.1041446,27.6132812 C70.3014611,27.6132812 81,34.5281905 81,43.0581634 C81,47.3231498 78.3253653,51.1843704 74.001066,53.9793443 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M40.3972881,76.4456988 L40.3972881,95.3404069 L54.5170166,95.3404069 L54.5170166,95.3404069 C54.5165526,95.3385183 54.516089,95.3366295 54.515626,95.3347404 C54.6093153,95.3385061 54.7034848,95.3404069 54.7980982,95.3404069 C58.6157051,95.3404069 61.710487,92.245625 61.710487,88.4280181 C61.710487,86.6197822 61.01617,84.9737128 59.8795929,83.7418666 L59.8795929,83.7418666 C59.8949905,83.7341665 59.9104102,83.7265043 59.925852,83.7188798 C58.8840576,82.5086663 58.2542926,80.9336277 58.2542926,79.2114996 C58.2542926,75.3938927 61.3490745,72.2991108 65.1666814,72.2991108 C68.9842884,72.2991108 72.0790703,75.3938927 72.0790703,79.2114996 C72.0790703,81.1954221 71.2432806,82.9841354 69.9045961,84.2447446 L69.9045961,84.2447446 C69.9333407,84.2629251 69.9619885,84.281245 69.9905383,84.2997032 L69.9905383,84.2997032 C69.1314315,85.4516923 68.6228758,86.8804654 68.6228758,88.4280181 C68.6228758,91.8584969 71.1218232,94.7053153 74.3986526,95.2474079 C74.3913315,95.2784624 74.3838688,95.3094624 74.3762652,95.3404069 L95.6963988,95.3404069 L95.6963988,75.5678578 L95.6963988,75.5678578 C95.6466539,75.5808558 95.5967614,75.5934886 95.5467242,75.6057531 C95.5504899,75.5120637 95.5523907,75.4178943 95.5523907,75.3232809 C95.5523907,71.505674 92.4576088,68.4108921 88.6400019,68.4108921 C86.831766,68.4108921 85.1856966,69.105209 83.9538504,70.2417862 L83.9538504,70.2417862 C83.9461503,70.2263886 83.938488,70.2109688 83.9308636,70.1955271 C82.7206501,71.2373215 81.1456115,71.8670865 79.4234834,71.8670865 C75.6058765,71.8670865 72.5110946,68.7723046 72.5110946,64.9546976 C72.5110946,61.1370907 75.6058765,58.0423088 79.4234834,58.0423088 C81.4074059,58.0423088 83.1961192,58.8780985 84.4567284,60.2167829 L84.4567284,60.2167829 C84.4749089,60.1880383 84.4932288,60.1593906 84.511687,60.1308407 L84.511687,60.1308407 C85.6636761,60.9899475 87.0924492,61.4985032 88.6400019,61.4985032 C92.0704807,61.4985032 94.9172991,58.9995558 95.4593917,55.7227265 C95.538755,55.7414363 95.6177614,55.761071 95.6963988,55.7816184 L95.6963988,40.0412962 L74.3762652,40.0412962 L74.3762652,40.0412962 C74.3838688,40.0103516 74.3913315,39.9793517 74.3986526,39.9482971 L74.3986526,39.9482971 C71.1218232,39.4062046 68.6228758,36.5593862 68.6228758,33.1289073 C68.6228758,31.5813547 69.1314315,30.1525815 69.9905383,29.0005925 C69.9619885,28.9821342 69.9333407,28.9638143 69.9045961,28.9456339 C71.2432806,27.6850247 72.0790703,25.8963113 72.0790703,23.9123888 C72.0790703,20.0947819 68.9842884,17 65.1666814,17 C61.3490745,17 58.2542926,20.0947819 58.2542926,23.9123888 C58.2542926,25.6345169 58.8840576,27.2095556 59.925852,28.419769 L59.925852,28.419769 C59.9104102,28.4273935 59.8949905,28.4350558 59.8795929,28.4427558 C61.01617,29.674602 61.710487,31.3206715 61.710487,33.1289073 C61.710487,36.9465143 58.6157051,40.0412962 54.7980982,40.0412962 C54.7034848,40.0412962 54.6093153,40.0393953 54.515626,40.0356296 L54.515626,40.0356296 C54.516089,40.0375187 54.5165526,40.0394075 54.5170166,40.0412962 L40.3972881,40.0412962 L40.3972881,52.887664 L40.3972881,52.887664 C40.4916889,53.3430132 40.5412962,53.8147625 40.5412962,54.2980982 C40.5412962,58.1157051 37.4465143,61.210487 33.6289073,61.210487 C32.0813547,61.210487 30.6525815,60.7019313 29.5005925,59.8428245 C29.4821342,59.8713744 29.4638143,59.9000221 29.4456339,59.9287667 C28.1850247,58.5900823 26.3963113,57.7542926 24.4123888,57.7542926 C20.5947819,57.7542926 17.5,60.8490745 17.5,64.6666814 C17.5,68.4842884 20.5947819,71.5790703 24.4123888,71.5790703 C26.134517,71.5790703 27.7095556,70.9493053 28.919769,69.9075109 L28.919769,69.9075109 C28.9273935,69.9229526 28.9350558,69.9383724 28.9427558,69.95377 C30.174602,68.8171928 31.8206715,68.1228758 33.6289073,68.1228758 C37.4465143,68.1228758 40.5412962,71.2176578 40.5412962,75.0352647 C40.5412962,75.5186004 40.4916889,75.9903496 40.3972881,76.4456988 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M27.6619958,98.5383065 C27.5690581,98.5388896 27.4761291,98.539182 27.383212,98.539182 C41.5122315,92.2342259 36.7359182,71.4340774 52.2062903,71.4340772 C52.3396942,72.0325374 52.4778143,72.6764878 52.6543744,73.3309353 C41.7206358,71.5725612 42.70852,93.6013809 27.6619958,98.5383065 Z M27.962646,98.5354078 C44.3675979,98.3221342 60.9448114,89.104528 60.944811,79.6231217 C57.0326028,79.6231217 55.0057081,78.1546059 53.8483468,76.2715831 C46.8437297,73.3160546 41.0335584,95.5643154 27.9626323,98.5354081 Z M60.4476718,66.8723739 C57.4632888,63.6421817 54.9582687,60.7541572 53.4305549,58.7453802 C47.3662923,50.7715364 44.307483,54.9700909 40.8462757,58.7453801 C37.3850684,62.5206692 41.7580858,65.5796149 38.4732643,68.2464352 C35.1884428,70.9132556 35.391237,71.8376623 29.8473278,66.9588778 C24.3034186,62.0800933 23.919977,60.7368279 26.4649349,57.9530299 C29.0098928,55.1692318 31.1369568,59.5524845 36.3357237,54.6053302 C41.5344905,49.6581758 37.1673192,45.2736183 37.1673192,45.2736183 C37.1673192,45.2736183 47.9916921,23.1463023 62.4556497,24.7805686 C76.9196074,26.4148348 56.9839048,22.6644011 52.0250205,40.0179431 C49.9018746,47.4478606 52.4201529,45.6971267 56.4460414,48.8353078 C57.8695188,49.9449088 63.120208,53.6842856 69.3136884,58.3372485 C77.8095419,50.1273311 87.3705002,40.8200581 90.1462007,38.0443577 C94.9225135,33.268045 99.6988262,38.0443577 94.9225134,42.8206705 C92.2168565,45.5263274 83.0052228,54.3768782 74.6585455,62.4104777 C84.7196352,70.2010353 95.1107413,79.0341049 95.1107416,82.5307694 C95.1107421,88.9149413 92.3944614,92.7263341 86.6764506,90.6368273 C83.0906414,89.3264812 73.3126471,80.2536547 65.0234105,71.7029822 C62.8994697,73.7599251 61.2357389,75.3821997 60.3189624,76.2989761 C57.6045976,78.4574835 53.6647127,73.2589589 55.5426497,71.5226634 C56.5140946,70.6244887 58.249291,68.9770292 60.4476718,66.8723739 L60.4476718,66.8723739 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-refresh-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M106.369002,39.4325143 C116.529932,60.3119371 112.939592,86.1974934 95.5979797,103.539105 C73.7286194,125.408466 38.2713806,125.408466 16.4020203,103.539105 C-5.46734008,81.6697449 -5.46734008,46.2125061 16.4020203,24.3431458 C19.5262146,21.2189514 24.5915344,21.2189514 27.7157288,24.3431458 C30.8399231,27.4673401 30.8399231,32.5326599 27.7157288,35.6568542 C12.0947571,51.2778259 12.0947571,76.6044251 27.7157288,92.2253967 C43.3367004,107.846368 68.6632996,107.846368 84.2842712,92.2253967 C97.71993,78.7897379 99.5995262,58.1740623 89.9230597,42.729491 L83.4844861,54.9932839 C81.4307001,58.9052072 76.5945372,60.4115251 72.682614,58.3577391 C68.7706907,56.3039532 67.2643728,51.4677903 69.3181587,47.555867 L84.4354914,18.7613158 C86.4966389,14.8353707 91.3577499,13.3347805 95.273202,15.415792 L124.145886,30.7612457 C128.047354,32.8348248 129.52915,37.6785572 127.455571,41.5800249 C125.381992,45.4814927 120.53826,46.9632892 116.636792,44.8897102 L106.369002,39.4325143 Z M98.1470904,27.0648707 C97.9798954,26.8741582 97.811187,26.6843098 97.6409651,26.4953413 L98.6018187,26.1987327 L98.1470904,27.0648707 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-right-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <path d=\"M80.3563798,109.353315 C78.9238993,110.786918 76.9450203,111.675144 74.7592239,111.675144 L-4.40893546,111.675144 C-8.77412698,111.675144 -12.3248558,108.130732 -12.3248558,103.758478 C-12.3248558,99.3951199 -8.78077754,95.8418109 -4.40893546,95.8418109 L66.8418109,95.8418109 L66.8418109,24.5910645 C66.8418109,20.225873 70.3862233,16.6751442 74.7584775,16.6751442 C79.1218352,16.6751442 82.6751442,20.2192225 82.6751442,24.5910645 L82.6751442,103.759224 C82.6751442,105.941695 81.7891419,107.920575 80.3566508,109.353886 Z\" transform=\"translate(35.175144, 64.175144) rotate(-45.000000) translate(-35.175144, -64.175144) \"></path>\n</svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 129 129\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-star-filled tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"nonzero\">\n <path d=\"M61.8361286,96.8228569 L99.1627704,124.110219 C101.883827,126.099427 105.541968,123.420868 104.505636,120.198072 L90.2895569,75.9887263 L89.0292911,79.8977279 L126.314504,52.5528988 C129.032541,50.5595011 127.635256,46.2255025 124.273711,46.2229134 L78.1610486,46.1873965 L81.4604673,48.6032923 L67.1773543,4.41589688 C66.1361365,1.19470104 61.6144265,1.19470104 60.5732087,4.41589688 L46.2900957,48.6032923 L49.5895144,46.1873965 L3.47685231,46.2229134 C0.115307373,46.2255025 -1.28197785,50.5595011 1.43605908,52.5528988 L38.7212719,79.8977279 L37.4610061,75.9887263 L23.2449266,120.198072 C22.2085954,123.420868 25.8667356,126.099427 28.5877926,124.110219 L65.9144344,96.8228569 L61.8361286,96.8228569 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-classic tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-pop tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M16.0098166,56 C11.586117,56 8,59.5776607 8,63.9924054 L8,80.0075946 C8,84.4216782 11.5838751,88 16.0098166,88 L111.990183,88 C116.413883,88 120,84.4223393 120,80.0075946 L120,63.9924054 C120,59.5783218 116.416125,56 111.990183,56 L16.0098166,56 L16.0098166,56 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-zoomin tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.578055 16,24.0085154 L16,71.9914846 C16,76.4144655 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.421945 112,71.9914846 L112,24.0085154 C112,19.5855345 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-tag-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M18.1643182,47.6600756 L18.1677196,51.7651887 C18.1708869,55.5878829 20.3581578,60.8623899 23.0531352,63.5573673 L84.9021823,125.406414 C87.5996731,128.103905 91.971139,128.096834 94.6717387,125.396234 L125.766905,94.3010679 C128.473612,91.5943612 128.472063,87.2264889 125.777085,84.5315115 L63.9280381,22.6824644 C61.2305472,19.9849735 55.9517395,17.801995 52.1318769,17.8010313 L25.0560441,17.7942007 C21.2311475,17.7932358 18.1421354,20.8872832 18.1452985,24.7049463 L18.1535504,34.6641936 C18.2481119,34.6754562 18.3439134,34.6864294 18.4409623,34.6971263 C22.1702157,35.1081705 26.9295004,34.6530132 31.806204,33.5444844 C32.1342781,33.0700515 32.5094815,32.6184036 32.9318197,32.1960654 C35.6385117,29.4893734 39.5490441,28.718649 42.94592,29.8824694 C43.0432142,29.8394357 43.1402334,29.7961748 43.2369683,29.7526887 L43.3646982,30.0368244 C44.566601,30.5115916 45.6933052,31.2351533 46.6655958,32.2074439 C50.4612154,36.0030635 50.4663097,42.1518845 46.6769742,45.94122 C43.0594074,49.5587868 37.2914155,49.7181264 33.4734256,46.422636 C28.1082519,47.5454734 22.7987486,48.0186448 18.1643182,47.6600756 Z\"></path>\n <path d=\"M47.6333528,39.5324628 L47.6562932,39.5834939 C37.9670934,43.9391617 26.0718874,46.3819521 17.260095,45.4107025 C5.27267473,44.0894301 -1.02778744,36.4307276 2.44271359,24.0779512 C5.56175386,12.9761516 14.3014034,4.36129832 24.0466405,1.54817001 C34.7269254,-1.53487574 43.7955833,3.51606438 43.7955834,14.7730751 L35.1728168,14.7730752 C35.1728167,9.91428944 32.0946059,8.19982862 26.4381034,9.83267419 C19.5270911,11.8276553 13.046247,18.2159574 10.7440788,26.4102121 C8.82861123,33.2280582 11.161186,36.0634845 18.2047888,36.8398415 C25.3302805,37.6252244 35.7353482,35.4884477 44.1208333,31.7188498 L44.1475077,31.7781871 C44.159701,31.7725635 44.1718402,31.7671479 44.1839238,31.7619434 C45.9448098,31.0035157 50.4503245,38.3109156 47.7081571,39.5012767 C47.6834429,39.512005 47.6585061,39.5223987 47.6333528,39.5324628 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-theme-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(6.762422, 19.968999)\">\n <path d=\"M0.824945506,108.186742 C0.664785639,108.187747 0.504640965,108.188251 0.344516735,108.188251 C24.6927592,97.3230528 16.4618388,61.4785938 43.121606,61.4785936 C43.3514982,62.5099075 43.5895175,63.6196137 43.8937798,64.7474092 C25.0518979,61.7172401 26.754298,99.6790423 0.824939051,108.186742 Z M1.34304326,108.181747 C29.613352,107.814217 58.1805158,91.9297101 58.1805151,75.5906019 C51.4386888,75.5906018 47.9457839,73.0599394 45.9513275,69.8149659 C33.880418,64.7217657 23.8678719,103.061726 1.34301955,108.181748 Z\"></path>\n <path d=\"M48.871084,61.6312522 C45.6348746,64.6233738 52.4243955,73.581882 57.1020034,69.8621716 C65.3329228,61.631253 108.502656,20.4006304 116.733576,12.169711 C124.964495,3.9387916 116.733576,-4.29212771 108.502656,3.9387916 C100.271737,12.1697108 57.4180113,53.7289683 48.871084,61.6312522 Z\"></path>\n </g>\n <path d=\"M62.2824054,71.6211067 C57.93733,66.8541323 54.3123948,62.6301561 51.9937779,59.5814279 C41.5433616,45.8402704 36.2721798,53.0755512 30.307554,59.5814276 C24.3429282,66.0873041 31.8788571,71.3587209 26.2181932,75.9543964 C20.5575294,80.5500719 20.9070004,82.1430826 11.3532982,73.7355757 C1.79959591,65.3280689 1.13881905,63.0132479 5.52449152,58.2159872 C9.91016399,53.4187265 13.5756887,60.9722938 22.5346144,52.4469667 C31.4935401,43.9216395 23.9676854,36.3658236 23.9676854,36.3658236 C23.9676854,36.3658236 42.6210998,-1.76571499 67.5465342,1.05058165 C92.4719685,3.8668783 58.1171911,-2.5961653 49.5716499,27.3088291 C45.9128772,40.1126497 50.2525733,37.0956468 57.1903023,42.5036084 C59.4792141,44.2878157 67.5103988,50.0176866 77.2457031,57.2905766 C71.4143155,62.9019825 66.2337717,67.8661661 62.2824054,71.6211067 Z M73.4870997,83.4678852 C87.4278174,97.7290403 103.323635,112.360587 109.285731,114.539289 C119.139459,118.140092 123.820369,111.571999 123.820368,100.570289 C123.820367,94.7414103 107.064445,80.3074425 90.2759123,67.2185217 C83.6390655,73.6178 77.7700759,79.2918373 73.4870997,83.4678852 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/tip": {
"title": "$:/core/images/tip",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-tip tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128.241818 C99.346224,128.241818 128,99.5880417 128,64.2418177 C128,28.8955937 99.346224,0.241817675 64,0.241817675 C28.653776,0.241817675 0,28.8955937 0,64.2418177 C0,99.5880417 28.653776,128.241818 64,128.241818 Z M75.9358659,91.4531941 C75.3115438,95.581915 70.2059206,98.8016748 64,98.8016748 C57.7940794,98.8016748 52.6884562,95.581915 52.0641341,91.4531941 C54.3299053,94.0502127 58.8248941,95.8192805 64,95.8192805 C69.1751059,95.8192805 73.6700947,94.0502127 75.9358659,91.4531941 L75.9358659,91.4531941 Z M75.9358659,95.9453413 C75.3115438,100.074062 70.2059206,103.293822 64,103.293822 C57.7940794,103.293822 52.6884562,100.074062 52.0641341,95.9453413 C54.3299053,98.5423599 58.8248941,100.311428 64,100.311428 C69.1751059,100.311428 73.6700947,98.5423599 75.9358659,95.9453413 L75.9358659,95.9453413 Z M75.9358659,100.40119 C75.3115438,104.529911 70.2059206,107.74967 64,107.74967 C57.7940794,107.74967 52.6884562,104.529911 52.0641341,100.40119 C54.3299053,102.998208 58.8248941,104.767276 64,104.767276 C69.1751059,104.767276 73.6700947,102.998208 75.9358659,100.40119 L75.9358659,100.40119 Z M75.9358659,104.893337 C75.3115438,109.022058 70.2059206,112.241818 64,112.241818 C57.7940794,112.241818 52.6884562,109.022058 52.0641341,104.893337 C54.3299053,107.490356 58.8248941,109.259423 64,109.259423 C69.1751059,109.259423 73.6700947,107.490356 75.9358659,104.893337 L75.9358659,104.893337 Z M64.3010456,24.2418177 C75.9193117,24.2418188 88.0000013,32.0619847 88,48.4419659 C87.9999987,64.8219472 75.9193018,71.7540963 75.9193021,83.5755932 C75.9193022,89.4486648 70.0521957,92.8368862 63.9999994,92.8368862 C57.947803,92.8368862 51.9731007,89.8295115 51.9731007,83.5755932 C51.9731007,71.1469799 39.9999998,65.4700602 40,48.4419647 C40.0000002,31.4138691 52.6827796,24.2418166 64.3010456,24.2418177 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-unlocked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M48.6266053,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L30.136303,64 C19.6806213,51.3490406 2.77158986,28.2115132 25.8366966,8.85759246 C50.4723026,-11.8141335 71.6711028,13.2108337 81.613302,25.0594855 C91.5555012,36.9081373 78.9368488,47.4964439 69.1559674,34.9513593 C59.375086,22.4062748 47.9893192,10.8049522 35.9485154,20.9083862 C23.9077117,31.0118202 34.192312,43.2685325 44.7624679,55.8655518 C47.229397,58.805523 48.403443,61.5979188 48.6266053,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-video tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,12 C29.0909091,12 8.72727273,14.9166667 5.81818182,17.8333333 C2.90909091,20.75 1.93784382e-15,41.1666667 0,64.5 C1.93784382e-15,87.8333333 2.90909091,108.25 5.81818182,111.166667 C8.72727273,114.083333 29.0909091,117 64,117 C98.9090909,117 119.272727,114.083333 122.181818,111.166667 C125.090909,108.25 128,87.8333333 128,64.5 C128,41.1666667 125.090909,20.75 122.181818,17.8333333 C119.272727,14.9166667 98.9090909,12 64,12 Z M54.9161194,44.6182253 C51.102648,42.0759111 48.0112186,43.7391738 48.0112186,48.3159447 L48.0112186,79.6840553 C48.0112186,84.2685636 51.109784,85.9193316 54.9161194,83.3817747 L77.0838806,68.6032672 C80.897352,66.0609529 80.890216,61.9342897 77.0838806,59.3967328 L54.9161194,44.6182253 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/warning": {
"title": "$:/core/images/warning",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-warning tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 129 129\">\n <g fill-rule=\"evenodd\">\n <path d=\"M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z\"></path>\n </g>\n</svg>"
},
"$:/language/Buttons/AdvancedSearch/Caption": {
"title": "$:/language/Buttons/AdvancedSearch/Caption",
"text": "advanced search"
},
"$:/language/Buttons/AdvancedSearch/Hint": {
"title": "$:/language/Buttons/AdvancedSearch/Hint",
"text": "Advanced search"
},
"$:/language/Buttons/Cancel/Caption": {
"title": "$:/language/Buttons/Cancel/Caption",
"text": "cancel"
},
"$:/language/Buttons/Cancel/Hint": {
"title": "$:/language/Buttons/Cancel/Hint",
"text": "Discard changes to this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Help/Caption": {
"title": "$:/language/Buttons/Help/Caption",
"text": "help"
},
"$:/language/Buttons/Help/Hint": {
"title": "$:/language/Buttons/Help/Hint",
"text": "Show help panel"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import files"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "ok"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Store changes to this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration:"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers:"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup:"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle:"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers:"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags:"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers:"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki:"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits:"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version:"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Plugins/Add/Hint": {
"title": "$:/language/ControlPanel/Plugins/Add/Hint",
"text": "Install new plugins"
},
"$:/language/ControlPanel/Plugins/Add/Caption": {
"title": "$:/language/ControlPanel/Plugins/Add/Caption",
"text": "Add"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Installed/Hint": {
"title": "$:/language/ControlPanel/Plugins/Installed/Hint",
"text": "Currently installed plugins"
},
"$:/language/ControlPanel/Plugins/Installed/Caption": {
"title": "$:/language/ControlPanel/Plugins/Installed/Caption",
"text": "Installed"
},
"$:/language/ControlPanel/Plugins/Language/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Language/Prompt",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Plugin/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Plugin/Prompt",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Theme/Prompt": {
"title": "$:/language/ControlPanel/Plugins/Theme/Prompt",
"text": "Themes"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/Heading": {
"title": "$:/language/ControlPanel/Saving/Heading",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Automatically save changes during editing"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
"text": "Toolbar Buttons"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
"text": "Default toolbar button appearance:"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
"text": "Include icon"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
"text": "Include text"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
"text": "Default Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
"text": "Specify which sidebar tab is displayed by default"
},
"$:/language/ControlPanel/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar "
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This is an external tiddler stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Hint": {
"title": "$:/language/EditTemplate/Body/Hint",
"text": "Use [[wiki text|http://tiddlywiki.com/static/WikiText.html]] to add formatting, images, and dynamic features"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Button/Hide": {
"title": "$:/language/EditTemplate/Body/Preview/Button/Hide",
"text": "hide preview"
},
"$:/language/EditTemplate/Body/Preview/Button/Show": {
"title": "$:/language/EditTemplate/Body/Preview/Button/Show",
"text": "show preview"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes will override the default version"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "River of tiddlers as static HTML file"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON tiddlers file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV tiddlers file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "Single tiddler \".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against": {
"title": "$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against",
"text": "A temporary storage field used in [[$:/core/templates/static.content]]"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "If set to \"yes\" indicates that a tiddler should be saved as a JavaScript library"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"$:/language/Filters/TypedTiddlers": {
"title": "$:/language/Filters/TypedTiddlers",
"text": "Non wiki-text tiddlers"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is important to make sure that you can reliably save changes. See http://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from 2.x.x TiddlyWiki files (`.html`), `.tiddler`, `.tid`, `.json` or other files \n\n```\n--load <filepath>\n```\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "Render an individual tiddler as a specified ContentType, defaults to `text/html` and save it to the specified filename:\n\n```\n--rendertiddler <title> <filename> [<type>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "Render a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the \"noclean\" parameter is specified. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "Saves an individual tiddler in its raw text or binary format to the specified filename. \n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "Saves a group of tiddlers in their raw text or binary format to the specified directory. \n\n```\n--savetiddlers <filter> <pathname>\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "The server built in to TiddlyWiki5 is very simple. Although compatible with TiddlyWeb it doesn't support many of the features needed for robust Internet-facing usage.\n\nAt the root, it serves a rendering of a specified tiddler. Away from the root, it serves individual tiddlers encoded in JSON, and supports the basic HTTP operations for `GET`, `PUT` and `DELETE`.\n\n```\n--server <port> <roottiddler> <rendertype> <servetype> <username> <password> <host> <pathprefix>\n```\n\nThe parameters are:\n\n* ''port'' - port number to serve from (defaults to \"8080\")\n* ''roottiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\") \n* ''rendertype'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''servetype'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''pathprefix'' - optional prefix for paths\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation isn't suitable for general use.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password:\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port.\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''type'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging \n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin "
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See http://tiddlywiki.com/static/Upgrading.html for more details. "
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or use the 'Escape' key to cancel)"
},
"$:/language/Encryption/ConfirmClearPassword": {
"title": "$:/language/Encryption/ConfirmClearPassword",
"text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
},
"$:/language/Encryption/PromptSetPassword": {
"title": "$:/language/Encryption/PromptSetPassword",
"text": "Set a new password for this TiddlyWiki"
},
"$:/language/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" - click {{$:/core/images/edit-button}} to create"
},
"$:/language/OfficialPluginLibrary": {
"title": "$:/language/OfficialPluginLibrary",
"text": "Official ~TiddlyWiki Plugin Library"
},
"$:/language/PluginReloadWarning": {
"title": "$:/language/PluginReloadWarning",
"text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to plugins to take effect"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"type": "text/vnd.tiddlywiki",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "http://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"type": "text/vnd.tiddlywiki",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "http://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"text": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|http://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"title": "$:/core/modules/commander.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/build.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/clearpassword.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/editions.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/help.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/init.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar ext = path.extname(self.params[0]);\n\tfs.readFile(this.params[0],$tw.utils.getTypeEncoding(ext),function(err,data) {\n\t\tif (err) {\n\t\t\tself.callback(err);\n\t\t} else {\n\t\t\tvar fields = {title: self.params[0]},\n\t\t\t\ttype = path.extname(self.params[0]);\n\t\t\tvar tiddlers = self.commander.wiki.deserializeTiddlers(type,data,fields);\n\t\t\tif(!tiddlers) {\n\t\t\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t\t\t} else {\n\t\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddlers[t]));\n\t\t\t\t}\n\t\t\t\tself.callback(null);\t\n\t\t\t}\n\t\t}\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/load.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.pluginsPath));\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.themesPath));\n\tcollectPlugins(path.resolve($tw.boot.corePath,$tw.config.languagesPath));\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers},null,$tw.config.preferences.jsonSpaces)\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/makelibrary.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/output.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/password.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\";\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/rendertiddler.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\") != \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/rendertiddlers.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savelibrarytiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tbasepath = this.params[1],\n\t\tskinnyListTitle = this.params[2];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerData(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Save each JSON file and collect the skinny data\n\tvar skinnyList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler,null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{text: undefined}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/savelibrarytiddlers.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title),\n\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/savetiddler.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.deleteDirectory(pathname);\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/savetiddlers.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif(!$tw.browser) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\thttp = require(\"http\");\n}\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\n/*\nA simple HTTP server with regexp-based routes\n*/\nfunction SimpleServer(options) {\n\tthis.routes = options.routes || [];\n\tthis.wiki = options.wiki;\n\tthis.variables = options.variables || {};\n}\n\nSimpleServer.prototype.set = function(obj) {\n\tvar self = this;\n\t$tw.utils.each(obj,function(value,name) {\n\t\tself.variables[name] = value;\n\t});\n};\n\nSimpleServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nSimpleServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nSimpleServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"pathprefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length);\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nSimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) {\n\tvar header = request.headers.authorization || \"\",\n\t\ttoken = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tusername = parts[0],\n\t\tpassword = parts[1];\n\tif(incomingUsername === username && incomingPassword === password) {\n\t\treturn \"ALLOWED\";\n\t} else {\n\t\treturn \"DENIED\";\n\t}\n};\n\nSimpleServer.prototype.listen = function(port,host) {\n\tvar self = this;\n\thttp.createServer(function(request,response) {\n\t\t// Compose the state object\n\t\tvar state = {};\n\t\tstate.wiki = self.wiki;\n\t\tstate.server = self;\n\t\tstate.urlInfo = url.parse(request.url);\n\t\t// Find the route that matches this path\n\t\tvar route = self.findMatchingRoute(request,state);\n\t\t// Check for the username and password if we've got one\n\t\tvar username = self.get(\"username\"),\n\t\t\tpassword = self.get(\"password\");\n\t\tif(username && password) {\n\t\t\t// Check they match\n\t\t\tif(self.checkCredentials(request,username,password) !== \"ALLOWED\") {\n\t\t\t\tvar servername = state.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\";\n\t\t\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + servername + '\"'\n\t\t\t\t});\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// Return a 404 if we didn't find a route\n\t\tif(!route) {\n\t\t\tresponse.writeHead(404);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t\t// Set the encoding for the incoming request\n\t\t// TODO: Presumably this would need tweaking if we supported PUTting binary tiddlers\n\t\trequest.setEncoding(\"utf8\");\n\t\t// Dispatch the appropriate method\n\t\tswitch(request.method) {\n\t\t\tcase \"GET\": // Intentional fall-through\n\t\t\tcase \"DELETE\":\n\t\t\t\troute.handler(request,response,state);\n\t\t\t\tbreak;\n\t\t\tcase \"PUT\":\n\t\t\t\tvar data = \"\";\n\t\t\t\trequest.on(\"data\",function(chunk) {\n\t\t\t\t\tdata += chunk.toString();\n\t\t\t\t});\n\t\t\t\trequest.on(\"end\",function() {\n\t\t\t\t\tstate.data = data;\n\t\t\t\t\troute.handler(request,response,state);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}).listen(port,host);\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n\t// Set up server\n\tthis.server = new SimpleServer({\n\t\twiki: this.commander.wiki\n\t});\n\t// Add route handlers\n\tthis.server.addRoute({\n\t\tmethod: \"PUT\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\tfields = JSON.parse(state.data);\n\t\t\t// Pull up any subfields in the `fields` object\n\t\t\tif(fields.fields) {\n\t\t\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\t\t\tfields[name] = field;\n\t\t\t\t});\n\t\t\t\tdelete fields.fields;\n\t\t\t}\n\t\t\t// Remove any revision field\n\t\t\tif(fields.revision) {\n\t\t\t\tdelete fields.revision;\n\t\t\t}\n\t\t\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title}));\n\t\t\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\t\t\tresponse.writeHead(204, \"OK\",{\n\t\t\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"DELETE\",\n\t\tpath: /^\\/bags\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]);\n\t\t\tstate.wiki.deleteTiddler(title);\n\t\t\tresponse.writeHead(204, \"OK\", {\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": state.server.get(\"serveType\")});\n\t\t\tvar text = state.wiki.renderTiddler(state.server.get(\"renderType\"),state.server.get(\"rootTiddler\"));\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/status$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar text = JSON.stringify({\n\t\t\t\tusername: state.server.get(\"username\"),\n\t\t\t\tspace: {\n\t\t\t\t\trecipe: \"default\"\n\t\t\t\t},\n\t\t\t\ttiddlywiki_version: $tw.version\n\t\t\t});\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/favicon.ico$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\t\t\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\t\t\tresponse.end(buffer,\"base64\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers.json$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar tiddlers = [];\n\t\t\tstate.wiki.forEachTiddler({sortField: \"title\"},function(title,tiddler) {\n\t\t\t\tvar tiddlerFields = {};\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tif(name !== \"text\") {\n\t\t\t\t\t\ttiddlerFields[name] = tiddler.getFieldString(name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\ttiddlers.push(tiddlerFields);\n\t\t\t});\n\t\t\tvar text = JSON.stringify(tiddlers);\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\ttiddler = state.wiki.getTiddler(title),\n\t\t\t\ttiddlerFields = {},\n\t\t\t\tknownFields = [\n\t\t\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t\t\t];\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\t\t\ttiddlerFields[name] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t\t\t} else {\n\t\t\t\tresponse.writeHead(404);\n\t\t\t\tresponse.end();\n\t\t\t}\n\t\t}\n\t});\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\tvar port = this.params[0] || \"8080\",\n\t\trootTiddler = this.params[1] || \"$:/core/save/all\",\n\t\trenderType = this.params[2] || \"text/plain\",\n\t\tserveType = this.params[3] || \"text/html\",\n\t\tusername = this.params[4],\n\t\tpassword = this.params[5],\n\t\thost = this.params[6] || \"127.0.0.1\",\n\t\tpathprefix = this.params[7];\n\tthis.server.set({\n\t\trootTiddler: rootTiddler,\n\t\trenderType: renderType,\n\t\tserveType: serveType,\n\t\tusername: username,\n\t\tpassword: password,\n\t\tpathprefix: pathprefix\n\t});\n\tthis.server.listen(port,host);\n\tconsole.log(\"Serving on \" + host + \":\" + port);\n\tconsole.log(\"(press ctrl-C to exit)\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/server.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/setfield.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerData(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/unpackplugin.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/verbose.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"title": "$:/core/modules/commands/version.js",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"title": "$:/core/modules/config.js",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming = JSON.parse(text),\n\t\tresults = [];\n\tif($tw.utils.isArray(incoming)) {\n\t\tfor(var t=0; t<incoming.length; t++) {\n\t\t\tvar incomingFields = incoming[t],\n\t\t\t\tfields = {};\n\t\t\tfor(var f in incomingFields) {\n\t\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t\t}\n\t\t\t}\n\t\t\tresults.push(fields);\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"title": "$:/core/modules/deserializers.js",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/filters/addprefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/addprefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/addsuffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/after.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/current.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/missing.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/orphans.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/shadows.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"title": "$:/core/modules/filters/all/tiddlers.js",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/all.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/backlinks.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/before.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/commands.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = {};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value;\n\t\t\tif((operator.operand === \"\") || (operator.operand === \"title\")) {\n\t\t\t\tvalue = title;\n\t\t\t} else {\n\t\t\t\tvalue = tiddler.getFieldString(operator.operand);\n\t\t\t}\n\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\tvalues[value] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/each.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate(tiddler.fields[fieldName]);\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/eachday.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editiondescription.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/editiondescription.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editions.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/editions.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/field.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/fields.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/get.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getindex.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/getindex.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand) || tiddler.fields[operator.operand] === \"\"))) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && tiddler.fields[operator.operand] !== \"\") {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/has.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/haschanged.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/haschanged.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerData(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/indexes.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/current.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/current.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/image.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/missing.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/orphan.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/shadow.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/system.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/tag.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/is/tiddler.js",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tvar isFilterOperator = isFilterOperators[operator.operand];\n\tif(isFilterOperator) {\n\t\treturn isFilterOperator(source,operator.prefix,options);\n\t} else {\n\t\treturn [\"Filter Error: Unknown operand for the 'is' filter operator\"];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/is.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/limit.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/links.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/list.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/listed.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"title": "$:/core/modules/filters/listops.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/modules.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/moduletypes.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/next.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/plugintiddlers.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/prefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/previous.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/regexp.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/removeprefix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/removesuffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tvar isSameDay = function(dateField) {\n\t\t\treturn (new Date(dateField)).setHours(0,0,0,0) === targetDate;\n\t\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tif(isSameDay(tiddler.fields[fieldName])) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/sameday.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffix) {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: operator.suffix\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/filters/search.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/shadowsource.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/sort.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/splitbefore.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/storyviews.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/suffix.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && !tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tag.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tagging.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\t$tw.utils.pushTop(results,tiddler.fields.tags);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/tags.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/title.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"title": "$:/core/modules/filters/untagged.js",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar operator, operand, bracketPos, curlyBracketPos;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tvar nextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\t\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow \"Syntax error in filter expression\";\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [\"Filter error: \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter\",function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"title": "$:/core/modules/filters.js",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/info/platform.js": {
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"title": "$:/core/modules/info/platform.js",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/language.js": {
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a single translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\nexports.Language = Language;\n\n})();\n",
"title": "$:/core/modules/language.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"title": "$:/core/modules/macros/changecount.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB),\n\t\tbrightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"title": "$:/core/modules/macros/contrastcolour.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"title": "$:/core/modules/macros/csvtiddlers.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/dumpvariables.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/dumpvariables.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to dump all active variable values\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"dumpvariables\";\n\nexports.params = [\n];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\tvar output = [\"|!Variable |!Value |\"],\n\t\tvariables = [], variable;\n\tfor(variable in this.variables) {\n\t\tvariables.push(variable);\n\t}\n\tvariables.sort();\n\tfor(var index=0; index<variables.length; index++) {\n\t\tvar variable = variables[index];\n\t\toutput.push(\"|\" + variable + \" |<input size=50 value=<<\" + variable + \">>/> |\")\n\t}\n\treturn output.join(\"\\n\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/dumpvariables.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter) {\n\tvar tiddlers = this.wiki.filterTiddlers(filter),\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"title": "$:/core/modules/macros/jsontiddlers.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert the content of a tiddler to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tparts.push(\"data:\");\n\tparts.push(type);\n\tparts.push(isBase64 ? \";base64\" : \"\");\n\tparts.push(\",\");\n\tparts.push(isBase64 ? text : encodeURIComponent(text));\n\treturn parts.join(\"\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/makedatauri.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"title": "$:/core/modules/macros/now.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"title": "$:/core/modules/macros/qualify.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/resolvepath.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
"title": "$:/core/modules/macros/resolvepath.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"title": "$:/core/modules/macros/version.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/audioparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/csvparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"sandbox\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/htmlparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.tag = \"embed\";\n\t\t}\n\t} else if(text) {\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t\t\telement.tag = \"embed\";\n\t\t} else if(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"application/pdf\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/imageparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar node = {\n\t\ttype: \"whitespace\",\n\t\tstart: pos\n\t};\n\tvar re = /(\\s)+/g;\n\tre.lastIndex = pos;\n\tvar match = re.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t}\n\treturn null;\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar whitespace = $tw.utils.parseWhiteSpace(source,pos);\n\tif(whitespace) {\n\t\treturn whitespace.end;\n\t}\n\treturn pos;\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for an indirect value\n\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\tif(indirectValue) {\n\t\t\t\tpos = indirectValue.end;\n\t\t\t\tnode.type = \"indirect\";\n\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for a unquoted value\n\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\tif(unquotedValue) {\n\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/utils/parseutils.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/textparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/textparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: http://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|'\"\\\\^~]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[http://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [http://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [http://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|http://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"p\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /(\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"macrodef\",\n\t\tname: this.match[1],\n\t\tparams: params,\n\t\ttext: text\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[http://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|http://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/syslink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?\\$:[^\\s<|]+(?:[^\\s<|])/mg;\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
"title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\tthis.tree.push.apply(this.tree,this.parseInlineRun());\n\t} else {\n\t\tthis.tree.push.apply(this.tree,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar tree = [];\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t}\n\treturn tree;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,nextMatch.matchIndex)});\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,terminatorMatch.index)});\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,inlineRuleMatch.matchIndex)});\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"title": "$:/core/modules/pluginswitcher.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tthis.numChanges = 0;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(callback) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\tcallback(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\twindow.onbeforeunload = function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t};\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\",\n\t\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert(\"Error while saving:\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"title": "$:/core/modules/saver-handler.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t// Strip the file://\n\tif(pathname.indexOf(\"file://\") === 0) {\n\t\tpathname = pathname.substr(7);\n\t}\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Save the file\n\twindow.twi.saveFile(pathname,text);\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/andtidwiki.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\tfilename = document.location.pathname.substr(p+1);\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tlink.setAttribute(\"target\",\"_blank\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/download.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/fsosaver.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/manualdownload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/msdownload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/tiddlyfox.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/tiddlyie.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback(\"Error saving to TWEdit: \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"title": "$:/core/modules/savers/twedit.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; ;charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback(\"Error:\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"title": "$:/core/modules/savers/upload.js",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/browser-messaging.js": {
"text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\"),\n\t\t\tiframeInfo = {\n\t\t\t\turl: url,\n\t\t\t\tstatus: \"loading\",\n\t\t\t\tdomNode: iframe\n\t\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert(\"Error loading plugin library: \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/default/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert(\"Error loading plugin library: \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/default/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\tconsole.log(\"browser-messaging: \",document.location.toString())\n\t\tconsole.log(\"browser-messaging: Received message from\",event.origin);\n\t\tconsole.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
"title": "$:/core/modules/browser-messaging.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/commands.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"title": "$:/core/modules/startup/commands.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n",
"title": "$:/core/modules/startup/favicon.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin\n\tvar fields = {\n\t\ttitle: \"$:/temp/info-plugin\",\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo();\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"title": "$:/core/modules/startup/info.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"title": "$:/core/modules/startup/load-modules.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: \"Set password\",\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"title": "$:/core/modules/startup/password.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n\t})();\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only drafts have changed\n\t\tvar onlyDraftsHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !tiddler.hasField(\"draft.of\")) {\n\t\t\t\tonlyDraftsHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyDraftsHaveChanged) {\n\t\t\ttimerId = setTimeout(refresh,DRAFT_TIDDLER_TIMEOUT);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n",
"title": "$:/core/modules/startup/render.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param);\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tif(document[fullscreen._fullscreenElement]) {\n\t\t\t\tdocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tdocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/startup/rootwidget.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION = false;\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t}\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance(PERFORMANCE_INSTRUMENTATION);\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-US\"\n\t\t]\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget = new widget.widget({\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},{\n\t\t\twiki: $tw.wiki,\n\t\t\tdocument: document\n\t\t});\n\t}\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t} \n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({wiki: $tw.wiki, dirtyTracking: !$tw.syncadaptor});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/startup.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers();\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permalink\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permaview\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t//invoke any hooks that might change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// If a target tiddler was specified add it to the history stack\n\tif(target && target !== \"\") {\n\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t}\n\t\t$tw.wiki.addToHistory(target);\n\t} else if(storyList.length > 0) {\n\t\t$tw.wiki.addToHistory(storyList[0]);\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\tif(options.updateAddressBar !== \"no\") {\n\t\t// Get the story and the history stack\n\t\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\t\ttargetTiddler = \"\";\n\t\tif(options.targetTiddler) {\n\t\t\ttargetTiddler = options.targetTiddler;\n\t\t} else {\n\t\t\t// The target tiddler is the one at the top of the stack\n\t\t\tif(historyList.length > 0) {\n\t\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t\t}\n\t\t\t// Blank the target tiddler if it isn't present in the story\n\t\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\t\ttargetTiddler = \"\";\n\t\t\t}\n\t\t}\n\t\t// Assemble the location hash\n\t\tif(options.updateAddressBar === \"permalink\") {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t} else {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t}\n\t\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\t\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\t\tif(options.updateHistory === \"yes\") {\n\t\t\t\t// Assign the location hash so that history is updated\n\t\t\t\twindow.location.hash = $tw.locationHash;\n\t\t\t} else {\n\t\t\t\t// We use replace so that browser history isn't affected\n\t\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t\t}\n\t\t}\n\t}\n}\n\n})();\n",
"title": "$:/core/modules/startup/story.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/storyviews/classic.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar currWidth = targetElement.offsetWidth,\n\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Remove the dom nodes of the widget at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"translateX(0px)\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"title": "$:/core/modules/storyviews/classic.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"title": "$:/core/modules/storyviews/pop.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerData(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();",
"title": "$:/core/modules/storyviews/zoomin.js",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store. If a syncadaptor is used then individual tiddlers are synchronised through it. If there is no syncadaptor then the entire wiki is saved via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.syncadaptor = options.syncadaptor;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\"));\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\t// Tasks are {type: \"load\"/\"save\"/\"delete\", title:, queueTime:, lastModificationTime:}\n\tthis.taskQueue = {}; // Hashmap of tasks yet to be performed\n\tthis.taskInProgress = {}; // Hash of tasks in progress\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.syncToServer(changes);\n\t});\n\t// Browser event handlers\n\tif($tw.browser) {\n\t\t// Set up our beforeunload handler\n\t\twindow.onbeforeunload = function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t};\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\tself.handleLazyLoadEvent(title);\n\t});\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nConstants\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.filterFn.call(this.wiki);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: tiddler.fields.revision,\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\treturn (this.numTasksInQueue() > 0) || (this.numTasksInProgress() > 0);\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(this.wiki.getTiddler(tiddlerFields.title),tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: tiddlerFields.revision,\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Set the various status tiddlers\n\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\tif(isLoggedIn) {\n\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t} else {\n\t\t\t\tself.wiki.deleteTiddler(self.titleUserName);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tif(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tvar self = this;\n\t\tif(this.pollTimerId) {\n\t\t\tclearTimeout(this.pollTimerId);\n\t\t\tthis.pollTimerId = null;\n\t\t}\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\t// Trigger the next sync\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(\"Error retrieving skinny tiddler list:\",err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null;\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Do a full load if we've already got a fat version of the tiddler\n\t\t\t\t\tif(tiddler && tiddler.fields.text !== undefined) {\n\t\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\t\tself.enqueueSyncTask({\n\t\t\t\t\t\t\ttype: \"load\",\n\t\t\t\t\t\t\ttitle: tiddlerFields.title\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Load the skinny version of the tiddler\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nSynchronise a set of changes to the server\n*/\nSyncer.prototype.syncToServer = function(changes) {\n\tvar self = this,\n\t\tnow = Date.now(),\n\t\tfilteredChanges = this.filterFn.call(this.wiki,function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t$tw.utils.each(changes,function(change,title,object) {\n\t\t// Process the change if it is a deletion of a tiddler we're already syncing, or is on the filtered change list\n\t\tif((change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) || filteredChanges.indexOf(title) !== -1) {\n\t\t\t// Queue a task to sync this tiddler\n\t\t\tself.enqueueSyncTask({\n\t\t\t\ttype: change.deleted ? \"delete\" : \"save\",\n\t\t\t\ttitle: title\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Queue up a sync task to load this tiddler\n\tthis.enqueueSyncTask({\n\t\ttype: \"load\",\n\t\ttitle: title\n\t});\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: \"Login to TiddlySpace\",\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(null,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nQueue up a sync task. If there is already a pending task for the tiddler, just update the last modification time\n*/\nSyncer.prototype.enqueueSyncTask = function(task) {\n\tvar self = this,\n\t\tnow = Date.now();\n\t// Set the timestamps on this task\n\ttask.queueTime = now;\n\ttask.lastModificationTime = now;\n\t// Fill in some tiddlerInfo if the tiddler is one we haven't seen before\n\tif(!$tw.utils.hop(this.tiddlerInfo,task.title)) {\n\t\tthis.tiddlerInfo[task.title] = {\n\t\t\trevision: null,\n\t\t\tadaptorInfo: {},\n\t\t\tchangeCount: -1\n\t\t};\n\t}\n\t// Bail if this is a save and the tiddler is already at the changeCount that the server has\n\tif(task.type === \"save\" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) {\n\t\treturn;\n\t}\n\t// Check if this tiddler is already in the queue\n\tif($tw.utils.hop(this.taskQueue,task.title)) {\n\t\t// this.logger.log(\"Re-queueing up sync task with type:\",task.type,\"title:\",task.title);\n\t\tvar existingTask = this.taskQueue[task.title];\n\t\t// If so, just update the last modification time\n\t\texistingTask.lastModificationTime = task.lastModificationTime;\n\t\t// If the new task is a save then we upgrade the existing task to a save. Thus a pending load is turned into a save if the tiddler changes locally in the meantime. But a pending save is not modified to become a load\n\t\tif(task.type === \"save\" || task.type === \"delete\") {\n\t\t\texistingTask.type = task.type;\n\t\t}\n\t} else {\n\t\t// this.logger.log(\"Queuing up sync task with type:\",task.type,\"title:\",task.title);\n\t\t// If it is not in the queue, insert it\n\t\tthis.taskQueue[task.title] = task;\n\t\tthis.updateDirtyStatus();\n\t}\n\t// Process the queue\n\t$tw.utils.nextTick(function() {self.processTaskQueue.call(self);});\n};\n\n/*\nReturn the number of tasks in progress\n*/\nSyncer.prototype.numTasksInProgress = function() {\n\treturn $tw.utils.count(this.taskInProgress);\n};\n\n/*\nReturn the number of tasks in the queue\n*/\nSyncer.prototype.numTasksInQueue = function() {\n\treturn $tw.utils.count(this.taskQueue);\n};\n\n/*\nTrigger a timeout if one isn't already outstanding\n*/\nSyncer.prototype.triggerTimeout = function() {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},self.taskTimerInterval);\n\t}\n};\n\n/*\nProcess the task queue, performing the next task if appropriate\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if we're not already performing a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif(this.numTasksInProgress() === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(task) {\n\t\t\t// Remove the task from the queue and add it to the in progress list\n\t\t\tdelete this.taskQueue[task.title];\n\t\t\tthis.taskInProgress[task.title] = task;\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// Dispatch the task\n\t\t\tthis.dispatchTask(task,function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\tself.logger.alert(\"Sync error while processing '\" + task.title + \"':\\n\" + err);\n\t\t\t\t}\n\t\t\t\t// Mark that this task is no longer in progress\n\t\t\t\tdelete self.taskInProgress[task.title];\n\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t// Process the next task\n\t\t\t\tself.processTaskQueue.call(self);\n\t\t\t});\n\t\t} else {\n\t\t\t// Make sure we've set a time if there wasn't a task to perform, but we've still got tasks in the queue\n\t\t\tif(this.numTasksInQueue() > 0) {\n\t\t\t\tthis.triggerTimeout();\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nChoose the next applicable task\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar self = this,\n\t\tcandidateTask = null,\n\t\tnow = Date.now();\n\t// Select the best candidate task\n\t$tw.utils.each(this.taskQueue,function(task,title) {\n\t\t// Exclude the task if there's one of the same name in progress\n\t\tif($tw.utils.hop(self.taskInProgress,title)) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is a save and the tiddler has been modified recently, but not hit the fallback time\n\t\tif(task.type === \"save\" && (now - task.lastModificationTime) < self.throttleInterval &&\n\t\t\t(now - task.queueTime) < self.fallbackInterval) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is newer than the current best candidate\n\t\tif(candidateTask && candidateTask.queueTime < task.queueTime) {\n\t\t\treturn;\n\t\t}\n\t\t// Now this is our best candidate\n\t\tcandidateTask = task;\n\t});\n\treturn candidateTask;\n};\n\n/*\nDispatch a task and invoke the callback\n*/\nSyncer.prototype.dispatchTask = function(task,callback) {\n\tvar self = this;\n\tif(task.type === \"save\") {\n\t\tvar changeCount = this.wiki.getChangeCount(task.title),\n\t\t\ttiddler = this.wiki.getTiddler(task.title);\n\t\tthis.logger.log(\"Dispatching 'save' task:\",task.title);\n\t\tif(tiddler) {\n\t\t\tthis.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\t// Adjust the info stored about this tiddler\n\t\t\t\tself.tiddlerInfo[task.title] = {\n\t\t\t\t\tchangeCount: changeCount,\n\t\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\t\trevision: revision\n\t\t\t\t};\n\t\t\t\t// Invoke the callback\n\t\t\t\tcallback(null);\n\t\t\t},{\n\t\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t\t});\n\t\t} else {\n\t\t\tthis.logger.log(\" Not Dispatching 'save' task:\",task.title,\"tiddler does not exist\");\n\t\t\treturn callback(null);\n\t\t}\n\t} else if(task.type === \"load\") {\n\t\t// Load the tiddler\n\t\tthis.logger.log(\"Dispatching 'load' task:\",task.title);\n\t\tthis.syncadaptor.loadTiddler(task.title,function(err,tiddlerFields) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Store the tiddler\n\t\t\tif(tiddlerFields) {\n\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else if(task.type === \"delete\") {\n\t\t// Delete the tiddler\n\t\tthis.logger.log(\"Dispatching 'delete' task:\",task.title);\n\t\tthis.syncadaptor.deleteTiddler(task.title,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tdelete self.tiddlerInfo[task.title];\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t});\n\t}\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"title": "$:/core/modules/syncer.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = [];\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields.push(field + \": \" + this.getFieldString(field));\n\t\t\t}\n\t\t}\n\t}\n\treturn fields.join(\"\\n\");\n};\n\n/*\nCompare two tiddlers for equality\ntiddler: the tiddler to compare\nexcludeFields: array of field names to exclude from the comparison\n*/\nexports.isEqual = function(tiddler,excludeFields) {\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\treturn false;\n\t}\n\texcludeFields = excludeFields || [];\n\tvar self = this,\n\t\tdifferences = []; // Fields that have differences\n\t// Add to the differences array\n\tfunction addDifference(fieldName) {\n\t\t// Check for this field being excluded\n\t\tif(excludeFields.indexOf(fieldName) === -1) {\n\t\t\t// Save the field as a difference\n\t\t\t$tw.utils.pushTop(differences,fieldName);\n\t\t}\n\t}\n\t// Returns true if the two values of this field are equal\n\tfunction isFieldValueEqual(fieldName) {\n\t\tvar valueA = self.fields[fieldName],\n\t\t\tvalueB = tiddler.fields[fieldName];\n\t\t// Check for identical string values\n\t\tif(typeof(valueA) === \"string\" && typeof(valueB) === \"string\" && valueA === valueB) {\n\t\t\treturn true;\n\t\t}\n\t\t// Check for identical array values\n\t\tif($tw.utils.isArray(valueA) && $tw.utils.isArray(valueB) && $tw.utils.isArrayEqual(valueA,valueB)) {\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise the fields must be different\n\t\treturn false;\n\t}\n\t// Compare our fields\n\tfor(var fieldName in this.fields) {\n\t\tif(!isFieldValueEqual(fieldName)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// There's a difference for every field in the other tiddler that we don't have\n\tfor(fieldName in tiddler.fields) {\n\t\tif(!(fieldName in this.fields)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// Return whether there were any differences\n\treturn differences.length === 0;\n};\n\n})();\n",
"title": "$:/core/modules/tiddler.js",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"] && incomingTiddler.version) {\n\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/plugins.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/system.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerData(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/upgraders/themetweaks.js",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/crypto.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/utils/crypto.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/animations/slide.js",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"title": "$:/core/modules/utils/dom/animator.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif(document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/browser.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t}\n\tel.className = c.join(\" \");\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function() {\n\tif(\"scrollX\" in window) {\n\t\treturn {x: window.scrollX, y: window.scrollY};\n\t} else {\n\t\treturn {x: document.documentElement.scrollLeft, y: document.documentElement.scrollTop};\n\t}\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\ttry {\n\t\tif(window.localStorage) {\n\t\t\tlocalStorage.setItem(\"tw5-password-\" + name,password);\n\t\t}\n\t} catch(e) {\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\ttry {\n\t\treturn window.localStorage ? localStorage.getItem(\"tw5-password-\" + name) : \"\";\n\t} catch(e) {\n\t\treturn \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n\n})();\n",
"title": "$:/core/modules/utils/dom.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data)\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tdata = results.join(\"&\");\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this.responseText,this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback(\"XMLHttpRequest error code: \" + this.status);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,options.url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\trequest.send(data);\n\treturn request;\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/http.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"enter\": 13,\n\t\"escape\": 27\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nexports.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(\"+\"),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase();\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(namedKeys[s]) {\n\t\t\tinfo.keyCode = namedKeys[s];\n\t\t}\n\t}\n\treturn info;\n};\n\nexports.checkKeyDescriptor = function(event,keyInfo) {\n\tvar metaKeyStatus = !!keyInfo.metaKey; // Using a temporary variable to keep JSHint happy\n\treturn event.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === metaKeyStatus;\t\n};\n\n})();\n",
"title": "$:/core/modules/utils/dom/keyboard.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = document.createElement(\"div\"),\n\t\tmodalBackdrop = document.createElement(\"div\"),\n\t\tmodalWrapper = document.createElement(\"div\"),\n\t\tmodalHeader = document.createElement(\"div\"),\n\t\theaderTitle = document.createElement(\"h3\"),\n\t\tmodalBody = document.createElement(\"div\"),\n\t\tmodalLink = document.createElement(\"a\"),\n\t\tmodalFooter = document.createElement(\"div\"),\n\t\tmodalFooterHelp = document.createElement(\"span\"),\n\t\tmodalFooterButtons = document.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t});\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t});\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(document.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler && tiddler.fields && tiddler.fields.help) {\n\t\tvar link = document.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.appendChild(document.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: \"Close\"\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t});\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + window.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\twindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tdocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tdocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tif($tw.pageContainer) {\n\t\t$tw.utils.toggleClass($tw.pageContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"title": "$:/core/modules/utils/dom/modal.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar notification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{parentWidget: $tw.rootWidget, document: document});\n\twidgetNode.render(notification,null);\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t});\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"title": "$:/core/modules/utils/dom/notifier.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === options.title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\t// Store the popup details\n\tthis.popups.push({\n\t\ttitle: options.title,\n\t\twiki: options.wiki,\n\t\tdomNode: options.domNode\n\t});\n\t// Set the state tiddler\n\toptions.wiki.setTextReference(options.title,\n\t\t\t\"(\" + options.domNode.offsetLeft + \",\" + options.domNode.offsetTop + \",\" + \n\t\t\t\toptions.domNode.offsetWidth + \",\" + options.domNode.offsetHeight + \")\");\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"title": "$:/core/modules/utils/dom/popup.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\t// Now get ready to scroll the body\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = $tw.utils.getScrollPosition();\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar clientBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\ttop: clientBounds.top + scrollPosition.y,\n\t\t\twidth: clientBounds.width,\n\t\t\theight: clientBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t// targetPos/targetSize - position and size of the target element\n\t// currentPos/currentSize - position and size of the current scroll viewport\n\t// returns: new position of the scroll viewport\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = currentPos;\n\t\t\t// If the target is entirely above/left of the current view, then scroll to its top/left\n\t\t\tif((targetPos + targetSize) <= (currentPos + 50)) {\n\t\t\t\tnewPos = targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\tnewPos = targetPos + targetSize - currentSize;\n\t\t\t// If the target is out of view below/right, then just scroll to the top/left\n\t\t\t} else if(targetPos > (currentPos + currentSize - 50)) {\n\t\t\t\tnewPos = targetPos;\n\t\t\t}\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,window.innerWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,window.innerHeight);\n\t// Only scroll if the position has changed\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\twindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"title": "$:/core/modules/utils/dom/scroller.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/edition-info.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
"title": "$:/core/modules/utils/edition-info.js",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/fakedom.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text;\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis.style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value;\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"='\",$tw.utils.htmlEncode(v),\"'\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this.style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this.style) {\n\t\t\t\tstyle.push(s + \":\" + this.style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style='\",style.join(\"\"),\"'\")\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get textContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get formattedTextContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"title": "$:/core/modules/utils/fakedom.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = new Buffer(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n})();\n",
"title": "$:/core/modules/utils/filesystem.js",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/logger.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName) {\n\tthis.componentName = componentName || \"\";\n}\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tif(console !== undefined && console.log !== undefined) {\n\t\treturn Function.apply.call(console.log, console, [this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)));\n\t}\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\t// Prepare the text of the alert\n\tvar text = Array.prototype.join.call(arguments,\" \");\n\t// Check if there is an existing alert with the same text and the same component\n\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\talertFields,\n\t\texistingCount,\n\t\tself = this;\n\t$tw.utils.each(existingAlerts,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t}\n\t});\n\tif(alertFields) {\n\t\texistingCount = alertFields.count || 1;\n\t} else {\n\t\talertFields = {\n\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\ttext: text,\n\t\t\ttags: [ALERT_TAG],\n\t\t\tcomponent: this.componentName\n\t\t};\n\t\texistingCount = 0;\n\t}\n\talertFields.modified = new Date();\n\tif(++existingCount > 1) {\n\t\talertFields.count = existingCount;\n\t} else {\n\t\talertFields.count = undefined;\n\t}\n\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t// Log it too\n\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n};\n\nexports.Logger = Logger;\n\n})();\n",
"title": "$:/core/modules/utils/logger.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n})();\n",
"title": "$:/core/modules/utils/parsetree.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap of current values of measurements\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n}\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tself.measures = {};\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime) + \"ms\");\n\t\t\tfor(var m in self.measures) {\n\t\t\t\tself.logger.log(\"+\" + m + \": \" + self.measures[m] + \"ms\");\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments),\n\t\t\t\tvalue = self.measures[name] || 0;\n\t\t\tself.measures[name] = value + $tw.utils.timer(startTime);\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"title": "$:/core/modules/utils/performance.js",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\nError: \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"title": "$:/core/modules/utils/pluginmaker.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\tconsole.log($tw.node ? \"\\x1b[1;33m\" + text + \"\\x1b[0m\" : text);\n}\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\tvar s = 0;\n\t$tw.utils.each(object,function() {s++;});\n\treturn s;\n};\n\n/*\nCheck if an array is equal by value and by reference.\n*/\nexports.isArrayEqual = function(array1,array2) {\n\tif(array1 === array2) {\n\t\treturn true;\n\t}\n\tarray1 = array1 || [];\n\tarray2 = array2 || [];\n\tif(array1.length !== array2.length) {\n\t\treturn false;\n\t}\n\treturn array1.every(function(value,index) {\n\t\treturn value === array2[index];\n\t});\n};\n\n/*\nPush entries onto an array, removing them first if they already exist in the array\n\tarray: array to modify (assumed to be free of duplicates)\n\tvalue: a single value to push or an array of values to push\n*/\nexports.pushTop = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\t// Remove any array entries that are duplicated in the new values\n\t\tif(value.length !== 0) {\n\t\t\tif(array.length !== 0) {\n\t\t\t\tif(value.length < array.length) {\n\t\t\t\t\tfor(t=0; t<value.length; t++) {\n\t\t\t\t\t\tp = array.indexOf(value[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(p,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor(t=array.length-1; t>=0; t--) {\n\t\t\t\t\t\tp = value.indexOf(array[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(t,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Push the values on top of the main array\n\t\t\tarray.push.apply(array,value);\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t\tarray.push(value);\n\t}\n\treturn array;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1) + 3600000) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\" ' to \"'\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\").replace(/\\'/mg,\"'\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar e = s.substr(1,s.length-2); // Strip the & and the ;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(2),16));\t\n\t\t} else {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(1),10));\n\t\t}\n\t} else {\n\t\tvar c = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn String.fromCharCode(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|'\"\\\\^~]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10);\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\tif($tw.browser) {\n\t\t// TODO\n\t\tthrow \"$tw.utils.base64Decode() doesn't work in the browser\";\n\t} else {\n\t\treturn (new Buffer(string64,\"base64\")).toString();\n\t}\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\t\t\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n})();",
"title": "$:/core/modules/utils/utils.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-deletefield.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {};\n\tif(this.actionField) {\n\t\tremoveFields[this.actionField] = undefined;\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t}\n\t\t});\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,removeFields));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-deletefield.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-navigate.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$param\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Dispatch the message\n\tthis.dispatchEvent({type: this.actionMessage, param: param, paramObject: paramObject, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-sendmessage.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this;\n\tif(typeof this.actionValue === \"string\") {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue);\t\t\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/action-setfield.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,function(tiddlerFieldsArray) {\n\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/browse.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"button\");\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = this.popup && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif(this.set && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n}\n\nButtonWidget.prototype.isSelected = function() {\n\tvar tiddler = this.wiki.getTiddler(this.set);\n\treturn tiddler ? tiddler.fields.text === this.setTo : this.defaultSetValue === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\t$tw.popup.triggerPopup({\n\t\tdomNode: this.domNodes[0],\n\t\ttitle: this.popup,\n\t\twiki: this.wiki\n\t});\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup])) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/button.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value = tiddler.fields[this.checkboxField] || this.checkboxDefault || \"\";\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false;\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tiddler.hasTag(this.checkboxTag) !== checked)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tvar value = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.field || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/checkbox.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/codeblock.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = undefined;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/count.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = \"tc-dropzone\";\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"}\n\t]);\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nDropZoneWidget.prototype.enterDrag = function() {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// We count enter/leave events\n\tthis.dragEnterCount = (this.dragEnterCount || 0) + 1;\n\t// If we're entering for the first time we need to apply highlighting\n\tif(this.dragEnterCount === 1) {\n\t\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.leaveDrag = function() {\n\t// Reduce the enter count\n\tthis.dragEnterCount = (this.dragEnterCount || 0) - 1;\n\t// Remove highlighting if we're leaving externally\n\tif(this.dragEnterCount <= 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag();\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag();\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tthis.leaveDrag();\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Reset the enter count\n\tthis.dragEnterCount = 0;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = this.wiki.readFiles(dataTransfer.files,function(tiddlerFieldsArray) {\n\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t});\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\tthis.importData(dataTransfer);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.importData = function(dataTransfer) {\n\t// Try each provided data type in turn\n\tfor(var t=0; t<this.importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || this.importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = this.importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.convertToFields(data);\n\t\t\t\tif(!tiddlerFields.title) {\n\t\t\t\t\ttiddlerFields.title = this.wiki.generateNewTitle(\"Untitled\");\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nDropZoneWidget.prototype.importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, convertToFields: function(data) {\n\t\treturn JSON.parse(data);\n\t}},\n\t{type: \"URL\", IECompatible: true, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/plain\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"Text\", IECompatible: true, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}}\n];\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/dropzone.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Construct the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"transclude\",\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t}\n\t}]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-binary.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 300,\n\tDEFAULT_IMAGE_HEIGHT = 185;\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\tthis.widthDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-width\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleWidthChangeEvent\"\n\t\t}]\n\t});\n\tthis.heightDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-height\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleHeightChangeEvent\"\n\t\t}]\n\t});\n\t// Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tparent.insertBefore(this.widthDomNode,nextSibling);\n\tparent.insertBefore(this.heightDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode,this.widthDomNode,this.heightDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n};\n\n/*\nNote that the bitmap editor intentionally doesn't try to refresh itself because it would be confusing to have the image changing spontaneously while editting it\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\t// Get the current bitmap into an image object\n\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Update the input boxes with the actual size of the canvas\n*/\nEditBitmapWidget.prototype.updateSize = function() {\n\tthis.widthDomNode.value = this.currCanvas.width;\n\tthis.heightDomNode.value = this.currCanvas.height;\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleWidthChangeEvent = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(this.widthDomNode.value,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newWidth !== this.currCanvas.width) {\n\t\tthis.changeCanvasSize(newWidth,this.currCanvas.height);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleHeightChangeEvent = function(event) {\n\t// Get the new width\n\tvar newHeight = parseInt(this.heightDomNode.value,10);\n\t// Update if necessary\n\tif(newHeight > 0 && newHeight !== this.currCanvas.height) {\n\t\tthis.changeCanvasSize(this.currCanvas.width,newHeight);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseInt(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"),10);\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\tif(tiddler) {\n\t\t// data URIs look like \"data:<type>;base64,<text>\"\n\t\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type,1.0),\n\t\t\tposColon = dataURL.indexOf(\":\"),\n\t\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\t\tposComma = dataURL.indexOf(\",\"),\n\t\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\t\ttext = dataURL.substring(posComma+1);\n\t\tvar update = {type: type, text: text};\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,update));\n\t}\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-bitmap.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditTextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditTextWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tvar editInfo = this.getEditInfo(),\n\t\ttag = this.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tif(this.editType) {\n\t\tdomNode.setAttribute(\"type\",this.editType);\n\t}\n\tif(editInfo.value === \"\" && this.editPlaceholder) {\n\t\tdomNode.setAttribute(\"placeholder\",this.editPlaceholder);\n\t}\n\tif(this.editSize) {\n\t\tdomNode.setAttribute(\"size\",this.editSize);\n\t}\n\t// Assign classes\n\tif(this.editClass) {\n\t\tdomNode.className = this.editClass;\n\t}\n\t// Set the text\n\tif(this.editTag === \"textarea\") {\n\t\tdomNode.appendChild(this.document.createTextNode(editInfo.value));\n\t} else {\n\t\tdomNode.value = editInfo.value;\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n\t// Fix height\n\tthis.fixHeight();\n\t// Focus field\n\tif(this.editFocus === \"true\") {\n\t\tif(domNode.focus && domNode.select) {\n\t\t\tdomNode.focus();\n\t\t\tdomNode.select();\t\t\t\n\t\t}\n\t}\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditTextWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tswitch(this.editField) {\n\t\t\t\tcase \"text\":\n\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"title\":\n\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\tvalue = this.editDefault;\n\t\t\t}\n\t\t}\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\treturn {value: value, update: update};\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditTextWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editDefault = this.getAttribute(\"default\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editSize = this.getAttribute(\"size\");\n\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",\"yes\") === \"yes\";\n\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\tthis.editFocus = this.getAttribute(\"focus\");\n\t// Get the editor element tag and type\n\tvar tag,type;\n\tif(this.editField === \"text\") {\n\t\ttag = \"textarea\";\n\t} else {\n\t\ttag = \"input\";\n\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\ttag = fieldModule.editTag;\n\t\t}\n\t\tif(fieldModule && fieldModule.editType) {\n\t\t\ttype = fieldModule.editType;\n\t\t}\n\t\ttype = type || \"text\";\n\t}\n\t// Get the rest of our parameters\n\tthis.editTag = this.getAttribute(\"tag\",tag);\n\tthis.editType = this.getAttribute(\"type\",type);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely rerender if any of our attributes have changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.editTitle]) {\n\t\tthis.updateEditor(this.getEditInfo().value);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditTextWidget.prototype.updateEditor = function(text) {\n\tthis.updateEditorDomNode(text);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditTextWidget.prototype.updateEditorDomNode = function(text) {\n\t// Replace the edit value if the tiddler we're editing has changed\n\tvar domNode = this.domNodes[0];\n\tif(!domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.document.activeElement !== domNode) {\n\t\t\tdomNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nFix the height of textareas to fit their content\n*/\nEditTextWidget.prototype.fixHeight = function() {\n\tvar self = this,\n\t\tdomNode = this.domNodes[0];\n\tif(this.editAutoHeight && domNode && !domNode.isTiddlyWikiFakeDom && this.editTag === \"textarea\") {\n\t\t// Resize the textarea to fit its content, preserving scroll position\n\t\tvar scrollPosition = $tw.utils.getScrollPosition(),\n\t\t\tscrollTop = scrollPosition.y;\n\t\t// Measure the specified minimum height\n\t\tdomNode.style.height = self.editMinHeight;\n\t\tvar minHeight = domNode.offsetHeight;\n\t\t// Set its height to auto so that it snaps to the correct height\n\t\tdomNode.style.height = \"auto\";\n\t\t// Calculate the revised height\n\t\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,minHeight);\n\t\t// Only try to change the height if it has changed\n\t\tif(newHeight !== domNode.offsetHeight) {\n\t\t\tdomNode.style.height = newHeight + \"px\";\n\t\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t\t$tw.utils.forceLayout(domNode);\n\t\t\t// Check that the scroll position is still visible before trying to scroll back to it\n\t\t\tscrollTop = Math.min(scrollTop,self.document.body.scrollHeight - window.innerHeight);\n\t\t\twindow.scrollTo(scrollPosition.x,scrollTop);\n\t\t}\n\t}\n};\n\n/*\nHandle a dom \"input\" event\n*/\nEditTextWidget.prototype.handleInputEvent = function(event) {\n\tthis.saveChanges(this.domNodes[0].value);\n\tthis.fixHeight();\n\treturn true;\n};\n\nEditTextWidget.prototype.handleFocusEvent = function(event) {\n\tif(this.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.editFocusPopup,\n\t\t\twiki: this.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\nEditTextWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\nexports[\"edit-text\"] = EditTextWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit-text.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder}\n\t\t}\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/edit.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/element.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/encrypt.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar textNode = this.document.createTextNode($tw.utils.entityDecode(this.parseTreeNode.entity));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/entity.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/fieldmangler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\t// Get the exclusion list\n\tvar exclude;\n\tif(this.exclude) {\n\t\texclude = this.exclude.split(\" \");\n\t} else {\n\t\texclude = [\"text\"]; \n\t}\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tfor(var fieldName in tiddler.fields) {\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tfields.push(fieldName);\n\t\t\t}\n\t\t}\n\t\tfields.sort();\n\t\tfor(var f=0; f<fields.length; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tvar row = this.template,\n\t\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\t\tif(reMatch) {\n\t\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trow = row.replace(\"$name$\",fieldName);\n\t\t\t\trow = row.replace(\"$value$\",value);\n\t\t\t\trow = row.replace(\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\t\ttext.push(row);\n\t\t\t}\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || changedAttributes.stripTitlePrefix || changedTiddlers[this.tiddlerTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/fields.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/image.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar self = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\tvar widgetStackStart,widgetStackEnd;\n\tfunction addWidgetNode(widgetNode) {\n\t\tif(widgetNode) {\n\t\t\tif(!widgetStackStart && !widgetStackEnd) {\n\t\t\t\twidgetStackStart = widgetNode;\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t} else {\n\t\t\t\twidgetStackEnd.children = [widgetNode];\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t}\n\t\t}\n\t}\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = self.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\taddWidgetNode({\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params\n\t\t\t\t});\n\t\t\t\tparseTreeNode = parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\t// Add our own children to the end of the pile\n\tvar parseTreeNodes;\n\tif(widgetStackStart && widgetStackEnd) {\n\t\tparseTreeNodes = [widgetStackStart];\n\t\twidgetStackEnd.children = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/importvariables.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.utils.checkKeyDescriptor(event,self.keyInfo)) {\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.key = this.getAttribute(\"key\");\n\tthis.keyInfo = $tw.utils.parseKeyDescriptor(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/keyboard.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true;\n\t// Render the link if required\n\tif(useWikiLinks) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.linkClasses) {\n\t\tclasses.push(this.linkClasses);\n\t}\n\tclasses.push(\"tc-tiddlylink\");\n\tif(this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t}\n\tif(this.isMissing && !this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t} else {\n\t\tif(!this.isMissing) {\n\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t}\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Set an href\n\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\",\n\t\twikiLinkText = wikiLinkTemplate.replace(\"$uri_encoded$\",encodeURIComponent(this.to));\n\twikiLinkText = wikiLinkText.replace(\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tdomNode.setAttribute(\"href\",wikiLinkText);\t\t\n\t}\n\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragstart\", handlerObject: this, handlerMethod: \"handleDragStartEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n};\n\nLinkWidget.prototype.handleDragStartEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\tif(this.to) {\n\t\t\t$tw.dragInProgress = true;\n\t\t\t// Set the dragging class on the element being dragged\n\t\t\t$tw.utils.addClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t\t// Create the drag image elements\n\t\t\tthis.dragImage = this.document.createElement(\"div\");\n\t\t\tthis.dragImage.className = \"tc-tiddler-dragger\";\n\t\t\tvar inner = this.document.createElement(\"div\");\n\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\tinner.appendChild(this.document.createTextNode(this.to));\n\t\t\tthis.dragImage.appendChild(inner);\n\t\t\tthis.document.body.appendChild(this.dragImage);\n\t\t\t// Astoundingly, we need to cover the dragger up: http://www.kryogenix.org/code/browser/custom-drag-image.html\n\t\t\tvar cover = this.document.createElement(\"div\");\n\t\t\tcover.className = \"tc-tiddler-dragger-cover\";\n\t\t\tcover.style.left = (inner.offsetLeft - 16) + \"px\";\n\t\t\tcover.style.top = (inner.offsetTop - 16) + \"px\";\n\t\t\tcover.style.width = (inner.offsetWidth + 32) + \"px\";\n\t\t\tcover.style.height = (inner.offsetHeight + 32) + \"px\";\n\t\t\tthis.dragImage.appendChild(cover);\n\t\t\t// Set the data transfer properties\n\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t// First the image\n\t\t\tdataTransfer.effectAllowed = \"copy\";\n\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\tdataTransfer.setDragImage(this.dragImage.firstChild,-16,-16);\n\t\t\t}\n\t\t\t// Then the data\n\t\t\tdataTransfer.clearData();\n\t\t\tvar jsonData = this.wiki.getTiddlerAsJson(this.to),\n\t\t\t\ttextData = this.wiki.getTiddlerText(this.to,\"\"),\n\t\t\t\ttitle = (new RegExp(\"^\" + $tw.config.textPrimitives.wikiLink + \"$\",\"mg\")).exec(this.to) ? this.to : \"[[\" + this.to + \"]]\";\n\t\t\t// IE doesn't like these content types\n\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\tdataTransfer.setData(\"text/plain\",title);\n\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t}\n\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\tdataTransfer.setData(\"Text\",title);\n\t\t\tevent.stopPropagation();\n\t\t} else {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\nLinkWidget.prototype.handleDragEndEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\t$tw.dragInProgress = false;\n\t\t// Remove the dragging class on the element being dragged\n\t\t$tw.utils.removeClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t// Delete the drag image element\n\t\tif(this.dragImage) {\n\t\t\tthis.dragImage.parentNode.removeChild(this.dragImage);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/link.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(this.catchTo) {\n\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.catchMessage && this.parentWidget) {\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: this.catchMessage,\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\tif(this.catchSet) {\n\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/linkcatcher.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
"title": "$:/core/modules/widgets/list.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/macrocall.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar text = this.getVariable(this.parseTreeNode.name || this.getAttribute(\"$name\"),{params: params}),\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/macrocall.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList}\n\t));\n};\n\nNavigatorWidget.prototype.findTitleInStory = function(storyList,title,defaultIndex) {\n\tvar p = storyList.indexOf(title);\n\treturn p === -1 ? defaultIndex : p;\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tvar p = storyList.indexOf(title);\n\twhile(p !== -1) {\n\t\tstoryList.splice(p,1);\n\t\tp = storyList.indexOf(title);\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tvar pos = storyList.indexOf(oldTitle);\n\tif(pos !== -1) {\n\t\tstoryList[pos] = newTitle;\n\t\tdo {\n\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\tif(pos !== -1) {\n\t\t\t\tstoryList.splice(pos,1);\n\t\t\t}\n\t\t} while(pos !== -1);\n\t} else {\n\t\tstoryList.splice(0,0,newTitle);\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tvar storyList = this.getStoryList();\n\tif(storyList) {\n\t\t// See if the tiddler is already there\n\t\tvar slot = this.findTitleInStory(storyList,title,-1);\n\t\t// If not we need to add it\n\t\tif(slot === -1) {\n\t\t\t// First we try to find the position of the story element we navigated from\n\t\t\tslot = this.findTitleInStory(storyList,fromTitle,-1) + 1;\n\t\t\t// Add the tiddler\n\t\t\tstoryList.splice(slot,0,title);\n\t\t\t// Save the story\n\t\t\tthis.saveStoryList(storyList);\n\t\t}\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title),\n\t\tdraftTitle = draftTiddler.fields.title,\n\t\tstoryList = this.getStoryList();\n\tthis.removeTitleFromStory(storyList,draftTitle);\n\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Delete this tiddler\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle;\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\";\n\t\tc++;\n\t} while(this.wiki.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Save the draft tiddler as the real tiddler\n\t\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields()));\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(originalTiddler) {\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t} else {\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t}\n\t\t\tthis.saveStoryList(storyList);\n\t\t\t// Trigger an autosave\n\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\t\t\t\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags)\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\texistingTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\t\t\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\tvar self = this;\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\t\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\t\t\n\t}\n\treturn false;\n};\n\n// \nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerData(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push(\"The following tiddlers were imported:\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(tiddlerFields));\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: IMPORT_TITLE,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([IMPORT_TITLE]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/navigator.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/password.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nRadio widget\n\nWill set a field to the selected value:\n\n```\n\t<$radio field=\"myfield\" value=\"check 1\">one</$radio>\n\t<$radio field=\"myfield\" value=\"check 2\">two</$radio>\n\t<$radio field=\"myfield\" value=\"check 3\">three</$radio>\n```\n\n|Parameter |Description |h\n|tiddler |Name of the tiddler in which the field should be set. Defaults to current tiddler |\n|field |The name of the field to be set |\n|value |The value to set |\n|class |Optional class name(s) |\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.radioClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(this.getValue() == this.radioValue) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.radioTitle);\n\treturn tiddler && tiddler.getFieldString(this.radioField);\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tif(this.radioClass !== \"\") {\n\t\tthis.radioClass += \" \";\n\t}\n\tthis.radioClass += \"tc-radio\";\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/radio.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/raw.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tdomNode.style.left = (this.popup.left - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTitle = this.state;\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state = this.stateTitle ? this.wiki.getTextReference(this.stateTitle,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.readMatchState(state);\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.readMatchState(state);\n\t\t\tthis.isOpen = !this.isOpen;\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.readMatchState = function(state) {\n\tthis.isOpen = state === this.text;\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes[\"default\"] || changedAttributes.animate) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false,\n\t\t\tcurrentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\trefreshed = true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n }});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/reveal.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/scrollable.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\tvar value = this.getSelectDomNode().value;\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tvar domNode = this.getSelectDomNode();\n\tif(domNode.value !== value) {\n\t\tdomNode.value = value;\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tif(changedTiddlers[this.selectTitle]) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/select.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tvar value = this.setValue;\n\tif(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(!this.setValue) {\n\t\t\tvalue = $tw.utils.stringifyList(results);\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t}\n\tthis.setVariable(this.setName,value,this.parseTreeNode.params);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.value || changedAttributes.emptyValue) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/set.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/text.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/tiddler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: \"Recursive transclusion error in transclude widget\"}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/transclude.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified();\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function() {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{parentWidget: this});\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"title": "$:/core/modules/widgets/view.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tif(arguments.length > 0) {\n\t\tthis.initialise(parseTreeNode,options);\n\t}\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\n*/\nWidget.prototype.setVariable = function(name,value,params) {\n\tthis.variables[name] = {value: value, params: params};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n*/\nWidget.prototype.getVariable = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value;\n\t\t// Substitute any parameters specified in the definition\n\t\tvalue = this.substituteVariableParameters(value,variable.params,actualParams);\n\t\tvalue = this.substituteVariableReferences(value);\n\t\treturn value;\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn this.evaluateMacroModule(name,actualParams,options.defaultValue);\n};\n\nWidget.prototype.substituteVariableParameters = function(text,formalParams,actualParams) {\n\tif(formalParams) {\n\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\tparamInfo, paramValue;\n\t\t// Step through each of the parameters in the macro definition\n\t\tfor(var p=0; p<formalParams.length; p++) {\n\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\tparamInfo = formalParams[p];\n\t\t\tparamValue = undefined;\n\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\tnextAnonParameter++;\n\t\t\t}\n\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t}\n\t\t\t// If we've still not got a value, use the default, if any\n\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t// Replace any instances of this parameter\n\t\t\ttext = text.replace(new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(paramInfo.name) + \"\\\\$\",\"mg\"),paramValue);\n\t\t}\n\t}\n\treturn text;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tname = name || \"transclusion\";\n\tvar output = [],\n\t\tnode = this;\n\twhile(node && node.parentWidget) {\n\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\toutput.push(node.getVariable(name));\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn $tw.utils.hashString(output.join(\"\"));\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.render(parent,nextSibling);\n\t});\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar self = this,\n\t\trefreshed = false;\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\trefreshed = childWidget.refresh(changedTiddlers) || refreshed;\n\t});\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\treturn parent.findNextSiblingDomNode(index);\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke any action widgets that are descendants of this widget.\n*/\nWidget.prototype.invokeActions = function(event) {\n\treturn this.invokeActionCall(this,event);\n};\n\n/*\nRecursively search through descendants, invoking all actions encountered.\n*/\nWidget.prototype.invokeActionCall = function(here,event) {\n\tvar handled = false;\n\tfor(var t=0; t<here.children.length; t++) {\n\t\tvar child = here.children[t];\n\t\tif(child.invokeAction && child.invokeAction(this,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(this.invokeActionCall(child,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\nexports.widget = Widget;\n\n})();\n",
"title": "$:/core/modules/widgets/widget.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki.js": {
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\";\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value) {\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tdata[index] = value;\n\t\tthis.setTiddlerData(title,data,this.getModificationFields());\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || [];\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tvar fields = {\n\t\t\tcreated: new Date()\n\t\t},\n\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\tif(creator) {\n\t\tfields.creator = creator;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tvar fields = Object.create(null),\n\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\tfields.modified = new Date();\n\tif(modifier) {\n\t\tfields.modifier = modifier;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t (isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\t// Count up the links\n\t\tvar links = [],\n\t\t\tcheckParseTree = function(parseTree) {\n\t\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\tif(parser) {\n\t\t\tcheckParseTree(parser.tree);\n\t\t}\n\t\treturn links;\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinks = [];\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\tbacklinks.push(title);\n\t\t}\n\t});\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\tvar self = this;\n\treturn this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\tvar tagmap = self.getTagMap();\n\t\treturn self.sortByList(tagmap[tag],tag);\n\t});\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar t, title, titles = [], unlisted = [];\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Add remaining entries to unlisted\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tunlisted.push(title);\n\t\t\t}\n\t\t}\n\t\t//sort unlisted\n\t\t$tw.wiki.sortTiddlers(unlisted,\"title\",false,false);\n\t\t//concat listed with unlisted\n\t\ttitles = titles.concat(unlisted);\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tvar currPos = titles.indexOf(title),\n\t\t\t\tnewPos = -1,\n\t\t\t\ttiddler = this.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(newPos === -1) {\n\t\t\t\t\tnewPos = currPos;\n\t\t\t\t}\n\t\t\t\tif(newPos !== currPos) {\n\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t}\n\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerData(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerData(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\n// Temporarily disable caching so that tweakParseTreeNode() works\nreturn initializer();\n\n//\tthis.caches = this.caches || Object.create(null);\n//\tvar caches = this.caches[title];\n//\tif(caches && caches[cacheName]) {\n//\t\treturn caches[cacheName];\n//\t} else {\n//\t\tif(!caches) {\n//\t\t\tcaches = Object.create(null);\n//\t\t\tthis.caches[title] = caches;\n//\t\t}\n//\t\tcaches[cacheName] = initializer();\n//\t\treturn caches[cacheName];\n//\t}\n};\n\n// Clear all caches associated with a particular tiddler\nexports.clearCache = function(title) {\n\tthis.caches = this.caches || Object.create(null);\n\tif($tw.utils.hop(this.caches,title)) {\n\t\tdelete this.caches[title];\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.old_parseText = function(type,text,options) {\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.old_parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"newInlineParseTree\" : \"newBlockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.old_parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nvar tweakMacroDefinition = function(nodeList) {\n\tif(nodeList && nodeList[0] && nodeList[0].type === \"macrodef\") {\n\t\tnodeList[0].type = \"set\";\n\t\tnodeList[0].attributes = {\n\t\t\tname: {type: \"string\", value: nodeList[0].name},\n\t\t\tvalue: {type: \"string\", value: nodeList[0].text}\n\t\t};\n\t\tnodeList[0].children = nodeList.slice(1);\n\t\tnodeList.splice(1,nodeList.length-1);\n\t\ttweakMacroDefinition(nodeList[0].children);\n\t}\n};\n\nvar tweakParser = function(parser) {\n\t// Move any macro definitions to contain the body tree\n\ttweakMacroDefinition(parser.tree);\n};\n\nexports.parseText = function(type,text,options) {\n\tvar parser = this.old_parseText(type,text,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTiddler = function(title,options) {\n\tvar parser = this.old_parseTiddler(title,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type || \"text/vnd.tiddlywiki\",tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.children: optional array of children for the transclude widget\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTree = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"transclude\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttiddler: {\n\t\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: title}},\n\t\t\t\tisBlock: !options.parseAsInline}]}\n\t]};\n\tif(options.field) {\n\t\tparseTree.tree[0].children[0].attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.children) {\n\t\tparseTree.tree[0].children[0].children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTree,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tliteral: If true, searches for literal string, rather than separate search terms\n\tfield: If specified, restricts the search to the specified field\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tmatch;\n\t\tfor(var t=0; t<searchTermsRegExps.length; t++) {\n\t\t\tmatch = false;\n\t\t\tif(options.field) {\n\t\t\t\tmatch = searchTermsRegExps[t].test(tiddler.getFieldString(options.field));\n\t\t\t} else {\n\t\t\t\t// Search title, tags and body\n\t\t\t\tif(contentTypeInfo.encoding === \"utf8\") {\n\t\t\t\t\tmatch = match || searchTermsRegExps[t].test(tiddler.fields.text);\n\t\t\t\t}\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.join(\"\\0\") : \"\";\n\t\t\t\tmatch = match || searchTermsRegExps[t].test(tags) || searchTermsRegExps[t].test(tiddler.fields.title);\n\t\t\t}\n\t\t\tif(!match) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(tiddler.fields.text !== undefined) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text;\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,callback) {\n\tvar result = [],\n\t\toutstanding = files.length;\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t});\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,callback) {\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\t// Deserialise the file contents\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\t// Are we binary?\n\t\tif(isBinary) {\n\t\t\t// The base64 section starts after the first comma in the data URI\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttiddlerFields.text = text.substr(commaPos+1);\n\t\t\t\tcallback([tiddlerFields]);\n\t\t\t}\n\t\t} else {\n\t\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\t\tif(encryptedJson) {\n\t\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields));\n\t\t\t}\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]);\n\tif(!origTiddler) {\n\t\treturn tiddler.fields.text !== \"\";\n\t}\n\treturn tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"] || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\thistoryTitle = historyTitle || \"$:/HistoryList\";\n\tvar titles = $tw.utils.isArray(title) ? title : [title];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.getTiddlerData(historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: fromPageRect});\n\t});\n\tthis.setTiddlerData(historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n})();\n",
"title": "$:/core/modules/wiki.js",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #fffffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Blue": {
"title": "$:/palettes/Blue",
"name": "Blue",
"description": "A blue theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Muted": {
"title": "$:/palettes/Muted",
"name": "Muted",
"description": "Bright tiddlers on a muted background",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Contrast": {
"title": "$:/palettes/Contrast",
"name": "Contrast",
"description": "High contrast and unambiguous",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,0,0, 0.5)\nsidebar-foreground: #ffffff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ececec\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Rocker": {
"title": "$:/palettes/Rocker",
"name": "Rocker",
"description": "A dark theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Vanilla": {
"title": "$:/palettes/Vanilla",
"name": "Vanilla",
"description": "Pale and unobtrusive",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ececec\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ececec\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)http://tiddlywiki.com --> "
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<<renderContent>>\n</$importvariables>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\"><<renderContent>></$importvariables>"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"type": "text/vnd.tiddlywiki",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|http://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`{{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>\n</$importvariables>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html>\n<head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\t\t<!-- Force IE standards mode for Intranet and HTA - should be the first meta -->\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}\n</div>\n</body>\n</html>\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"icon": "$:/core/images/advanced-search-button",
"color": "#bbb",
"text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button message=\"tm-delete-tiddler\" class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=\"0hh:0mm:0ss DD MM YYYY\"/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">(count: <$view field=\"count\"/>)</span></$reveal>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<div class=\"tc-binary-warning\">\n\n<<lingo Prompt>>\n\n</div>\n"
},
"$:/core/ui/Components/tag-link": {
"title": "$:/core/ui/Components/tag-link",
"text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
},
"$:/core/ui/ControlPanel/Plugins/Add": {
"title": "$:/core/ui/ControlPanel/Plugins/Add",
"tags": "$:/tags/ControlPanel/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Add/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define install-plugin-button()\n<$button>\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\" emptyMessage=\"\"\"install\"\"\">\nreinstall\n</$list>\n</$button>\n\\end\n\n\\define display-plugin-info()\n<tr>\n<td>\n<<install-plugin-button>>\n<br>\n</td>\n<td>\n''<$view tiddler=<<assetInfo>> field=\"description\"/>''\n<br>\n<$view tiddler=<<assetInfo>> field=\"original-title\"/>\n</td>\n<td>\n<$view tiddler=<<assetInfo>> field=\"version\"/>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\">\n<br>\n<em>\nInstalled:\n<br>\n<$text text=<<installedVersion>>/>\n</em>\n</$list>\n</td>\n</tr>\n\\end\n\n\\define load-plugin-library-button()\n<$button>\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\nopen plugin library\n</$button>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\nSearch: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\" focus=\"true\"/>\n<$select tiddler=\"$:/temp/RemoteAssetCategory/$(currentTiddler)$\" default=\"plugin\">\n<option value=\"plugin\">Plugins</option>\n<option value=\"theme\">Themes</option>\n<option value=\"language\">Languages</option>\n</$select>\n\n<$set name=\"pluginType\" filter=\"[[$:/temp/RemoteAssetCategory/$(currentTiddler)$]is[tiddler]]\" value={{$:/temp/RemoteAssetCategory/$(currentTiddler)$}} emptyValue=\"plugin\">\n<table class=\"tc-plugin-library-listing\">\n<tbody>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type<pluginType>search{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[description]]\" variable=\"assetInfo\">\n<<display-plugin-info>>\n</$list>\n</tbody>\n</table>\n</$set>\n</$list>\n\\end\n\n\\define plugin-library-listing()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<div class=\"tc-plugin-library\">\n\n!! <$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link>\n\n//<$view field=\"url\"/>//\n\n<$transclude/>\n\n<<display-server-connection>>\n</div>\n</$list>\n\\end\n\n<div>\n<<plugin-library-listing>>\n</div>\n\n"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Tags\" default=\"\" tag=\"input\"/> |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed",
"tags": "$:/tags/ControlPanel/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Installed/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\\define plugin-table-body(type,disabledMessage)\n<div class=\"tc-plugin-info-chunk\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<div>\n''<$view field=\"description\"><$view field=\"title\"/></$view>'' $disabledMessage$\n</div>\n<div>\n<$view field=\"title\"/>\n</div>\n<div>\n<$view field=\"version\"/>\n</div>\n</div>\n\\end\n\\define plugin-table(type)\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[description]]\" emptyMessage=<<lingo \"Empty/Hint\">>>\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$reveal type=\"nomatch\" text=\"\" state=\"!!list\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList={{!!list}} default=\"readme\" template=\"$:/core/ui/PluginInfo\"/>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=\"!!list\">\nNo information provided\n</$reveal>\n</div>\n</$reveal>\n</$set>\n</$list>\n</$set>\n\\end\n\n! <<lingo Plugin/Prompt>>\n\n<<plugin-table plugin>>\n\n! <<lingo Theme/Prompt>>\n\n<<plugin-table theme>>\n\n! <<lingo Language/Prompt>>\n\n<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/snippets/paletteeditor}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Plugins]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Plugins/Installed\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<backupURL>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n! <<lingo TiddlySpot/Heading>>\n\n<<lingo TiddlySpot/Description>>\n\n|<<lingo TiddlySpot/UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Password>> |<$password name=\"upload\"/> |\n|<<lingo TiddlySpot/Backups>> |<<backupLink>> |\n\n''<<lingo TiddlySpot/Advanced/Heading>>''\n\n|<<lingo TiddlySpot/ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo TiddlySpot/UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo TiddlySpot/BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>"
},
"$:/core/ui/ControlPanel/Settings/AutoSave": {
"title": "$:/core/ui/ControlPanel/Settings/AutoSave",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/AutoSave/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/AutoSave/\n\n<$link to=\"$:/config/AutoSave\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo Disabled/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
"caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationHistory": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"color": "#bbb",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search{$(searchTiddler)$}]\"/>\"\"\">\n\n{{$:/language/Search/Matches}}\n\n</$set>\n\n//<small>Title matches:</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>All matches:</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n<$list filter=\"[is[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[is[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"no\"><<lingo Preview/Button/Hide>></$button>\n\n<div class=\"tc-tiddler-preview\">\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude />\n\n</div>\n\n<div class=\"tc-tiddler-preview-edit\">\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"yes\"><<lingo Preview/Button/Show>></$button>\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define new-field(name,value)\n<$reveal type=\"nomatch\" text=\"\" default=\"\"\"$name$\"\"\">\n<$button>\n<$action-sendmessage $message=\"tm-add-field\" $name$=\"\"\"$value$\"\"\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=\"\"\"$name$\"\"\">\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n\\end\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=\"$:/temp/newfieldname\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} class=\"tc-edit-texteditor\"/>\n</span>\n<span class=\"tc-edit-field-add-value\">\n<$edit-text tiddler=\"$:/temp/newfieldvalue\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\"/>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\" name={{$:/temp/newfieldname}} value={{$:/temp/newfieldvalue}}/>\n</span>\n</div>\n</$fieldmangler>\n\n"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$list>\n"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\"><$set name=\"backgroundColor\" value={{!!color}}><span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">×</$button></span>\n</$set>\n</$list>\n\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$edit-text tiddler=\"$:/temp/NewTagName\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$button message=\"tm-add-tag\" param={{$:/temp/NewTagName}} set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<lingo Tags/Add/Button>>\n</$button>\n</span>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$linkcatcher set=\"$:/temp/NewTagName\" setTo=\"\" message=\"tm-add-tag\">\n<$list filter=\"[tags[]!is[system]search:title{$:/temp/NewTagName}sort[]]\">\n{{||$:/core/ui/Components/tag-link}}\n</$list>\n<hr>\n<$list filter=\"[tags[]is[system]search:title{$:/temp/NewTagName}sort[]]\">\n{{||$:/core/ui/Components/tag-link}}\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n</$fieldmangler>\n</div>"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus=\"true\"/>"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-popup-handle\"/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$\n\\end\n<div class=<<frame-classes>>>\n<$set name=\"storyTiddler\" value=<<currentTiddler>>>\n<$keyboard key=\"escape\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"ctrl+enter\" message=\"tm-save-tiddler\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</$keyboard>\n</$keyboard>\n</$set>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "<$button message=\"tm-save-tiddler\" tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/Filters/TypedTiddlers": {
"title": "$:/core/Filters/TypedTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Filters/TypedTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n<table>\n<tbody>\n<tr>\n<th>\n<<lingo Listing/Select/Caption>>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>>>\n<$transclude subtiddler=<<payloadTiddler>> mode=\"block\"/>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</div>"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Drafts": {
"title": "$:/core/ui/MoreSideBar/Drafts",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Drafts/Caption}}",
"text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Orphans": {
"title": "$:/core/ui/MoreSideBar/Orphans",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Orphans/Caption}}",
"text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/System": {
"title": "$:/core/ui/MoreSideBar/System",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/System/Caption}}",
"text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Tags": {
"title": "$:/core/ui/MoreSideBar/Tags",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Tags/Caption}}",
"text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/> <small class=\"tc-menu-list-count\"><$count filter=\"[all[current]tagging[]]\"/></small>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}} <small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down tc-drop-down-language-chooser\">\n<$linkcatcher to=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$link>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/language\" text=<<currentTiddler>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/language\" text=<<currentTiddler>>>\n \n</$reveal>\n</span>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=\"$(journalTags)$\"/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<<journalButton>>\n</$set></$set>"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "<$button message=\"tm-new-tiddler\" tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button message=\"tm-save-wiki\" param={{$:/config/SaveWikiButton/Template}} tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/view\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$link to=<<storyview>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/view\" text=<<storyview>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/view\" text=<<storyview>>>\n \n</$reveal>\n</span>\n<$transclude tiddler=<<icon>>/>\n<$text text=<<storyview>>/></$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\" variable=\"themeTitle\">\n<$link to=<<themeTitle>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/theme\" text=<<themeTitle>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/theme\" text=<<themeTitle>>>\n \n</$reveal>\n</span>\n<$view tiddler=<<themeTitle>> field=\"name\"/>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$reveal>\n</$list>\n</div>\n\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n\n</$importvariables>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/pluginreloadwarning": {
"title": "$:/core/ui/PageTemplate/pluginreloadwarning",
"tags": "$:/tags/PageTemplate",
"text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[has[plugin-type]haschanged[]!plugin-type[import]limit[1]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\">\n\n<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n\n<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n\n{{||$:/core/ui/PageTemplate/pagecontrols}}\n\n<$transclude tiddler=\"$:/core/ui/SideBarLists\" mode=\"inline\"/>\n\n</$reveal>\n\n</div>\n\n</$scrollable>"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template=\"$:/core/ui/ViewTemplate\" editTemplate=\"$:/core/ui/EditTemplate\" storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"text": "\\define containerClasses()\ntc-page-container tc-page-view-$(themeTitle)$ tc-language-$(languageTitle)$\n\\end\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$set name=\"themeTitle\" value={{$:/view}}>\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$set name=\"currentTiddler\" value=\"\">\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$dropzone>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$importvariables>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\nNo ''\"<$text text=<<currentTab>>/>\"'' found\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Tags\" \"$:/state/tab/moresidebar\" \"tc-vertical\">>\n</div>\n"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\define lingo-base() $:/language/CloseAll/\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" storyview=\"pop\">\n\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">×</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\n\n</$list>\n\n<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<div class=\"tc-sidebar-lists\">\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus=\"true\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n{{$:/core/ui/SearchResults}}\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" />\n\n</$reveal>\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/icon/$title$\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/icon/$title$\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$title$!!icon\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define qualifyTitle(title)\n$title$$(currentTiddler)$\n\\end\n\\define toggleButton(state)\n<$reveal state=\"$state$\" type=\"match\" text=\"closed\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$state$\" type=\"match\" text=\"open\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td><$transclude tiddler=\"$:/core/ui/TagTemplate\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state=<<qualifyTitle \"$:/state/tag-manager/\">> /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td>\n<$reveal state=<<qualifyTitle \"$:/state/tag-manager/\">> type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n<td></td>\n<td></td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB)\n<$set name=\"foregroundColor\" value=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">>>\n<$set name=\"backgroundColor\" value=\"\"\"$colour$\"\"\">\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-tag-label\" style=<<tag-styles>>>\n<$transclude tiddler={{!!icon}}/> <$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\"><div class=\"tc-drop-down\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]tagging[]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</$set>\n</$set>\n\\end\n\n\\define tag-body(colour,palette)\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}}/>\n</span>\n\\end\n\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}}/>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$reveal>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-tiddler-body\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n{{||$:/core/ui/ImportListing}}\n\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n\n{{||$:/core/ui/TiddlerInfo/Advanced/PluginInfo}}\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"relativedate\"/>\n</div>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list>\n</span>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}/>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo\"/>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-view-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ $(tiddlerTagClasses)$\n\\end\n<$set name=\"storyTiddler\" value=<<currentTiddler>>><$set name=\"tiddlerInfoState\" value=<<qualify \"$:/state/popup/tiddler-info\">>><$tiddler tiddler=<<currentTiddler>>><$link tag=\"div\" draggable=\"no\" tabindex=\"1\" class=<<frame-classes>>><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</$link>\n</$tiddler></$set></$set>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Clone/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseOthers/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Close/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Edit/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Info/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>>/>\n</$reveal>\n</$list>\n</$set>\n</$set>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\define newHereButtonTags()\n[[$(currentTiddler)$]]\n\\end\n\\define newHereButton()\n<$button tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<newHereButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournalHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set></$set></$set>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permalink/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permaview/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#ff0"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3"
},
"$:/config/DefaultSidebarTab": {
"title": "$:/config/DefaultSidebarTab",
"text": "$:/core/ui/SideBar/Open"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/OfficialPluginLibrary": {
"title": "$:/config/OfficialPluginLibrary",
"tags": "$:/tags/PluginLibrary",
"url": "http://tiddlywiki.com/library/index.html",
"caption": "{{$:/language/OfficialPluginLibrary}}",
"text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team.\n"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state]] -[prefix[$:/temp]]"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]]"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/config/Toolbar/Icons": {
"title": "$:/config/Toolbar/Icons",
"text": "yes"
},
"$:/config/Toolbar/Text": {
"title": "$:/config/Toolbar/Text",
"text": "no"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
"text": "show"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch(colour)\n<$set name=\"swatchColour\" value={{##$colour$}}>\n<div class=\"tc-swatch\" style=<<swatchStyle>>/>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\">\n<<swatch foreground>>\n<<swatch background>>\n<<swatch muted-foreground>>\n<<swatch primary>>\n<<swatch page-background>>\n<<swatch tab-background>>\n<<swatch tiddler-info-background>>\n</div>\n"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "{{$:/language/ControlPanel/Basics/Language/Prompt}} <$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"/></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\")\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\">\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n<$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$button>\n</$list>\n</div><div class=\"tc-tab-divider $class$\"/><div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/timeline": {
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"title": "$:/core/macros/timeline",
"type": "text/vnd.tiddlywiki",
"text": "\\define timeline-title()\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday{!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}>\n<<timeline-title>>\n</$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$set>\n\\end\n\n\\define toc-body(rootTag,tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc\">\n<$list filter=\"\"\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\"\"\">\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n<<toc-caption>>\n</$list>\n<$list filter=\"\"\"[all[current]] -[[$rootTag$]]\"\"\">\n<$macrocall $name=\"toc-body\" rootTag=\"\"\"$rootTag$\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$list>\n</li>\n</$set>\n</$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter)\n<<toc-body rootTag:\"\"\"$tag$\"\"\" tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<<toc-linked-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</$list>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n</$list>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"\"\"toc-selective-expandable\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-selective-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=\"<<toc-linked-selective-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-selective-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"$itemClassFilter$\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-tabbed-selected-item-filter(selectedTiddler)\n[all[current]field:title{$selectedTiddler$}]\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{$selectedTiddler$}}>\n<div class=\"tc-tabbed-table-of-contents\">\n<$linkcatcher to=\"$selectedTiddler$\">\n<div class=\"tc-table-of-contents\">\n<$macrocall $name=\"toc-selective-expandable\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" itemClassFilter=<<toc-tabbed-selected-item-filter selectedTiddler:\"\"\"$selectedTiddler$\"\"\">>/>\n</div>\n</$linkcatcher>\n<div class=\"tc-tabbed-table-of-contents-content\">\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"nomatch\" text=\"\">\n<$transclude mode=\"block\" tiddler=\"$template$\">\n<h1><<toc-caption>></h1>\n<$transclude mode=\"block\">$missingText$</$transclude>\n</$transclude>\n</$reveal>\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"match\" text=\"\">\n$unselectedText$\n</$reveal>\n</div>\n</div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=\"\"\"$selectedTiddler$\"\"\">\n<$macrocall $name=\"toc-tabbed-external-nav\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" selectedTiddler=\"\"\"$selectedTiddler$\"\"\" unselectedText=\"\"\"$unselectedText$\"\"\" missingText=\"\"\"$missingText$\"\"\" template=\"\"\"$template$\"\"\"/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n{{$:/language/Docs/PaletteColours/$colour$}}\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<table>\n<tbody>\n<$list filter=\"[all[current]indexes[]]\" variable=\"colourName\">\n<tr>\n<td>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<$edit-text index=<<colourName>> tag=\"input\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n</$set>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n<$transclude tiddler=\"$:/snippets/currpalettepreview\"/>\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n<<lingo Prompt>> <$view tiddler={{$:/palette}} field=\"name\"/>\n\n<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[description]]\"><div class=\"tc-chooser-item\"><$link to={{!!title}}><div><$reveal state=\"$:/palette\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/palette\" type=\"nomatch\" text={{!!title}}> </$reveal> ''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/></div><$transclude tiddler=\"$:/snippets/currpalettepreview\"/></$link></div>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/ControlPanel/Plugins": {
"title": "$:/tags/ControlPanel/Plugins",
"list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
"text": ""
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$view tiddler={{$:/theme}} field=\"name\"/>\n\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\"><div><$reveal state=\"$:/theme\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/theme\" type=\"nomatch\" text={{!!title}}> </$reveal> <$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$list>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"type": "text/vnd.tiddlywiki",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/StoryView/\n<<lingo Prompt>> <$select tiddler=\"$:/view\">\n<$list filter=\"[storyviews[]]\">\n<option><$view field=\"title\"/></option>\n</$list>\n</$select>"
}
}
}
{
"tiddlers": {
"Untitled": {
"text": "Civilian Aircraft",
"title": "Untitled"
}
}
}
alert-background: #ffe476
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #ffffcc
blockquote-bar: <<colour muted-foreground>>
code-background: #001100
code-border: #004400
code-foreground: #66ee66
dirty-indicator: #ff0000
download-background: #34bbc7
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #fff
dropdown-tab-background: #ececec
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
foreground: #333333
message-background: #ecf2ff
message-border: #cfd6e6
message-foreground: #999954
modal-backdrop: <<colour foreground>>
modal-background: <<colour background>>
modal-border: #999999
modal-footer-background: #f5f5f5
modal-footer-border: #dddddd
modal-header-border: #eeeeee
muted-foreground: #999999
notification-background: #ffffdd
notification-border: #999999
page-background: #000000
pre-background: #f5f5f5
pre-border: #cccccc
primary: #4c1e1e
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #000000
sidebar-controls-foreground: #ffffff
sidebar-foreground-shadow: rgba(255,0,0, 0.5)
sidebar-foreground: #cc6666
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #c0c0c0
sidebar-tab-background-selected: #ececec
sidebar-tab-background: <<colour tab-background>>
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: <<colour tab-divider>>
sidebar-tab-foreground-selected:
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: #444444
sidebar-tiddler-link-foreground: #999999
static-alert-foreground: #aaaaaa
tab-background-selected: #fffee0
tab-background: #DEDEB3
tab-border-selected: #d8d8d8
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #cccca4
table-footer-background: #b3b38e
table-header-background: #d9d9ae
tag-background: #d5ad34
tag-foreground: #ffffff
tiddler-background: <<colour background>>
tiddler-border: <<colour background>>
tiddler-controls-foreground-hover: #888888
tiddler-controls-foreground-selected: #444444
tiddler-controls-foreground: #cccccc
tiddler-editor-background: #f8f8f8
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #f8f8f8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: #801818
tiddler-subtitle-foreground: #c0c0c0
tiddler-title-foreground: #b30000
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
{
"tiddlers": {
"$:/plugins/danielo515/ContextPlugin/Caption": {
"created": "20140530174219263",
"tags": "contextPlugin",
"title": "$:/plugins/danielo515/ContextPlugin/Caption",
"type": "text/vnd.tiddlywiki",
"text": "Context search"
},
"Context Search": {
"caption": "{{$:/plugins/danielo515/ContextPlugin/Caption}}",
"created": "20140530173407542",
"tags": "$:/tags/AdvancedSearch",
"title": "Context Search",
"type": "text/vnd.tiddlywiki",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tw-search\"><$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/><$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\"> <$link to=\"\" class=\"btn-invisible\">{{$:/core/images/close-button}}</$link></$reveal></div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<div class=\"tw-search-results\">\n\n<<lingo Standard/Matches>>\n\n<$list filter=\"[!is[system]search{$:/temp/advancedsearch}sort[title]limit[250]]\">\n{{!!title||$:/core/ui/ListItemTemplate}}\n<$context term={{$:/temp/advancedsearch}}/>\n</$list>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/plugins/danielo515/ContextPlugin/widgets/context.js": {
"created": "20140418153435777",
"creator": "danielo",
"modified": "20140530231943517",
"modifier": "danielo",
"module-type": "widget",
"title": "$:/plugins/danielo515/ContextPlugin/widgets/context.js",
"type": "application/javascript",
"text": "/*\\\\\ntitle: $:/core/modules/widgets/danielo/context-widget.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar contextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\ncontextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\ncontextWidget.prototype.render = function(parent,nextSibling) {\n // Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n \n if(this.term && this.term.length>3){\n \n this.createRegexp();\n var matches = this.executeRegexp();\n\t if(matches.length > 0){ \n this.domNode = this.document.createElement(this.element);\n this.domNode.className=\"tw-context\";\n this.composeResults( matches ); //this appends to domNode \n \t// Insert element\n \tparent.insertBefore(this.domNode,nextSibling);\n \tthis.renderChildren(this.domNode,null);\n\t \tthis.domNodes.push(this.domNode);\n }\n }\n\t\n};\n\n/*\nCompute the internal state of the widget\n*/\ncontextWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n this.matchedClass = this.getAttribute(\"matchClass\",\"matched\");\n\tthis.tiddler = this.getAttribute( \"tiddler\",this.getVariable(\"currentTiddler\") );\n this.term = this.getAttribute(\"term\",this.getAttribute(\"searchTerm\"));\n\tthis.contextLength = this.getAttribute(\"length\",50);\n this.before = this.getAttribute(\"before\",this.contextLength);\n this.after = this.getAttribute(\"after\",this.contextLength);\n this.maxMatches = this.getAttribute(\"maxMatches\",10);\n this.element = this.getAttribute(\"element\",\"pre\");\n\tthis.makeChildWidgets();\n};\n\n /*Create the regular expression*/\ncontextWidget.prototype.createRegexp = function()\n{\n var regString = \"(\\\\w+[\\\\s\\\\S]{0,#before#})?(#term#)([\\\\s\\\\S]{0,#after#}\\\\w+)?\";\n\n var regString = regString.replace(\"#before#\",this.before).replace(\"#term#\", $tw.utils.escapeRegExp(this.term) ) .replace(\"#after#\",this.after);\n this.regexp = new RegExp(regString,\"ig\");\n //console.log(regString);\n};\n/*\nexecute the regular expresion\n*/\ncontextWidget.prototype.executeRegexp = function()\n{\n var text = this.wiki.getTiddlerText(this.tiddler), match,results = new Array();\n while( (match = this.regexp.exec( text ) ) && (results.length < this.maxMatches) )\n { results.push(match) }\n //console.log(\"matches\",results);\n return results;\n};\n\n/*\ncompose the results\nmatches : array of match objects from regular expression execute\n*/\ncontextWidget.prototype.composeResults = function(matches){\n var result=[], self=this, node = this.domNode,\n dots = textNode(\"...\\n\"),\n span = matchedNode( this.term );\n\n for(var i=0; i < matches.length; i++){\n processMatch( matches[i] );\n }\n \n function processMatch(match){\n if( match.index !== 0) node.appendChild( dots.cloneNode(true) );\n for( var i=1;i<match.length;i++ ) {//match[0] full matched text (all groups together)\n if( match[i] ) {\n if ( match[i].toLowerCase() == self.term.toLowerCase() ) \n node.appendChild( match[i] == self.term ? span.cloneNode(true) : matchedNode( match[i] ) )\n else\n node.appendChild( textNode( match[i]) )\n }\n }\n if( match.index + match[0].length < match.input.length) node.appendChild( dots.cloneNode(true) );\n }\n \n function textNode(text){ return self.document.createTextNode(text) }\n function matchedNode(text) { \n var node = self.document.createElement(\"span\"); node.appendChild( textNode(text) ); node.className = self.matchedClass;\n return node }\n \n};\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\ncontextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.term || changedAttributes.length || changedAttributes.matchedClass) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n return this.refreshChildren(changedTiddlers);\n};\n\nexports.context = contextWidget;\n\n})();"
},
"$:/plugins/danielo515/ContextPlugin/readme": {
"title": "$:/plugins/danielo515/ContextPlugin/readme",
"text": "!Usage\n\nAfter installing the plugin you will have a new tab in [[$:/AdvancedSearch]] called [[Context Search]]. If you want this functionality in other places you will have to edit the desired tiddler yourself adding the ''context widget''. For more details about using the widget see the section below.\n\n!!Using the widget\n\nThe very basic usage of the widget is the following:\n\n```\n<$context term=\"lorem\"/>\n```\nWhich will render as:\n<$context term=\"lorem\"/>\n\nThe widgets will search inside the current tiddler by default. Because that you see the same content twice here. This example is not very useful. Other more meaningful would be:\n\n```\n<$list filter=\"[search{$:/temp/advancedsearch}sort[title]limit[250]]\">\n{{!!title||$:/core/ui/ListItemTemplate}}\n<$context term={{$:/temp/advancedsearch}}/>\n</$list>\n```\n\nThat will search for tiddlers containing the text specified in [[$:/temp/advancedsearch]] and will display a link to the matching tiddlers plus a preview of the matching content. Something very similar is used in [[Context Search]]. Below you can find a complete list of parameters and their default values.\n\n|! parameter |! description | !default |\n| term | The term you want to search ||\n| searchTerm | An alias for the previous one ||\n| tiddler | The tiddler's name to look into | current tiddler |\n| length | Number of context characters to show | 50 |\n| before | Number of characters before the matched term to show | the value of the length parameter |\n| after | Number of characters after the matched term to show | the value of the length parameter |\n| maxMatches | maximun number of matched elements to show. Incrementing this can cause several performance issues | 10 |\n| element | Node element to create. This element will contain the results of the search. If you want to style it its class is `tw-context` | `<pre>` |\n| matchClass | The css class to assign to the matched terms in the results. This is used to highlight the results | matched |\n\n!Customizing the output\nThere are not many ways to customize the output of this widget. You can specify ''what type of node you want to create'' to wrap the results (div,span...). The default is `<pre>`. This container is created with the class `tw-context` so you can easily apply styles to it. Something similar happens to the ''highlighted'' words. You can specify the name of the class to assign to it and also you can apply styles to that class.\n\nA very basic example of customization could be:\n\n# Create a tiddler, for example [[$/plugins/danielo515/context/css]]\n# Paste the following text or any css rule you want: \"\"\"\n\n<pre>\n.matched{background-color:yellow}\n.tw-context {\n border:1px solid blue;\n word-break: break-all; word-wrap: break-word;}\n</pre>\n\"\"\"\n# Tag it with `$:/tags/stylesheet`\n# Save the tiddler"
},
"$:/plugins/danielo515/ContextPlugin/visualizer": {
"title": "$:/plugins/danielo515/ContextPlugin/visualizer",
"tags": "$:/tags/SearchResults",
"caption": "Context",
"text": "<$list filter=\"[!is[system]search{$:/temp/search}sort[title]limit[250]]\">\n {{!!title||$:/core/ui/ListItemTemplate}}\n <$context term={{$:/temp/search}} />\n</$list>"
},
"$:/plugins/danielo515/ContextPlugin/Stylesheet/results": {
"created": "20140529162823729",
"tags": "$:/tags/Stylesheet contextPlugin",
"title": "$:/plugins/danielo515/ContextPlugin/Stylesheet/results",
"type": "text/css",
"text": ".matched{background-color:yellow}\n.tw-context {/*border:1px solid;\n /*word-break: break-all; word-wrap: break-word*/}"
}
}
}
{
"tiddlers": {
"$:/plugins/felixhayashi/tiddlymap/caretaker.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/caretaker.js\ntype: application/javascript\nmodule-type: startup\n\nThis module is responsible for registering a global namespace under $tw\nand loading (and refreshing) the configuration.\n\nSince changes in configuration tiddlers are instantly acknowledged,\nthe user does not need to refresh its browser (in theory :)).\n\nLike a caretaker in real life, nobody can communicate with him. He does\nall his work in the background without being ever seen. What I want to\nsay here is: do not require the caretaker!\n\n@preserve\n\n\\*/\n(function(){\"use strict\";exports.name=\"tmap.caretaker\";exports.platforms=[\"browser\"];exports.after=[\"startup\"];exports.before=[\"rootwidget\"];exports.synchronous=true;var t=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var e=require(\"$:/plugins/felixhayashi/tiddlymap/adapter.js\").Adapter;var i=function(e){var i=e;if(!i.path)i.path=t.getEmptyMap();i.path.pluginRoot=\"$:/plugins/felixhayashi/tiddlymap\";i.path.edges=\"$:/plugins/felixhayashi/tiddlymap/graph/edges\";i.path.views=\"$:/plugins/felixhayashi/tiddlymap/graph/views\";i.path.options=\"$:/plugins/felixhayashi/tiddlymap/config\";i.path.tempRoot=\"$:/temp/felixhayashi/tiddlymap\";i.path.localHolders=\"$:/temp/felixhayashi/tiddlymap/holders\";i.path.dialogs=\"$:/plugins/felixhayashi/tiddlymap/dialog\";if(!i.ref)i.ref=t.getEmptyMap();i.ref.dialogStandardFooter=\"$:/plugins/felixhayashi/tiddlymap/dialog/standardFooter\";i.ref.defaultGraphViewHolder=\"$:/plugins/felixhayashi/tiddlymap/misc/defaultViewHolder\";i.ref.graphBar=\"$:/plugins/felixhayashi/tiddlymap/misc/advancedEditorBar\";i.ref.sysConf=\"$:/plugins/felixhayashi/tiddlymap/config/sys\";i.ref.visConf=\"$:/plugins/felixhayashi/tiddlymap/config/vis\";i.ref.welcomeFlag=\"$:/plugins/felixhayashi/tiddlymap/flag/welcome\";i.ref.focusButton=\"$:/plugins/felixhayashi/tiddlymap/misc/focusButton\";if(!i.config)i.config=t.getEmptyMap();i.config.sys=$tw.wiki.getTiddlerData(i.ref.sysConf,{});var a=t.unflatten($tw.wiki.getTiddlerData(i.ref.sysConf+\"/user\",{}));i.config.sys=$tw.utils.extendDeepCopy(i.config.sys,a);i.config.vis=$tw.wiki.getTiddlerData(i.ref.visConf,{});var a=t.unflatten($tw.wiki.getTiddlerData(i.ref.visConf+\"/user\",{}));i.config.vis=$tw.utils.extendDeepCopy(i.config.vis,a);if(!i.field)i.field=t.getEmptyMap();$tw.utils.extend(i.field,i.config.sys.field);if(!i.misc)i.misc=t.getEmptyMap();i.misc.unknownEdgeLabel=\"__noname__\";i.misc.cssPrefix=\"tmap-\";i.misc.lockedViews=[\"default\",\"live\",\"search\"];if(!i.filter)i.filter=t.getEmptyMap();i.filter.allSharedEdges=\"[prefix[\"+i.path.edges+\"]]\";i.filter.allSharedEdgesByLabel=\"[prefix[\"+i.path.edges+\"]removeprefix[\"+i.path.edges+\"/]]\";i.filter.allViews=\"[all[tiddlers+shadows]has[\"+i.field.viewMarker+\"]]\";i.filter.allViewsByLabel=\"[all[tiddlers+shadows]has[\"+i.field.viewMarker+\"]removeprefix[\"+i.path.views+\"/]]\"};var a=function(e){var i=e;var a=function(){};if($tw.tiddlymap.opt.config.sys.debug===\"true\"&&console){i.logger=function(){if(arguments.length<2)return;var t=Array.prototype.slice.call(arguments);var e=t.shift(t);var i=console.hasOwnProperty(e)?e:\"debug\";console[i].apply(console,t)}}else{i.logger=a}i.notify=$tw.tiddlymap.opt.config.sys.notifications===\"true\"?t.notify:a;return i};var r=function(){var t=function(){var t=[];t.push(\"prefix[\"+$tw.tiddlymap.opt.path.options+\"]\");t.push(\"!has[draft.of]\");return\"[\"+t.join(\"\")+\"]\"}.call(this);$tw.tiddlymap.logger(\"log\",\"Caretaker's filter: \\\"\"+t+'\"');return $tw.wiki.compileFilter(t)};var d=function(){for(var t=$tw.tiddlymap.registry.length-1;t>=0;t--){var e=$tw.tiddlymap.registry[t];if(!document.body.contains(e.getContainer())){$tw.tiddlymap.logger(\"warn\",\"A graph has been removed.\");e.destruct();$tw.tiddlymap.registry.splice(t,1)}}};exports.startup=function(){$tw.tiddlymap=t.getEmptyMap();$tw.tiddlymap.registry=[];window.setInterval(d,1e3);$tw.tiddlymap.opt=t.getEmptyMap();i($tw.tiddlymap.opt);a($tw.tiddlymap,$tw.tiddlymap.opt);$tw.tiddlymap.adapter=new e;$tw.tiddlymap.logger(\"warn\",\"TiddlyMap's caretaker was started\");$tw.tiddlymap.logger(\"log\",\"Registered namespace and options\");$tw.tiddlymap.edgeChanges=[];var l=r();$tw.rootWidget.addEventListener(\"tm-create-edge\",function(t){var e={from:$tw.tiddlymap.adapter.createNode(t.paramObject.from).id,to:$tw.tiddlymap.adapter.createNode(t.paramObject.to).id,label:t.paramObject.label};$tw.tiddlymap.adapter.insertEdge(e);$tw.tiddlymap.notify(\"Edge inserted\")});$tw.wiki.addEventListener(\"change\",function(e){$tw.tiddlymap.logger(\"warn\",\"These tiddlers changed:\",e);var r=t.getMatches(l,Object.keys(e));if(!r.length)return;$tw.tiddlymap.logger(\"warn\",\"Global options will be rebuild\");i($tw.tiddlymap.opt);a($tw.tiddlymap)})}})();",
"title": "$:/plugins/felixhayashi/tiddlymap/caretaker.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/felixhayashi/tiddlymap/fixer.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/fixer.js\ntype: application/javascript\nmodule-type: startup\n\n@preserve\n\n\\*/\n(function(){\"use strict\";exports.name=\"tmap.fixer\";exports.after=[\"tmap.caretaker\"];exports.before=[\"rootwidget\"];exports.synchronous=true;var e=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var t=require(\"$:/plugins/felixhayashi/tiddlymap/adapter.js\").Adapter;var a=require(\"$:/plugins/felixhayashi/tiddlymap/view_abstraction.js\").ViewAbstraction;var r=function(){var t=function(e){};t($tw.tiddlymap.opt.path.edges);var r=$tw.tiddlymap.opt.filter.allViews;var i=e.getMatches(r);for(var s=0;s<i.length;s++){var o=new a(i[s]);if(o.isConfEnabled(\"private_edge_mode\")){t(o.getEdgeStoreLocation())}}}})();",
"title": "$:/plugins/felixhayashi/tiddlymap/fixer.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/felixhayashi/tiddlymap/layout": {
"title": "$:/plugins/felixhayashi/tiddlymap/layout",
"type": "text/vnd.tiddlywiki",
"tags": [
"$:/tags/Stylesheet"
],
"text": "html {\n /*\n body {\n background: url(unquote('<$macrocall $name=\"makedatauri\" type={{$:/plugins/felixhayashi/tiddlymap/media/surface.png!!type}} text={{$:/plugins/felixhayashi/tiddlymap/media/surface.png}}/>'));\n }\n */ }\n html .tmap-small-list, html .tmap-very-small-list {\n overflow: auto;\n min-height: 20px;\n max-height: 150px;\n display: block; }\n html .tmap-very-small-list {\n max-height: 70px; }\n html .tmap-quick-connect {\n font-size: 0.7em; }\n html .tmap-quick-connect .tc-drop-down {\n padding: 5px;\n width: 250px;\n white-space: normal;\n line-height: 1em;\n position: absolute;\n z-index: 1000;\n right: 50px; }\n html .tmap-quick-connect .tc-drop-down select {\n width: 80px;\n word-wrap: initial; }\n html .tmap-quick-connect .tc-drop-down table {\n border: none;\n margin-bottom: 0px; }\n html .tmap-quick-connect .tc-drop-down table td {\n padding: 3px;\n border: none;\n vertical-align: top; }\n html .tmap-quick-connect .tc-drop-down .tmap-scroll-table {\n height: 120px;\n overflow: auto;\n display: block; }\n html .tmap-quick-connect .tc-drop-down hr {\n border: 0;\n height: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n border-bottom: 1px solid rgba(255, 255, 255, 0.3); }\n html .tmap-quick-connect .tc-drop-down a {\n display: inline;\n padding: 0;\n color: #5778d8;\n background: transparent; }\n html .tmap-quick-connect .tc-drop-down a:hover {\n background: transparent;\n color: #5778d8;\n text-decoration: underline; }\n html .tmap-quick-connect .tc-drop-down button {\n display: inline-block;\n padding: 0px 3px;\n width: auto;\n text-align: left;\n color: #333333;\n line-height: 1; }\n html .tmap-quick-connect .tc-drop-down button:hover {\n color: #ffffff; }\n html .tmap-quick-connect .tc-drop-down button svg:hover {\n fill: #ffffff; }\n html .tc-modal-wrapper {\n z-index: 1010; }\n html .tc-modal-wrapper .tc-modal-header {\n padding-top: 0px;\n padding-bottom: 0px; }\n html .tc-modal-wrapper .tc-modal-header svg {\n vertical-align: sub; }\n html .tc-modal-wrapper .tc-modal-header h3 {\n line-height: 10px; }\n html .tc-modal-wrapper .tc-modal-body {\n max-height: 70vh;\n overflow: auto; }\n html .tc-modal-wrapper .tc-modal-body .tc-image-button {\n font-size: 14px; }\n html .tc-modal-wrapper .tc-modal-body fieldset legend {\n font-weight: bold; }\n html .tc-modal-wrapper .tc-modal-body fieldset table {\n margin: 6px 0;\n clear: both;\n border: none; }\n html .tc-modal-wrapper .tc-modal-body fieldset table tr td {\n border: none;\n vertical-align: top;\n min-width: 140px;\n padding: 3px 15px 3px 0; }\n html .tc-modal-wrapper .tc-modal-body fieldset table tr td:last-child {\n padding-right: 0px; }\n html .tc-modal-wrapper .tc-modal-body fieldset table tr td input {\n width: 140px; }\n html .tc-modal-wrapper .tc-modal-body fieldset table tr .tmap-note {\n margin: 10px 10px 10px 0; }\n html .tc-modal-wrapper .tc-modal-body fieldset table tr .tmap-description {\n font-style: italic; }\n html .tc-modal-wrapper .tc-modal-body fieldset ul {\n padding-left: 30px; }\n html .tc-modal-wrapper .tc-modal-body fieldset ul li {\n list-style: none; }\n html .tc-modal-wrapper .tc-modal-footer {\n padding-top: 0px;\n padding-bottom: 0px; }\n html #tmap-node-filter-dialog #tmap-filter-tips {\n font-size: 0.8em; }\n html #tmap-node-filter-dialog textarea {\n height: 100px;\n max-height: 300px;\n overflow: auto;\n width: 100%;\n font-size: 11px;\n font-family: \"Courier New\", Courier, monospace; }\n html .tc-sidebar-scrollable .tmap-widget {\n min-height: 350px; }\n html .tc-sidebar-scrollable .tmap-widget.tmap-halfscreen {\n position: absolute;\n right: 0px;\n top: 0;\n left: 0px;\n bottom: 0;\n padding: 0px;\n width: 100% !important;\n border: none;\n border-left: 1px solid lightgray;\n height: 100% !important;\n margin: 0;\n background: #ececec;\n z-index: 1000; }\n html .tmap-widget {\n border: 1px dotted lightgray;\n padding: 2px;\n width: 100%;\n color: #666666;\n display: block; }\n html .tmap-widget.tmap-click-to-use .network-frame:not(.vis-active) {\n cursor: pointer; }\n html .tmap-widget.tmap-click-to-use .network-frame:not(.vis-active) .network-navigation {\n display: none; }\n html .tmap-widget.tmap-click-to-use .network-frame:not(.vis-active):hover:before {\n box-shadow: 10px 10px 5px lightgray;\n color: gray;\n background: white;\n content: \"Click to use\";\n font-size: 18px;\n font-weight: bold;\n left: 50%;\n margin-left: -100px;\n position: absolute;\n text-align: center;\n top: 50px;\n width: 200px;\n z-index: 2000;\n padding: 5px;\n pointer-events: none; }\n html .tmap-widget .tmap-vis-graph {\n height: calc(100% - 35px); }\n html .tmap-widget .tmap-vis-graph .network-frame .tmap-vis-button.tmap-button-enabled {\n bottom: 90px;\n right: 15px;\n background-image: url(<$macrocall $name=\"makedatauri\" type=\"image/png\" text={{$:/plugins/felixhayashi/tiddlymap/media/fullscreen.png}} />); }\n html .tmap-widget.tmap-no-buttons .network-navigation {\n display: none; }\n html .tmap-widget.tmap-advanced-editor {\n background: #F2F2F2; }\n html .tmap-widget.tmap-advanced-editor .tmap-topbar {\n background: #d6d9d8; }\n html .tmap-widget .network-manipulationUI.edit.editmode {\n height: 26px; }\n html .tmap-widget .network-manipulationDiv {\n border-top: #d6d9d8;\n background: #E6E6E6;\n padding: 3px 0;\n height: 35px; }\n html .tmap-widget .tmap-topbar {\n background: #F5F5F5;\n border-bottom: 1px solid lightgray;\n padding: 3px 5px;\n height: 35px;\n position: relative; }\n html .tmap-widget .tmap-topbar .tmap-view-label {\n width: 100%;\n text-align: center;\n font-weight: bold;\n padding-top: 3px; }\n html .tmap-widget .tmap-topbar .focus-button {\n position: absolute;\n right: 10px; }\n html .tmap-widget .tmap-topbar .focus-button input {\n width: 140px; }\n html .tmap-widget .tmap-topbar .tmap-popup {\n position: relative; }\n html .tmap-widget .tmap-topbar .tmap-popup .tc-drop-down {\n position: absolute;\n z-index: 999;\n right: 0px; }\n html .tmap-widget .tmap-topbar .tc-drop-down {\n background-color: #F3F3F3;\n min-width: 170px;\n max-width: 210px;\n padding: 5px;\n margin: 5px 0; }\n html .tmap-widget .tmap-topbar .tc-drop-down button, html .tmap-widget .tmap-topbar .tc-drop-down a {\n padding: 0px;\n text-decoration: none; }\n html .tmap-widget .tmap-topbar .tc-drop-down button:hover, html .tmap-widget .tmap-topbar .tc-drop-down a:hover {\n color: #ffffff; }\n html .tmap-widget .tmap-topbar .tc-drop-down button svg, html .tmap-widget .tmap-topbar .tc-drop-down a svg {\n vertical-align: middle; }\n html .tmap-widget .tmap-topbar [hidden] {\n display: none; }\n html .tmap-widget .tmap-topbar .tc-block-dropdown {\n width: 370px;\n min-width: 370px;\n padding: 5px;\n margin: 15px 0 0 -370px; }\n html .tmap-widget .tmap-topbar .tc-block-dropdown a {\n display: inline;\n padding: 0px; }\n html .tmap-widget .tmap-topbar select {\n width: 150px;\n word-wrap: initial;\n padding: 2px; }\n html .tmap-widget .tmap-topbar button {\n line-height: inherit;\n color: #666666; }\n html .tmap-widget .tmap-topbar > * {\n display: inline-block; }\n html .tmap-widget .tmap-topbar .tmap-separator:after {\n color: #bdbdbd;\n margin: 3px;\n content: \" | \"; }\n html .tmap-widget .tmap-topbar .tc-edit-add-tag .tc-add-tag-name input {\n width: 70%; }\n html .tmap-widget .tmap-topbar .tc-sidebar-header {\n text-shadow: none; }\n html .tmap-widget .tmap-topbar .tc-edit-tags {\n border: none;\n padding: inherit;\n box-shadow: none; }\n\nhtml:fullscreen body {\n overflow: hidden; }\nhtml:fullscreen .tc-dropzone > *:not(.tmap-has-fullscreen-child) {\n z-index: 0; }\nhtml:fullscreen .tmap-has-fullscreen-child {\n z-index: 1 !important;\n left: 0px !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n position: fixed !important; }\n html:fullscreen .tmap-has-fullscreen-child .tmap-widget.tmap-fullscreen {\n background: white !important;\n height: 100% !important;\n width: 100% !important;\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n z-index: 999 !important;\n border: none !important;\n margin: 0 !important; }\n\nhtml:-moz-full-screen body {\n overflow: hidden; }\nhtml:-moz-full-screen .tc-dropzone > *:not(.tmap-has-fullscreen-child) {\n z-index: 0; }\nhtml:-moz-full-screen .tmap-has-fullscreen-child {\n z-index: 1 !important;\n left: 0px !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n position: fixed !important; }\n html:-moz-full-screen .tmap-has-fullscreen-child .tmap-widget.tmap-fullscreen {\n background: white !important;\n height: 100% !important;\n width: 100% !important;\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n z-index: 999 !important;\n border: none !important;\n margin: 0 !important; }\n\nhtml:-webkit-full-screen body {\n overflow: hidden; }\nhtml:-webkit-full-screen .tc-dropzone > *:not(.tmap-has-fullscreen-child) {\n z-index: 0; }\nhtml:-webkit-full-screen .tmap-has-fullscreen-child {\n z-index: 1 !important;\n left: 0px !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n position: fixed !important; }\n html:-webkit-full-screen .tmap-has-fullscreen-child .tmap-widget.tmap-fullscreen {\n background: white !important;\n height: 100% !important;\n width: 100% !important;\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n z-index: 999 !important;\n border: none !important;\n margin: 0 !important; }\n\nhtml:-ms-fullscreen body {\n overflow: hidden; }\nhtml:-ms-fullscreen .tc-dropzone > *:not(.tmap-has-fullscreen-child) {\n z-index: 0; }\nhtml:-ms-fullscreen .tmap-has-fullscreen-child {\n z-index: 1 !important;\n left: 0px !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n position: fixed !important; }\n html:-ms-fullscreen .tmap-has-fullscreen-child .tmap-widget.tmap-fullscreen {\n background: white !important;\n height: 100% !important;\n width: 100% !important;\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n z-index: 999 !important;\n border: none !important;\n margin: 0 !important; }\n\nfieldset.tmap-options dt, fieldset.tmap-options dd {\n margin-bottom: 15px; }\nfieldset.tmap-options input {\n font-weight: normal; }\n"
},
"$:/plugins/felixhayashi/tiddlymap/adapter.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/adapter.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n(function(){var e=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var t=require(\"$:/plugins/felixhayashi/tiddlymap/view_abstraction.js\").ViewAbstraction;var i=require(\"$:/plugins/felixhayashi/vis/vis.js\");var r=function(e){this.wiki=e?e:$tw.wiki;this.opt=$tw.tiddlymap.opt;this.logger=$tw.tiddlymap.logger};r.prototype.insertEdge=function(i,r){if(typeof i!==\"object\"||!i.from||!i.to)return;r=new t(r);var o=i.label?i.label:this.opt.misc.unknownEdgeLabel;var d=r.getEdgeStoreLocation()+\"/\"+o;var s=this.wiki.getTiddlerData(d,[]);delete i.label;if(i.id){var a=e.keyOfItemWithProperty(s,\"id\",i.id);if(typeof a===\"undefined\"){a=s.length}}else{i.id=e.genUUID();var a=s.length}this.logger(\"info\",\"Inserting edge\",i,\"into store\",d);s[a]=i;var n={};var l=this.wiki.getTiddler(d);if(!l||!l.fields.id){n.id=e.genUUID()}this.wiki.setTiddlerData(d,s,n);i.label=o;$tw.tiddlymap.edgeChanges.push({type:\"insert\",edge:i});return i};r.prototype.selectEdgesByFilter=function(t,i){var r=e.getMatches(t);var o=[];for(var d=0;d<r.length;d++){o.push(e.getBasename(r[d]))}return this.selectEdgesByLabel(o,i)};r.prototype.selectEdgesByLabel=function(i,r){if(typeof r!==\"object\")r=e.getEmptyMap();var o=new t(r.view);var d=o.getEdgeStoreLocation();var s=e.getEmptyMap();for(var a=0;a<i.length;a++){var n=d+\"/\"+i[a];if(!e.tiddlerExists(n))continue;var l=this.wiki.getTiddlerData(n);for(var p=0;p<l.length;p++){if(i[a]!==this.opt.misc.unknownEdgeLabel){l[p].label=i[a]}s[l[p].id]=l[p]}}return e.convert(s,r.outputType)};r.prototype.selectEdgesByEndpoints=function(i,r){if(typeof r!==\"object\")r=e.getEmptyMap();var o=new t(r.view);var d=o.exists()?r.view.getEdgeFilter(\"compiled\"):this.opt.filter.allSharedEdges;var s=this.selectEdgesByFilter(d,{outputType:\"array\",view:o});return this.filterEdgesByEndpoints(s,i,r)};r.prototype.filterEdgesByEndpoints=function(t,i,r){if(typeof r!==\"object\")r=e.getEmptyMap();t=e.convert(t,\"array\");var o=/^(=1|>=1|=2)$/;var d=o.test(r.endpointsInSet)?r.endpointsInSet:\">=1\";var i=e.getLookupTable(i,\"id\");var s=e.getEmptyMap();for(var a=0;a<t.length;a++){var n=t[a];switch(d){case\"=2\":isMatch=i[n.from]&&i[n.to];break;case\">=1\":isMatch=i[n.from]||i[n.to];break;case\"=1\":isMatch=i[n.from]===undefined&&i[n.to]||i[n.to]===undefined&&i[n.from];break;default:isMatch=false}if(isMatch)s[n.id]=n}return e.convert(s,r.outputType)};r.prototype.selectNodesByFilter=function(t,i){var r=e.getMatches(t);return this.selectNodesByReference(r,i)};r.prototype.selectNodesByReference=function(t,i){if(typeof i!==\"object\")i=e.getEmptyMap();var r=i.addProperties;var o=e.getEmptyMap();for(var d=0;d<t.length;d++){var s=this.createNode(t[d],r,i.view);if(s){o[s.id]=s}}if(i.view){this._restorePositions(o,i.view)}return e.convert(o,i.outputType)};r.prototype.createNode=function(i,r,o){var d=this.wiki.getTiddler(e.getTiddlerReference(i));if(!d||d.isDraft()||this.wiki.isSystemTiddler(d.fields.title)){return}if(!d.fields[this.opt.field.nodeId]){var s=e.getEmptyMap();s[this.opt.field.nodeId]=e.genUUID();d=new $tw.Tiddler(d,s);$tw.wiki.addTiddler(d)}var a=e.getEmptyMap();var n=d.fields[this.opt.field.nodeIcon];if(n){var l=e.getTiddler(n);if(l&&l.fields.text){var p=l.fields.type?l.fields.type:\"image/svg+xml\";var f=l.fields.text;a.shape=\"image\";if(p===\"image/svg+xml\"){f=f.replace(/\\r?\\n|\\r/g,\" \");if(!e.inArray(\"xmlns\",f)){f=f.replace(/<svg/,'<svg xmlns=\"http://www.w3.org/2000/svg\"')}}var g=$tw.config.contentTypeInfo[p].encoding===\"base64\"?f:window.btoa(f);a.image=\"data:\"+p+\";base64,\"+g}}var v=d.fields[this.opt.field.nodeLabel];a.label=v&&this.opt.field.nodeLabel!==\"title\"?this.wiki.renderText(\"text/plain\",\"text/vnd-tiddlywiki\",v):d.fields.title;var y=d.fields[this.opt.field.nodeInfo];a.title=y&&this.opt.field.nodeInfo!==\"text\"?this.wiki.renderText(\"text/html\",\"text/vnd-tiddlywiki\",y):d.fields.title;if(d.fields.color){a.color=d.fields.color}if(typeof r===\"object\"){a=$tw.utils.extendDeepCopy(a,r)}a.id=d.fields[this.opt.field.nodeId];a.ref=d.fields.title;if(o){var o=new t(o);if(o.isConfEnabled(\"physics_mode\")){a.allowedToMoveX=true;a.allowedToMoveY=true}}return a};r.prototype.selectNeighbours=function(t,i){if(typeof i!==\"object\")i=e.getEmptyMap();if(i.edges){var r=this.filterEdgesByEndpoints(i.edges,t,{outputType:\"array\",endpointsInSet:\"=1\"})}else{var r=this.selectEdgesByEndpoints(t,{outputType:\"array\",view:i.view,endpointsInSet:\"=1\"})}var t=e.getLookupTable(t,\"id\");var o=e.getEmptyMap();for(var d=0;d<r.length;d++){var s=t[r[d].from]?r[d].to:r[d].from;o[s]=true}return this.selectNodesByIds(o,i)};r.prototype.selectNodesByIds=function(t,r){if(typeof r!==\"object\")r=e.getEmptyMap();if(Array.isArray(t)){t=e.getArrayValuesAsHashmapKeys(t)}else if(t instanceof i.DataSet){t=e.getLookupTable(t,\"id\")}var o=e.getEmptyMap();var d=this.wiki.allTitles();var s=this.opt.field.nodeId;var a=r.addProperties;for(var n in t){for(var l=0;l<d.length;l++){var p=this.createNode(d[l],a,r.view);if(p&&t[p.id]){o[p.id]=p}}}if(r.view){this._restorePositions(o,r.view)}return e.convert(o,r.outputType)};r.prototype.selectNodeById=function(t,i){if(typeof i!==\"object\"){i=e.getEmptyMap()}i.outputType=\"hashmap\";var r=this.selectNodesByIds([t],i);return r[t]};r.prototype.deleteNodesFromStore=function(t,i){if(!t)return;var r=this.opt.field.nodeId;var o=this.wiki.allTitles();var d=[];var t=e.getLookupTable(t,\"id\");for(var s in t){for(var a=0;a<o.length;a++){var n=e.getTiddlersWithProperty(r,s,{isIncludeDrafts:true,isReturnRef:true,tiddlers:o});d=d.concat(n)}}var l=this.wiki.getTiddlerList(\"$:/StoryList\");if(l.length){l=l.filter(function(t){return!e.inArray(t,d)});var p=this.wiki.getTiddler(\"$:/StoryList\");this.wiki.addTiddler(new $tw.Tiddler(p,{list:l}))}e.deleteTiddlers(d);var f=this.selectEdgesByEndpoints(t,{view:i,outputType:\"array\"});this.deleteEdgesFromStore(f)};r.prototype.deleteEdgeFromStore=function(i,r){if(!i)return;var o=i.label?i.label:this.opt.misc.unknownEdgeLabel;var r=new t(r);var d=r.getEdgeStoreLocation()+\"/\"+o;var s=this.wiki.getTiddlerData(d,[]);this.logger(\"info\",\"Edge with label\",o,\"will be deleted: \",i);var a=e.keyOfItemWithProperty(s,\"id\",i.id);if(a!=null){s.splice(a,1);this.wiki.setTiddlerData(d,s);$tw.tiddlymap.edgeChanges.push({type:\"delete\",edge:i})}};r.prototype.deleteEdgesFromStore=function(t,i){t=e.convert(t,\"array\");for(var r=0;r<t.length;r++){this.deleteEdgeFromStore(t[r],i)}};r.prototype.getView=function(e,i){return new t(e,i)};r.prototype.createView=function(e){if(typeof e!==\"string\"||e===\"\"){e=\"My view\"}var i=this.wiki.generateNewTitle(this.opt.path.views+\"/\"+e);return new t(i,true)};r.prototype._restorePositions=function(i,r){r=new t(r);if(!r.exists())return;var o=r.getPositions();for(var d in i){if(e.hasOwnProp(o,d)){i[d].x=o[d].x;i[d].y=o[d].y}}};r.prototype.storePositions=function(e,i){i=new t(i);i.setPositions(e)};r.prototype.setupTiddler=function(t){var i=this.wiki.getTiddler(e.getTiddlerReference(t));if(!i)return;var r=this.opt.field.nodeId;if(!i.fields[r]){var o=e.getEmptyMap();o[r]=e.genUUID();i=new $tw.Tiddler(i,o);$tw.wiki.addTiddler(i)}return i};r.prototype.insertNode=function(i,r){if(typeof r!==\"object\")r=e.getEmptyMap();if(typeof i!==\"object\"){i=e.getEmptyMap()}var o=e.getEmptyMap();o.title=this.wiki.generateNewTitle(i.label?i.label:\"New node\");i.label=o.title;i.ref=o.title;if(this.opt.field.nodeId===\"title\"){i.id=o.title}else{i.id=e.genUUID();o[this.opt.field.nodeId]=i.id}if(r.view){var d=new t(r.view);d.addNodeToView(i)}this.wiki.addTiddler(new $tw.Tiddler(o,this.wiki.getModificationFields(),this.wiki.getCreationFields()));return i};exports.Adapter=r})();",
"title": "$:/plugins/felixhayashi/tiddlymap/adapter.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/callback_manager.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/callback_manager.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n(function(){\"use strict\";var e=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var t=function(){this.wiki=$tw.wiki;this.logger=$tw.tiddlymap.logger;this.callbacks=e.getEmptyMap()};t.prototype.add=function(e,t,l){this.logger(\"debug\",'A callback was registered for changes of \"'+e+'\"');this.callbacks[e]={execute:t,isDeleteOnCall:typeof l===\"boolean\"?l:true}};t.prototype.remove=function(e){if(this.callbacks[e]){this.logger(\"debug\",'A callback for \"'+e+'\" will be deleted');delete this.callbacks[e]}};t.prototype.handleChanges=function(e){if(this.callbacks.length==0){this.logger(\"debug\",\"No registered callbacks exist at the moment\");return}for(var t in e){if(!this.callbacks[t])continue;if(this.wiki.getTiddler(t)){this.logger(\"debug\",'A callback for \"'+t+'\" will be executed');this.callbacks[t].execute(t);if(!this.callbacks.isDeleteOnCall)continue}this.remove(t)}};exports.CallbackManager=t})();",
"title": "$:/plugins/felixhayashi/tiddlymap/callback_manager.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/dialog_manager.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/dialog_manager.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n(function(){\"use strict\";var t=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var e=require(\"$:/plugins/felixhayashi/tiddlymap/callback_manager.js\").CallbackManager;var i=function(t,e){this.wiki=$tw.wiki;this.logger=$tw.tiddlymap.logger;this.adapter=$tw.tiddlymap.adapter;this.opt=$tw.tiddlymap.opt;this.callbackManager=t;if(e){this.context=e}};i.prototype.open=function(e,i,a){if(!i){i={}}if(typeof a===\"function\"&&this.context){a=a.bind(this.context)}var l=this.opt.path.tempRoot+\"/dialog-\"+t.genUUID();var d={title:l,footer:t.getText(this.opt.ref.dialogStandardFooter),output:l+\"/output\",result:l+\"/result\",confirmButtonLabel:\"Okay\",cancelButtonLabel:\"Cancel\"};if(i.dialog){if(i.dialog.preselects){this.wiki.addTiddler(new $tw.Tiddler({title:d.output},i.dialog.preselects));delete i.dialog.preselects}$tw.utils.extend(d,i.dialog);delete i.dialog}this.callbackManager.add(d.result,function(e){var i=this.wiki.getTiddler(e);var l=i.fields.text;if(l){var o=this.wiki.getTiddler(d.output)}else{var o=null;$tw.tiddlymap.notify(\"operation cancelled\")}if(typeof a===\"function\"){a(l,o)}t.deleteTiddlers([d.title,d.output,d.result])}.bind(this),true);var o=t.getTiddler(this.opt.path.dialogs+\"/\"+e);var r=new $tw.Tiddler(o,i,d);this.wiki.addTiddler(r);$tw.rootWidget.dispatchEvent({type:\"tm-modal\",param:r.fields.title,paramObject:r.fields});this.logger(\"debug\",\"Opened dialog\",r)};exports.DialogManager=i})();",
"title": "$:/plugins/felixhayashi/tiddlymap/dialog_manager.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/exception.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/exception.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n(function(){Exception={};Exception.EnvironmentError=function(n){this.name=\"EnvironmentError\";this.message=\"Critical parts (\"+n+\") of the underlying system changed.\"};Exception.DependencyError=function(n){this.name=\"DependencyError\";this.message=\"TiddlyMap cannot run without: \"+n};for(var n in Exception){Exception[n].prototype=Object.create(Error.prototype);Exception[n].constructor=Exception[n]}exports.Exception=Exception})();",
"title": "$:/plugins/felixhayashi/tiddlymap/exception.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/utils.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/utils.js\ntype: application/javascript\nmodule-type: library\n\nATTENTION: THIS CLASS MUST NOT REQUIRE ANY OTHER TIDDLYMAP FILE\nIN ORDER TO AVOID ACYCLIC DEPENDENCIES!\n\n@preserve\n\n\\*/\n(function(){var e=require(\"$:/plugins/felixhayashi/vis/vis.js\");var t=require(\"$:/plugins/felixhayashi/tiddlymap/exception.js\").Exception;var r={};r.deleteTiddlers=function(e){var t=Object.keys(e);for(var n=0;n<t.length;n++){if(r.tiddlerExists(e[t[n]])){var i=r.getTiddlerReference(e[t[n]]);$tw.wiki.deleteTiddler(i)}}};r.getTiddlerIds=function(e,t){var n=[];var i=Object.keys(e);for(var l=0;l<i.length;l++){if(r.tiddlerExists(e[i[l]])){var a=r.getTiddler(e[i[l]]).fields[t];n.push(a)}}return n};r.getTiddlerById=function(e,t){if(!t)t=\"id\";var n=$tw.wiki.allTitles();for(var i=0;i<n.length;i++){var l=r.getTiddler(n[i]);if(l.fields[t]===e){return l}}};r.getLabel=function(e,t){var n=r.getTiddler(e);return n&&n.fields[t]?n.fields[t]:n.fields.title};r.convert=function(t,n){if(typeof t!==\"object\")return;switch(n){case\"array\":return r.getValues(t);case\"hashmap\":case\"object\":if(t instanceof e.DataSet){return e.get({returnType:\"Object\"})}else{return t}case\"dataset\":default:if(t instanceof e.DataSet){return t}if(!Array.isArray(t)){t=r.getValues(t)}return new e.DataSet(t)}};r.inject=function(t,n){if(n instanceof e.DataSet){n.update(r.convert(t,\"array\"))}else if(Array.isArray(n)){t=r.convert(t,\"object\");for(var i in t){if(!r.inArray(t[i],n)){n.push(t[i])}}}else{$tw.utils.extend(n,r.convert(t,\"object\"))}return n};r.refresh=function(t,n,i){if(!i){return new e.DataSet(r.convert(t,\"array\"))}var l={updated:r.convert(t,\"array\"),removed:[]};for(var a in n){if(!t[a])l.removed.push(a)}i.remove(l.removed);i.update(l.updated);return i};r.getValues=function(t){if(Array.isArray(t)){return t}if(t instanceof e.DataSet){return t.get({returnType:\"Array\"})}var r=[];var n=Object.keys(t);for(var i=0;i<n.length;i++){r.push(t[n[i]])}return r};r.hasOwnProp=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};r.getEmptyMap=function(){var e=Object.create(null);Object.defineProperty(e,\"hasOwnProperty\",{enumerable:false,configurable:false,writable:false,value:Object.prototype.hasOwnProperty.bind(e)});return e};r.getMatches=function(e,t,n){var i=undefined;if(typeof t===\"object\"){var l=Object.keys(t);i=function(e){for(var n=0;n<l.length;n++){var i=r.getTiddler(t[l[n]]);if(i){e(i,i.fields.title)}}}}if(typeof e===\"string\"){e=$tw.wiki.compileFilter(e)}var a=e.call($tw.wiki,i);return a};r.isMatch=function(e,t){var n=r.getTiddlerReference(e);return r.getMatches(t,[n]).length>0};r.getTiddlerReference=function(e){if(e instanceof $tw.Tiddler){return e.fields.title}else if(typeof e===\"string\"){return e}};r.getTiddler=function(e){return e instanceof $tw.Tiddler?e:$tw.wiki.getTiddler(e)};r.getBasename=function(e){return e.substring(e.lastIndexOf(\"/\")+1)};r.notify=function(e){var t=\"$:/temp/tiddlymap/notify\";$tw.wiki.addTiddler(new $tw.Tiddler({title:t,text:e}));$tw.notifier.display(t)};r.tiddlerExists=function(e){var t=r.getTiddlerReference(e);return t&&($tw.wiki.tiddlerExists(t)||$tw.wiki.isShadowTiddler(t))};r.getPropertiesByPrefix=function(e,t,n){var i=r.getEmptyMap();for(var l in e){if(r.startsWith(l,t)){i[n?l.substr(t.length):l]=e[l]}}return i};r.startsWith=function(e,t){return typeof e===\"string\"&&e.indexOf(t)===0};r.hasElements=function(e){return Object.keys(e).length>0};r.findAndRemoveClassNames=function(e){for(var t=0;t<e.length;t++){var r=document.getElementsByClassName(e[t]);for(var n=0;n<r.length;n++){$tw.utils.removeClass(r[n],e[t])}}};r.isDraft=function(e){return r.getTiddler(e)&&r.getTiddler(e).isDraft()};r.getText=function(e,t){if(!t){t=\"\"}var n=r.getTiddler(e);return n?n.fields.text:t};r.inArray=function(e,t){return t.indexOf(e)!==-1};r.joinAndWrap=function(e,t,r,n){if(!n)n=\" \";return t+e.join(r+n+t)+r};r.keysOfItemsWithProperty=function(e,t,n,i){e=r.getIterableCollection(e);var l=Object.keys(e);var a=[];var i=typeof i===\"number\"?i:l.length;for(var u=0;u<l.length;u++){var f=l[u];if(typeof e[f]===\"object\"&&e[f][t]){if(!n||e[f][t]===n){a.push(f);if(a.length===i){break}}}}return a};r.keyOfItemWithProperty=function(e,t,n){var i=r.keysOfItemsWithProperty(e,t,n,1);return i.length?i[0]:undefined};r.getIterableCollection=function(t){return t instanceof e.DataSet?t.get():t};r.getLookupTable=function(e,t){e=r.getIterableCollection(e);var n=r.getEmptyMap();var i=Object.keys(e);for(var l=0;l<i.length;l++){var a=i[l];var u=t?e[a][t]:e[a];if(typeof u===\"string\"&&u!=\"\"||typeof u===\"number\"){if(!n[u]){n[u]=e[a];continue}}throw'TiddlyMap: Cannot use \"'+u+'\" as lookup table index'}return n};r.getArrayValuesAsHashmapKeys=function(e){return r.getLookupTable(e)};r.getTiddlersWithProperty=function(e,t,n){if(typeof n!==\"object\")n=r.getEmptyMap();if(!n.tiddlers){n.tiddlers=$tw.wiki.allTitles()}var i=[];var l=n.isReturnRef;var a=Object.keys(n.tiddlers);for(var u=0;u<a.length;u++){var f=r.getTiddler(n.tiddlers[a[u]]);if(f.fields[e]===t){i.push(l?f.fields.title:f);if(n.isIncludeDrafts){var s=$tw.wiki.findDraft(f.fields.title);if(s){i.push(l?s:$tw.wiki.getTiddler(s))}}}}return i};r.Exception=t;r.getFullScreenApis=function(){var e=document,t=e.body,r={_requestFullscreen:t.webkitRequestFullscreen!==undefined?\"webkitRequestFullscreen\":t.mozRequestFullScreen!==undefined?\"mozRequestFullScreen\":t.msRequestFullscreen!==undefined?\"msRequestFullscreen\":t.requestFullscreen!==undefined?\"requestFullscreen\":\"\",_exitFullscreen:e.webkitExitFullscreen!==undefined?\"webkitExitFullscreen\":e.mozCancelFullScreen!==undefined?\"mozCancelFullScreen\":e.msExitFullscreen!==undefined?\"msExitFullscreen\":e.exitFullscreen!==undefined?\"exitFullscreen\":\"\",_fullscreenElement:e.webkitFullscreenElement!==undefined?\"webkitFullscreenElement\":e.mozFullScreenElement!==undefined?\"mozFullScreenElement\":e.msFullscreenElement!==undefined?\"msFullscreenElement\":e.fullscreenElement!==undefined?\"fullscreenElement\":\"\",_fullscreenChange:e.webkitFullscreenElement!==undefined?\"webkitfullscreenchange\":e.mozFullScreenElement!==undefined?\"mozfullscreenchange\":e.msFullscreenElement!==undefined?\"MSFullscreenChange\":e.fullscreenElement!==undefined?\"fullscreenchange\":\"\"};if(!r._requestFullscreen||!r._exitFullscreen||!r._fullscreenElement){return null}else{return r}};r.flatten=function(e,t){t=t||{};var r=t.delimiter||\".\";var n=t.prefix||\"\";var i={};function l(e,a){Object.keys(e).forEach(function(u){var f=e[u];var s=t.safe&&Array.isArray(f);var c=Object.prototype.toString.call(f);var d=c===\"[object Object]\"||c===\"[object Array]\";var o=a?a+r+u:n+u;if(!s&&d){return l(f,o)}i[o]=f})}l(e);return i};r.unflatten=function(e,t){t=t||{};var n=t.delimiter||\".\";var i={};if(Object.prototype.toString.call(e)!==\"[object Object]\"){return e}function l(e){var t=Number(e);return isNaN(t)||e.indexOf(\".\")!==-1?e:t}Object.keys(e).forEach(function(a){var u=a.split(n);var f=l(u.shift());var s=l(u[0]);var c=i;while(s!==undefined){if(c[f]===undefined){c[f]=typeof s===\"number\"&&!t.object?[]:{}}c=c[f];if(u.length>0){f=l(u.shift());s=l(u[0])}}c[f]=r.unflatten(e[a],t)});return i};r.genUUID=function(){var e=\"0123456789abcdefghijklmnopqrstuvwxyz\".split(\"\");return function(){var t=e,r=new Array(36);var n=0,i;for(var l=0;l<36;l++){if(l==8||l==13||l==18||l==23){r[l]=\"-\"}else if(l==14){r[l]=\"4\"}else{if(n<=2)n=33554432+Math.random()*16777216|0;i=n&15;n=n>>4;r[l]=t[l==19?i&3|8:i]}}return r.join(\"\")}}();exports.utils=r})();",
"title": "$:/plugins/felixhayashi/tiddlymap/utils.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/view_abstraction.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/view_abstraction.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n(function(){var t=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var e=function(i,r){if(i instanceof e){return i}this.wiki=$tw.wiki;this.opt=$tw.tiddlymap.opt;this.logger=$tw.tiddlymap.logger;this.path=t.getEmptyMap();this.path.config=this._getConfigPath(i);if(r){this._createView()}else if(!this.exists()){return}this.path.map=this.path.config+\"/map\";this.path.nodeFilter=this.path.config+\"/filter/nodes\";this.path.edgeFilter=this.path.config+\"/filter/edges\";this._ignoreOnNextRebuild=t.getEmptyMap();this.rebuildCache(t.getValues(this.path))};e.prototype._getConfigPath=function(e){if(e instanceof $tw.Tiddler){return e.fields.title}if(typeof e==\"string\"){if(t.startsWith(e,this.opt.path.views)){var i=this.opt.path.views+\"/\";e=e.substr(i.length)}if(!t.inArray(\"/\",e)){return this.opt.path.views+\"/\"+e}}};e.prototype.getPaths=function(){return this.path};e.prototype._createView=function(){if(this.exists()){this.destroy()}var e={};e.title=this.path.config;e[this.opt.field.viewMarker]=true;e.id=t.genUUID();this.wiki.addTiddler(new $tw.Tiddler(e))};e.prototype.refresh=function(t){return this.rebuildCache(Object.keys(t))};e.prototype.rebuildCache=function(e,i){if(!this.exists())return[];if(t.inArray(this.path.config,e)){this.logger(\"debug\",\"View's config is requested to be rebuild -> trigger full rebuild\");e=t.getValues(this.path)}var r=this._ignoreOnNextRebuild;this._ignoreOnNextRebuild=t.getEmptyMap();var s=[];for(var o=0;o<e.length;o++){var n=e[o];if(!i&&r[n]){continue}switch(n){case this.path.config:this.config=this.getConfig(null,true);break;case this.path.map:this.positions=this.getPositions(true);break;case this.path.nodeFilter:this.nodeFilter=this.getNodeFilter(null,true);break;case this.path.edgeFilter:this.edgeFilter=this.getEdgeFilter(null,true);break;default:continue}s.push(n)}return s};e.prototype.exists=function(){return t.tiddlerExists(this.path.config)};e.prototype.getRoot=function(){return this.path.config};e.prototype.getLabel=function(){if(!this.exists())return;return t.getBasename(this.path.config)};e.prototype.destroy=function(){if(!this.exists())return;var e=\"[prefix[\"+this.getRoot()+\"]]\";t.deleteTiddlers(t.getMatches(e));this.path=t.getEmptyMap()};e.prototype.getReferences=function(){var e=\"[regexp:text[<\\\\$tiddlymap.*?view=.\"+this.getLabel()+\"..*?>]]\";return t.getMatches(e)};e.prototype.rename=function(e){if(!this.exists()||typeof e!==\"string\"||t.inArray(\"/\",e)){return}var i=this.getLabel();if(i===e){return}for(index in this.path){var r=this.wiki.getTiddler(this.path[index]);if(!r)continue;this.path[index]=this.path[index].replace(i,e);this.wiki.addTiddler(new $tw.Tiddler(r,{title:this.path[index]}));this.wiki.deleteTiddler(r.fields.title)}this.rebuildCache(t.getValues(this.path),true)};e.prototype.isConfEnabled=function(t){return this.getConfig(t)===\"true\"};e.prototype.getConfig=function(e,i){if(!this.exists()){return t.getEmptyMap()}if(!i&&this.config){var r=this.config}else{var s=this.wiki.getTiddler(this.path.config).fields;var r=t.getPropertiesByPrefix(s,\"config.\");defaults={\"config.layout.active\":\"user\"};$tw.utils.extend(defaults,r)}return e?r[t.startsWith(e,\"config.\")?e:\"config.\"+e]:r};e.prototype.getHierarchyEdgeTypes=function(){if(this.getConfig(\"layout.active\")!==\"hierarchical\")return[];var e=t.getPropertiesByPrefix(this.getConfig(),\"config.layout.hierarchical.order-by-\",true);var i=t.getEmptyMap();for(var r in e){if(e[r]===\"true\"){var s=t.getTiddlerById(r);if(s){i[t.getBasename(s.fields.title)]=true}}}return i};e.prototype.setConfig=function(t){this.logger(\"log\",\"Updating config\",this.config,\"with\",t);$tw.utils.extend(this.config,t);this.wiki.addTiddler(new $tw.Tiddler(this.wiki.getTiddler(this.path.config),this.config));this._ignoreOnNextRebuild[this.path.config]=true};e.prototype.removeNodeFromFilter=function(t){var e=this.getNodeFilter(\"expression\");var i=e.replace(\"[[\"+t.label+\"]]\",\"\").replace(this._getAddNodeFilterPart(t),\"\");if(i!==e){this.setNodeFilter(i);return true}return false};e.prototype._getAddNodeFilterPart=function(t){return\"[field:\"+this.opt.field.nodeId+\"[\"+t.id+\"]]\"};e.prototype.setNodeFilter=function(t){if(!this.exists())return;t=t.replace(\"\\n\",\" \");if(this.getNodeFilter.expression===t){return}this.wiki.addTiddler(new $tw.Tiddler({title:this.path.nodeFilter,filter:t.replace(\"\\n\",\" \")}));this.logger(\"debug\",\"Node filter set to\",t);this.nodeFilter=this.getNodeFilter(null,true);this._ignoreOnNextRebuild[this.path.nodeFilter]=true};e.prototype.getPrettyNodeFilterExpr=function(){var t=this.getNodeFilter(\"expression\").trim().replace(\"][\",\"] [\");var e=/[\\+\\-]?\\[.+?[\\]\\}\\>]\\]/g;var i=t.match(e);t=t.replace(e,\" [] \").trim();var r=t.split(/\\s+/);var s=0;var o=[];for(var n=0;n<r.length;n++){o[n]=r[n]===\"[]\"?i[s++]:r[n]}return o.join(\"\\n\")};e.prototype.appendToNodeFilter=function(t){var t=this.getNodeFilter(\"expression\")+\" \"+t;this.setNodeFilter(t)};e.prototype.addNodeToView=function(t){this.appendToNodeFilter(this._getAddNodeFilterPart(t));this.setNodePosition(t)};e.prototype.getEdgeStoreLocation=function(){return this.isConfEnabled(\"private_edge_mode\")?this.getRoot()+\"/graph/edges\":this.opt.path.edges};e.prototype.getAllEdgesFilter=function(t){var e=t?\"removeprefix[\"+this.getEdgeStoreLocation()+\"/]\":\"\";return\"[prefix[\"+this.getEdgeStoreLocation()+\"]\"+e+\"]\"};e.prototype.getEdgeFilter=function(e,i){if(!i&&this.edgeFilter){var r=this.edgeFilter}else{var r=t.getEmptyMap();var s=$tw.wiki.getTiddler(this.path.edgeFilter);r.defaultIsShow=!s||s.fields[\"default-is-show\"]!==\"false\";r.expression=function(){var e=[];if(r.defaultIsShow){e.push(\"prefix[\"+this.getEdgeStoreLocation()+\"]\")}if(s){var i=t.getPropertiesByPrefix(s.fields,\"show-\",true);for(var o in i){var n=i[o]!==\"false\";if(r.defaultIsShow!==n){e.push((n?\"\":\"!\")+\"field:id[\"+o+\"]\")}}}return\"[\"+e.join(\"\")+\"]\"}.call(this);r.compiled=this.wiki.compileFilter(r.expression)}return e?r[e]:r};e.prototype.getNodeFilter=function(e,i){if(!i&&this.nodeFilter){var r=this.nodeFilter}else{var r=t.getEmptyMap();var s=$tw.wiki.getTiddler(this.path.nodeFilter);if(s&&typeof s.fields.filter===\"string\"){r.expression=s.fields.filter}else{r.expression=\"\"}r.compiled=this.wiki.compileFilter(r.expression)}return e?r[e]:r};e.prototype.getPositions=function(t){if(!t&&this.positions){return this.positions}return $tw.wiki.getTiddlerData(this.path.map,{})};e.prototype.setPositions=function(t){if(!this.exists())return;$tw.tiddlymap.logger(\"log\",'Storing positions in view \"'+this.getLabel()+'\"');if(typeof t!==\"object\")return;this.wiki.setTiddlerData(this.path.map,t);this.positions=t;this._ignoreOnNextRebuild[this.path.map]=true};e.prototype.setNodePosition=function(t){if(t&&t.x&&t.y){var e=this.getPositions();e[t.id]={x:t.x,y:t.y};this.setPositions(e)}};exports.ViewAbstraction=e})();",
"title": "$:/plugins/felixhayashi/tiddlymap/view_abstraction.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/map-macro.js": {
"text": "/*\\\ntitle: $:/plugins/felixhayashi/tiddlymap/map-macro.js\ntype: application/javascript\nmodule-type: macro\n\nIn connection with tiddlymap, this macro allows us to access\nsystem information from within tiddlers as well as to execute some\nutil functions.\n\n@preserve\n\n\\*/\n(function(){\"use strict\";var r=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;exports.name=\"map-macro\";exports.params=function(r){var t=[];for(var e=0;e<r;e++){t.push({name:\"arg\"+e})}return t}(5);var t=function(){return};exports.run=function(){switch(arguments[0]){case\"basename\":return r.getBasename(arguments[1]);case\"option\":var t=$tw.tiddlymap.opt;var e=arguments[1].split(\".\");for(var n=0;n<e.length;n++){if(typeof t==\"object\"&&t[e[n]]){t=t[e[n]]}else{return\"property doesn't exist\"}}if(!(typeof t==\"string\"))return\"property is not a string\";return t}return\"wrong signature\"}})();",
"title": "$:/plugins/felixhayashi/tiddlymap/map-macro.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/cannotDeleteViewDialog": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/cannotDeleteViewDialog",
"subtitle": "{{$:/core/images/locked-padlock}} You cannot delete this view!",
"text": "It is not possible to delete the current view as ''<<count>>'' tiddlers\nare referencing it. To delete the view you must first remove the tiddlymap\nwidgets in the tiddlers listed below or change their view attributes.\n\n''References''\n\n<ul>\n<$list filter=<<filter>> variable=\"item\">\n <li><$link><<item>></$link></li>\n</$list>\n</ul>\n\nAfter the references are removed, you may delete the view."
},
"$:/plugins/felixhayashi/tiddlymap/dialog/configureTiddlyMap": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/configureTiddlyMap",
"subtitle": "{{$:/core/images/options-button}} Configuration of ~TiddlyMap",
"text": "<$importvariables filter=\"[[$:/plugins/felixhayashi/tiddlymap/misc/macros]]\">\n\nPlease visit the [[online docs|http://bit.ly/tiddlymap#Changing%20TiddlyMap's%20default%20configuration]] for more information about the following options.\n\n<fieldset class=\"tmap-options\">\n <legend>Field settings</legend>\n <table>\n <<tmap-row title:\"Node-id field\" field:\"config.sys.field.nodeId\" type:\"input-text\"\n descr:\"Field to identify tiddlers and trace their changes (missing ids are autogenerated).\"\n note:\"If you plan on using ~TiddlyWiki's cloning feature, set this value to 'title', however, you may lose some of ~TiddlyMap's functionality then. Please refer to the docs for further information.\">>\n <<tmap-row title:\"Node-icon field\" field:\"config.sys.field.nodeIcon\" type:\"input-text\"\n descr:\"Local image used as node image in the graphs.\">>\n <<tmap-row title:\"Node-label field\" field:\"config.sys.field.nodeLabel\" type:\"input-text\" \n descr:\"Alternative node label to use instead of the title.\">>\n <<tmap-row title:\"Node-info field\" field:\"config.sys.field.nodeInfo\" type:\"input-text\"\n descr:\"Field used as tooltip when hovering a node in a graph.\"\n note:\"It is prohibited to use the text field here.\">>\n <<tmap-row title:\"View-marker field\" field:\"config.sys.field.viewMarker\" type:\"input-text\"\n descr:\"Field used by the system to identify user views.\"\n note:\"It is __not__ recommended to change this default unless it conflicts with an existing system tiddler property.\">>\n </table> \n</fieldset>\n\n<fieldset><legend>Other settings</legend>\n <table>\n <<tmap-row title:\"Debug output\" field:\"config.sys.debug\" type:\"input-checkbox\"\n descr:\"Set this to true if you want debug information to be displayed in the browser console.\">>\n <<tmap-row title:\"Show notifications\" field:\"config.sys.notifications\" type:\"input-checkbox\"\n descr:\"Set this to true if you want to receive fade-out notifications for important events.\">>\n <<tmap-row title:\"Halfscreen enlargement\" field:\"config.sys.halfscreen\" type:\"input-checkbox\"\n descr:\"When the fullscreen-button is pressed, sidebar maps (live view, editor) are enlarged halfscreen instead of fullscreen so the story river stays visible.\">>\n <<tmap-row title:\"Allow single click mode\" field:\"config.sys.singleClickMode\" type:\"input-checkbox\"\n descr:\"A single click on a node is sufficient enough to open the corresponding tiddler.\"\n note:\"Drag and drop will still work and does not cause a tiddler to be opened.\">>\n </table>\n</fieldset>\n\n\n</$importvariables>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/getConfirmation": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/getConfirmation",
"subtitle": "{{$:/core/images/import-button}} You must confirm in order to proceed!",
"text": "<<message>>\n\n''Are you really sure you want to do this?''\n\n\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/createView": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/createView",
"subtitle": "{{$:/core/images/new-button}} Creating a new view",
"text": "Please specify a view name.\n\nName: <$edit-text tiddler=<<output>> field=\"text\" type=\"text\" tag=\"input\" default=\"\"></$edit-text> <sup>[1]</sup>\n\n---\n\n<sup>[1]</sup> <small>Attention: using the name of an existing view will overwrite it!</small>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/deleteNodeDialog": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/deleteNodeDialog",
"subtitle": "{{$:/core/images/delete-button}} Deleting the node named \"<<var.nodeLabel>>\"",
"text": "''Please choose an option or abort:''\n\n<$radio tiddler=<<output>> field=\"opt.delete\" value=\"from system\">\n Delete from system <sup>[1]</sup>\n</$radio><br />\n<$radio tiddler=<<output>> field=\"opt.delete\" value=\"from filter\">\n Delete from graph's filter <sup>[2]</sup>\n</$radio>\n\n---\n\n<sup>[1]</sup>\n<small>This will delete the node named \"<<var.nodeLabel>>\" ''and'' the corresponding tiddler named \"<<var.nodeRef>>\" ''and'' all connected edges.</small><br/>\n<sup>[2]</sup>\n<small>''Important:'' Removing a node from the graph's filter only works, if the node has been added in the map editor per double click or via \"Add Node\". Then we can delete the node \"<<var.nodeLabel>>\" from the existing filter used by the graph without removing the underlying tiddler. If the node hasn't been added as mentioned above, you need to change the underlying tiddler in a way that it doesn't match your filter anymore, if you want it to be removed from the graph.</small>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/editNodeFilter": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/editNodeFilter",
"subtitle": "{{$:/core/images/edit-button}} Filter Editor",
"text": "<div id=\"tmap-node-filter-dialog\">\n\n <$edit-text tag=\"textarea\" tiddler=<<output>> field=\"text\" default=<<prettyFilter>> autoHeight=\"no\" />\n\n <div id=\"tmap-filter-tips\">\n\n Tips for creating a node filter:\n\n * \"\"\"\n <b>Warning:</b> Never use filters that are selectors (e.g. \"[all[tiddlers]]\")! Seriously!\n Use filters that really __are__ filters such as \"[!is[system]!has[draft.of]]\" etc. See this [[discussion|https://groups.google.com/d/msg/tiddlywikidev/aCRvcsVwfU8/FGsG1EOBUOQJ]].\n \"\"\"\n * A new line is equivalent to an \"or\".\n * New to filters? Read this [[introduction|http://tiddlywiki.com/#Introduction%20to%20Filters]].\n\n </div>\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/editView": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/editView",
"subtitle": "{{$:/core/images/theme-button}} View Configuration",
"text": "\\define orderByEdgeField() config.layout.hierarchical.order-by-$(curEdgeId)$\n\n<$importvariables filter=\"[[$:/plugins/felixhayashi/tiddlymap/misc/macros]]\">\n\n<fieldset><legend>Layout</legend>\n <$radio tiddler=<<output>> field=\"config.layout.active\" value=\"hierarchical\"> Hierachical layout</$radio>\n -- //Display nodes hierarchically ordered.//\n <ul>\n <li>\n Which relations define the hierarchical order?\n <div class=\"tmap-small-list\">\n <$list filter=<<var.edgeFilter>> >\n <$set name=\"curEdgeId\" value={{!!id}}>\n <$checkbox tiddler=<<output>> field=<<orderByEdgeField>> checked=\"true\" unchecked=\"false\" default=\"false\">\n <$macrocall $name=\"map-macro\" arg0=\"basename\" arg1={{!!title}} />\n </$checkbox>\n <br />\n </$set>\n </$list>\n </div>\n </li>\n </ul>\n \n <$radio tiddler=<<output>> field=\"config.layout.active\" value=\"user\"> User defined layout</$radio>\n -- //Position nodes on the canvas without any restriction.//\n\n</fieldset>\n\n<fieldset><legend>Other</legend>\n \n <table>\n <<tmap-row title:\"Floating nodes\" field:\"config.physics_mode\" type:\"input-checkbox\"\n descr:\"Set this to true if you want your nodes to freely swirl around.\">>\n <<tmap-row title:\"Private edge mode\" field:\"config.private_edge_mode\" type:\"input-checkbox\"\n descr:\"Use local edges that __exclusively__ belong to this particular view.\">>\n </table>\n \n</fieldset>\n\n</$importvariables>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/getWidgetCode": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/getWidgetCode",
"subtitle": "{{$:/core/images/permalink-button}} Widget Code Generator",
"text": "<$importvariables filter=\"[[$:/plugins/felixhayashi/tiddlymap/misc/macros]]\">\n\nThe following wizard will assist you in creating the widget code you can use (copy'n'paste) to embed this view in a tiddler. Please visit the [[online demo|http://bit.ly/tiddlymap]] for some examples on how the attributes below affect the displayed graph.\n\n''Widget-code''\n\n<pre style=\"white-space: normal;\">\n<$tiddlymap\n\nview=\"<<param.view>>\"\n\n<$list filter=\"[field:title<output>field:var.click-to-use[false]]\">\n click-to-use=\"false\"\n</$list>\n\n<$list filter=\"[field:title<output>has[var.width]]\">\n width=\"<$view tiddler=<<output>> field=\"var.width\" />\"\n</$list>\n\n<$list filter=\"[field:title<output>has[var.height]]\">\n height=\"<$view tiddler=<<output>> field=\"var.height\" />\"\n</$list>\n\n<$list filter=\"[field:title<output>has[var.class]]\">\n class=\"<$view tiddler=<<output>> field=\"var.class\" />\"\n</$list>\n\n<$list filter=\"[field:title<output>has[var.editor]]\">\n class=\"<$view tiddler=<<output>> field=\"var.editor\" />\"\n</$list>\n\n<$list filter=\"[field:title<output>field:var.show-buttons[false]]\">\n show-buttons=\"false\"\n</$list>\n\n></$tiddlymap>\n</pre>\n\nIf you are unsure about a parameter, just leave everything as is and simply copy the widget code displayed above.\n\n<fieldset class=\"tmap-options\">\n <legend>Parameters</legend> \n <table>\n <<tmap-row type:\"input-text\" title:\"Height\" field:\"var.height\"\n descr:\"The graph's height in css units. Defaults to '300px'.\">>\n <<tmap-row type:\"input-text\" title:\"Width\" field:\"var.width\"\n descr:\"The graph's width in css units. Defaults to '100%'.\">>\n <<tmap-row type:\"input-text\" title:\"Class\" field:\"var.class\"\n descr:\"A custom class you can assign to apply your own css.\">>\n <<tmap-row type:\"input-checkbox\" title:\"Click to use\" field:\"var.click-to-use\" default:\"true\"\n descr:\"Prevents the graph from reacting to mouse or click events. This default is highly recommended.\">>\n <<tmap-row type:\"input-checkbox\" title:\"Show buttons\" field:\"var.show-buttons\" default:\"true\"\n descr:\"Show or hide the graph's navigation buttons.\">>\n </table>\n</fieldset>\n\n</$importvariables>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/getNodeName": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/getNodeName",
"subtitle": "{{$:/core/images/tag-button}} Please name your new node",
"text": "Name: <$edit-text tiddler=<<output>> field=\"text\" type=\"text\" tag=\"input\" default=\"\"></$edit-text> <sup>[1]</sup> \n\n---\n\n<sup>[1]</sup>\n<small>If you leave the name field blank, a name will be automatically generated for you.</small>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/previewContent": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/previewContent",
"subtitle": "{{$:/core/images/video}} Previewing \"<<param.ref>>\"",
"text": "<$transclude tiddler=<<param.ref>> field=\"text\" mode=\"block\" />"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/getEdgeType": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/getEdgeType",
"subtitle": "You are about to connect \"<<fromLabel>>\" with \"<<toLabel>>\"",
"text": "\\define getLabel()\n<$macrocall $name=\"map-macro\" arg0=\"basename\" arg1={{!!title}} />\n\\end\n\n''Type'': Please choose an existing relationship type from the list or specify a new one. <sup>[1]</sup>\n\n<!-- \"One trap to be aware of is that the edit text widget cannot be used to edit a field of the tiddler that contains it. Each keypress results in the tiddler being re-rendered, which loses the cursor position within the text field.\" -->\n<$edit-text tiddler=<<output>> field=\"text\" type=\"text\" tag=\"input\" default=\"\"></$edit-text>\n<$select tiddler=<<output>> default=\"\">\n <option></option>\n <$list filter=<<edgeFilterExpr>> >\n <!-- if no value element is specified text is used; see http://dev.w3.org/html5/spec-preview/the-option-element.html -->\n <option value={{!!title}} >{{!!title}}</option>\n </$list>\n</$select>\n\n---\n\n<sup>[1]</sup> <small>Please note that the name of the relationship type is case sensitive.</small>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/getViewName": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/getViewName",
"subtitle": "{{$:/core/images/tag-button}} Please specify a view name",
"text": "Name: <$edit-text tiddler=<<output>> field=\"text\" type=\"text\" tag=\"input\" default=\"\"></$edit-text> <sup>[1]</sup>\n\n<$reveal type=\"nomatch\" text=\"0\" default=<<count>>>\n \n Note that ''<<count>>'' tiddlers are referencing this view and renaming the view will cause the reference to be invalid. It is recommended to first remove the tiddlymap widgets in the tiddlers listed below or change their view attributes accordingly.\n\n ''References''\n\n <ul>\n <$list filter=<<filter>> variable=\"item\">\n <li><$link><<item>></$link></li>\n </$list>\n </ul>\n \n</$reveal>\n\n---\n\n<sup>[1]</sup> <small>Attention: using the name of an existing view will overwrite it!</small>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/welcome": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/welcome",
"subtitle": "{{$:/core/images/options-button}} Initial Setup",
"text": "It seems that you freshly installed ~TiddlyMap. Before you start creating\nmaps, please make sure ~TiddlyMap is configured correctly to suit your needs.\n\n{{$:/plugins/felixhayashi/tiddlymap/dialog/configureTiddlyMap}}"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/standardFooter": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/standardFooter",
"text": "<$button set=<<result>> setTo=\"1\"><<confirmButtonLabel>><$action-sendmessage $message=\"tm-close-tiddler\" /></$button>\n<$button set=<<result>> setTo=\"\"><<cancelButtonLabel>><$action-sendmessage $message=\"tm-close-tiddler\" /></$button>"
},
"$:/plugins/felixhayashi/tiddlymap/license": {
"title": "$:/plugins/felixhayashi/tiddlymap/license",
"subtitle": "License",
"caption": "License",
"text": "!! ~TiddlyMap\n\nCopyright (c) 2014, Felix Küppers\nAll rights reserved.\n\n~TiddlyMap is licensed under the [[BSD 2-Clause License|http://opensource.org/licenses/BSD-2-Clause]]. For the exact license terms, please visit [[https://github.com/felixhayashi/TW5-TiddlyMap/blob/master/LICENSE]]. \n\n!! ~TiddlyWiki\n\nCreated by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007 Copyright © ~UnaMesa Association 2007-2014\n\nPublished under the following [licenses](https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses):\n\n# BSD 3-clause \"New\" or \"Revised\" License (including any right to adopt any future version of a license if permitted)\n# Creative Commons Attribution 3.0 (including any right to adopt any future version of a license if permitted)\n\n!! Vis.js\n\nCopyright (c) 2014 [Almende B.V.](https://github.com/almende/vis)\n\nPublished under the following licenses:\n\n# Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n# MIT License (MIT)\n"
},
"$:/plugins/felixhayashi/tiddlymap/readme": {
"title": "$:/plugins/felixhayashi/tiddlymap/readme",
"text": "* Please refer to the project-readme hosted at [[https://github.com/felixhayashi/TW5-TiddlyMap]].\n* A demo with several examples and explanations can be found at [[http://bit.ly/tiddlymap]]."
},
"$:/plugins/felixhayashi/tiddlymap/media/fullscreen.png": {
"title": "$:/plugins/felixhayashi/tiddlymap/media/fullscreen.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOKQxPfTsHAAAEcUlEQVRIx72XX0xTZxjGn+c9JcYQ50qM5RjKkOOG1NQEQiMV1tkLIbLsypCahsTojIkX6kgBr7aG7Wo6ou7STHbnjdGb/Ymb2ABODdiIxKR/IdoeR1PIKJAZdZntLnZq0CEWtHtuzjk57/l+3/e9J8/7fkQB8vv9DIfDHyqK8nEul2sSkS0AzABAMkNyAsBNAD9qmna9t7c397oxudzLXbt2icVi+YxkH0mQ/4YvdRWRxZ/6EonEmcHBweyKwR6P5wCAfhEBSWzatClls9mS27ZtS1dVVc1v3LgxAwDT09PmBw8erI9Go5ZIJFKZSqVUEUE2mwXJg/39/d8XDN63b9+XAD4nie3bt0dbWlpC9fX1eiFpGR8ftwYCAVsoFKoxdumrc+fOffFynLIE9AyAHpLYvXv3yNGjR4dUVV1AgSovL19wOp2Tjx49QiKRqCD5kcPhMAeDwSuvBHs8nq9FxEcSXq93wOPx3MUqZbfbf1+zZs2f0Wi0mmSjw+EoDQaDV/8D9ng8B0ieFBHs37//17a2tjDeUJqmzZSWls6HQiFNUZQmh8ORvH379t3nOW5vb1dMJtPfJLFnz56bHR0dQQDwer3HlhrwwoUL3y5+fl3cpUuXGoaHh3cCQCqVMl28ePGZAICiKMdJwm63R/PQt6m9e/cGbTZbhCRUVT0OACa/3894PN4HAK2traFCVriaHXC5XKFYLLYVQJ/f7z8tsVjMBQBWqzVVV1eno0iqra19qKpqSkSwsLDgEpJtJFFbW5tEkaVpWlJEUFJS0iYkdxrgdLHB1dXVacNenSaS75NEVVXV/EpzW2jO87JarfOGp39gImkWEeS9t5gqKyvLGGCzKV8E/i/lq5jkcrkMSUxPT5uLDZ2dnTWLCEQkIyISFxEkk8n1Lwd6vd5jr3Kl5fSq76amptYbFSsmInKLJOLxuKXYK9Z13WKAbwnJnwAgGo1WFhucTCYrFUUBgJ+loqJimCTS6bR67969imJBJyYmKmZnZ1URgcvlum7q7e3NHT582Aegb3Bw0Ga32x8ulbPVVKfFunPnjk1EkMvlfG63OysAkMlkzhrbvfXy5csNb3u1gUCg4f79+1sB4MmTJ2df6LmOHDlyUETOK4qC9vb2X5qbm6NvAzo2NlYzMDDQShLZbPbQiRMnzr/QgQSDwbEdO3aUkmyKRCJb1q1bN1dZWfnHm0IDgUCr8Sef6unpOblkzzU6Onq1sbHRTLIxEolsefr06bOampqp1UCHhoYabty44Tbyerarq8u3bJc5MjJyxel0liqK0qTrulXX9XfXrl3714YNGwrqNCcnJ63Xrl1zhsPhOsMeT/l8Pl/BDX13d/enAL4zLA4WiyWlaVpi8+bNaVVVF8rKyjJ5G5yZmXknkUhYdF1/b25uTs2fOkge6uzsPL/iI4zf75fHjx93KoryjclkgtGfgSQMI0B+YovvSXbV19efdrvdKz/CvDyBbDbbTPITkjtFRBOR54ZPclJEbgL4weFw/LYcMK9/AFcdm7xTEIntAAAAAElFTkSuQmCC"
},
"$:/plugins/felixhayashi/tiddlymap/icon": {
"tags": "$:/tags/Image",
"title": "$:/plugins/felixhayashi/tiddlymap/icon",
"text": "<svg\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:cc=\"http://creativecommons.org/ns#\"\n xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n xmlns:svg=\"http://www.w3.org/2000/svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\n version=\"1.1\"\n width=\"22\"\n height=\"22\"\n id=\"svg2\">\n <defs\n id=\"defs4\">\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4329\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4321\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4315\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4307\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4299\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4293\" />\n </defs>\n <g\n transform=\"translate(0,-1030.3622)\"\n id=\"layer1\">\n <path\n d=\"m 17.867073,4.5821643 a 3.7249374,3.7249374 0 1 1 -7.449875,0 3.7249374,3.7249374 0 1 1 7.449875,0 z\"\n transform=\"matrix(-0.92067214,0,0,0.9067667,31.288377,1044.4963)\"\n id=\"path4139-1-14\"\n style=\"fill-opacity:1;fill-rule:nonzero\" />\n <path\n d=\"m 17.000007,1033.6163 -8.8942822,4.5708 8.2745462,5.1624 z\"\n id=\"path4327\"\n style=\"fill-rule:nonzero\" />\n <path\n d=\"m 16.759655,1039.6227 c -1.848511,-10.8084 -23.2472087,-9.4234 -27.641002,-7.1916 l 7.0480408,1.1159 c 0,0 12.9317346,-4.5838 17.4326372,7.7395 z\"\n id=\"path4337\"\n style=\"fill-opacity:1\" />\n </g>\n <metadata\n id=\"metadata3772\">\n <rdf:RDF>\n <cc:Work\n rdf:about=\"\">\n <dc:title></dc:title>\n </cc:Work>\n </rdf:RDF>\n </metadata>\n</svg>\n"
},
"$:/plugins/felixhayashi/tiddlymap/media/surface.png": {
"title": "$:/plugins/felixhayashi/tiddlymap/media/surface.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAAmALMAAQfdEQQAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfeDBYVBDLiNMeiAAAFvUlEQVRIx7WXbUxTZxTH/+c8VwQLlAKuEotF2mJRlMFEqeCUiMzojH7YEjMSlM1EY2Z04vbBbUrcZqbOTZfFOKMOcWRuZMyoS4xUN16EMUVUMkAFJ6VQkdFSoOIL9O5DBREFX/l/vOf+z+88z715znkITyMZZMjDTLfEC0iWE0hAD0DlZhkC7HCDagWoxA0cvzq/uwgE+UkpachoJjhiCta6mXYwATLfN7AnM923MzGIuC8hARn/lN3ZiUy4nxlsyEM6QAcgPECdb6TNFDTbMn10UnOkMsap9dE5AMDSVaeqdlYoz9qL1WftReOuuS6HMDHcshsEfrdyXscPTw3W/cabieRPmYAEdcrltLD3q2ar32x4mq9S2HIi9LBl78QzracnMDEI9FlFin3jE8G6PN5JLK9hAt4Zv6ps0+TvyvAc+rLmo+m5DfungwhEvKs8uWVt/7h4CPorb2VJzmACPpy01bzO+MUFPKcSg+c2+kijOs85zoQTKF6TplA0ZrvyHwEb8pAOgW0kgE8m7zyZHr6uGi+o6IDpLQEjAp1/tZ7WMUkJY5f6WRqzOy48AP8CETSCylkAS3VrS1YbNl7CS9IkZcx/rm5XT1XHxVBBvCh+gfPzqlzIDAD6kVgDBhJGp1z+OPLrc3jJWhOx6ZwpKKmGiGEL1q4BAIYMYqYdBCBt/OoqDJPeGpteJZEEiUfsgAxi/TG8DgAG/yjb7FcWNAwXOD5oljVcMcEmSELSH/rXmYjngwnTgmZZHmeIPaFcPlTCJ8UH/GwWIoYkjZzPRDSDQJgWNKt54Is513drb3W7vIdK5uru9BkslnN9t3amWZPaB/aPaxYQYBImBsFAxJiojHEONB6u/z5mpPC+N1jihQXRi72Fz92hCrPfaQnIub5bCwB6/ygnEYNBEczEKiLGuPtnb3/dvN2o8mbvQRO33WtVyPLgjWhP7ZbEcF9jY74tzwAAY701DokkCJJU7KmAHzEtK01OjvR/tcFLeN/trXjganUKY7PSS9X5uPiMk2PSetzdYol2RUWdq0b94JD2dDKGDAcRw9pVp+pvAoAsk9m8Ur+heE/tlsSB367tXqsiy2Q26xTG5t4V9fdH+EU1laTcyE4NW1Xffq/Nd2FB9GLbbatKIgFBwiEJ4qtMrK5uv6TU+OgcM82aVIPfpKYsk9kMAKlhq+pTw1bVx55QLldIfl06hbG5zlWjLkq25vQWN9OsSV1YEL14iXZFRb4tzxDhF9XnB4CYgPg6ALjmqlF61oorDOZSAqPcUaoGgJX6DcUHTafMA7fu/DznvpX6DcUyZPRCe1WUbM0J9Aru3FO7JVGGjP7Q3uKyTGZzVUelmjxbXUqTT/rOkmTpT51vpC13RkkuhlHrK5e93XCrPkR298zmyrmdhTIR/r1VG3KmJV8zXNCKtjJNU5c1RJDAJNOcIgZBJlAGg/Czdf/E4QKbbx6dyCQgwBmZlOn2dKc2+y4AOGsvMn57ZfPUlw3NseydeslZbiQQ7tQH7Orrx1W5kEPTfBuIeFF158XQwJHBbUa/6NaXAT118/iEvKZDSUwCIHn5TylHyx+aQBoPuSpC05QKJk4osxfqVV7BbUa/Ka0vCs1p2PsGEwPg7dlxv2977MxlzW7PH7dMpSJQ/Fl7of5Wj6snLjCx6Xmgh60Hph5pykliYshw78qKO5Yx6LAHAJaDbSfC0gMVTFJCTcel0MsdlQF+kv/dsT7a9qcBXnT+HfqjZY+pzF4Q4xlvsf3A1IehQw70cwoi3yPQPkECRIzxowy2aOW0+skBsc3higntY7w1DgC4cbtRZem65l/dflFd01GpvXnHFkIgeMZaWr4v9sj+Z77CZMrg0sKoD4jFV17sBYAgSAITQ5Dk2TLP2QuA+p4TaP2412K/yaTMZ7/CDCzgfElcIhEvJNAMiSQdEasESSBiB4PrBIsSctOx8XHTiocC9up/PG8QrAaKLngAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/tiddlymap/misc/connection_wizard": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/connection_wizard",
"subtitle": "{{$:/plugins/felixhayashi/tiddlymap/icon}} Connection Wizard",
"text": "\"\"\"\nPlease go on connecting <<currentTiddler>> with any tiddler of your choice.\nJust type in the name of the tiddler you want to link in the search field. <sup>[1]</sup>\n\"\"\"\n\nSearch:\n<$edit-text tiddler=\"$:/temp/felixhayashi/tiddlymap/quick_connect_search\" tag=\"input\" default=\"\" />\n\n---\n\n<$tiddlymap editor=\"vis\"\n click-to-use=\"false\"\n object-id=\"quick_connect\"\n height=\"250px\"\n view=\"quick_connect\"\n refresh-trigger=\"$:/temp/felixhayashi/tiddlymap/quick_connect_search\"></$tiddlymap>\n\n---\n\n<sup>[1]</sup> <small>The current tiddler is highlighted in the graph.</small>"
},
"$:/plugins/felixhayashi/tiddlymap/misc/advancedEditorBar": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/advancedEditorBar",
"text": "\\define showEdgeField() show-$(curEdgeId)$\n\n<!-- ===== View Switcher ======================================== -->\n\n<div>\n View:\n <$reveal type=\"match\" text=\"false\" default=<<param.isViewBound>> >\n <$select tiddler=<<param.ref.viewHolder>> field=\"text\" default=<<param.ref.view>> >\n <$list filter=<<map-macro \"option\" \"filter.allViews\">> >\n <option value={{!!title}}>\n <$macrocall $name=\"map-macro\" arg0=\"basename\" arg1={{!!title}} />\n </option>\n </$list>\n </$select>\n </$reveal>\n <$reveal type=\"match\" text=\"true\" default=<<param.isViewBound>> >\n <b><<param.viewLabel>></b>\n </$reveal>\n\n <$button popup=<<qualify \"$:/temp/tmap/editor/showactions\">> >{{$:/core/images/menu-button}}</$button>\n\n <$reveal type=\"popup\" position=\"below\" state=<<qualify \"$:/temp/tmap/editor/showactions\">> >\n <div class=\"tc-drop-down\">\n <a href=\"http://bit.ly/tiddlymap#The View Menu\" target=\"_blank\">{{$:/core/images/info-button}} Open online help</a>\n <hr />\n <$button class=\"tc-btn-invisible\" message=\"tm-create-view\">{{$:/core/images/new-button}} Create empty view</$button>\n <$button class=\"tc-btn-invisible\" message=\"tm-rename-view\">{{$:/core/images/tag-button}} Rename view</$button>\n <$button class=\"tc-btn-invisible\" message=\"tm-delete-view\">{{$:/core/images/delete-button}} Delete view</$button>\n <$button class=\"tc-btn-invisible\" message=\"tm-edit-view\">{{$:/core/images/theme-button}} Configure view</$button>\n <$button class=\"tc-btn-invisible\" message=\"tm-store-position\">{{$:/core/images/globe}} Save positions</$button>\n <$button class=\"tc-btn-invisible\" message=\"tm-generate-widget\">{{$:/core/images/permalink-button}} Grab widget code</$button>\n <hr />\n <$button class=\"tc-btn-invisible\" message=\"tm-configure-system\">{{$:/core/images/options-button}} Global configurations</$button>\n </div>\n </$reveal>\n\n</div>\n\n<!-- ===== Edge Filter ========================================== -->\n\n<span class=\"tmap-separator\" />\n\n<div>\n Edge Filter:\n <$button popup=<<qualify \"$:/temp/tmap/editor/filteredges\">> >{{$:/core/images/menu-button}}</$button>\n \n <$reveal type=\"popup\" position=\"below\" state=<<qualify \"$:/temp/tmap/editor/filteredges\">> >\n <div class=\"tc-drop-down\">\n \n <$tiddler tiddler=<<param.ref.edgeFilter>>>\n <a href=\"http://bit.ly/tiddlymap#Using the edge filter\" target=\"_blank\">{{$:/core/images/info-button}} Open online help</a>\n <hr />\n <$checkbox field=\"default-is-show\" checked=\"true\" unchecked=\"false\" default=\"true\">\n Toggle default (show or hide)\n </$checkbox>\n <hr />\n <$set name=\"default\" filter=\"[all[current]!field:default-is-show[false]]\" value=\"true\" emptyValue=\"false\">\n <div class=\"tmap-small-list\">\n <$list filter=<<param.allEdgesFilter>> >\n <$set name=\"curEdgeId\" value={{!!id}}>\n <$checkbox tiddler=<<param.ref.edgeFilter>> field=<<showEdgeField>> checked=\"true\" unchecked=\"false\" default=<<default>> >\n <$macrocall $name=\"map-macro\" arg0=\"basename\" arg1={{!!title}} />\n </$checkbox>\n <br />\n </$set>\n </$list>\n </div>\n </$set>\n </$tiddler>\n \n </div>\n </$reveal>\n\n</div>\n\n<!-- ===== Node Filter ========================================== -->\n\n<span class=\"tmap-separator\" />\n\n<div>\n Node Filter:\n <$button popup=<<qualify \"$:/temp/tmap/editor/state/nodeFilterActions\">> >{{$:/core/images/menu-button}}</$button>\n <$reveal type=\"popup\" position=\"below\" state=<<qualify \"$:/temp/tmap/editor/state/nodeFilterActions\">> >\n <div class=\"tc-drop-down\">\n <a href=\"http://bit.ly/tiddlymap#Using the node filter\" target=\"_blank\">{{$:/core/images/info-button}} Open online help</a>\n <hr />\n <$button class=\"tc-btn-invisible\" message=\"tm-edit-node-filter\">{{$:/core/images/edit-button}} Edit filter</$button>\n <hr />\n <$checkbox field=\"config.display_neighbours\" checked=\"true\" unchecked=\"false\" default=\"false\">\n Show neighbours\n </$checkbox>\n </div>\n </$reveal>\n\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/misc/focusButton": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/focusButton",
"text": "<div class=\"focus-button\">\n <$reveal type=\"nomatch\" state=<<qualify \"$:/temp/tmap/state/focus\">> text=\"show\">\n <$button class=<<tv-config-toolbar-class>>>{{$:/core/images/advanced-search-button}}\n <$action-setfield $tiddler=<<param.search-output>> text=\"\" />\n <$action-setfield $tiddler=<<qualify \"$:/temp/tmap/state/focus\">> text=\"show\" />\n <$action-sendmessage $message=\"tm-reset-focus\" />\n </$button>\n </$reveal>\n <$reveal type=\"match\" state=<<qualify \"$:/temp/tmap/state/focus\">> text=\"show\">\n <$button class=<<tv-config-toolbar-class>> >{{$:/core/images/advanced-search-button}}\n <$action-setfield $tiddler=<<qualify \"$:/temp/tmap/state/focus\">> text=\"hide\" />\n <$action-sendmessage $message=\"tm-reset-focus\" />\n </$button>\n <div class=\"tmap-popup\">\n <div class=\"tc-drop-down\">\n <$edit-text tiddler=<<param.search-output>> field=\"text\" type=\"text\" tag=\"input\" default=\"\" />\n <small><$count filter=<<param.nodeFilter>> /> results</small>\n <hr />\n <div class=\"tmap-very-small-list\">\n <$list filter=<<param.nodeFilter>> variable=\"item\" emptyMessage=\"//No results//\">\n <$button class=\"tc-btn-invisible\" set=<<qualify \"$:/temp/tmap/state/focus\">> setTo=\"hide\" message=\"tm-focus-node\" param=<<item>>>\n <$view tiddler=<<item>> field=\"title\" />\n </$button>\n </$list>\n </div>\n </div>\n </div>\n </$reveal>\n\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/misc/macros": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/macros",
"text": "\\define input-text(field, default)\n <$edit-text tiddler=<<output>> field=\"$field$\" type=\"text\" tag=\"input\" default=\"$default$\" />\n\\end\n\n\\define input-checkbox(field, default)\n <$checkbox tiddler=<<output>> field=\"$field$\" checked=\"true\" unchecked=\"false\" default=\"$default$\" />\n\\end\n\n\\define input-radio(field, default)\n <$radio tiddler=<<output>> field=\"$field$\" value=\"$value$\" />\n\\end\n\n\\define tmap-row(title, field, type, default, descr, note)\n <tr>\n <td class=\"tmap-title\">$title$:</td>\n <td>\n <<$type$ field:\"$field$\" default:\"$default$\" values:\"$values$\">>\n </td>\n <td>\n <span class=\"tmap-description\">$descr$</span>\n <$reveal type=\"nomatch\" text=\"\" default=\"$note$\">\n <div class=\"tmap-note\">''Note:'' $note$</div>\n </$reveal>\n </td>\n </tr>\n\\end"
},
"$:/plugins/felixhayashi/tiddlymap/misc/defaultViewHolder": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/defaultViewHolder",
"text": "$:/plugins/felixhayashi/tiddlymap/graph/views/default"
},
"$:/plugins/felixhayashi/tiddlymap/config/sys": {
"title": "$:/plugins/felixhayashi/tiddlymap/config/sys",
"type": "application/json",
"text": "{ \n \"field\": {\n \"nodeId\": \"id\",\n \"nodeLabel\": \"caption\",\n \"nodeIcon\": \"icon\",\n \"nodeInfo\": \"description\",\n \"viewMarker\": \"isview\"\n },\n \"debug\": \"false\",\n \"notifications\": \"true\",\n \"editNodeOnCreate\": \"false\",\n \"halfscreen\": \"false\",\n \"singleClickMode\": \"false\"\n}\n"
},
"$:/plugins/felixhayashi/tiddlymap/config/vis": {
"title": "$:/plugins/felixhayashi/tiddlymap/config/vis",
"type": "application/json",
"text": "{\n \"nodes\": {\n \"radiusMin\": 10,\n \"radiusMax\": 30,\n \"radius\": 10,\n \"shape\": \"box\",\n \"widthMin\": 16,\n \"widthMax\": 64,\n \"fontColor\": \"black\",\n \"fontSize\": 14,\n \"fontFace\": \"verdana\",\n \"level\": -1,\n \"color\": {\n \"border\" : \"#2B7CE9\",\n \"background\" : \"#97C2FC\",\n \"highlight\": {\n \"border\": \"#2B7CE9\",\n \"background\": \"#D2E5FF\"\n },\n \"hover\": {\n \"border\": \"white\",\n \"background\": \"white\"\n }\n }\n },\n \"edges\": {\n \"widthMin\": 1,\n \"widthMax\": 15,\n \"width\": 1,\n \"widthSelectionMultiplier\": 4,\n \"hoverWidth\": 1.5,\n \"style\": \"arrow\",\n \"color\": {\n \"color\": \"#848484\",\n \"highlight\": \"#B90000\",\n \"hover\": \"B90000\"\n },\n \"fontColor\": \"gray\",\n \"fontSize\": 14,\n \"fontFace\": \"arial\",\n \"fontFill\": \"transparent\",\n \"arrowScaleFactor\": 1,\n \"dash\": {\n \"length\": 10,\n \"gap\": 5\n },\n \"inheritColor\": false\n },\n \"groups\": {\n \"special\": {\n \"borderWidth\": 1,\n \"color\": {\n \"background\": \"#E6B293\",\n \"border\": \"#FF6700\"\n }\n },\n \"neighbours\": {\n \"color\": \"#DCDCDC\"\n },\n \"matches\": {\n \"color\": \"#97C2FC\"\n }\n },\n \"tooltip\": {\n \"delay\": 300,\n \"fontColor\": \"black\",\n \"fontSize\": 14,\n \"fontFace\": \"verdana\",\n \"color\": {\n \"border\": \"#666\",\n \"background\": \"#FFFFC6\"\n }\n },\n \"clickToUse\": true,\n \"configurePhysics\": false,\n \"physics\": {\n \"barnesHut\": {\n \"enabled\": false\n },\n \"repulsion\": {\n \"enabled\": false,\n \"centralGravity\": 0,\n \"springLength\": 200,\n \"springConstant\": 0.05,\n \"nodeDistance\": 100,\n \"damping\": 0.18\n }\n },\n \"clustering\": {\n \"enabled\": false,\n \"initialMaxNodes\": 100,\n \"clusterThreshold\": 500,\n \"reduceToNodes\": 300,\n \"chainThreshold\": 0.4,\n \"clusterEdgeThreshold\": 20,\n \"sectorThreshold\": 100,\n \"screenSizeThreshold\": 0.2,\n \"fontSizeMultiplier\": 4,\n \"maxFontSize\": 1000,\n \"forceAmplification\": 0.1,\n \"distanceAmplification\": 0.1,\n \"edgeGrowth\": 20,\n \"nodeScaling\": {\n \"width\": 1,\n \"height\": 1,\n \"radius\": 1\n },\n \"maxNodeSizeIncrements\": 600,\n \"activeAreaBoxSize\": 80,\n \"clusterLevelDifference\": 2\n },\n \"navigation\": {\n \"enabled\": true\n },\n \"keyboard\": {\n \"enabled\": false,\n \"speed\": {\n \"x\": 10,\n \"y\": 10,\n \"zoom\": 0.02\n }\n },\n \"hierarchicalLayout\": {\n \"enabled\": false,\n \"levelSeparation\": 250,\n \"nodeSpacing\": 200,\n \"direction\": \"UD\",\n \"layout\": \"direction\"\n },\n \"freezeForStabilization\": false,\n \"smoothCurves\": {\n \"enabled\": true,\n \"dynamic\": true,\n \"type\": \"continuous\",\n \"roundness\": 0.5\n },\n \"maxVelocity\": 30,\n \"minVelocity\": 0.1,\n \"stabilize\": true,\n \"zoomExtentOnStabilize\": true,\n \"stabilizationIterations\": 1500,\n \"dragNetwork\": true,\n \"dragNodes\": true,\n \"zoomable\": true,\n \"hover\": false,\n \"hideEdgesOnDrag\": false,\n \"hideNodesOnDrag\": false,\n \"width\": \"100%\",\n \"height\": \"100%\",\n \"selectable\": true,\n \"locale\": \"en_EN\",\n \"locales\": {\n \"en_EN\": {\n \"edit\": \"Edit\",\n \"del\": \"Delete selected\",\n \"back\": \"Back\",\n \"addNode\": \"Add Node\",\n \"addEdge\": \"Add Edge\",\n \"editNode\": \"Edit Node\",\n \"editEdge\": \"Edit Edge\",\n \"addDescription\": \"Click in an empty space to place a new node.\",\n \"edgeDescription\": \"Click on a node and drag the edge to another node to connect them.\",\n \"editEdgeDescription\": \"Click on the control points and drag them to a node to connect to it.\",\n \"createEdgeError\": \"Cannot link edges to a cluster.\",\n \"deleteClusterError\": \"Clusters cannot be deleted.\"\n }\n }\n}\n"
},
"$:/plugins/felixhayashi/tiddlymap/misc/quickConnectButton": {
"tags": "$:/tags/ViewToolbar",
"title": "$:/plugins/felixhayashi/tiddlymap/misc/quickConnectButton",
"description": "Show available ~TiddlyMap actions",
"text": "<$reveal type=\"nomatch\" state=<<qualify \"$:/temp/tiddlymap/\">> text=\"show\">\n <$button set=<<qualify \"$:/temp/tiddlymap/\">> setTo=\"show\" class=<<tv-config-toolbar-class>> >\n {{$:/plugins/felixhayashi/tiddlymap/icon}}\n </$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<qualify \"$:/temp/tiddlymap/\">> text=\"show\">\n <$button set=<<qualify \"$:/temp/tiddlymap/\">> setTo=\"hide\" class=<<tv-config-toolbar-class>> >\n {{$:/plugins/felixhayashi/tiddlymap/icon}}\n </$button>\n\n<div class=\"tmap-quick-connect tc-reveal tc-popup\">\n <div class=\"tc-drop-down\">\n <div>{{$:/core/images/import-button}} ''Add tiddler to view'': Drop <$link to=<<currentTiddler>>>this link</$link> on a graph editor</div>\n <hr />\n <div>{{$:/core/images/close-others-button}} ''Create connection'' <sup>[1]</sup></div>\n <table>\n <tr>\n <td>Type:</td>\n <td>\n <$edit-text tiddler=\"$:/temp/quickConnectSearch/type\" field=\"text\" type=\"text\" tag=\"input\" default=\"\" />\n <$select tiddler=\"$:/temp/quickConnectSearch/type\" default=\"\">\n <option></option>\n <$list filter=<<map-macro \"option\" \"filter.allSharedEdgesByLabel\">> >\n <option>{{!!title}}</option>\n </$list>\n </$select>\n </td>\n </tr>\n <tr>\n <td>Search:</td>\n <td>\n <$edit-text tiddler=\"$:/temp/quickConnectSearch\" type=\"search\" tag=\"input\" default=\"\"></$edit-text>\n <small><$count filter=\"[!is[system]search{$:/temp/quickConnectSearch}sort[title]limit[50]]\" /> results</small>\n </td>\n </tr>\n <tr>\n <td colspan=\"2\">\n <table class=\"tmap-very-small-list\">\n <$list filter=\"[!is[system]search{$:/temp/quickConnectSearch}sort[title]count[]]\" variable=\"item\" emptyMessage=\"//No results//\">\n <tr>\n <td>\n <$button>From\n <$action-sendmessage $message=\"tm-create-edge\"\n from=<<item>>\n to=<<currentTiddler>>\n label={{$:/temp/quickConnectSearch/type}}\n view={{$:/temp/quickConnectSearch/view}} />\n </$button>\n </td>\n <td>\n <$button>To\n <$action-sendmessage $message=\"tm-create-edge\"\n from=<<currentTiddler>>\n to=<<item>>\n label={{$:/temp/quickConnectSearch/type}}\n view={{$:/temp/quickConnectSearch/view}} />\n </$button>\n </td>\n <td><$view tiddler=<<item>> field=\"title\" /></td>\n </tr>\n </$list>\n </table>\n </td>\n </tr>\n </table>\n <hr />\n <div>''Existing Connections'' <sup>[1]</sup></div>\n <p> \n <$connections>\n <div>\n <$button class=\"tc-btn-invisible\">\n <$action-sendmessage $message=\"tm-remove-edge\" id=<<edge.id>> label=<<edge.label>> />\n {{$:/core/images/close-button}}\n </$button> <<role>> <$link><<neighbour>></$link>\n </div>\n </$connections>\n </p>\n \n <hr />\n \n <small>[1] Note, that nodes will be globally linked or removed. Have a look at the [[docs|http://bit.ly/tiddlymap#Public%20and%20Private%20Edges]] for more information on private and public relations.</small><br />\n \n </div>\n</div>\n\n\n\n\n</$reveal>\n\n\n\n\n"
},
"$:/plugins/felixhayashi/tiddlymap/searchVisualizer": {
"title": "$:/plugins/felixhayashi/tiddlymap/searchVisualizer",
"caption": "Graph",
"tags": "$:/tags/SearchResults",
"text": "<$tiddlymap\n view=\"search\"\n click-to-use=\"false\"\n object-id=\"search_visualizer\"\n width=\"calc(100% - 15px)\"\n bottom-spacing=\"15px\"\n refresh-trigger=\"$:/temp/search\"></$tiddlymap>"
},
"$:/plugins/felixhayashi/tiddlymap/hook/liveView": {
"caption": "Live",
"tags": "$:/tags/SideBar",
"title": "$:/plugins/felixhayashi/tiddlymap/hook/liveView",
"text": "<$reveal type=\"nomatch\" state=\"$:/view\" text=\"top\" default=\"\">\n\n You cannot use the live view because either\n\n * you did not install the ''TW5-TopStoryView'' plugin\n * or haven't switched your scroll view to //top// (Configuration ➡ Appearance ➡ Story view ➡ Current view).\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/view\" text=\"top\" default=\"\">\n <$tiddlymap\n object-id=\"live_view\"\n view=\"live\"\n refresh-trigger=\"$:/temp/focussedTiddler\"\n click-to-use=\"false\"\n width=\"calc(100% - 15px)\"\n bottom-spacing=\"15px\"></$tiddlymap>\n</$reveal>\n \n\n"
},
"$:/plugins/felixhayashi/tiddlymap/hook/editor": {
"caption": "Map",
"tags": "$:/tags/SideBar",
"title": "$:/plugins/felixhayashi/tiddlymap/hook/editor",
"text": "<$tiddlymap\n editor=\"advanced\"\n object-id=\"main_editor\"\n click-to-use=\"false\"\n width=\"calc(100% - 15px)\"\n bottom-spacing=\"15px\"></$tiddlymap>"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/default/filter/nodes": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/default/filter/nodes",
"filter": ""
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/default": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/default",
"isview": "true",
"text": ""
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/live/filter/nodes": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/live/filter/nodes",
"filter": "[!is[system]field:title{$:/temp/focussedTiddler}]"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/live": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/live",
"config.display_neighbours": "true",
"config.physics_mode": "true"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/quick_connect/filter/nodes": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/quick_connect/filter/nodes",
"filter": "[all[current]] [!is[system]search{$:/temp/felixhayashi/tiddlymap/quick_connect_search}limit[10]]"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/quick_connect": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/quick_connect",
"config.display_neighbours": "false",
"config.physics_mode": "false"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/search/filter/nodes": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/search/filter/nodes",
"filter": "[!is[system]search{$:/temp/search}] [!is[system]search:tags{$:/temp/search}] [!is[system]search:text{$:/temp/search}limit[10]]"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/search": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/search",
"config.display_neighbours": "true",
"config.physics_mode": "true"
},
"$:/plugins/felixhayashi/tiddlymap/connections.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/connections.js\ntype: application/javascript\nmodule-type: widget\n\n@preserve\n\n\\*/\n(function(){\"use strict\";var e=require(\"$:/core/modules/widgets/widget.js\").widget;var t=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var r=function(t,r){e.call(this,t,r);this.addEventListener(\"tm-remove-edge\",function(e){$tw.tiddlymap.adapter.deleteEdgeFromStore(e.paramObject)})};r.prototype=Object.create(e.prototype);r.prototype.render=function(e,t){this.parentDomNode=e;this.computeAttributes();this.execute();this.renderChildren(e,t)};r.prototype.execute=function(){var e=\"[field:title[\"+this.getVariable(\"currentTiddler\")+\"]!has[draft.of]]\";var t=this.getAttribute(\"filter\",e);this.nodes=$tw.tiddlymap.adapter.selectNodesByFilter(t,{outputType:\"hashmap\"});this.edges=$tw.tiddlymap.adapter.selectEdgesByEndpoints(this.nodes,{outputType:\"hashmap\",endpointsInSet:\">=1\"});this.neighbours=$tw.tiddlymap.adapter.selectNeighbours(this.nodes,{edges:this.edges,outputType:\"hashmap\"});var r=[];for(var i in this.edges){var s=this.makeItemTemplate(this.edges[i]);if(s){r.push(s)}}this.makeChildWidgets(r)};r.prototype.makeItemTemplate=function(e){var t=\"\";var r=this.nodes[e.to]?\"From\":\"To\";var i=this.neighbours[e[r.toLowerCase()]];if(!i)return;return{type:\"edgelistitem\",edge:e,link:i,linkRole:r,children:this.parseTreeNode.children}};r.prototype.refresh=function(e){for(var r in e){var i=t.startsWith(r,$tw.tiddlymap.opt.path.edges);var s=r===this.getVariable(\"currentTiddler\");if(i||s){this.refreshSelf();return true}}return this.refreshChildren(e)};exports[\"connections\"]=r;var i=function(t,r){e.call(this,t,r)};i.prototype=Object.create(e.prototype);i.prototype.execute=function(){var e=this.parseTreeNode;this.setVariable(\"currentTiddler\",e.link.ref);this.setVariable(\"edge.id\",e.edge.id);this.setVariable(\"edge.label\",e.edge.label);this.setVariable(\"neighbour\",e.link.ref);this.setVariable(\"role\",e.linkRole);this.makeChildWidgets()};i.prototype.refresh=function(e){return this.refreshChildren(e)};exports.edgelistitem=i})();",
"title": "$:/plugins/felixhayashi/tiddlymap/connections.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/felixhayashi/tiddlymap/graph_widget.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/graph_widget.js\ntype: application/javascript\nmodule-type: widget\n\n@preserve\n\n\\*/\n(function(){\"use strict\";var e=require(\"$:/core/modules/widgets/widget.js\").widget;var t=require(\"$:/core/modules/widgets/dropzone.js\").dropzone;var i=require(\"$:/plugins/felixhayashi/tiddlymap/view_abstraction.js\").ViewAbstraction;var r=require(\"$:/plugins/felixhayashi/tiddlymap/callback_manager.js\").CallbackManager;var s=require(\"$:/plugins/felixhayashi/tiddlymap/dialog_manager.js\").DialogManager;var o=require(\"$:/plugins/felixhayashi/tiddlymap/utils.js\").utils;var a=require(\"$:/plugins/felixhayashi/vis/vis.js\");var n=function(t,i){e.call(this);this.initialise(t,i);this.adapter=$tw.tiddlymap.adapter;this.opt=$tw.tiddlymap.opt;this.notify=$tw.tiddlymap.notify;this.callbackManager=new r;this.dialogManager=new s(this.callbackManager,this);this.computeAttributes();this.editorMode=this.getAttribute(\"editor\");if(this.editorMode){this.addEventListeners([{type:\"tm-create-view\",handler:this.handleCreateView},{type:\"tm-rename-view\",handler:this.handleRenameView},{type:\"tm-delete-view\",handler:this.handleDeleteView},{type:\"tm-edit-view\",handler:this.handleEditView},{type:\"tm-configure-system\",handler:this.handleConfigureSystem},{type:\"tm-store-position\",handler:this.handleStorePositions},{type:\"tm-edit-node-filter\",handler:this.handleEditNodeFilter},{type:\"tm-import-tiddlers\",handler:this.handleImportTiddlers},{type:\"tm-generate-widget\",handler:this.handleGenerateWidget}])}this.addEventListeners([{type:\"tm-focus-node\",handler:this.handleFocusNode},{type:\"tm-reset-focus\",handler:this.repaintGraph}]);this.checkForFreshInstall()};n.prototype=Object.create(e.prototype);n.prototype.handleConnectionEvent=function(e,t){var i=this.getView().getAllEdgesFilter(true);var r={edgeFilterExpr:i,fromLabel:this.adapter.selectNodeById(e.from).label,toLabel:this.adapter.selectNodeById(e.to).label};this.dialogManager.open(\"getEdgeType\",r,function(i,r){if(i){var s=o.getText(r);e.label=s&&s!==this.opt.misc.unknownEdgeLabel?s:this.opt.misc.unknownEdgeLabel;this.adapter.insertEdge(e,this.getView())}if(typeof t==\"function\"){t(i)}})};n.prototype.checkForFreshInstall=function(e,t){if(!o.tiddlerExists(this.opt.ref.welcomeFlag)){this.handleConfigureSystem(true);this.wiki.addTiddler(new $tw.Tiddler({title:this.opt.ref.welcomeFlag}))}};n.prototype.openStandardConfirmDialog=function(e,t){var i={message:t,dialog:{confirmButtonLabel:\"Yes, proceed\",cancelButtonLabel:\"Cancel\"}};this.dialogManager.open(\"getConfirmation\",i,e)};n.prototype.logger=function(e,t){var i=Array.prototype.slice.call(arguments,1);i.unshift(\"@\"+this.objectId.toUpperCase());i.unshift(e);$tw.tiddlymap.logger.apply(this,i)};n.prototype.render=function(e,t){this.parentDomNode=e;this.registerClassNames(e);this.sidebar=document.getElementsByClassName(\"tc-sidebar-scrollable\")[0];this.containedInSidebar=this.sidebar&&this.sidebar.contains(this.parentDomNode);this.objectId=this.getAttribute(\"object-id\")?this.getAttribute(\"object-id\"):o.genUUID();this.viewHolderRef=this.getViewHolderRef();this.view=this.getView();this.initAndRenderEditorBar(e);this.initAndRenderGraph(e);$tw.tiddlymap.registry.push(this)};n.prototype.registerClassNames=function(e){if(!$tw.utils.hasClass(e,\"tmap-widget\")){var t=[\"tmap-widget\"];if(this.getAttribute(\"click-to-use\")!==\"false\"){t.push(\"tmap-click-to-use\")}if(this.getAttribute(\"editor\")===\"advanced\"){t.push(\"tmap-advanced-editor\")}if(this.getAttribute(\"show-buttons\")===\"false\"){t.push(\"tmap-no-buttons\")}if(this.getAttribute(\"class\")){t.push(this.getAttribute(\"class\"))}$tw.utils.addClass(e,t.join(\" \"))}};n.prototype.initAndRenderEditorBar=function(e){this.graphBarDomNode=document.createElement(\"div\");$tw.utils.addClass(this.graphBarDomNode,\"tmap-topbar\");e.appendChild(this.graphBarDomNode);this.rebuildEditorBar();this.renderChildren(this.graphBarDomNode)};n.prototype.rebuildEditorBar=function(){var e={viewLabel:this.getView().getLabel(),isViewBound:String(this.isViewBound()),\"ref.view\":this.getView().getRoot(),\"ref.viewHolder\":this.getViewHolderRef(),\"ref.edgeFilter\":this.getView().getPaths().edgeFilter,allEdgesFilter:this.view.getAllEdgesFilter(),\"search-output\":\"$:/temp/tmap/editor/search\",nodeFilter:this.view.getNodeFilter(\"expression\")+\"+[search{$:/temp/tmap/editor/search}]\"};for(var t in e){this.setVariable(\"param.\"+t,e[t])}var i={type:\"tiddler\",attributes:{tiddler:{type:\"string\",value:this.getView().getRoot()}},children:[]};if(this.editorMode===\"advanced\"){i.children.push({type:\"transclude\",attributes:{tiddler:{type:\"string\",value:this.opt.ref.graphBar}}})}else{i.children.push({type:\"element\",tag:\"span\",attributes:{\"class\":{type:\"string\",value:\"tmap-view-label\"}},children:[{type:\"text\",text:e.viewLabel}]})}i.children.push({type:\"transclude\",attributes:{tiddler:{type:\"string\",value:this.opt.ref.focusButton}}});this.makeChildWidgets([i])};n.prototype.refresh=function(e){this.callbackManager.handleChanges(e);var t=this.isViewSwitched(e);var i=this.getView().refresh(e);if(t||i.length){var r={resetData:true,resetOptions:true,resetFocus:true};if(t){this.logger(\"warn\",\"View switched\");this.view=this.getView(true)}else{this.logger(\"warn\",\"View modified\",i);r.resetData=false}this.rebuildGraph(r)}else{this.checkOnGraph(e)}this.checkOnEditorBar(e,t,i)};n.prototype.rebuildGraph=function(e){this.logger(\"debug\",\"Rebuilding graph\");if(!e)e={};this.hasNetworkStabilized=false;if(e.resetData){this.graphData.edges.clear();this.graphData.nodes.clear();this.graphData.edgesById=null;this.graphData.nodesById=null;this.graphData.nodesByRef=null}if(e.resetOptions){this.graphOptions=this.getGraphOptions();this.network.setOptions(this.graphOptions)}this.graphData=this.getGraphData(true);if(e.resetFocus&&!this.preventNextContextReset){if(typeof e.resetFocus!==\"object\"){e.resetFocus={delay:0,duration:0}}this.fitGraph(e.resetFocus.delay,e.resetFocus.duration);this.doZoomAfterStabilize=true;this.preventNextContextReset=false}};n.prototype.getContainer=function(){return this.parentDomNode};n.prototype.getGraphData=function(e){if(!e&&this.graphData){return this.graphData}var t=this.getView().getNodeFilter(\"compiled\");var i=this.adapter.selectNodesByFilter(t,{view:this.getView(),outputType:\"hashmap\",addProperties:{group:\"matches\"}});var r=this.adapter.selectEdgesByEndpoints(i,{view:this.getView(),outputType:\"hashmap\",endpointsInSet:this.getView().isConfEnabled(\"display_neighbours\")?\">=1\":\"=2\"});if(this.getView().isConfEnabled(\"display_neighbours\")){var s=this.adapter.selectNeighbours(i,{edges:r,outputType:\"hashmap\",view:this.getView(),addProperties:{group:\"neighbours\"}});o.inject(s,i)}if(this.getView().getConfig(\"layout.active\")===\"hierarchical\"){this.setHierarchy(i,r,this.getView().getHierarchyEdgeTypes())}if(!this.graphData)this.graphData=o.getEmptyMap();this.graphData.nodes=o.refresh(i,this.graphData.nodesById,this.graphData.nodes);this.graphData.edges=o.refresh(r,this.graphData.edgesById,this.graphData.edges);this.graphData.nodesByRef=o.getLookupTable(i,\"ref\");this.graphData.nodesById=i;this.graphData.edgesById=r;return this.graphData};n.prototype.isViewBound=function(){return o.startsWith(this.getViewHolderRef(),this.opt.path.localHolders)};n.prototype.isViewSwitched=function(e){if(this.isViewBound()){return false}else{return o.hasOwnProp(e,this.getViewHolderRef())}};n.prototype.checkOnEditorBar=function(e,t,i){if(t||i.length){this.removeChildDomNodes();this.rebuildEditorBar();this.renderChildren(this.graphBarDomNode);return true}else{return this.refreshChildren(e)}};n.prototype.checkOnGraph=function(e){var t=this.getView().getNodeFilter(\"compiled\");var i=o.getMatches(t,Object.keys(e));if(i.length){this.logger(\"info\",\"Modified nodes\",i);this.rebuildGraph();return}else{for(var r in e){if(this.graphData.nodesByRef[r]){this.logger(\"info\",\"Obsolete node\",i);this.rebuildGraph();return}}}var s=this.getView().getEdgeFilter(\"compiled\");var a=o.getMatches(s,Object.keys(e));if(a.length){this.logger(\"info\",\"Changed edge stores\",a);this.rebuildGraph();return}};n.prototype.initAndRenderGraph=function(e){this.logger(\"info\",\"Initializing and rendering the graph\");if(this.editorMode){var i=this.makeChildWidget({type:\"dropzone\"});var r=this;i.handleDropEvent=function(e){r.lastImportDropCoordinates={x:e.clientX,y:e.clientY};t.prototype.handleDropEvent.call(this,e)};i.render(e);this.graphDomNode=i.findFirstDomNode()}else{this.graphDomNode=document.createElement(\"div\");e.appendChild(this.graphDomNode)}$tw.utils.addClass(this.graphDomNode,\"tmap-vis-graph\");e.style[\"width\"]=this.getAttribute(\"width\",\"100%\");window.addEventListener(\"resize\",this.handleResizeEvent.bind(this),false);if(!this.containedInSidebar){this.callbackManager.add(\"$:/state/sidebar\",this.handleResizeEvent.bind(this))}window.addEventListener(\"click\",this.handleClickEvent.bind(this),false);window.addEventListener(o.getFullScreenApis()[\"_fullscreenChange\"],this.handleFullScreenChange.bind(this),false);this.handleResizeEvent();this.graphOptions=this.getGraphOptions();this.graphData=this.getGraphData();this.network=new a.Network(this.graphDomNode,this.graphData,this.graphOptions);var s=this.getAttribute(\"refresh-trigger\");if(s){this.logger(\"debug\",\"Registering refresh trigger:\",s);this.callbackManager.add(s,this.handleTriggeredRefresh.bind(this),false)}this.network.on(\"click\",this.handleVisClickEvent.bind(this));this.network.on(\"doubleClick\",this.handleVisDoubleClickEvent.bind(this));this.network.on(\"stabilized\",this.handleVisStabilizedEvent.bind(this));this.network.on(\"dragStart\",this.handleVisDragStart.bind(this));this.network.on(\"dragEnd\",this.handleVisDragEnd.bind(this));this.addGraphButtons({fullscreen:this.handleToggleFullscreen});this.setGraphButtonEnabled(\"fullscreen\",true)};n.prototype.getGraphOptions=function(){if(!this.graphOptions){var e=$tw.utils.extendDeepCopy(this.opt.config.vis);e.onDelete=function(e,t){this.handleRemoveElement(e)}.bind(this);e.onConnect=function(e,t){this.handleConnectionEvent(e)}.bind(this);e.onAdd=function(e,t){this.handleInsertNode(e)}.bind(this);e.onEditEdge=function(e,t){var i=this.handleReconnectEdge(e)}.bind(this);e.dataManipulation={enabled:this.editorMode?true:false,initiallyVisible:true};e.navigation=true;e.clickToUse=this.getAttribute(\"click-to-use\")!==\"false\"}else{var e=this.graphOptions}if(this.getView().getConfig(\"layout.active\")===\"hierarchical\"){e.hierarchicalLayout.enabled=true;e.hierarchicalLayout.layout=\"direction\"}else{e.hierarchicalLayout.enabled=false}return e};n.prototype.handleCreateView=function(){this.dialogManager.open(\"createView\",null,function(e,t){if(e){var i=o.getText(t);if(!o.inArray(i,this.opt.misc.lockedViews)){var r=this.adapter.createView(i);this.setView(r.getRoot())}else{this.notify(\"Forbidden!\")}}})};n.prototype.handleRenameView=function(){if(!o.inArray(this.getView().getLabel(),this.opt.misc.lockedViews)){var e=this.getView().getReferences();var t={count:e.length.toString(),filter:o.joinAndWrap(e,\"[[\",\"]]\")};this.dialogManager.open(\"getViewName\",t,function(e,t){if(e){var i=o.getText(t);if(!o.inArray(i,this.opt.misc.lockedViews)){this.view.rename(i);this.setView(this.view.getRoot())}else{this.notify(\"Forbidden!\")}}})}else{this.notify(\"Forbidden!\")}};n.prototype.handleEditView=function(){var e={\"var.edgeFilter\":this.getView().getEdgeFilter(\"expression\"),dialog:{preselects:this.getView().getConfig()}};this.dialogManager.open(\"editView\",e,function(e,t){if(e&&t){var i=o.getPropertiesByPrefix(t.fields,\"config.\");this.getView().setConfig(i)}})};n.prototype.handleDeleteView=function(){var e=this.getView().getLabel();if(o.inArray(e,this.opt.misc.lockedViews)){this.notify(\"Forbidden!\");return}var t=this.getView().getReferences();if(t.length){var i={count:t.length.toString(),filter:o.joinAndWrap(t,\"[[\",\"]]\")};this.dialogManager.open(\"cannotDeleteViewDialog\",i,null);return}var r=\"You are about to delete the view \"+\"''\"+e+\"'' (no tiddler currently references this view).\";this.openStandardConfirmDialog(function(t){if(t){this.getView().destroy();this.setView(this.opt.path.views+\"/default\");this.notify('view \"'+e+'\" deleted ')}},r)};n.prototype.handleTriggeredRefresh=function(e){this.logger(\"log\",\"Tiddler\",e,\"triggered a refresh\");this.rebuildGraph({resetData:false,resetOptions:false,resetFocus:{delay:1e3,duration:1e3}})};n.prototype.handleConfigureSystem=function(e){var t={dialog:{preselects:o.flatten({config:{sys:this.opt.config.sys}})}};var i=e===true?\"welcome\":\"configureTiddlyMap\";console.log(e,i);this.dialogManager.open(i,t,function(e,t){if(e&&t){var i=o.getPropertiesByPrefix(t.fields,\"config.sys.\",true);this.wiki.setTiddlerData(this.opt.ref.sysConf+\"/user\",i)}})};n.prototype.handleReconnectEdge=function(e){var t=this.graphData.edges.get(e.id);$tw.utils.extend(t,e);this.adapter.deleteEdgesFromStore([{id:t.id,label:t.label}],this.getView());return this.adapter.insertEdge(t,this.getView())};n.prototype.handleRemoveElement=function(e){if(e.edges.length&&!e.nodes.length){this.adapter.deleteEdgesFromStore(this.graphData.edges.get(e.edges),this.getView());this.notify(\"edge\"+(e.edges.length>1?\"s\":\"\")+\" removed\")}if(e.nodes.length){this.handleRemoveNode(this.graphData.nodesById[e.nodes[0]])}};n.prototype.handleRemoveNode=function(e){var t={\"var.nodeLabel\":e.label,\"var.nodeRef\":e.ref,dialog:{preselects:{\"opt.delete\":\"from system\"}}};this.dialogManager.open(\"deleteNodeDialog\",t,function(t,i){if(t){if(i.fields[\"opt.delete\"]===\"from system\"){this.adapter.deleteNodesFromStore([e])}else{var r=this.getView().removeNodeFromFilter(e);if(!r){this.notify(\"Couldn't remove node from filter\");return}}this.notify(\"Node removed \"+i.fields[\"opt.delete\"])}})};n.prototype.handleFullScreenChange=function(){var e=o.getFullScreenApis();if(this.enlargedMode===\"fullscreen\"&&!document[e[\"_fullscreenElement\"]]){this.handleToggleFullscreen()}};n.prototype.handleToggleFullscreen=function(){var e=o.getFullScreenApis();this.logger(\"log\",\"Toggled graph enlargement\");if(this.enlargedMode){o.findAndRemoveClassNames([\"tmap-\"+this.enlargedMode,\"tmap-has-\"+this.enlargedMode+\"-child\"]);if(this.enlargedMode===\"fullscreen\"){document[e[\"_exitFullscreen\"]]()}this.enlargedMode=null}else{this.enlargedMode=this.containedInSidebar&&this.opt.config.sys.halfscreen===\"true\"?\"halfscreen\":\"fullscreen\";$tw.utils.addClass(this.parentDomNode,\"tmap-\"+this.enlargedMode);if(this.containedInSidebar){$tw.utils.addClass(this.sidebar,\"tmap-has-\"+this.enlargedMode+\"-child\")}if(this.enlargedMode===\"fullscreen\"){document.documentElement[e[\"_requestFullscreen\"]](Element.ALLOW_KEYBOARD_INPUT)}}this.handleResizeEvent()};n.prototype.handleGenerateWidget=function(e){var t={\"param.view\":this.getView().getLabel()};this.dialogManager.open(\"getWidgetCode\",t)};n.prototype.handleShowContentPreview=function(e){var t={\"param.ref\":e};this.dialogManager.open(\"previewContent\",t)};n.prototype.handleImportTiddlers=function(e){var t=JSON.parse(e.param);var i=this.graphDomNode.getBoundingClientRect();var r=this.network.DOMtoCanvas({x:this.lastImportDropCoordinates.x-i.left,y:this.lastImportDropCoordinates.y-i.top});for(var s=0;s<t.length;s++){var a=this.wiki.getTiddler(t[s].title);if(!a){this.notify(\"Cannot integrate foreign tiddler\");return}if(o.isMatch(a,this.getView().getNodeFilter(\"compiled\"))){this.notify(\"Node already exists\");continue}var n=this.adapter.createNode(a,{x:s*20+r.x,y:r.y},this.getView());if(n){this.getView().addNodeToView(n);this.rebuildGraph()}}};n.prototype.handleStorePositions=function(e){this.adapter.storePositions(this.network.getPositions(),this.getView());if(e){this.notify(\"positions stored\")}};n.prototype.handleEditNodeFilter=function(){var e={prettyFilter:this.getView().getPrettyNodeFilterExpr()};this.dialogManager.open(\"editNodeFilter\",e,function(t,i){if(t){this.getView().setNodeFilter(o.getText(i,e.prettyFilter))}})};n.prototype.handleVisStabilizedEvent=function(e){if(!this.hasNetworkStabilized){this.hasNetworkStabilized=true;this.logger(\"log\",\"Network stabilized after \"+e.iterations+\" iterations\");this.setNodesMoveable(this.graphData.nodesById,this.getView().isConfEnabled(\"physics_mode\"));if(this.doZoomAfterStabilize){this.doZoomAfterStabilize=false;this.fitGraph(1e3,1e3)}}};n.prototype.handleFocusNode=function(e){this.network.focusOnNode(this.graphData.nodesByRef[e.param].id,{scale:1,animation:true})};n.prototype.fitGraph=function(e,t){window.clearTimeout(this.activeZoomExtentTimeout);var i=function(){this.network.zoomExtent({duration:t});this.activeZoomExtentTimeout=0}.bind(this);if(e){this.activeZoomExtentTimeout=window.setTimeout(i,e)}else{i()}};n.prototype.handleStartStabilizionEvent=function(e){};n.prototype.handleInsertNode=function(e){this.dialogManager.open(\"getNodeName\",null,function(t,i){if(t){e.label=o.getText(i);this.adapter.insertNode(e,{view:this.getView(),editNodeOnCreate:false});this.preventNextContextReset=true}})};n.prototype.handleVisClickEvent=function(e){if(this.opt.config.sys.singleClickMode===\"true\"){if(e.nodes.length){this.openTiddler(e.nodes[0])}}};n.prototype.handleVisDoubleClickEvent=function(e){if(!e.nodes.length&&!e.edges.length){if(this.editorMode){this.handleInsertNode(e.pointer.canvas)}}else{if(e.nodes.length){this.openTiddler(e.nodes[0])}else if(e.edges.length){this.logger(\"debug\",\"Doubleclicked on an Edge\")}}};n.prototype.handleResizeEvent=function(e){if(this.containedInSidebar){var t=window.innerHeight;var i=this.parentDomNode.getBoundingClientRect().top;var r=this.getAttribute(\"bottom-spacing\",\"10px\");var s=t-i+\"px\";this.parentDomNode.style[\"height\"]=\"calc(\"+s+\" - \"+r+\")\"}else{var o=this.getAttribute(\"height\");this.parentDomNode.style[\"height\"]=o?o:\"300px\"}if(this.network){this.repaintGraph()}};n.prototype.handleClickEvent=function(e){if(!document.body.contains(this.parentDomNode)){window.removeEventListener(\"click\",this.handleClickEvent);return}if(this.network){var t=document.elementFromPoint(e.clientX,e.clientY);if(!this.parentDomNode.contains(t)){this.network.selectNodes([])}}};n.prototype.handleVisDragEnd=function(e){if(e.nodeIds.length&&this.getView().getConfig(\"layout.active\")!==\"hierarchical\"){var t=this.getView().isConfEnabled(\"physics_mode\");var i=this.graphData.nodesById[e.nodeIds[0]];this.setNodesMoveable([i],t);if(!t){this.handleStorePositions()}}};n.prototype.handleVisDragStart=function(e){if(e.nodeIds.length){var t=this.graphData.nodesById[e.nodeIds[0]];this.setNodesMoveable([t],true)}};n.prototype.destruct=function(){window.removeEventListener(\"resize\",this.handleResizeEvent);this.network.destroy()};n.prototype.openTiddler=function(e){var t=this.graphData.nodesById[e];var i=t.ref;this.logger(\"debug\",\"Opening tiddler\",i,\"with id\",e);if(this.enlargedMode===\"fullscreen\"){this.handleShowContentPreview(i)}else{this.dispatchEvent({type:\"tm-navigate\",navigateTo:i})}};n.prototype.getViewHolderRef=function(){if(this.viewHolderRef){return this.viewHolderRef}this.logger(\"info\",\"Retrieving or generating the view holder reference\");var e=this.getAttribute(\"view\");if(e){this.logger(\"log\",'User wants to bind view \"'+e+'\" to graph');var t=this.opt.path.views+\"/\"+e;if(this.wiki.getTiddler(t)){var i=this.opt.path.localHolders+\"/\"+o.genUUID();this.logger(\"log\",'Created an independent temporary view holder \"'+i+'\"');this.wiki.addTiddler(new $tw.Tiddler({title:i,text:t}));this.logger(\"log\",'View \"'+t+'\" inserted into independend holder')}else{this.logger(\"log\",'View \"'+e+'\" does not exist')}}if(typeof i===\"undefined\"){this.logger(\"log\",\"Using default (global) view holder\");var i=this.opt.ref.defaultGraphViewHolder}return i};n.prototype.setView=function(e,t){if(e){if(!t){t=this.viewHolderRef}this.logger(\"info\",'Inserting view \"'+e+'\" into holder \"'+t+'\"');this.wiki.addTiddler(new $tw.Tiddler({title:t,text:e}))}this.view=this.getView(true)};n.prototype.getView=function(e){if(!e&&this.view){return this.view}var t=this.getViewHolderRef();var r=this.wiki.getTiddler(t).fields.text;this.logger(\"info\",'Retrieved view \"'+r+'\" from holder \"'+t+'\"');if(o.tiddlerExists(r)){return new i(r)}else{this.logger(\"log\",'Warning: View \"'+r+\"\\\" doesn't exist. Default is used instead.\");return new i(\"default\")}};n.prototype.repaintGraph=function(){if(!document[o.getFullScreenApis()[\"_fullscreenElement\"]]||this.enlargedMode){this.logger(\"info\",\"Repainting the whole graph\");this.network.redraw();this.fitGraph(0,1e3)}};n.prototype.setGraphButtonEnabled=function(e,t){var i=\"network-navigation tmap-vis-button\"+\" \"+\"tmap-\"+e;var r=this.parentDomNode.getElementsByClassName(i)[0];$tw.utils.toggleClass(r,\"tmap-button-enabled\",t)};n.prototype.setNodesMoveable=function(e,t){this.network.storePositions();var i=[];var r=Object.keys(e);for(var s=0;s<r.length;s++){var o={id:e[r[s]].id,allowedToMoveX:t,allowedToMoveY:t};i.push(o)}this.graphData.nodes.update(i)};n.prototype.setHierarchy=function(e,t,i){function r(s,o){if(s.level)return;s.level=o;for(var a in t){var n=t[a];if(n.from===s.id){var d=e[n.to];if(i[n.label]){r(d,o+1)}else{r(d,o)}}else if(n.to===s.id){var h=e[n.from];if(i[n.label]){r(h,o-1)}else{r(h,o)}}}}e:for(var s in e){for(var o in t){if(e[s].level||e[s].id===t[o].to){continue e}}r(e[s],1e3)}};n.prototype.addGraphButtons=function(e){var t=this.parentDomNode.getElementsByClassName(\"vis network-frame\")[0];for(var i in e){var r=document.createElement(\"div\");r.className=\"network-navigation tmap-vis-button \"+\" \"+\"tmap-\"+i;r.addEventListener(\"click\",e[i].bind(this),false);t.appendChild(r)}};exports.tiddlymap=n})();",
"title": "$:/plugins/felixhayashi/tiddlymap/graph_widget.js",
"type": "application/javascript",
"module-type": "widget"
}
}
}
{
"field.nodeId": "title",
"field.nodeLabel": "caption",
"field.nodeIcon": "icon",
"field.nodeInfo": "description",
"field.viewMarker": "isview",
"debug": "false",
"notifications": "true",
"editNodeOnCreate": "false",
"halfscreen": "false",
"singleClickMode": "false"
}
$:/plugins/felixhayashi/tiddlymap/graph/views/default
{
"tiddlers": {
"$:/plugins/felixhayashi/topstoryview/config.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/topstoryview/config.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n(function(){\"use strict\";exports.config={classNames:{storyRiver:\"tc-story-river\",backDrop:\"story-backdrop\",tiddlerFrame:\"tc-tiddler-frame\",tiddlerTitle:\"tc-title\"},references:{focusOffsetStore:\"$:/config/storyRiver/top/focusOffset\",scrollOffsetStore:\"$:/config/storyRiver/top/scrollOffset\",focussedTiddlerStore:\"$:/temp/focussedTiddler\",refreshTrigger:\"$:/temp/focussedTiddler/refresh\"},checkbackTime:$tw.utils.getAnimationDuration(),fn:{extractTitleFromFrame:function(e,t,r){if(!(e instanceof Element))return;if(!$tw.utils.hasClass(e,t))return;var s=e.getElementsByClassName(r)[0];if(s){var i=s.innerText||s.textContent;return i.trim()}}}}})();",
"title": "$:/plugins/felixhayashi/topstoryview/config.js",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/topstoryview/layout": {
"title": "$:/plugins/felixhayashi/topstoryview/layout",
"type": "text/vnd.tiddlywiki",
"tags": [
"$:/tags/Stylesheet"
],
"text": "html .tc-story-river:after {\n content: \"\";\n display: block; }\n"
},
"$:/plugins/felixhayashi/topstoryview/focus_notifier.js": {
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/topstoryview/focus_notifier.js\ntype: application/javascript\nmodule-type: startup\n\n@preserve\n\n\\*/\n(function(){\"use strict\";exports.name=\"focus_notifier\";exports.platforms=[\"browser\"];exports.after=[\"story\"];exports.synchronous=true;exports.startup=function(){var e=require(\"$:/plugins/felixhayashi/topstoryview/config.js\").config;var t=function(){var t=r.getElementsByClassName(e.classNames.tiddlerFrame);if(t.length){var s=t[0].getBoundingClientRect().left;var l=document.elementFromPoint(s+1,i);var d=e.fn.extractTitleFromFrame(l,e.classNames.tiddlerFrame,e.classNames.tiddlerTitle);if(d!==a&&$tw.wiki.getTiddler(d)){a=d;$tw.wiki.addTiddler(new $tw.Tiddler({title:e.references.focussedTiddlerStore,text:a}))}}else{if(a){a=\"\";$tw.wiki.addTiddler(new $tw.Tiddler({title:e.references.focussedTiddlerStore,text:a}))}}n=false};var r=document.getElementsByClassName(e.classNames.storyRiver)[0];var s=$tw.wiki.getTiddler(e.references.focusOffsetStore);var i=s?parseInt(s.fields.text):150;var a=null;var n=false;$tw.wiki.addEventListener(\"change\",function(r){if(r[e.references.refreshTrigger]){t()}});window.addEventListener(\"scroll\",function(r){if(!n){n=true;window.setTimeout(t,e.checkbackTime)}},false);t()}})();",
"title": "$:/plugins/felixhayashi/topstoryview/focus_notifier.js",
"type": "application/javascript",
"module-type": "startup"
},
"$:/temp/focussedTiddler": {
"title": "$:/temp/focussedTiddler"
},
"$:/plugins/felixhayashi/topstoryview/top.js": {
"text": "/*\\\ntitle: $:/plugins/felixhayashi/topstoryview/top.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n@preserve\n\n\\*/\n(function(){\"use strict\";var t=require(\"$:/plugins/felixhayashi/topstoryview/config.js\").config;var e=\"cubic-bezier(0.645, 0.045, 0.355, 1)\";var i=function(e){this.listWidget=e;this.pageScroller=new $tw.utils.PageScroller;this.pageScroller.scrollIntoView=this.scrollIntoView;this.pageScroller.storyRiverElement=document.getElementsByClassName(t.classNames.storyRiver)[0];this.pageScroller.backDropElement=document.getElementsByClassName(t.classNames.backDrop)[0];var i=$tw.wiki.getTiddler(t.references.scrollOffsetStore);this.pageScroller.offsetTop=i?parseInt(i.fields.text):71;this.lastFrame=null;this.handleChange()};i.prototype.navigateTo=function(t){var e=this.listWidget.findListItem(0,t.title);if(e===undefined){return}var i=this.listWidget.children[e],r=i.findFirstDomNode();if(r instanceof Element){this.pageScroller.scrollIntoView(r)}};i.prototype.scrollIntoView=function(t){var e=$tw.utils.getAnimationDuration();this.cancelScroll();this.startTime=Date.now();var i=$tw.utils.getScrollPosition();var r=t.getBoundingClientRect(),o={left:r.left+i.x,top:r.top+i.y,width:r.width,height:r.height};var n=function(t,e,i,r){if(t<=i){return t}else if(e<r&&i<t+e-r){return t+e-r}else if(i<t){return t}else{return i}},s=n(o.left,o.width,i.x,window.innerWidth),a=o.top-this.offsetTop;if(s!==i.x||a!==i.y){var l=this,m;m=function(){var t;if(e<=0){t=1}else{t=(Date.now()-l.startTime)/e}if(t>=1){l.cancelScroll();t=1}t=$tw.utils.slowInSlowOut(t);window.scrollTo(i.x+(s-i.x)*t,i.y+(a-i.y)*t);if(t<1){l.idRequestFrame=l.requestAnimationFrame.call(window,m)}};m()}};i.prototype.handleChange=function(e,i){var r=this.pageScroller.storyRiverElement;var o=r.getElementsByClassName(t.classNames.tiddlerFrame);var n=o[o.length-1];if(n&&this.lastFrame!==n){var s=n.getBoundingClientRect();var a=window.innerHeight;if(s.height<a){r.style[\"paddingBottom\"]=a-s.height+\"px\"}else{r.style[\"paddingBottom\"]=\"\"}}this.lastFrame=n;$tw.wiki.addTiddler(new $tw.Tiddler({title:t.references.refreshTrigger}))};i.prototype.insert=function(e){var i=e.findFirstDomNode();if(!(i instanceof Element)){return}var r=t.fn.extractTitleFromFrame(i,t.classNames.tiddlerFrame,t.classNames.tiddlerTitle);var o=$tw.wiki.getTiddler(r);if(o&&!o.isDraft()){var n=this.pageScroller.storyRiverElement;n.insertBefore(i,n.firstElementChild.nextSibling)}this.startInsertAnimation(i,function(){this.handleChange(\"insert\",i)}.bind(this))};i.prototype.remove=function(t){var e=t.findFirstDomNode();if(!(e instanceof Element)){t.removeChildDomNodes();return}this.startRemoveAnimation(t,e,function(){var i=this.lastFrame===e;t.removeChildDomNodes();this.handleChange(\"remove\",e);if(i&&this.lastFrame){this.pageScroller.scrollIntoView(this.lastFrame)}}.bind(this))};i.prototype.startInsertAnimation=function(t,i){var r=$tw.utils.getAnimationDuration();var o=window.getComputedStyle(t),n=parseInt(o.marginBottom,10),s=parseInt(o.marginTop,10),a=t.offsetHeight+s;setTimeout(function(){$tw.utils.setStyle(t,[{transition:\"none\"},{marginBottom:\"\"}]);i()},r);$tw.utils.setStyle(t,[{transition:\"none\"},{marginBottom:-a+\"px\"},{opacity:\"0.0\"}]);$tw.utils.forceLayout(t);$tw.utils.setStyle(t,[{transition:\"opacity \"+r+\"ms \"+e+\", \"+\"margin-bottom \"+r+\"ms \"+e},{marginBottom:n+\"px\"},{opacity:\"1.0\"}])};i.prototype.startRemoveAnimation=function(t,i,r){var o=$tw.utils.getAnimationDuration();var n=i.offsetWidth,s=window.getComputedStyle(i),a=parseInt(s.marginBottom,10),l=parseInt(s.marginTop,10),m=i.offsetHeight+l;setTimeout(r,o);$tw.utils.setStyle(i,[{transition:\"none\"},{transform:\"translateX(0px)\"},{marginBottom:a+\"px\"},{opacity:\"1.0\"}]);$tw.utils.forceLayout(i);$tw.utils.setStyle(i,[{transition:$tw.utils.roundTripPropertyName(\"transform\")+\" \"+o+\"ms \"+e+\", \"+\"opacity \"+o+\"ms \"+e+\", \"+\"margin-bottom \"+o+\"ms \"+e},{transform:\"translateX(-\"+n+\"px)\"},{marginBottom:-m+\"px\"},{opacity:\"0.0\"}])};exports.top=i})();",
"title": "$:/plugins/felixhayashi/topstoryview/top.js",
"type": "application/javascript",
"module-type": "storyview"
}
}
}
{
"tiddlers": {
"$:/plugins/felixhayashi/vis/img/network/acceptDeleteIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/acceptDeleteIcon.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNVQxNjo0NTowOCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDVUMTY6NDU6MDgrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjBmYzFjNjhhLTcwZTYtMGY0Ni05ZDk4LWFhNDVjNjYxYThjODwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpiYzZmYmUxNi1mOTBkLWI1NDQtODUzOC05MjFkNjBiZjU0ZWI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDVUMTY6NDU6MDgrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjBmYzFjNjhhLTcwZTYtMGY0Ni05ZDk4LWFhNDVjNjYxYThjODwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNVQxNjo0NTowOCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmJjNmZiZTE2LWY5MGQtYjU0NC04NTM4LTkyMWQ2MGJmNTRlYjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz450LuoAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAATUSURBVHjajJZtTJVlGMd/13U/z+F4sBQOCiovZiMt8YiKZrMtypdh09StbLOtzA1RUmuTkppzIilJOB0Oa21tbaV+6UP5Mlnm5heVkfhyQJ1ONITAkAMqcTDonNOHA6g9qF3b/eF5/vf18r/u676uWwoLC3G73QCoKiICgIhQeGejVw3LMOTIP0xGdRQAFi1E9DyGSkLsKxtWEmAQuXfvHrJlyxZiYmIQkQHjeac/jjfKBsJ8YlnRzQKIgBoIh8ByaRSICAilRCjdk1UeAIhEIogIPT09SFFRER6PZ4DByqr1+WpRoYAquKYuqCPz9SZeeCVA4vggAC2XPVw54eXi0WTOH8yIslIIs+bryTsq+hl0d3cjxcXFuN1uVJVVp9dvEigSwP3iYj9vfV7L6IldPE5uXvZwcKuPsz/7+qLc/I1vexFAMBjEzJ49G9u2WV1TsEaVUhOBmJxVVeR9X8NTI3t5kgxN6GXakia67/bSeC4ZkexprccCZxLnVodCIRRgdU1BgsBuBVzz8qt49yv/oMb2f5TJd7kzBsXeLPHzal4VaiAmZnfupY0JIoKqKqoUGAHX9MV+llf4HxmtMaDyaDZLtvqZushPWEHsAlVFP/3rswSNsEEt4O0v/E9MCebx8PxCP5YNlr3hg7+/TFBEl6mClflGHUl9VdIvGycuJdDgvm/bAtu6j3c0uSmZufQhnRHPBsnIqcOyQGSZAjlEgCkLGh3RDHk6yJWTCQCUZi+gav8Mzh3KpGzeQgCuV3sZEhd06D2f3QgCas9XIuozCjw3q92xMXF8O8218QDM/fAMGLAsmLO2Jnof6rwkpjv10rLaURtEJimWJomtMDLdGUlyRhuBei8AU5Y0M2ZCMyPSW8hc2AxAW4OXUeOdbcKbFsQ2YKwkizCg1uAH9kxWOzU/+ga+X8s/Q/iBKur4w8tL79c69ESiTFXFQvQmyhhu1XsYNeHhW5s2o4OuwDB6ug2uISF8fZED9HQbgh1PM3Zah8PB7UYPGBBalDB+MFB/Kt6x0e0JMSzpDr9XxzmwprNxDB95F9eQkANrrI3HssFQq4hWAnDxaMqgaUoYF6DJ73X8b74Qz/C0Qds016tSUANqVypG92EMnD+SwZ9XPc5KSg/QWu900HotgRHjnA5uN3m4diojmiKzV3cNL25DdTvGwJESn0NhzMR2Ohqc6etoiidpgrNET3zrix6yKf3Bld8WLZ8IZcAG6ip9/LQpyOIt91vG2BltHCwezbbpKzEKYoFodKVO+fUh48f3+Lh20oexIBQqExFk586dxMbGkntp41rELscozFpRxaLN/6Mv/cf4hcMzCYdAzboDKXm7Ozs7MTk5ObhcLs4lzqmeeus4GCublgvJtF61Sc1qxR0beqzh7g4Xx3ZN5/KxaagCsvlASl4pQG9vb5TB0KFDibZtZfmlonxcVgVhAcuGjJxa0l9uImVKO3GpXahA4EYsjbXx3PgtmYbTk1CiKYM1h1LzKvrncmdnJ1JeXo7b7cYYQ9+A4L2r21IJR9ZhXOuxXGAZBvKv/Uui8wELVHYgUn44bdWNfmKRSIRgMIiUlJQQGxs78Krof7oYY8jt2TUCy3oH0XmI+MAejW0gYpoxxg/mF4zu3a8rbvXrPuigq6uLfwcA6IKAIsDf9kIAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/addNodeIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/addNodeIcon.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0YjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2OWVmYWE1NS01ZTI5LTIzNGUtYTUzMy0xNDkxYjM1NDNmYmE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0Yjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjY5ZWZhYTU1LTVlMjktMjM0ZS1hNTMzLTE0OTFiMzU0M2ZiYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz5WKqp9AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYXSURBVHjafFZtUFTXGX7e9z27sveuMCwYV8ElrA7YSFYHtJUPkaaI0aRqG8wP00zUzljDINNSA/2ROtpO24SxnahlxjYd7SSjmUkymcxYlDhQPzHGisEVp8HwYWCVVVgEsrsuLnL74+5uqTF9Z+7cO/d8PO95zvO851BlZSV0XQcAMDOYGQBARDhX3JRmMDYZwLPMWAzGHACYIgwS46oBNBNwtOL8CwE8EkSEUCgE2rJlC2w2G4go8Zwo/bMDgnoG6gxLfAAAYvPDMCCszKTAMIAGAhrWnf15AAAMwwARIRKJgDZv3gy73Q4iAjPjxIr9VVOMRhbAYKB8zvrO0llrfEsdKwLZek6YAPSFvtSu3GtLawu0ZJ6625SHGBQB1T88t6MxvopgMAjaunUrdF0HM+P4yv27DMYeJmB1RqW3Jnf3tQX2p0L4P9EXuqEd7PmDp+XuMU9sRbvXnnt1TxxACgoKYLVacbzsQDUJGkSATe6qi28uPtzusM6Kxie6NHLGUX3lxVUNX9StPHnn4wy3njuUYcu6n2pNi66avcEXnByP/nv8aiaIyrqz2gO5A9+9FI1GIfn5+WhZdTAdjFMkwMvZOy7uWnTAOz3L4Yk71m3t69fdfTDoUGTBeHTUfiHQ6lo7Z2OXJvpDAChKe+aOCdKRKWxZ2+1qb3yyd3GYmRkQ7GQBVs99wfv6on3eR2k4PdTkDEbH7IuS8/svld/561PJS/pDk1/bzwx94pze7xc5v/H+YPY6r5BAkdrJzODTK46lE6PeYEJt7u+8j+OZwCBiEAgAoNgKJoEQf6PvNvdrXgtZoNhSf7q0KZ3B2AQmVMze0Jmt54S/DcDCVig2NcvEUGxJAE4Pl+YOr0iv6BRSIPAmBeBZAmHlE2sH4p1uhrq1s0MnnEQMBsf8wRASAICQQCCITN1X7/sOuc0kgOVp3/fPs2WHv+coG7gQOJUnLGsUCTxEjPzUohEA+NfIWUdtx0+efzA1kSSkIGyBAQNCKgHAEBAJ3u79U7kiAcWoem/gb5Fd33nrH3kp+SMWtuAB+GllMJxMjCx9QRgA3uiqL5kwHiTlpxb3smlfMDGYGPP1hcMAkJvs8ScpfdJspdj+MK6Pf+5+u29vyb4lR4+BGEziVESAkEpw6Av1OhUpHCz4qOXbzFWz4Ncdj/v/o08Lt92ODDgZDCEFJYoUGH4mzugP92puPTf0pD3H7wvfdFZdqSxnMtWjoGAAmG9fOLxjwesdjT2/XzIQ7ks3sycYMSEwGHNtWf5bkX5NkYCJBxUBXiGV0XHvosOt54Zey33j/K+8P33++vjnbiGJbbLE+J9SANAb6nJ2B79wcUwETAwQQ7fMjPzMvfP8ja87HUIKMOiaAqMZhrGmLdAy78eZrwwsTS0eObTs+IdtgVanxBUExqGbb5VzrIISGIoUXsmqbgEhJldCQWqRf27SvPAn/o8XmgLhZsUkR4ll37mhk3n94Z4OlzY/7NLcYZfm7o1z2zT4vsvUNSXqprBCkmiTFbPX90/fh8GIT2sf+zTPdDMf4dVnNg4z+E0ixsGeBs9jd5ViSgLHjCb/peaR+MD3d4/ZJg2llyuG2Vwy7QWAs8PNnn1f7vkGSGxAzE6mk+kxkx/p/4unffSCR0hAoL1EBCYiPNdWNcwkNQTCR7feWX6g+7f/A7I8rcw/U6UEe0Ndrhc/W7mtL9ztmqlSgstSS/zTJ28dalpOpkRryrwbhwBACgsLMWPGDOT4ll3qyeqAkJTdCF7P/CrUY/GkLL1rE+2hTbSH8+0Lb/WEuhzhyaA905blf9Vd/895WnZwLHrPevir/cvOB1oLYpTtLrm6oYGIMDExAaqtrUVKSgqYGSKCk0WHq5ikkWEWtNL0imv5qUW+RclLRjJsrhBAuH1/QL8R7HR4xy5nescuP23E6hOA6mLv+sb4uTw6Ogqqq6uDpmkQkcStorX4XRcM1FjZ+kvFFjCJKU1WpkNJJUqIMtX1RyLeX3JtQ0JRhmGYZ/L27duRnJycuFGISOJ9pqh5lrB6iYgqGOxRrOaa54DcZmKvkJxk8JHC9rKh+KVhOsD4+Dj+MwADIf8n5m4xGwAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/backIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/backIcon.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpmOWQ3OGY4ZC1lNzY0LTc1NDgtODZiNy1iNmQ1OGMzZDg2OTc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmY5ZDc4ZjhkLWU3NjQtNzU0OC04NmI3LWI2ZDU4YzNkODY5Nzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4jq1U/AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAVTSURBVHjanFVfTFNnFP+d77ve8qeVFbBrpcVgRrCRFikFByLxwSAaE32oRCHD6JMxxhhn8G2RxxH3MsOTbyYsmCAxPMmMMYtkIUYmK60OO0qAK23BFlNob0uh3x7WS5jLZPpLbm6+k/P9zrm5v9855PF4UFhYCABgjIExBgAgIqRSqRIi6gDQRkQ1RGTB3wgR0e8AHgH4Sa/XR/EBiAiJRAJ04cIF5Ofng4g2n0gkUkxENwF0c843LzHGQEQQQkCLExEA9ALotVgsUQAQQmgNQhJCbF5kjCEUCl0moj4t5na7fTU1NUpVVVXUYrEkASAcDhe8efOmxOfzWScmJqoBdBNR99LS0hWz2dynNSSEAF28eBGFhYVgjCEcDn9HRD1EhIMHD3o9Hs9kWVlZAh9BKBQqGB4edr58+dKZ+6JbJpOpBwBWV1fB6+rqIMsyIpHIFcZYL2MMra2tY5cuXRrfuXNnBtvAYDBk3G63oqpqZm5uzgrgSDKZjBoMhueZTAbc5XIhFouVEtFTxhiOHTs2dv78eS8+Efv374+oqpqZnZ21cs5PJJPJPlmWkyynnBuMMTQ0NHi7uro+mVyDx+Pxulwu71ZOlkqlSonoJhGhvb39s8k1nDx50ss5hyRJN9PpdKlERB2aWjSVaEilUvzBgwcORVEs5eXloXPnzk1sV8BkMiUdDofP7/dXZ7PZDilnIhw4cGBeS1pbW2P37t1zBwKBikQiUUREWFhYsHHO0d7evm0Ru90+/+rVq2rO+XGJiJxEhMrKyhgAjI6OWoeHh5tWVla+4JzDZrO9bW5unhwcHGzz+/32np4e+xaDbfoHAMxmc6ijo2O0oqIiJkkSNjY2HBIRmRljMJvNyWfPnln7+/tPMMZQXl6+0NbW9qK2tjYcj8floaEhqKpq+HCkbD3PzMwYBgYG0NXV9UuusFna2kEgELAQEQ4dOvSis7PzN41Ar9dnrl27NqCNkv/C3bt3zy4tLVmICJxzEBFJRBQmorLFxcWCqqqq0Pj4eO3Y2JhbUZTdra2tL2pra8OJRGLHnTt3zkqS9K+huHU4EhHMZnMoGo0W5OIh7nK5jjLGKq1W69vDhw8rRqMxMjc3t2t5eXnX5ORklc/nM+fl5SWnpqa+0uv1K/n5+Ws6nW5NluXNd15e3ppOp1uz2WyzZ86cGQ0Gg6ZAIFCZzWZ/lYjokRDiuN/vt7W0tMw3NTUpbrd78P79++5gMFgRiUTKHj58WMYYQ3V19etTp05tq6Lp6Wkb5xxCiEfc7XZPM8a6FxcXTfX19a/1en2Gcy5qamreNjY2/qGq6joRZe12+9Tp06e3JY/FYgWPHz8+mhvr3/CWlpbk+vp6PmOseWVlBS6XS9GSJUkSdrs93NDQ8Oe+ffvC/8fJIyMjddFo9Esi6pVleVjT2m0A8Hq9zqGhIefnjoknT544A4GAM/eDbxMReFNTE0pKSpKqqsaI6Pj8/LxVVdWM3W6PfCr5xMTE1zllXS0uLn6aSqXAGxsbodPpoNfrn6uqCs75EUVRrJFIZMfevXsXdTrdxseIE4mEPDIyUu/3++tynd8yGo29RIR0Og26fv06ioqKwBgD5xzv3r27zBjrIyJIkgSHwzFZWVmp7NmzJ1ZaWpoAgGg0WqgoSvHMzIw1GAw6tvjhitFo7NPW5fv370Hd3d0oKCgA53zTQMvLy+VCiKuSJH0rSdLmztZytIWv5RPRD0T0Y3Fx8dzWfby6ugopHo//w4mcc8iyPMc5v5FOp7/PZrOdQohWInIC2C2EgBBigYi8Qoifs9lsv06nWyIiaFxagXg8jr8GAGxuIe7LBeWhAAAAAElFTkSuQmCC"
},
"$:/plugins/felixhayashi/vis/img/network/connectIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/connectIcon.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3ZWRhMjI0MC0yYTQxLTNlNDQtYWM2My1iNzNiYTE5OWI3Y2E8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjdlZGEyMjQwLTJhNDEtM2U0NC1hYzYzLWI3M2JhMTk5YjdjYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4ubxs+AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAUtSURBVHjajJZ/bNT1Gcdfz/P53PV6B4W7VltLqdAaplIOiMOoyxxJCSs/Gv/yB4gzJroAosmmDklwkYWR0bQsdmkykoojTpcsWYLxD/lRZdMQkTHRtkLZRqG0tIVe7662vTu43n32x/VKZ/jh89cn38/zvN7P5/l88zwf2blzJz6fDwARQUSm1n8s31CM0/VAnbNmsUPuAsDpgEO+Bg4C7//iyv5hvmMiQiqVQpqamvB6vVNwEeG1JZtCBrYi/MrkAwDNgjhwAlbzICBLA0rDb0+/839C6XQaaWxspLCw8Dp86cbNmqVFJQddE6KzdjZ9D89g+B6fSyCOcyn1nxil+O9xKg5HqWFSHGXLjrP7W/ICqVQK2bNnDz6fDxFh65KNvxbHDhF4rJj2bXPo+IGfcW5h5xL4f99P+FCEMIAob75x9t0dAMlkElNXV4e1lteXbNqiQoMaeOFOjrdU868SD2luYyEP6dUh+sYmSHeOU6GO5Z8VLx5+NNZxIpPJ5AS2L3upROCoCvz8Lo7vnkf77cAHhpiz/zIL9vWz8L8p/NvupmM0Q7pjnAoLqz8tDrc8MnQqYVUVhVdF4LEg7b+rvDn8wDDlH0WoPpukLJImSBaMwjcJqmwWts2jPZLG/8kwYVFeVdXXZcFf4yVDc2cNKfBFmD9X+0ncCP58F48eG+Feo2CAUkvs4dl0V/uJvdXLiiV+ut++n7YLSfxPfMMG54ChzB3WIesVWB2i82bw1AR6fJR7C4VsfYiv6u/k3A9nEgP4zXke8DiYHyAOMK+QxPIgnZ9GqSHr1itQJ8DK2fTerDQ+S/bHRXQJaHSCwNIZ2Xh+7+S3VAmwNMBA/tuPZtErgKquUmdMWIFlRURvdamRNEXGwIWrlP47pTMzLiunxghGMwTLvcTWlHAp77s4QNSrYMQtss6ZMgWqCm5cHoDHO1nbk6K8zEN8+3zatv2Hn1b59EqJZdxmYUERg9P9KwpIiAOTdWUWBXuLzB/vZG3P1Un4PNp2d1MbmyD45TWCxuCsQm0x56bHGHFYEZwxok7toAA9Sfw3hCcoL/NOwi9QO5wmWO1j4JEgZxTkodmcWRGkf3pcX0r8xoAaBixKu4U5/xwndM+0tpAvS6mP+PZK2nb1UBvPEKwKMLDvPj4ESGc55lGy303sdJKQdZB2rkMdctAB/4gzN+/Q2ENNd4LyUi/xN+bTtquX2thk5nk4wI3gAF+OMNcA1nFQDfK+BY5GqbkwWabTY5QZhXWlnNx1ntrY1Rz87fuvw29m/Sn8J+PUGAFj5T19baA1IspuBZp7cx1x4SwG1cEf+lgRSROs8jGwb+Ht4QB/GSSsAhYano39LWIBxNEIbP14hPDuiyS2VtJuHXQlKKvxM/jiXDq/D/xPlwifGMkJZB2NIoKpr69nxeiZxLHicFSFVWfGqBidIP3LSjrWltD94CyufF/4kQgPuVz2Lz93+dDRa9eu5QQ8Hg8/iXee+Dy4CKMs7xqn4nwKz9IirhQqmVuB42m8ey+x7LMoD6iAON782eChhqmRuXfvXgKBAKqKqtI0/8nNKrQI4BVYXkzHgzPpC88gWuHL/caXrhLoGiN0apSKr0ZZRBZM7q2w5ZnLR1oAnHOMjY0hra2tFBQUYIyZmstvVT1Z6eDlAuEVq7merxmwueNPDXy9PvybjKP5mctHLk4/XTKZRJqbm/H7/VNw1VyEMYbW4FN3WNWnnchKoy5sHeVGBRX6VWi3ymFx7r11Ix8MTX/y5C2RSPC/AQB61erowbpqSwAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/cross.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/cross.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAADvGaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNC0wMi0xNFQxMjowNToxNyswMTowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo5ODJjNjBiMC1lM2YzLTA5NDAtODI1NC0xYmU5YjVhNGUxODM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjIxODYxNmM2LTM1MWMtNDI0OS04YWFkLWJkZDQ2ZTczNWE0NDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0xNFQxMTo1NTozNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjc8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NzwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+cZUZMwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAA2ElEQVR42gDLADT/AS0tLUQFBQUVFxcXtPHx8fPl5eUNCAgITCkpKesEHx8fGgYGBjH+/v4a+Pj4qgQEBFU6OjodMTExzwQUFBSvEBAQEfX19SD19fVqNDQ0CElJSd/9/f2vAwEBAfrn5+fkBwcHLRYWFgsXFxfz29vbo9LS0uwDDQ0NDfPz81orKysXIyMj+ODg4Avh4eEa/f391gMkJCRYPz8/KUhISOMCAgKh8fHxHRsbGx4UFBQQBDk5OeY7Ozv7CAgItPb29vMEBASaJSUlTQ0NDesDAEwpT0Ko8Ri2AAAAAElFTkSuQmCC"
},
"$:/plugins/felixhayashi/vis/img/network/cross2.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/cross2.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAADoRaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDItMTRUMTE6NTY6MTUrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTAyLTE0VDExOjU2OjE1KzAxOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNC0wMi0xNFQxMTo1NjoxNSswMTowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6OWIwNjRhODctYWNlZi1jMjQ5LTg5MWUtNDAxOTVmMWJjMTNkPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjlmYTI2M2QyLTljOWMtNWY0OC1iYjNiLThmYmQ5NmI5ZTBhMjwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjlmYTI2M2QyLTljOWMtNWY0OC1iYjNiLThmYmQ5NmI5ZTBhMjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo5ZmEyNjNkMi05YzljLTVmNDgtYmIzYi04ZmJkOTZiOWUwYTI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMTRUMTE6NTY6MTUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjliMDY0YTg3LWFjZWYtYzI0OS04OTFlLTQwMTk1ZjFiYzEzZDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0xNFQxMTo1NjoxNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOklDQ1Byb2ZpbGU+c1JHQiBJRUM2MTk2Ni0yLjE8L3Bob3Rvc2hvcDpJQ0NQcm9maWxlPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj41PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjU8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PvQ0yV0AAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHZJREFUeNoAaQCW/wE1NTWrERER3+3t7Xbp6emKOTk5IgQtLS3kBAQEdfLy8ipOTk5LQ0NDkAE0NDQAEhISxiEhITkTExPH9PT0OgMGBgaPMzMzVS8vL7XU1NRC7+/vEQNfX19lUFBQtfPz82EEBAQMNTU1HwMAMI4nIAoe9RQAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/deleteIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/deleteIcon.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowNmE3NWYwMy04MDdhLWUzNGYtYjk1Zi1jZGU2MjM0Mzg4OGY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjA2YTc1ZjAzLTgwN2EtZTM0Zi1iOTVmLWNkZTYyMzQzODg4Zjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4aYJzYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYGSURBVHjalJZ7UJTnFcZ/73m/72PdJY1RbhoQp6lkXRAvmIYxdCUadLVOozPNtGObap1JsKipjiShbdoRbeKEiQHpQK3xj0xa03aamTbaTGyAYV1QGeqFi+JyiZFLAlmESBkWRmS3fyzslGkmnZ5/v/M873Oe75zzvqqoqAibzQaAiKCUAkApRdHIK/NFsx2NR91nOSILADDoJyzNaM4xxbtvPHh0iC+JiYkJ1OHDh4mJiUEpFSXPv/ziPC28TIiXDCOSrAClQDSEpsCwJPIhrEBRQpiSytXlQwDhcBilFPfu3UMVFxdjt9ujFTzfcLBADCoEEAFr1ZbrrNjch2vtEImPBgHob7fTcWE+bVXJNJ/NiFQlEGLvieXHKmYqGB8fRx05cgSbzYaIsPvywV8pKFaA7fGtLTzz61YWpo/xVTHQbufsq5lcez9zWuWhk5mvFwMEg0H0+vXrMU2Tn1wp3CtCiQ5DjGd3A/m/v8IDCZP8r4iNmyRrWx/j/5qktykZpXKzAjVDVxPzGqemptDr1q1jX3NRnIJarcDKK2hgR2ULXRfncv7UYv7xpovhnhiW5Mz+kefeSKO6LJ1A1xzEuk/Ojm4mRibpuZaMZW3OCtRUND60NmiICCIUShisx7a2sLMiQn4s77uEQgIabnqdfHIlgT1/qQeg8vs5dHhdCNB1wYn3RIiC995j26stjAbsNH+YiZJCESnS1Y/XxIXu8r4YIPv/VkVs3CTnTy2ms34xro1+sp9po6sxlTu34ultmsPVvy6is86FCHgO+DDs49zpjufBpCG+seYOC9OHaTidieicb9ouVAhKtouAseI710ma7pLuqwmgYfHqAFt+6WdLoQ/LBl11Lm7VudAa8vb72PCin9TlAWIsGGhLACD+kSAZnusYBii1XQAPYWDllt6ov2lrBkDBR2+6Ofuak2//3M+G/T4wAAPW7fPhKfRTVeqk9qQbFKRmDUTxS3N7QYGYmwzCkqklBGlPDEcTNv+sg9tNCbTXuvBWujE0bHrZj9JE1B/wU1Pm5PwJN6YBS9a2kVvQEcWnrh5GTFD3lxkYkqRMgYQlwVldUvDnen73LHTUuqitdKM0eAr9AFQfd1J/yo2aJn+2sn4Wdn5qEFODJskgBIjx5T0uCrQA08pnIjS9PERDjPnfOKXAMEBECUoGEIHBj+2zkt76UQ6dXheGAev3+cg74Kf6uJPqcicbfuond7cPy4SOiy7+tD9nFvZurx00KOk3CNEC+mE+vjSPBc7IWqgqTaPT60IMcO/xsXGa3HfKjRgRdbl7/KDg0jtubje6aHj7c7J3dgLQ2zoPwwQ91SooOQdAW1VKVMHty0kA5Bb48BycJn/LjWFGbLv4thvvb53kFvjJ+XEdWkPfjQVR/CcNKYgGMc8JWt5Fa2j+MIPPuyI2pa4IoHSkt6vLIuRaQ9q32khzt4GCxtNu6k46GeiIR2lIfDQQsafPzq1LGRGL9Gk9d+vrwewvfHPQOoexQVjxdB/auk/zmaUMdsfz6bVUtIalT7bxveP1ZHh6GPDPYeSzeD69kcpIfxymFWLNrka+ljhBTWkWwz2JiJT84YHnz2iPx0P20PkmRF5i6HYiwZFJsn/YzdezbzE3cQibY5xV266z6RfXohakb+xB9CjanCD9qTbW7Grk4WV38VZm0l6dhQiEw9taHSuDqrS0FIfDwXM3X9mHMsvRAk/sauDpQy38P+GtzOTGB9mEpkD0C2dS8n8zOjqK9ng8WJZFU+JTjasGvaCNXPpvJBPoMlm0OoDNMfWVxONfWNSUPUZ7TUQ56tCZlPwSgMnJSVRpaSmxsbFE1raw82ZxAZZRQUiBYUKGp5UlOX2krBzmoUVjiIKhHge9rfPo+Wcy3ZeXIYASgL1/X5RfMXMvj46OosrLy7HZbGitUUohIuzoem0RofALaOsghgWGjky0MiJTL8b0lOvI8hN1DKXKP0jd3TNTWDgcJhgMoo4ePYrD4Yi+KmaeLlprnrtXFo9h/AAlG1AqE8yFmBrC+jO0bgH9EVpO/1F2Dc5g//OAsbEx/j0Af+USsQynL1UAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/downArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/downArrow.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOJDdL2KxuAAAGRklEQVRIx52XXWwTVxaAzznXDn9xLUcFjyOShowhEzuwSSQXMN38gEJEoOwDaxkCCMr2FaXhJ0/sWmmfCkULSAgUtdknHpBWEYi2oGhlmc2fWrwJCDL+wYF4XEicZBMbgrFDY/eh4wjMmJjel5m595z73XPuPeeeQcihORwO9Hg8f2aM7UylUluIyAgAOgAARJxBxAAA9APA9zzP97S3t6cWmxPfNVhXV0d6vf4LRDyLiID4u7jSk4heVz0eDAbPuVyu5HuD7Xb7ZwDQSUSAiFBYWDhmMpkks9kcLikpiWq12gQAQDQaXTI6Oqr1+Xx6r9dbPDY2ZiAiSCaTgIhHOjs7/5UzeO/evV8CwN8RETZs2ODbvn27WF1dPZnLtty7d2+l0+k0iaJYJnvpq46Ojn9kyjEF6DkAaENEaGho+Ono0aM/GQyGGOTYOI6Lbd68OfjixYtfg8HgakSstVgsOrfbfSurxXa7/WsiagMAaG5u/s+uXbseZU7s8XgKrly58sn4+DiHiMBx3Pj+/ft7BUGYzpTt7u7mr127tk3+PHPp0qW2tyy22+2fIeJpIoJDhw51NzU1PVay6MKFCw3hcJgjImCMQSwWyw8GgwV1dXW+TFme52dWrFjxf1EUecbYFovFIt25c+cuAAABANhsNkZEnUQEO3bs6G9sbBzN5sqJiQmOiKCjo6Pj8uXLHYgIExMT3DsiY3Tr1q398kI7bTYbWwAzxloQEdavX+87cODAg3fGX0boMMYyQ+mttmfPngcmk8mLiGAwGFoAAMjhcCARnQUAaGxsFBcN/D8ABgCoqakRGWOgUqnOOhwOJL/fXwMAUFRUNFZVVbVoyCiBcgGXl5dPGQyGMSKCZ8+e1RAiNiEilJeXS7mES6bFKpUqJ7B82CQiArVa3USIaJXB4VyUiegNUDqz5dJKS0vD8sI3qxBxLSJCSUlJNJuC3+8v8Hg8XDwez8sEp3N4V1dX5bJly+bWrl07bjQap5XmKSoqisq661SIqCMiSOdeJejFixf/+rq1Snvsdrs/BgDo7e2FI0eO/Jvn+bfgGo0mIevqVIu5yuPxcAAAFRUV4tKlS+dev6UAAKqqqu6m++bm5vL8fr9pZGSEUwK/fhBVqVRqhoj00Wh0yapVq15mCs7PzzP5QMwfPHjw58zxffv2LfRdvXp1EyLCq1evVErQ58+fL5HBM0RED4kIJEnSKgmXlZWNExGIomgOBAIF2Tzz6NGjAq/XW0FEwPP8uJLM06dPtbJ3/EREA4gIDx8+1CsJm83mSUEQvMlkkq5fv27NBr5165YVAGjdunVeQRAmlGRCoZBeBg8QIv4AAODz+YqzTXr48OFenU4XmZycLOzp6SnNHO/r6yudmpoq1Gq1EZvN1pttHkmSihljAAA/0urVq/+LiBAOhw3379//UElBrVYnKysrRSICl8u1KR6PL+xhIpFQDQwMbEJEMJvNolqtVix3AoHAh9PT0wYigpqamh5qb29PIeJxAACXy2XKttqdO3c+4Djul0QikX/jxo2qdP/NmzcrY7FYPsdxvzQ0NGS9YAYHB01yBB2vr69P/n7EZmbOy+4Wurq6KrIp19bWDhERDA8PbwiFQtonT55oh4eH/8QYA6vVejebntPprHj8+LEAABCPx88vFAKiKKYsFksIEf8iSVKRRqOZKi4ujiqUNbOSJOVHIpGV4XD4g0AgUDQ7O6srLS31bdu2TdHaoaGhj/r6+urlMPr81KlT/3ujAnG73UMbN25cgYhbvF6vMRvcaDSODQ0NGSORyMpYLKZdvnz5bHNzc3deXt68EtTpdDbKJ/lMW1vb6axVZktLyzlEbCEiqK2t7d+9e/dblszOzuZ5vV4OAEAQhPH8/Py5TJnbt29XuN1uq1zqnj9x4sQXi5a3ra2tpxljJxERBEHwWa1WURCEnMrbkZGRlYODgyZJkspk9545duxYW84F/cmTJ/8GAN+mLwW9Xj/G83xwzZo1YYPB8Eyj0STSaXBycvKDYDCoD4VCH0UiEUM6dyPi562trd+99y+Mw+Ggly9ftjLGvlGpVAsVCCKCnAjeuK3S74h4orq6+p/19fXv/wuTuYBkMvkJIn6KiFYi4olIJ4NmEHGEiPoB4IbFYul9FzDdfgOenj3/W2qSyQAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/editIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/editIcon.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDozOWNhNzE5ZC03YzNlLTUyNGEtYmY1NS03NGVmMmM1MzE0YTc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjM5Y2E3MTlkLTdjM2UtNTI0YS1iZjU1LTc0ZWYyYzUzMTRhNzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4ykninAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYpSURBVHjafFZtTFvnFX7Oea+NudiY2Hwam4CBlgQwXdKREDKUoYg0jbRJ29RJ2VZ1mjRFUxSpA3VTfkzJfkQbS7spU6rtx5Z2UtppScjaHxvLuiatWi2jLEoMIUDCh23g2gbj7+tPuPvhOurawPl1dc99n+c55z33fV46ceIEZFkGADAziAgAQERoe/9ZK4GPM/AcgbsIXAcABCgMvkfAqAa89eDoJyF8LogIqqqChoaGYDAYHr8kItS8uc8iIH6iAa9IkAo5EAQX8pqmgUVBCBggYFgDhv0/GAsBgKZpICJkMhnQ4OAgZFkGEYGZUXmp+0cS+CKBwWA0DVRPOg5Zl2q6zaHyJlnVAMQXVTkwHrUqH0Xsvn+tdQAAMQDgpPLS2MViFY8rkGUZzIzaS/t/xqCzGggtz9e697zsnKhoLUtim4jOq/LE6x7X0nsh16dEZ5a/O3a2SCAOHjwInU6Hujd6ThJ4mCDQ+b2G232v7v6vwarPbQn8MGlMr+X0kpE3Wr5Zt5hL5HPhqYSdQIfKJ+yhxDPKWC6Xg+jt7UXD5b5KBt1kCHS85Ljd8/On3NupfnhFaZj4rWff1B98B1R/hnUmKd36bdtCNl4g0en4edNE/cXwLq8qMTMIPAQwmo/WuHvObA8+9c58k/dKtD0TyZWXN5YGA7ej7epKxspM//7SoNOdWc/Jyq2wiwhDzPxT8cP0jys3VMM7OmL0/77zn4Ydui3b8uiK0jD7RrA77c9Wd57cefPpF+2T6bWsFPWkaiPTCWvTsZpHFU+XrS+8G3AR08F6X+1FJvBxQQzHQOWk2SmrW4FPX/U2LVwPuDZj+fJKl2khPpeyAqA9rzR/YqwuiWXX8taN/CabGkrVuq9YJlkQQDjOAJ5jAhz9Vt9W4N5/rNp8I+vtMV/aZm4zLnUNNt0urdYnF68HWoJj4Wo1mLGUNRr8LEgDgNqeCh8xQIKOsgC7iAjVe83rT9zQa8uNM28u70kspessu8q8zq/V3NcZpVzb9+0zmVhOvvvrhaMVzrJg0zeq7xMVCCwdpnWSGBqjUyJwLTFgbvxie3w31uoWR1Y74r60rdxZqrR8q85t2W2MGCp12bm/KC3hyaSTiMhxuGrKcahqpbjOaDOoEhOEoFqJQCCJvqA85I6bfTdDjQlf2lbxVNlS6wt19yy7jRHZZlDnrinNj/6sHMhnNw2Ogco7O79e5fm/xQywRBBCEAuwn4gQ96bkYj4Vyuq9N1Z3Bj4Od5bs0MXt/dZZ21ctiqFan174q985P+Lfp+U1g7XDON/1ctP458WlVjLyJhOISZE0wM0S1QfuRC3lTjkJAKKEtNC9eIOhSh9xHLZOJRZTFuXDsEoStLkR/768ummsaJG9Pb9oe+9J+xaeSVokiQDSJphAo5uaBuWjiKP4QTqS1cUWU7ayesN66wu22frD1vmVW6GW6T8u9eVjGyZzs+w78Nqu0a2mbvVu1KEJQAgeZRL0liQYyx+GOmKeQpu0rMYsAJPNEFGD2dLodLIy6c9Ys7G8yeSUl3tf2/X3rcBVJSOv34l3sCBogi7z1LH/rBHjl4IJ93/ncQFAnjeImJD0Z8zuCwu9q3djDXqTlAKID5xv+9t2R8n8VcUFBljQ8Gyfe40BYBM4DwDLt8Kue79ZcFkbzfEdbUbv+oN4c9KTtsfm1MbYQqqh+2zrVZYKs/7Ef+byimt1POYiJhDhPBFBIiIEXhxfs7/dfYoIF+auBfYTE/pebx/V8hqBP2ODvD34yvuh/WCAmU75Bx6sIgaI/v5+6PV6JLqUsYr7dpDAoehs0h73pHTWrvKgThYbRSt9UmSjef3MpaUvBz4O72UmADgTOPJguGiZor+/HyUlJWBmJFz+D8xTtlUiOpbwpmrmrweeSXrT+g11k4SBN3RGKUcAVCVdFhyP1nreDbY//NPyEXUlU/Pp4XYycGT6V0Ux2WwWdO7cOZSWlkII8diX7SPPNgDaKdbxoNAxwATBAEkEEgSWCEQAqPAMwqvMdCEwMO0tVqZpWsGTT58+DaPR+PhGIYQAAAgh0P7B3ioW/B0iGiCGiwXbCuOHFSJys6AbYFye2T+xWhT3WYJEIoH/DQBMw3kes8OJPgAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/leftArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/leftArrow.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOIyX3IEvhAAAGn0lEQVRIx62XX1BT+RXHzzn3FgYhIjuBcC2BwCVIYGEIcIGopTiiO7I6OLE2jujYbXf6os5WAV9KyWj74m7/bH3TsfTBFx+Y6dhWZ6eLDNkV1oRsoqI3CX9mTTIC2dD8U0ICNLcPTRx0+efW83LvzO/8zud3z+/3+55zETZhRqMRHQ7HjxiGeV+SpF1EVAoAOQAAiBhExEkAGAGAf/I8/+XFixeljWLieoMtLS2kUCh+hYh/QERA/J/7ak8iWjm10+12fzo0NJR4Y7DBYPgAAPqICBARtm/fPlNRUeGprKz0qVSqcHZ2dhwAIBwOpz99+jTb5XIpnE5n4czMDEdEkEgkABF/3tfX99dNg48dO3YJAH6DiFBdXe3av3+/WFtb69/Mtjx8+DB3cHCwQhTFHcks/fbatWu9r/sxq0A/BYALiAj79u0znz171sxxXBQ2afn5+VGdTueen59fdrvdBYj4Y0EQcqxW62drgg0Gw2Ui6kREOH78+IDBYHDC97Sqqipfenp6yOVylSBikyAImVar9fPvgA0GwweI+DERwalTp/7V1tb2DfyfxvN8MDMz89+iKPIMw+wSBMEzOjr64CX46NGjDMMwXxMRHDhwYESv14/DWzKVShWKxWJxj8ejJKL2wsLC34miKLEAAAzDfISIUFVV5Tpx4sTjjYKNjY3lOhyO/LS0tP9UVFTMlpWVBdbzP3LkyOO5ubl3HA5HOcdxHwHAH9FoNOLExEQCAKCrq+tvWq12zdO7tLREV69e3e1wOMpT95aI4MyZM/1qtXpduMPhkF+/fl0PACCTyYgdHx9vRkRQKpUz60H7+/srbTZbZSQS2caybKK6uvrJ8vIyI4pihdPpzN8IrNFo5jiOm/H5fFwkEmlmEbENEUGj0XhWm2CxWLiBgYGaZ8+eKREROI6bNhgMw6WlpcEbN240sCwL8Xg8bZOHzeP3+zkiamMRcWcS7FvpFIlE0vr6+na6XK4yIgKZTPaitbXV3NraOvVSfZJSef/+/YbR0dEGAABJkl5uAQBAXl7ebHt7+z2e5wMlJSU+s9kMiKhjEVGNiKBSqcKpgM+fP0+7dOnST6LRaBbLsglBEB7q9foHWVlZS6/IXlK/EREkSQIiAoZhXtHxubm5/Fu3bu0+f/7835VKZTi5oDIWEXOICFLaCwBgs9nyo9FoVlFRkcdgMIyoVKrIaqnr6OiwdHR0WNZLb29v7y9DoVB+8lDFk+AcNlUEVpokSbhKxXkrlorJSpIUJCJFOBxOz8vLWwAA0Gq1M3fu3Hnh8XgKr1y58sO6urpHer3enpGRsbwyyM2bNxsePXpUQ0SvLPL1d7lcPpvcwvTkWJCIaIKIwOPxZKecs7OzF3t6evrLy8vHJUlibDab9vLlyz81mUwlr69+JTT1ntp3IoK8vLzZgwcP3gMAmJ6ezk6OjbNE9BUi7p6YmFDU19fPpoJu3bp18fTp00M2m801NDSknZ6eLrh9+3arzWabPnz48HBxcXEwFbyurs7S3t7+YKM0e71eRXJbv2Jqa2sXEfFni4uLTEtLy3c0muO4FzqdbiIej8cjkYgsFArl2u12jd/vT19aWvpBMBjM5Xn+G57nN6zXg4ODDbFYTCZJ0q+poKDgC0QEn8/HjY2NydeadOjQocfd3d39ZWVlToZhSBTFqsnJyQoAALVaPbsRdHJyUh4IBDgigubm5i8Zk8kE9fX1zxHxvfn5eWxsbHSvNZlhGKmmpsbNcZwnMzMzrFKpnu7du9eiUqkCG4EHBgbqw+GwHAA6T548OcIAAJSUlFi2bNnSGwgE5LFYLK7RaL5dL4hcLo+q1Wofz/P+bdu2LWwixe8+efJECwAQi8XeN5lMEgMAIIqiJAiCFxHbPR6PUiaTzRUWFobfxr212+1Fw8PDe5In/8Oenp6vX+lArFarvbGxMRMRdzmdztK3Abfb7UWDg4PvJa/QJxcuXPh41Z7LYrF83tTUlIOITU6nszQej8d37Njx7feBmkymd1NfKknSn7u6ujrX7TLNZvNnOp0uk2GYXV6vV+n1erMyMjKicrl8U53m1NRU7t27dwWHw6FNpveTzs7Ozk039N3d3b8AgOspNVIoFDM8z7uLi4t9HMdFZDJZPCWDfr9/q9vtVni93qJQKMStqFofnjt37i9v/AtjNBppYWHhHMMwv2dZNnWlABFflr81JLOrtrb2T3v27HnzX5jXF5BIJHYj4iFE3ElEPBHlJEFBRJwiohEA+IcgCPfWA6bsv6nEjVSaQsrEAAAAAElFTkSuQmCC"
},
"$:/plugins/felixhayashi/vis/img/network/minus.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/minus.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOJCdWb7wKAAAE/UlEQVRIx7WXXUwUVxTH/+fcMcTQLaFZd3cMu66MBVnFBOJEELqVByVSGxKNWWNMjK3xjViyyBNlQ9uXak31xQfS0kfeTOxXTK0bbP3I6io1mtldPoI7mwjLCuxiFDZpdvrgDtlStKjwTyYzc++d+7tzztxzzhCWoUAgQJFI5AMhxEeGYTQw8yYApQBARDNENALgJoCfFUX5s6enx/i/OelVnbt27WK73f4ZEZ0lIhC9GL7UmZkLH/XH4/FzAwMDudcG+3y+YwD6mBlEhPXr1497PB59y5YtSbfbnSkpKckCQCaTKXr06FFJLBazR6NR1/j4uMzMyOVyIKJP+vr6flg2+NChQ18A+JyIsG3bttiePXu02tra1HLccv/+/XXBYNCjaVpl3kpf9vb2di8eJ5aAngPQSUTYvXt3qK2tLSTL8nMsUw6H43l9fX382bNnf8fj8TIi+lBV1dJwOHz5pWCfz/c1M/uJCIcPH/7d5/NF8Yaqrq5OFhUVpWOxWDkR1amqWhwOh6/8B+zz+Y4R0WlmxtGjR39raWkZw1tKUZSZ4uLiKU3TFCFEg6qq+p07d/5aAB88eFAIIe4yM/bu3Xtz//79Q1ghud3u9Pz8fFbXdSczt7pcrq80TTMYAIQQJ4kI1dXVsSNHjjzECuvAgQMPPR5PlIggy/JJAOBAIEDMfBYAmpubNaySvF6vJoSAJElnA4EA8dDQkBcAnE7neE1NTWq1wFVVVU9kWR5nZszOznqZiFqICFVVVTpWWYqi6MyMNWvWtEhEtDMPTpoDIpHIe/39/Y2Tk5MOMxyaIdG8Lrw3DANCvNgghmEstNtstonW1tbriqJMA0B5eXkyFAqBiOqZiN4nIrjd7owJ7u/vb0ylUo5CyOLDjNHmwgzDABFBkiRIkgQhBKamphyXLl1qNOd1Op2ZfAiukIiolJlhxl4ASCaTDiEELly40Ps2pu3u7j6RTqcd5r3FYsnmF10qmUmgUEu1rZRMa0mGYcwwsz2TyRTZbLY5AJBleWJyctLR1tZ2otC8helvKb8vnpyZYbVaJ8z2p0+fFuX7ZpiZh5kZuq6XFCSK6w6HY+JlvpUkacn2wgUSEWw228S+ffuum/M+fvy4JN83JDHzLSJqHB4etm/fvn0CACoqKqa7urp+XGkzJxIJe96Ft5iIfgGAWCzmWu19rOu6K7/tfuWysrI/iAjJZFJ+8OCBdbWgIyMj1unpaZmZ4fV6/+Senh6DiPwAMDAw4Fkt8L179zx5//ubmppyLz6xmZnzeXNvvnjx4taVhgaDwa1jY2ObAWB+fv78Qj7WNM1QVTVBRK26rjstFssTl8uVWQno4ODghhs3bjTlv/zjXV1dd/9VgYTD4cEdO3YUE1FDNBrdtBLwwcHBDcFgsDm/hc50dnaeXrLmun379pW6urpSIqqLRqObstlstrKycvJNoNeuXdtqvqlhGOc7Ojr8r6wyQ6HQ5fr6+mIhREMikXAmEol31q5d+9xqtS6r0hwdHV139epVNRKJ1OTNe8bv9/uXXdCfOnXqUwDfmdHIbrePK4oS37hxY1KW5VmLxZI1w2AqlXo3Ho/bE4nEhnQ6LZuRi4iOt7e3f//avzCBQIDn5ubahRDfSJKEfH0GIlrIvy8JmR21tbXfNjU1vf4vzOIF5HK5RiL6mIh2MrPCzKV50AwRjTLzTQA/qap6/VVAU/8Apxa13K97LqUAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/plus.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/plus.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOJQd0Gq2DAAAFq0lEQVRIx61XbUxTZxR+znmvMQY7xJT2XieI1jmoHwlIY1CG4KIExuSHITVqYtwM/wgSEI1hNrhfw5mpP9Q0G/tl+Gd0XzFkNoCIaex0RtJSPwZto7RFPooRMFm4++G9BGuBYnaS5va+99zzvOc5H++5hCTE4XCQz+f7TAjxhaqqO5h5PYA0ACCiUSJ6CqAHwG8Wi+V2c3OzupBNmu9hcXExm83mY0R0johA9FY90ZWZZ79aHwgEznd0dEwvGthutx8B0MrMICKsWrVq0Gq1Bjdu3BjJysqKpaamvgGAWCy2dGBgINXv95v7+voyBwcHFWbG9PQ0iOir1tbWn5MG3r9//xkA3xARtmzZ4t+zZ483Ly9vKJmwPHz4MN3lclm9Xu+nGkvfOp3O0/F6IgHoeQCNRITdu3e7a2pq3IqiTCBJkWV5oqCgIPD69et/A4HAaiLaabPZ0jwez805Pbbb7d8xcyMAHDhw4M+Kiop/4g37fL6VV69eLQyHwzIRQZbl8MGDB7uzs7NH4nXb29st169f/1y7PXv58uXG9zy22+1HiKiFmXH48OH28vLy/kQeXbx4cXckEpGZGUIITExMLA8EAiuLi4v98boWi2U0JSVl2Ov1WoQQO2w2W/DevXt/AwADQFVVlWDmVmZGWVlZT2lp6cBcVEajUZmZ4XQ6nVeuXHESEaLRqDxPZQzs2rWrR9toa1VVlZgBFkLUEhE2b97sP3ToUO+89RdXOkKI+FJ6T/bt29drtVr7iAiKotQCADscDmLmcwBQWlrqXbDwPwAYAIqKirxCCEiSdM7hcBA/fvy4CAAyMjIGc3NzFyyZREDJAOfk5LxUFGWQmTE+Pl7ERFRORMjJyQkmUy7xHkuSlBSwlmxBZsaSJUvKJSLargFHZpdMW1tbYTQalXUg3fjs//q9qqo4ceJENQCoqjqzbjKZwpWVld0Wi2UEANatWxdxu90gogImok+ICFlZWTHdWFtbW+HQ0JCsgyT6xTOgqiqICJIkQZIkCCEwPDws37hxo1DXzcjIiGkteINERGnMDL33AkAkEpGFELh06ZJzIfpaWlrm1Dl9+nT12NjYTKkZDIY32qbTJP0QiE+W+LX/S3S2JFVVR5nZHIvFlppMpkkAUBQlHI1G5ZqamurZ9M5OLN3TU6dOVSeKu341Go1hff3Vq1dLtWejzMxPmBnBYDB11kHRLctyeK7YSpL0Dkh84ulnt8lkCldUVHTrui9evEjVnj2WmPkuERU+efLEnJ+fHwaADRs2jDQ1Nf2SiKqTJ09WJ6LuzJkzC+ZDKBQyayG8y0T0OwD4/f7MxcQokccLSTAYzBRCAMAfvHr16i4iQiQSUR49emRMxsBsqpPtXE+fPjWOjIwozIyioqLb3NzcrBJRPQB0dHRYP8TjZOT+/ftWLf71JSUl029TbHT0gkZ39rVr1zYtBpiIoNE3p7hcrk39/f3ZADA1NXVhZhDwer2qzWYLEVFlMBjMMBgMLzMzM2OJjPT29n48NTW1vLOzc2tXV9dWZkZ6eno4Pz/fn0j/wYMHa+7cuVOibfhoU1PTX+9MIB6P58G2bdtSiGhHX1/f+rnA09PTh54/f75ycnJyuRACRqMxXFZW1r1ixYrJRKAul6tUK6GzjY2NLXNOmbW1teeJqJaZsXPnzp69e/f2fkiH6uzs3OTxeLZro+6FhoaGY/NOmW63+2ZBQUGKEGJHKBTKCIVCy5ctWzZhNBqTmjSfPXuWfuvWLZvP58vV6D1bX19fn/RAf/z48a8B/KjXqdlsHrRYLIG1a9dGFEUZNxgMb/Q2ODQ09FEgEDCHQqE1Y2Njit65iOhoXV3dT4v+hHE4HDw5OVknhPher10hxDuZPEfLbMjLy/uhpKRk8Z8w8RuYnp4uJKIviWg7M1uYOU0DGiWiZ8zcA+BXm83WPR+gLv8BUhzshlEbZ/0AAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/rightArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/rightArrow.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOJRIZx0loAAAGfElEQVRIx61XXUwb2RU+5147CIPrOoLYQ2LjYAdqjKOAmGAw1YYHsgqrCilZy1YUlG5ZVcoD2kYQP9G10valu/0hipSHKE0fiaiqRu0SrXYTFxdDBHhlIojH5kfgcWMwJoYpBeyksftQT+QQCE6aTxrNaGbu+c4959zvnouQB1wuF3Ic90NK6UeZTMZKCDEAgBIAABHXEHEOAEYB4Cu9Xj989erVzH428U0fT506RVQq1c8Q8beICIj/+323OyEkd2h3OBzuGxoaSr81sd1u/wQAbhNCABGhrKxsqbq6mjeZTDGdTicoFIoUAIAgCAWLi4uKUCikCgaD2qWlJYYQAul0GhDxJ7dv3/5j3sQOh+MXAPBzRITjx4+HTp8+Hairq4vnk5ZHjx6Vut3u6kAgUJWN0i9v3rz5+c7/6C6kfQDgRERobW0d6+rqGmMYZgvyhFqt3mpsbAxvbm7+JxwOH0HED1iWVfp8vq/3JLbb7b8mhHQjIpw/f/6+3W4PwjvCbDbHCgoK1kOhUAUiWliWLfL5fN++Rmy32z9BxC8IIXDx4sVv2traFuD/hF6vXysqKnoaCAT0lFIry7L8xMTE5Etim81GKaXfEULgzJkzo2fPnp2B9wSdTreeTCZTPM9rCCHtWq32V4FAICMBAKCUfoaIYDabQxcuXJjOx2AoFDrIcZz6+fPn1Gg0LtfU1OxZfOfOnZteXV09yHHcDxiG+QwAfoculwtnZ2fTAAA9PT1/qa2t3bd6Z2ZmDl6/fv1jAHi5fo1GY7Czs9MrlUp3Xbscx5XcunXrLACAXC4ntKys7ANE/LFGo1nq6Ojw5zNbr9d7dHFxUWsymQIMwyw/ffq0NJFIlPp8vgpBEKCqquo150tLS7empqbKtra25Mlk8u8EEdsQEYxGI59v3pLJ5AFCCMhksmednZ0PL1269GeVShUVBOH7w8PD1mvXrp2ZnJxkdik2nhACUqm0TYKITVniWE5YDvb39zevrKyoRTkUQyo+i4oGAGAwGNacTudXQ0NDeo/H0/DkyRPNnTt3ND6fb8Zut4/K5fJnAAAVFRWxsbExQMRGgojHEBF0Op0gEvf39zfH43F1LsnOK1erc7R93ul0/ollWb9UKk0vLCxU9vX1fbyxsXEAAECj0QhZhysliKgkhICovQAAsVhMTSmFGzdu3Hzb5VNYWPjcZrNNWCyW0ODgYFM0GtVyHKc+efIkL5fLU1mnlZLckInY7d27QLSRyWQw1zYAgCSTyawRQlSCIBQcOnRoGwCAYZjllZUVdVdX10935jQ31ydOnJh0OBzjOwpPcu/evdrp6enj6XSaymSyf1dXVy8BAGxsbBRkx69JCCGzhBAVz/MKkdjhcHgHBgZey7M4A4lE8or3IkZGRiq8Xq8lmUwWZ4tupr29/WVxRaNRRdbGjIQQ8hARm2dnZ1X19fXLAACVlZWJ3t7ev+4Vwrt3754YHx8/KToSDoeVg4OD1ng8Xpbdu//Z1NTkN5lMS7njIpGIKjvmoQQRBwHgSigU0gLAozwL6JlEIoFUKnVgYGCgkeM4EyIShUKxbjKZAq2trbvKLs/zWkopvHjx4p7kyJEj/4hGoxCLxZipqakSs9m8uh/xsWPHlkdHR2Fubq5aDLnBYAjabLY9JXNubq4kkUgwhBCwWq3D1OPxQH19/QYifri5uYkNDQ3h/YiVSuV2eXn5QnFxceLw4cPR5ubmiZaWFo5SumeTd//+/XpBEEoAoLujo2OUZhVlXCaTfZ5IJEqSyWTKaDSu5EOu1+vjBoMhVlJS8sYOxe121zx+/Lg2W/UfeTyeDAUACAQCGZZlI4jYzvO8Ri6Xr2q1WuF97Md+v798ZGSkJbsCPu3t7f3ulQ7E5/P5GxoaihDRGgwGDe+D3O/3l7vd7g+zTd+XTqfzi117rvHx8W8tFosSES3BYNCQSqVSVVVVK+9C6vF4asSZZjKZaz09Pd1v7DLHxsa+bmxsLKKUWiORiCYSiRQXFhZu7ZdHEfPz86UPHjxgOY6rzYb3y+7u7u68G/orV650AsAtUbVUKtWSXq8PHz16NMYwzL/kcnlKlMF4PP69cDisikQi5evr64x46kDETy9fvvyHtz7CuFwusr29fZlS+htRJimlgIhAKX1lf859RsSeurq637e0tLz9EWanA+l0uhkRf4SITYQQPSFEmSVaQ8R5QsgoAPyNZVnvmwhF/BfnjYAmDVlf5AAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/upArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/upArrow.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOJTG7oDgaAAAGZUlEQVRIx7WXXWxTVxLHZ+ZcY1mON8li44/GruPrsMT5UElzgSRswEIBOdUSARsZoUioHxIPCKUowBPUyrYv2y5aeOABtMsKJJ5YIaR+qBQwCS1u4zihUVw7DqTE1yFOlObDDmDTEHsfeo1SY1NTaefF8j3/md+5c86ZORehAHO5XBgMBv/MGHsrnU43EZEVAEoBABBxHhHvA4AHAD7jef7r7u7u9G/FxJcNbt26lbRa7fuIeBIRAfEXea5fIlrp2hUOh0/19PSkXhnsdDrfBoDzRASICAaDIWqz2cSqqqpps9kcKy4ufgoAEIvF5OPj48WhUEg7MjJiikajeiKCVCoFiPjO+fPn/1MweO/evX8DgBOICLW1taHt27cH6urqZgpZlqGhIY3b7bYFAoE/SVn68Ny5cx9k61gO6CkAOIaI0NLS0nfo0KE+vV7/ZKUmHo+v8ng8r42PjxevXr06IZfLlzNjOp3uSUNDQ/jx48fPwuFwGSJuEQSh1OfzfZkX7HQ6/05EXYgI+/btu+F0OkeyJxaPx1edOHHirwMDAza/32/1eDzWxsbG0Eo4AEBNTc20XC5fCIVCFkTcJAiC0ufzXX8B7HQ630bEj4kI9u/f/1Vra+uDXKk8c+bM5mg0aigvLxdLS0tjs7OzmomJCcWmTZvC2Vqe5+eVSuVsIBDgGWNNgiCI/f393z8Ht7e3M8bYABGBw+Hw7N69ezQXtL+/X3f9+vUmxtjygQMHvqqurp7o6+urnJ2d1eh0uocGg+FRto/ZbF5IJpNPRVE0ElGbyWT6KBAIpAkAgDHWiYhQU1MT6ujo8OfbONeuXatDRBAEYdhiscQsFkusvr5+mIjgxo0bdfn89uzZ47fZbCOICHq9vhMAgFwuFxLRSQCAHTt2BPI5X758uXpiYqKsqKjokdPpHFyxRIMqlerR5ORk2dWrV6vz+Tc3NwcYY8Bx3EmXy4U0OjraDABgNBqj69evz3lklpaWaHBw0MYYA4fD8Z1SqXyWGVMoFM9aWlq+4zgOhoaGbEtLS5QrRmVl5U96vT5KRBCPx5sJEVsRESorK8V8sz179uzmeDxeYjAYJrdt2/Zj9rjdbv9Rp9NNLi4ully8eHFzvjg8z4tEBDKZrJUQsVECT+cSDw8Pq4PB4DqO41Lt7e2efEF37drl4TguFQqF1gWDQU0ujcVimZbKawMhYgUigtlsjuUSh0IhHRFBbW1tYO3atXP5wFarda6qquoHjuNgbGxMl0tjNBpjUgleyyFiKRFBpvZmm0wmSxERLC8v04ULFzZkandHR4cXAODSpUvPn6XTaYaIIJPJlnPFUqlUT6VmUsplnPKZzWabunXrFgSDQRsRwQq9V1qKNzLPAQCICKxW61S+eBkdl06n54lIG4vF5GvWrElkCysqKuYOHjz439HRUV0ikVjl9Xo3ZAciIhAEwatQKH7meX6K5/mcS7K4uCiXwPMcEd0jIq0oisW5wBl4RUXFHACA1+vdwHHcC+C2trbvf6tzTU5OFkvZGiUi+hYR4d69e9pC2l5Ww3/h/8ssEolopVb5LSHi59LuNf1ecKFwURRNjDEAgC+orKzsNiLC9PS0fnh4WF1IgJWpLvSt79+/r56bm9MTETQ3N39N3d3daUTsAgDo6emx/b9SPTg4aJNORJfdbk/9ssXm509L6V535cqV6lcBIyJI6ctrbre7+sGDB+sAAJLJ5Onn/TgQCKQFQYggYpsoikaVSvWTyWTKWcn8fv9ryWSyqLe3983bt2+/SUSg0Wim6uvrQ7n0d+/eff3OnTt2acLvHT9+fOBXNxCfz3d348aNSkRsGhkZseaDazSamYcPH/4xkUgUMcZArVZPORyOb0pKShK5oG63e4e0kz85duzYx3lvmZ2dnacQsZOIYMuWLZ6dO3f64XdYb29vtc/na5SuuqePHDny/ktvmX19fV82NDQoGWNNkUjEGIlEihQKxRO1Wv2kEODY2Jjm5s2bQjAYXC+l95Ourq6ugi/0R48efRcA/pU5p1qtNsrzfLi8vHxar9fHVSrV00wZnJmZ+UM4HNZGIpHXFxYW9JmvDkR87/Dhw/9+5U8Yl8tFiUTiMGPsH5mzyxj71U7ObhDSkTlSV1f3T7vd/uqfMNkTSKVSmxHxL4jYSEQ8EZVKoHlEHCMiDwB8KgjCNy8DZux/ivJJxnpJh8sAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/zoomExtends.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/zoomExtends.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffARwOJgNYWjpZAAAGOElEQVRIx62XUUxUZxbH//9zJxkI4DgRMoxBRsVddDqYQFgHBTvsCxfZXdyYaBoSY9o0PLgm3YZd9EH70D5tu6Q18cmsNtm3No0+rGsYQQK60GABNcI4oxg7M8lepuNlABUdsXP7wL3jQIvF2pNMvnvvd+75fd+Zc853Ltvb2yEiIAkA2WvrniQSiQQB7Cb5BwD1IrIFgNOcTwGYJDlE8oJhGFe/afvCAAACMLAoBGCQ+HP/+zAMA7Zc0HLg1NSUkPwrya7lczmji6RLROoB/B0A6r5o6wDw2chbX2YMEwoAGWQgIotgy6CIZHcMAIlE4m2SZ62FrV+/XvN6vTGv15vYuHHj7Nq1a9MAMDMzY49Go45IJOIKh8Plmqa5RaQrk8l01X3V9s43B778HFkxsvZ5+PDhJVBzpx+SPEES27dvjzQ1NYVqamqSWIXcvHmzpK+vzxsKhSpNj3w0sv+rD2C6/Y9X/gKSUPx+f3bHJvQzkp0k0dTUNHzkyJFht9s9j1VKaWnp/M6dO6OPHz9+Ho1Gy0QkUBb2Of/vvd1NEpVx/4/BU1NT/xCRDpJoa2vrPXDgQBi/UKqqqhJ2u30mEolsJllXdvuNgilvpKcyvmMRXFdXBxGBpmlvk/xYRHDo0KFLLS0t9/GaUlFRkSooKNBDoVCFoij1ZeE3YgUFBTdILgaXpmmKiJwliebm5iFVVb89duxYu+WJ1tbWoN/vj64GNjIy4unu7lat++PHj5+enp4eGhgY2AXgbDKZ/LfL5fpezP/2PZKoqqqKHDx4cNxKlVeFAkBtbW10z549QRHJBu2+ffvGvV5vmCQURXlPRCCaplFEugBAVdWQZYAkWltbgxcuXFCvXbvmWS14dHTUc+nSJbW5uTmoKEr2+e7du0OKokBRlC5d12kTkTcBYMOGDVp1dXU2Zfbu3Rv0+/1RksGLFy+q58+fT83NzTmX572VhiICh8ORstvtTlVVgzU1NVEAQUvH6/U+cLvdWiKRcGcymTcFQAtJbNu2LZa7csu9O3bsiKbT6VR+fv4SqPWz2WzZReTl5TmfPXuWMqGwxpxgi5nvtNhI7jLBiZXcNzc353z06BFOnTp1+mVuPnr0aLthGM6V5jdv3pwYHh4GyZ02kr8hCY/HM7vSC7mB8jIxg2fF+bKyslnTzm9tJJ0iAqv2rgRejeSecj8la9asSZu2nLafU34V+GpsZc8FACmSmJ2dtb+uq38O/PDhQ7tpKyUk74oIYrGY49cAv0xP0zSHmRl3bCS/Jtlw9+5dV21t7dRPveBwOFJ5eXnOzs7O9lzjiqIs6VyKi4uxsLCQWgkci8Vcpv7XIiL/BYBIJFK+vAIBwNjYmCcvL8+5sLCQyoXabLYf5fTz589TdrvdOT4+7gEAa8wBlyuKAhG5aCN5xeyr3Ldu3Squqqp6AADBYFAlGezp6VGbmpqC1dXVq6rX4+PjnsHBQZVkcHBwUPX5fKcBYHJysnh6etpttj5XpbS01CDZAQD9/f3e3Jx8VSgA+Hy+aENDQ9CEZ5+PjY15Tc90rFu3LiPm5EnT3VvPnTvny23oent71Rs3bqz6kJiYmLB2nLXR19fnu3///lZT5SRJ8MSJExARJJPJd0ieURQF+/fvDzY0NETxK8j169c9vb29KkkYhvGu0+k8YxgGlMbGRpBEUVHR9fn5+QKS9eFweEtRUdGD8vLy2deF9vX1Wbv/ZLyx/2NPYttiRgQCgWxUFhYW9jx58sRJsi4cDm9Jp9PpysrK734JtL+/3zc0NPR7M5hOTjQOdJBE+dTWxZoeCASWNOiFhYXdT58+LRCR+ng8viEejxfm5+fPFxcXr6rTvHfvXsnly5d/Fw6Hq83U++R249UOkcXDw/Pd4o5tuVFsjSUlJZ26rkcA/OvOnTuVk5OTlS6XS6uoqIhu2rQp4Xa754qKitJWGUwmk2ui0agrHo97ZmZm3DmNwruhwJUzQmXxK4Ivqppt+YoNw7DgZ3Rd/xzA+wD+qeu6W9d19+jo6JLjL7eoWNeGYfyN5KehwJWM0NSDIGN8vzI4V0pKSjIi0qXr+qcAGkj+yTCMXSQrDMNwmodCCsA9ERki+R8A/5toHMgoVAASxItcFr4osT8Aaa5QMU/uqTYAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/timeline/delete.png": {
"title": "$:/plugins/felixhayashi/vis/img/timeline/delete.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAl2cEFnAAAAEAAAABAAXMatwwAAAVRJREFUOMt108FKG1EUBuBvYtxbRGwxiGBXeYCW0mVpDSKVvIJ0F/syJsFdn6GCkaZ9gro3G1u0ILQgheJKRUwXPQNnxvTAcGf+c/7/nPvfO8UEKLCFJg5w31aNqGtgG3c4xLSZyP0QgI8Tpu0quQhyPwTgsBnkAVYD3MM9DibVId5GbiW+B+VIt7hJha1IdhPWDayVsBvcFtHlDYZ4mgou8D7e+zXyN/TwuUhjbkSXLHIZ61KNvItxaYyayBDrZsf36DyGdilQE+ngA57UyD+xg08luTSxHvP/wRuRewDm7uV9WJ4hsBy5rczJJm7G/tcS6VesjxN2Hj4c5S10Qj2Tz/AunrOEr0VtB+Z6vMJ+zfkfcVQjnMbRvcRC5B/hBU4auMbVjBFHCRsFdp6wK1yXHjz37xItRuejfFQ1nwb4HXVfs4nPYsQv0p+oKlLgNf7gGP4Cw4ZUK7kMJVEAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA1LTE2VDExOjM1OjIxKzAyOjAw9uVF5gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wNS0xNlQxMTozNToyMSswMjowMIe4/VoAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/readme": {
"title": "$:/plugins/felixhayashi/vis/readme",
"text": "! TW5-Vis.js\n\nA tiddlywiki plugin for the vis.js library.\n\n---\n\n! Notes on Copyright\n\n!! TiddlyWiki\n\nCreated by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007 Copyright © UnaMesa Association 2007-2014\n\nPublished under the following [licenses](https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses):\n\n1. BSD 3-clause \"New\" or \"Revised\" License (including any right to adopt any future version of a license if permitted)\n2. Creative Commons Attribution 3.0 (including any right to adopt any future version of a license if permitted)\n\n!! The **vis.js** library\n\nCopyright (c) 2014 [Almende B.V.](https://github.com/almende/vis)\n\nPublished under the following licenses:\n\n1. Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n2. MIT License (MIT)\n"
},
"$:/plugins/felixhayashi/vis/vis.css": {
"title": "$:/plugins/felixhayashi/vis/vis.css",
"type": "text/vnd.tiddlywiki",
"tags": "$:/tags/Stylesheet",
"text": "\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}}/>\n\\end\n\n.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=<<datauri \"$:/plugins/felixhayashi/vis/span\">>]{min-height:0;width:auto}.vis.timeline.root{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right,.vis.timeline .vispanel.top,.vis.timeline .vispanel.bottom{border:1px #bfbfbf}.vis.timeline .vispanel.center,.vis.timeline .vispanel.left,.vis.timeline .vispanel.right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis.timeline .vispanel.center,.vis.timeline .vispanel.top,.vis.timeline .vispanel.bottom{border-left-style:solid;border-right-style:solid}.vis.timeline .background{overflow:hidden}.vis.timeline .vispanel>.content{position:relative}.vis.timeline .vispanel .shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,0.8)}.vis.timeline .vispanel .shadow.top{top:-1px;left:0}.vis.timeline .vispanel .shadow.bottom{bottom:-1px;left:0}.vis.timeline .labelset{position:relative;overflow:hidden;box-sizing:border-box}.vis.timeline .labelset .vlabel{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box}.vis.timeline .labelset .vlabel{border-bottom:1px solid #bfbfbf}.vis.timeline .labelset .vlabel:last-child{border-bottom:0}.vis.timeline .labelset .vlabel .inner{display:inline-block;padding:5px}.vis.timeline .labelset .vlabel .inner.hidden{padding:0}.vis.timeline .itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis.timeline .itemset .background,.vis.timeline .itemset .foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis.timeline .axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis.timeline .foreground .group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis.timeline .foreground .group:last-child{border-bottom:0}.vis.timeline .item{position:absolute;color:#1a1a1a;border-color:#97b0f8;border-width:1px;background-color:#d5ddf6;display:inline-block;padding:5px}.vis.timeline .item.selected{border-color:#ffc200;background-color:#fff785;z-index:2}.vis.timeline .editable .item.selected{cursor:move}.vis.timeline .item.point.selected{background-color:#fff785}.vis.timeline .item.box{text-align:center;border-style:solid;border-radius:2px}.vis.timeline .item.point{background:0}.vis.timeline .item.dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis.timeline .item.range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis.timeline .item.background{overflow:hidden;border:0;background-color:rgba(213,221,246,0.4);box-sizing:border-box;padding:0;margin:0}.vis.timeline .item.range .content{position:relative;display:inline-block;max-width:100%;overflow:hidden}.vis.timeline .item.background .content{position:absolute;display:inline-block;overflow:hidden;max-width:100%;margin:5px}.vis.timeline .item.line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis.timeline .item .content{white-space:nowrap;overflow:hidden}.vis.timeline .item .delete{background:url(<<datauri \"$:/plugins/felixhayashi/vis/img/timeline/delete.png\">>) no-repeat top center;position:absolute;width:24px;height:24px;top:0;right:-24px;cursor:pointer}.vis.timeline .item.range .drag-left{position:absolute;width:24px;height:100%;top:0;left:-4px;cursor:w-resize}.vis.timeline .item.range .drag-right{position:absolute;width:24px;height:100%;top:0;right:-4px;cursor:e-resize}.vis.timeline .timeaxis{position:relative;overflow:hidden}.vis.timeline .timeaxis.foreground{top:0;left:0;width:100%}.vis.timeline .timeaxis.background{position:absolute;top:0;left:0;width:100%;height:100%}.vis.timeline .timeaxis .text{position:absolute;color:#4d4d4d;padding:3px;white-space:nowrap}.vis.timeline .timeaxis .text.measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis.timeline .timeaxis .grid.vertical{position:absolute;border-left:1px solid}.vis.timeline .timeaxis .grid.minor{border-color:#e5e5e5}.vis.timeline .timeaxis .grid.major{border-color:#bfbfbf}.vis.timeline .currenttime{background-color:#ff7f6e;width:2px;z-index:1}.vis.timeline .customtime{background-color:#6e94ff;width:2px;cursor:move;z-index:1}.vis.timeline .vispanel.background.horizontal .grid.horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis.timeline .vispanel.background.horizontal .grid.minor{border-color:#e5e5e5}.vis.timeline .vispanel.background.horizontal .grid.major{border-color:#bfbfbf}.vis.timeline .dataaxis .yAxis.major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis.timeline .dataaxis .yAxis.major.measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis.timeline .dataaxis .yAxis.minor.measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis.timeline .dataaxis .yAxis.title.measure{padding:0;margin:0;visibility:hidden;width:auto}.vis.timeline .dataaxis .yAxis.title.left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis.timeline .dataaxis .yAxis.title.right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis.timeline .legend{background-color:rgba(247,252,255,0.65);padding:5px;border-color:#b3b3b3;border-style:solid;border-width:1px;box-shadow:2px 2px 10px rgba(154,154,154,0.55)}.vis.timeline .legendText{white-space:nowrap;display:inline-block}.vis.timeline .graphGroup0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis.timeline .graphGroup1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis.timeline .graphGroup2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis.timeline .graphGroup3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis.timeline .graphGroup4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis.timeline .graphGroup5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis.timeline .graphGroup6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis.timeline .graphGroup7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis.timeline .graphGroup8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis.timeline .graphGroup9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis.timeline .fill{fill-opacity:.1;stroke:none}.vis.timeline .bar{fill-opacity:.5;stroke-width:1px}.vis.timeline .point{stroke-width:2px;fill-opacity:1.0}.vis.timeline .legendBackground{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis.timeline .outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis.timeline .iconFill{fill-opacity:.3;stroke:none}div.network-manipulationDiv{border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr=<<datauri \"$:/plugins/felixhayashi/vis/#fcfcfc\">>,GradientType=0);position:absolute;left:0;top:0;width:100%;height:30px}div.network-manipulation-editMode{position:absolute;left:0;top:0;height:30px;margin-top:20px}div.network-manipulation-closeDiv{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/cross.png\">>);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-manipulation-closeDiv:hover{opacity:.6}span.network-manipulationUI{font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin:-14px 0 0 10px;vertical-align:middle;cursor:pointer;padding:0 8px 0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}span.network-manipulationUI:hover{box-shadow:1px 1px 8px rgba(0,0,0,0.20)}span.network-manipulationUI:active{box-shadow:1px 1px 8px rgba(0,0,0,0.50)}span.network-manipulationUI.back{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/backIcon.png\">>)}span.network-manipulationUI.none:hover{box-shadow:1px 1px 8px rgba(0,0,0,0.0);cursor:default}span.network-manipulationUI.none:active{box-shadow:1px 1px 8px rgba(0,0,0,0.0)}span.network-manipulationUI.none{padding:0}span.network-manipulationUI.notification{margin:2px;font-weight:bold}span.network-manipulationUI.add{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/addNodeIcon.png\">>)}span.network-manipulationUI.edit{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/editIcon.png\">>)}span.network-manipulationUI.edit.editmode{background-color:#fcfcfc;border-style:solid;border-width:1px;border-color:#ccc}span.network-manipulationUI.connect{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/connectIcon.png\">>)}span.network-manipulationUI.delete{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/deleteIcon.png\">>)}span.network-manipulationLabel{margin:0 0 0 23px;line-height:25px}div.network-seperatorLine{display:inline-block;width:1px;height:20px;background-color:#bdbdbd;margin:5px 7px 0 15px}div.network-navigation_wrapper{position:absolute;left:0;top:0;width:100%;height:100%}div.network-navigation{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.network-navigation:hover{box-shadow:0 0 3px 3px rgba(56,207,21,0.30)}div.network-navigation:active{box-shadow:0 0 1px 3px rgba(56,207,21,0.95)}div.network-navigation.up{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/upArrow.png\">>);bottom:50px;left:55px}div.network-navigation.down{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/downArrow.png\">>);bottom:10px;left:55px}div.network-navigation.left{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/leftArrow.png\">>);bottom:10px;left:15px}div.network-navigation.right{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/rightArrow.png\">>);bottom:10px;left:95px}div.network-navigation.zoomIn{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/plus.png\">>);bottom:10px;right:15px}div.network-navigation.zoomOut{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/minus.png\">>);bottom:10px;right:55px}div.network-navigation.zoomExtends{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/zoomExtends.png\">>);bottom:50px;right:15px}div.network-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid;box-shadow:3px 3px 10px rgba(128,128,128,0.5)}"
},
"$:/plugins/felixhayashi/vis/vis.js": {
"text": "/*\\\ntitle: $:/plugins/felixhayashi/vis/vis.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\\*/\n\n\"use strict\";(function webpackUniversalModuleDefinition(root,factory){if(typeof exports===\"object\"&&typeof module===\"object\")module.exports=factory();else if(typeof define===\"function\"&&define.amd)define(factory);else if(typeof exports===\"object\")exports[\"vis\"]=factory();else root[\"vis\"]=factory()})(this,function(){return function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={exports:{},id:moduleId,loaded:false};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.loaded=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.p=\"\";return __webpack_require__(0)}([function(module,exports,__webpack_require__){exports.util=__webpack_require__(1);exports.DOMutil=__webpack_require__(2);exports.DataSet=__webpack_require__(3);exports.DataView=__webpack_require__(4);exports.Queue=__webpack_require__(5);exports.Graph3d=__webpack_require__(6);exports.graph3d={Camera:__webpack_require__(7),Filter:__webpack_require__(8),Point2d:__webpack_require__(9),Point3d:__webpack_require__(10),Slider:__webpack_require__(11),StepNumber:__webpack_require__(12)};exports.Timeline=__webpack_require__(13);exports.Graph2d=__webpack_require__(14);exports.timeline={DateUtil:__webpack_require__(15),DataStep:__webpack_require__(16),Range:__webpack_require__(17),stack:__webpack_require__(18),TimeStep:__webpack_require__(19),components:{items:{Item:__webpack_require__(20),BackgroundItem:__webpack_require__(21),BoxItem:__webpack_require__(22),PointItem:__webpack_require__(23),RangeItem:__webpack_require__(24)},Component:__webpack_require__(25),CurrentTime:__webpack_require__(26),CustomTime:__webpack_require__(27),DataAxis:__webpack_require__(28),GraphGroup:__webpack_require__(29),Group:__webpack_require__(30),BackgroundGroup:__webpack_require__(31),ItemSet:__webpack_require__(32),Legend:__webpack_require__(33),LineGraph:__webpack_require__(34),TimeAxis:__webpack_require__(35)}};exports.Network=__webpack_require__(36);exports.network={Edge:__webpack_require__(37),Groups:__webpack_require__(38),Images:__webpack_require__(39),Node:__webpack_require__(40),Popup:__webpack_require__(41),dotparser:__webpack_require__(42),gephiParser:__webpack_require__(43)};exports.Graph=function(){throw new Error(\"Graph is renamed to Network. Please create a graph as new vis.Network(...)\")};exports.moment=__webpack_require__(44);exports.hammer=__webpack_require__(45)},function(module,exports,__webpack_require__){var moment=__webpack_require__(44);exports.isNumber=function(object){return object instanceof Number||typeof object==\"number\"};exports.giveRange=function(min,max,total,value){if(max==min){return.5}else{var scale=1/(max-min);return Math.max(0,(value-min)*scale)}};exports.isString=function(object){return object instanceof String||typeof object==\"string\"};exports.isDate=function(object){if(object instanceof Date){return true}else if(exports.isString(object)){var match=ASPDateRegex.exec(object);if(match){return true}else if(!isNaN(Date.parse(object))){return true}}return false};exports.isDataTable=function(object){return typeof google!==\"undefined\"&&google.visualization&&google.visualization.DataTable&&object instanceof google.visualization.DataTable};exports.randomUUID=function(){var S4=function(){return Math.floor(Math.random()*65536).toString(16)};return S4()+S4()+\"-\"+S4()+\"-\"+S4()+\"-\"+S4()+\"-\"+S4()+S4()+S4()};exports.extend=function(a,b){for(var i=1,len=arguments.length;i<len;i++){var other=arguments[i];for(var prop in other){if(other.hasOwnProperty(prop)){a[prop]=other[prop]}}}return a};exports.selectiveExtend=function(props,a,b){if(!Array.isArray(props)){throw new Error(\"Array with property names expected as first argument\")}for(var i=2;i<arguments.length;i++){var other=arguments[i];for(var p=0;p<props.length;p++){var prop=props[p];if(other.hasOwnProperty(prop)){a[prop]=other[prop]}}}return a};exports.selectiveDeepExtend=function(props,a,b){if(Array.isArray(b)){throw new TypeError(\"Arrays are not supported by deepExtend\")}for(var i=2;i<arguments.length;i++){var other=arguments[i];for(var p=0;p<props.length;p++){var prop=props[p];if(other.hasOwnProperty(prop)){if(b[prop]&&b[prop].constructor===Object){if(a[prop]===undefined){a[prop]={}}if(a[prop].constructor===Object){exports.deepExtend(a[prop],b[prop])}else{a[prop]=b[prop]}}else if(Array.isArray(b[prop])){throw new TypeError(\"Arrays are not supported by deepExtend\")}else{a[prop]=b[prop]}}}}return a};exports.selectiveNotDeepExtend=function(props,a,b){if(Array.isArray(b)){throw new TypeError(\"Arrays are not supported by deepExtend\")}for(var prop in b){if(b.hasOwnProperty(prop)){if(props.indexOf(prop)==-1){if(b[prop]&&b[prop].constructor===Object){if(a[prop]===undefined){a[prop]={}}if(a[prop].constructor===Object){exports.deepExtend(a[prop],b[prop])}else{a[prop]=b[prop]}}else if(Array.isArray(b[prop])){throw new TypeError(\"Arrays are not supported by deepExtend\")}else{a[prop]=b[prop]}}}}return a};exports.deepExtend=function(a,b){if(Array.isArray(b)){throw new TypeError(\"Arrays are not supported by deepExtend\")}for(var prop in b){if(b.hasOwnProperty(prop)){if(b[prop]&&b[prop].constructor===Object){if(a[prop]===undefined){a[prop]={}}if(a[prop].constructor===Object){exports.deepExtend(a[prop],b[prop])}else{a[prop]=b[prop]}}else if(Array.isArray(b[prop])){throw new TypeError(\"Arrays are not supported by deepExtend\")}else{a[prop]=b[prop]}}}return a};exports.equalArray=function(a,b){if(a.length!=b.length)return false;for(var i=0,len=a.length;i<len;i++){if(a[i]!=b[i])return false}return true};exports.convert=function(object,type){var match;if(object===undefined){return undefined}if(object===null){return null}if(!type){return object}if(!(typeof type===\"string\")&&!(type instanceof String)){throw new Error(\"Type must be a string\")}switch(type){case\"boolean\":case\"Boolean\":return Boolean(object);case\"number\":case\"Number\":return Number(object.valueOf());case\"string\":case\"String\":return String(object);case\"Date\":if(exports.isNumber(object)){return new Date(object)}if(object instanceof Date){return new Date(object.valueOf())}else if(moment.isMoment(object)){return new Date(object.valueOf())}if(exports.isString(object)){match=ASPDateRegex.exec(object);if(match){return new Date(Number(match[1]))}else{return moment(object).toDate()}}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type Date\")}case\"Moment\":if(exports.isNumber(object)){return moment(object)}if(object instanceof Date){return moment(object.valueOf())}else if(moment.isMoment(object)){return moment(object)}if(exports.isString(object)){match=ASPDateRegex.exec(object);if(match){return moment(Number(match[1]))}else{return moment(object)}}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type Date\")}case\"ISODate\":if(exports.isNumber(object)){return new Date(object)}else if(object instanceof Date){return object.toISOString()}else if(moment.isMoment(object)){return object.toDate().toISOString()}else if(exports.isString(object)){match=ASPDateRegex.exec(object);if(match){return new Date(Number(match[1])).toISOString()}else{return new Date(object).toISOString()}}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type ISODate\")}case\"ASPDate\":if(exports.isNumber(object)){return\"/Date(\"+object+\")/\"}else if(object instanceof Date){return\"/Date(\"+object.valueOf()+\")/\"}else if(exports.isString(object)){match=ASPDateRegex.exec(object);var value;if(match){value=new Date(Number(match[1])).valueOf()}else{value=new Date(object).valueOf()}return\"/Date(\"+value+\")/\"}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type ASPDate\")}default:throw new Error('Unknown type \"'+type+'\"')}};var ASPDateRegex=/^\\/?Date\\((\\-?\\d+)/i;exports.getType=function(object){var type=typeof object;if(type==\"object\"){if(object==null){return\"null\"}if(object instanceof Boolean){return\"Boolean\"}if(object instanceof Number){return\"Number\"}if(object instanceof String){return\"String\"}if(Array.isArray(object)){return\"Array\"}if(object instanceof Date){return\"Date\"}return\"Object\"}else if(type==\"number\"){return\"Number\"}else if(type==\"boolean\"){return\"Boolean\"}else if(type==\"string\"){return\"String\"}return type};exports.getAbsoluteLeft=function(elem){return elem.getBoundingClientRect().left+window.pageXOffset};exports.getAbsoluteTop=function(elem){return elem.getBoundingClientRect().top+window.pageYOffset};exports.addClassName=function(elem,className){var classes=elem.className.split(\" \");if(classes.indexOf(className)==-1){classes.push(className);elem.className=classes.join(\" \")}};exports.removeClassName=function(elem,className){var classes=elem.className.split(\" \");var index=classes.indexOf(className);if(index!=-1){classes.splice(index,1);elem.className=classes.join(\" \")}};exports.forEach=function(object,callback){var i,len;if(Array.isArray(object)){for(i=0,len=object.length;i<len;i++){callback(object[i],i,object)}}else{for(i in object){if(object.hasOwnProperty(i)){callback(object[i],i,object)}}}};exports.toArray=function(object){var array=[];for(var prop in object){if(object.hasOwnProperty(prop))array.push(object[prop])}return array};exports.updateProperty=function(object,key,value){if(object[key]!==value){object[key]=value;return true}else{return false}};exports.addEventListener=function(element,action,listener,useCapture){if(element.addEventListener){if(useCapture===undefined)useCapture=false;if(action===\"mousewheel\"&&navigator.userAgent.indexOf(\"Firefox\")>=0){action=\"DOMMouseScroll\"}element.addEventListener(action,listener,useCapture)}else{element.attachEvent(\"on\"+action,listener)}};exports.removeEventListener=function(element,action,listener,useCapture){if(element.removeEventListener){if(useCapture===undefined)useCapture=false;if(action===\"mousewheel\"&&navigator.userAgent.indexOf(\"Firefox\")>=0){action=\"DOMMouseScroll\"}element.removeEventListener(action,listener,useCapture)}else{element.detachEvent(\"on\"+action,listener)}};exports.preventDefault=function(event){if(!event)event=window.event;if(event.preventDefault){event.preventDefault()}else{event.returnValue=false}};exports.getTarget=function(event){if(!event){event=window.event}var target;if(event.target){target=event.target}else if(event.srcElement){target=event.srcElement}if(target.nodeType!=undefined&&target.nodeType==3){target=target.parentNode}return target};exports.option={};exports.option.asBoolean=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(value!=null){return value!=false}return defaultValue||null};exports.option.asNumber=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(value!=null){return Number(value)||defaultValue||null}return defaultValue||null};exports.option.asString=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(value!=null){return String(value)}return defaultValue||null};exports.option.asSize=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(exports.isString(value)){return value}else if(exports.isNumber(value)){return value+\"px\"}else{return defaultValue||null}};exports.option.asElement=function(value,defaultValue){if(typeof value==\"function\"){value=value()}return value||defaultValue||null};exports.hexToRGB=function(hex){var shorthandRegex=/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;hex=hex.replace(shorthandRegex,function(m,r,g,b){return r+r+g+g+b+b});var result=/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);return result?{r:parseInt(result[1],16),g:parseInt(result[2],16),b:parseInt(result[3],16)}:null};exports.overrideOpacity=function(color,opacity){if(color.indexOf(\"rgb\")!=-1){var rgb=color.substr(color.indexOf(\"(\")+1).replace(\")\",\"\").split(\",\");return\"rgba(\"+rgb[0]+\",\"+rgb[1]+\",\"+rgb[2]+\",\"+opacity+\")\"}else{var rgb=exports.hexToRGB(color);if(rgb==null){return color}else{return\"rgba(\"+rgb.r+\",\"+rgb.g+\",\"+rgb.b+\",\"+opacity+\")\"}}};exports.RGBToHex=function(red,green,blue){return\"#\"+((1<<24)+(red<<16)+(green<<8)+blue).toString(16).slice(1)};exports.parseColor=function(color){var c;if(exports.isString(color)){if(exports.isValidRGB(color)){var rgb=color.substr(4).substr(0,color.length-5).split(\",\");color=exports.RGBToHex(rgb[0],rgb[1],rgb[2])}if(exports.isValidHex(color)){var hsv=exports.hexToHSV(color);var lighterColorHSV={h:hsv.h,s:hsv.s*.45,v:Math.min(1,hsv.v*1.05)};var darkerColorHSV={h:hsv.h,s:Math.min(1,hsv.v*1.25),v:hsv.v*.6};var darkerColorHex=exports.HSVToHex(darkerColorHSV.h,darkerColorHSV.h,darkerColorHSV.v);var lighterColorHex=exports.HSVToHex(lighterColorHSV.h,lighterColorHSV.s,lighterColorHSV.v);c={background:color,border:darkerColorHex,highlight:{background:lighterColorHex,border:darkerColorHex},hover:{background:lighterColorHex,border:darkerColorHex}}}else{c={background:color,border:color,highlight:{background:color,border:color},hover:{background:color,border:color}}}}else{c={};c.background=color.background||\"white\";c.border=color.border||c.background;if(exports.isString(color.highlight)){c.highlight={border:color.highlight,background:color.highlight}}else{c.highlight={};c.highlight.background=color.highlight&&color.highlight.background||c.background;c.highlight.border=color.highlight&&color.highlight.border||c.border}if(exports.isString(color.hover)){c.hover={border:color.hover,background:color.hover}}else{c.hover={};c.hover.background=color.hover&&color.hover.background||c.background;c.hover.border=color.hover&&color.hover.border||c.border}}return c};exports.RGBToHSV=function(red,green,blue){red=red/255;green=green/255;blue=blue/255;var minRGB=Math.min(red,Math.min(green,blue));var maxRGB=Math.max(red,Math.max(green,blue));if(minRGB==maxRGB){return{h:0,s:0,v:minRGB}}var d=red==minRGB?green-blue:blue==minRGB?red-green:blue-red;var h=red==minRGB?3:blue==minRGB?1:5;var hue=60*(h-d/(maxRGB-minRGB))/360;var saturation=(maxRGB-minRGB)/maxRGB;var value=maxRGB;return{h:hue,s:saturation,v:value}};var cssUtil={split:function(cssText){var styles={};cssText.split(\";\").forEach(function(style){if(style.trim()!=\"\"){var parts=style.split(\":\");var key=parts[0].trim();var value=parts[1].trim();styles[key]=value}});return styles},join:function(styles){return Object.keys(styles).map(function(key){return key+\": \"+styles[key]}).join(\"; \")}};exports.addCssText=function(element,cssText){var currentStyles=cssUtil.split(element.style.cssText);var newStyles=cssUtil.split(cssText);var styles=exports.extend(currentStyles,newStyles);element.style.cssText=cssUtil.join(styles)};exports.removeCssText=function(element,cssText){var styles=cssUtil.split(element.style.cssText);var removeStyles=cssUtil.split(cssText);for(var key in removeStyles){if(removeStyles.hasOwnProperty(key)){delete styles[key]}}element.style.cssText=cssUtil.join(styles)};exports.HSVToRGB=function(h,s,v){var r,g,b;var i=Math.floor(h*6);var f=h*6-i;var p=v*(1-s);var q=v*(1-f*s);var t=v*(1-(1-f)*s);switch(i%6){case 0:r=v,g=t,b=p;break;case 1:r=q,g=v,b=p;break;case 2:r=p,g=v,b=t;break;case 3:r=p,g=q,b=v;break;case 4:r=t,g=p,b=v;break;case 5:r=v,g=p,b=q;break}return{r:Math.floor(r*255),g:Math.floor(g*255),b:Math.floor(b*255)}};exports.HSVToHex=function(h,s,v){var rgb=exports.HSVToRGB(h,s,v);return exports.RGBToHex(rgb.r,rgb.g,rgb.b)};exports.hexToHSV=function(hex){var rgb=exports.hexToRGB(hex);return exports.RGBToHSV(rgb.r,rgb.g,rgb.b)};exports.isValidHex=function(hex){var isOk=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex);return isOk};exports.isValidRGB=function(rgb){rgb=rgb.replace(\" \",\"\");var isOk=/rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)/i.test(rgb);return isOk};exports.selectiveBridgeObject=function(fields,referenceObject){if(typeof referenceObject==\"object\"){var objectTo=Object.create(referenceObject);for(var i=0;i<fields.length;i++){if(referenceObject.hasOwnProperty(fields[i])){if(typeof referenceObject[fields[i]]==\"object\"){objectTo[fields[i]]=exports.bridgeObject(referenceObject[fields[i]])}}}return objectTo}else{return null}};exports.bridgeObject=function(referenceObject){if(typeof referenceObject==\"object\"){var objectTo=Object.create(referenceObject);for(var i in referenceObject){if(referenceObject.hasOwnProperty(i)){if(typeof referenceObject[i]==\"object\"){objectTo[i]=exports.bridgeObject(referenceObject[i])}}}return objectTo}else{return null}};exports.mergeOptions=function(mergeTarget,options,option){if(options[option]!==undefined){if(typeof options[option]==\"boolean\"){mergeTarget[option].enabled=options[option]}else{mergeTarget[option].enabled=true;for(var prop in options[option]){if(options[option].hasOwnProperty(prop)){mergeTarget[option][prop]=options[option][prop]}}}}};exports.binarySearchCustom=function(orderedItems,searchFunction,field,field2){var maxIterations=1e4;var iteration=0;var low=0;var high=orderedItems.length-1;while(low<=high&&iteration<maxIterations){var middle=Math.floor((low+high)/2);var item=orderedItems[middle];var value=field2===undefined?item[field]:item[field][field2];var searchResult=searchFunction(value);if(searchResult==0){return middle}else if(searchResult==-1){low=middle+1}else{high=middle-1}iteration++}return-1};exports.binarySearchValue=function(orderedItems,target,field,sidePreference){var maxIterations=1e4;var iteration=0;var low=0;var high=orderedItems.length-1;var prevValue,value,nextValue,middle;while(low<=high&&iteration<maxIterations){middle=Math.floor(.5*(high+low));prevValue=orderedItems[Math.max(0,middle-1)][field];value=orderedItems[middle][field];nextValue=orderedItems[Math.min(orderedItems.length-1,middle+1)][field];if(value==target){return middle}else if(prevValue<target&&value>target){return sidePreference==\"before\"?Math.max(0,middle-1):middle}else if(value<target&&nextValue>target){return sidePreference==\"before\"?middle:Math.min(orderedItems.length-1,middle+1)}else{if(value<target){low=middle+1}else{high=middle-1}}iteration++}return-1};exports.easeInOutQuad=function(t,start,end,duration){var change=end-start;t/=duration/2;if(t<1)return change/2*t*t+start;t--;return-change/2*(t*(t-2)-1)+start};exports.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return t<.5?2*t*t:-1+(4-2*t)*t},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}}},function(module,exports,__webpack_require__){exports.prepareElements=function(JSONcontainer){for(var elementType in JSONcontainer){if(JSONcontainer.hasOwnProperty(elementType)){JSONcontainer[elementType].redundant=JSONcontainer[elementType].used;JSONcontainer[elementType].used=[]}}};exports.cleanupElements=function(JSONcontainer){for(var elementType in JSONcontainer){if(JSONcontainer.hasOwnProperty(elementType)){if(JSONcontainer[elementType].redundant){for(var i=0;i<JSONcontainer[elementType].redundant.length;i++){JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i])}JSONcontainer[elementType].redundant=[]}}}};exports.getSVGElement=function(elementType,JSONcontainer,svgContainer){var element;if(JSONcontainer.hasOwnProperty(elementType)){if(JSONcontainer[elementType].redundant.length>0){element=JSONcontainer[elementType].redundant[0];JSONcontainer[elementType].redundant.shift()}else{element=document.createElementNS(\"http://www.w3.org/2000/svg\",elementType);svgContainer.appendChild(element)}}else{element=document.createElementNS(\"http://www.w3.org/2000/svg\",elementType);JSONcontainer[elementType]={used:[],redundant:[]};svgContainer.appendChild(element)}JSONcontainer[elementType].used.push(element);return element};exports.getDOMElement=function(elementType,JSONcontainer,DOMContainer,insertBefore){var element;if(JSONcontainer.hasOwnProperty(elementType)){if(JSONcontainer[elementType].redundant.length>0){element=JSONcontainer[elementType].redundant[0];JSONcontainer[elementType].redundant.shift()}else{element=document.createElement(elementType);if(insertBefore!==undefined){DOMContainer.insertBefore(element,insertBefore)}else{DOMContainer.appendChild(element)}}}else{element=document.createElement(elementType);JSONcontainer[elementType]={used:[],redundant:[]};if(insertBefore!==undefined){DOMContainer.insertBefore(element,insertBefore)}else{DOMContainer.appendChild(element)}}JSONcontainer[elementType].used.push(element);return element};exports.drawPoint=function(x,y,group,JSONcontainer,svgContainer){var point;if(group.options.drawPoints.style==\"circle\"){point=exports.getSVGElement(\"circle\",JSONcontainer,svgContainer);point.setAttributeNS(null,\"cx\",x);point.setAttributeNS(null,\"cy\",y);point.setAttributeNS(null,\"r\",.5*group.options.drawPoints.size)}else{point=exports.getSVGElement(\"rect\",JSONcontainer,svgContainer);point.setAttributeNS(null,\"x\",x-.5*group.options.drawPoints.size);point.setAttributeNS(null,\"y\",y-.5*group.options.drawPoints.size);point.setAttributeNS(null,\"width\",group.options.drawPoints.size);point.setAttributeNS(null,\"height\",group.options.drawPoints.size)}if(group.options.drawPoints.styles!==undefined){point.setAttributeNS(null,\"style\",group.group.options.drawPoints.styles)}point.setAttributeNS(null,\"class\",group.className+\" point\");return point};exports.drawBar=function(x,y,width,height,className,JSONcontainer,svgContainer){if(height!=0){if(height<0){height*=-1;y-=height}var rect=exports.getSVGElement(\"rect\",JSONcontainer,svgContainer);rect.setAttributeNS(null,\"x\",x-.5*width);rect.setAttributeNS(null,\"y\",y);rect.setAttributeNS(null,\"width\",width);rect.setAttributeNS(null,\"height\",height);rect.setAttributeNS(null,\"class\",className)}}},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Queue=__webpack_require__(5);function DataSet(data,options){if(data&&!Array.isArray(data)&&!util.isDataTable(data)){options=data;data=null}this._options=options||{};this._data={};this.length=0;this._fieldId=this._options.fieldId||\"id\";this._type={};if(this._options.type){for(var field in this._options.type){if(this._options.type.hasOwnProperty(field)){var value=this._options.type[field];if(value==\"Date\"||value==\"ISODate\"||value==\"ASPDate\"){this._type[field]=\"Date\"}else{this._type[field]=value}}}}if(this._options.convert){throw new Error('Option \"convert\" is deprecated. Use \"type\" instead.')}this._subscribers={};if(data){this.add(data)}this.setOptions(options)}DataSet.prototype.setOptions=function(options){if(options&&options.queue!==undefined){if(options.queue===false){if(this._queue){this._queue.destroy();delete this._queue}}else{if(!this._queue){this._queue=Queue.extend(this,{replace:[\"add\",\"update\",\"remove\"]})}if(typeof options.queue===\"object\"){this._queue.setOptions(options.queue)}}}};DataSet.prototype.on=function(event,callback){var subscribers=this._subscribers[event];if(!subscribers){subscribers=[];this._subscribers[event]=subscribers}subscribers.push({callback:callback})};DataSet.prototype.subscribe=DataSet.prototype.on;DataSet.prototype.off=function(event,callback){var subscribers=this._subscribers[event];if(subscribers){this._subscribers[event]=subscribers.filter(function(listener){return listener.callback!=callback})}};DataSet.prototype.unsubscribe=DataSet.prototype.off;DataSet.prototype._trigger=function(event,params,senderId){if(event==\"*\"){throw new Error(\"Cannot trigger event *\")}var subscribers=[];if(event in this._subscribers){subscribers=subscribers.concat(this._subscribers[event])}if(\"*\"in this._subscribers){subscribers=subscribers.concat(this._subscribers[\"*\"])}for(var i=0;i<subscribers.length;i++){var subscriber=subscribers[i];if(subscriber.callback){subscriber.callback(event,params,senderId||null)}}};DataSet.prototype.add=function(data,senderId){var addedIds=[],id,me=this;if(Array.isArray(data)){for(var i=0,len=data.length;i<len;i++){id=me._addItem(data[i]);addedIds.push(id)}}else if(util.isDataTable(data)){var columns=this._getColumnNames(data);for(var row=0,rows=data.getNumberOfRows();row<rows;row++){var item={};for(var col=0,cols=columns.length;col<cols;col++){var field=columns[col];item[field]=data.getValue(row,col)}id=me._addItem(item);addedIds.push(id)}}else if(data instanceof Object){id=me._addItem(data);addedIds.push(id)}else{throw new Error(\"Unknown dataType\")}if(addedIds.length){this._trigger(\"add\",{items:addedIds},senderId)}return addedIds};DataSet.prototype.update=function(data,senderId){var addedIds=[];var updatedIds=[];var updatedData=[];var me=this;var fieldId=me._fieldId;var addOrUpdate=function(item){var id=item[fieldId];if(me._data[id]){id=me._updateItem(item);updatedIds.push(id);updatedData.push(item)}else{id=me._addItem(item);addedIds.push(id)}};if(Array.isArray(data)){for(var i=0,len=data.length;i<len;i++){addOrUpdate(data[i])}}else if(util.isDataTable(data)){var columns=this._getColumnNames(data);for(var row=0,rows=data.getNumberOfRows();row<rows;row++){var item={};for(var col=0,cols=columns.length;col<cols;col++){var field=columns[col];item[field]=data.getValue(row,col)}addOrUpdate(item)}}else if(data instanceof Object){addOrUpdate(data)}else{throw new Error(\"Unknown dataType\")}if(addedIds.length){this._trigger(\"add\",{items:addedIds},senderId)}if(updatedIds.length){this._trigger(\"update\",{items:updatedIds,data:updatedData},senderId)}return addedIds.concat(updatedIds)};DataSet.prototype.get=function(args){var me=this;var id,ids,options,data;var firstType=util.getType(arguments[0]);if(firstType==\"String\"||firstType==\"Number\"){id=arguments[0];options=arguments[1];data=arguments[2]}else if(firstType==\"Array\"){ids=arguments[0];options=arguments[1];data=arguments[2]}else{options=arguments[0];data=arguments[1]}var returnType;if(options&&options.returnType){var allowedValues=[\"DataTable\",\"Array\",\"Object\"];returnType=allowedValues.indexOf(options.returnType)==-1?\"Array\":options.returnType;if(data&&returnType!=util.getType(data)){throw new Error('Type of parameter \"data\" ('+util.getType(data)+\") \"+\"does not correspond with specified options.type (\"+options.type+\")\")}if(returnType==\"DataTable\"&&!util.isDataTable(data)){throw new Error('Parameter \"data\" must be a DataTable '+'when options.type is \"DataTable\"')}}else if(data){returnType=util.getType(data)==\"DataTable\"?\"DataTable\":\"Array\"}else{returnType=\"Array\"}var type=options&&options.type||this._options.type;var filter=options&&options.filter;var items=[],item,itemId,i,len;if(id!=undefined){item=me._getItem(id,type);if(filter&&!filter(item)){item=null}}else if(ids!=undefined){for(i=0,len=ids.length;i<len;i++){item=me._getItem(ids[i],type);if(!filter||filter(item)){items.push(item)}}}else{for(itemId in this._data){if(this._data.hasOwnProperty(itemId)){item=me._getItem(itemId,type);if(!filter||filter(item)){items.push(item)}}}}if(options&&options.order&&id==undefined){this._sort(items,options.order)}if(options&&options.fields){var fields=options.fields;if(id!=undefined){item=this._filterFields(item,fields)}else{for(i=0,len=items.length;i<len;i++){items[i]=this._filterFields(items[i],fields)}}}if(returnType==\"DataTable\"){var columns=this._getColumnNames(data);if(id!=undefined){me._appendRow(data,columns,item)}else{for(i=0;i<items.length;i++){me._appendRow(data,columns,items[i])}}return data}else if(returnType==\"Object\"){var result={};for(i=0;i<items.length;i++){result[items[i].id]=items[i]}return result}else{if(id!=undefined){return item}else{if(data){for(i=0,len=items.length;i<len;i++){data.push(items[i])}return data}else{return items}}}};DataSet.prototype.getIds=function(options){var data=this._data,filter=options&&options.filter,order=options&&options.order,type=options&&options.type||this._options.type,i,len,id,item,items,ids=[];if(filter){if(order){items=[];for(id in data){if(data.hasOwnProperty(id)){item=this._getItem(id,type);if(filter(item)){items.push(item)}}}this._sort(items,order);for(i=0,len=items.length;i<len;i++){ids[i]=items[i][this._fieldId]}}else{for(id in data){if(data.hasOwnProperty(id)){item=this._getItem(id,type);if(filter(item)){ids.push(item[this._fieldId])}}}}}else{if(order){items=[];for(id in data){if(data.hasOwnProperty(id)){items.push(data[id])}}this._sort(items,order);for(i=0,len=items.length;i<len;i++){ids[i]=items[i][this._fieldId]}}else{for(id in data){if(data.hasOwnProperty(id)){item=data[id];ids.push(item[this._fieldId])}}}}return ids};DataSet.prototype.getDataSet=function(){return this};DataSet.prototype.forEach=function(callback,options){var filter=options&&options.filter,type=options&&options.type||this._options.type,data=this._data,item,id;if(options&&options.order){var items=this.get(options);for(var i=0,len=items.length;i<len;i++){item=items[i];id=item[this._fieldId];callback(item,id)}}else{for(id in data){if(data.hasOwnProperty(id)){item=this._getItem(id,type);if(!filter||filter(item)){callback(item,id)}}}}};DataSet.prototype.map=function(callback,options){var filter=options&&options.filter,type=options&&options.type||this._options.type,mappedItems=[],data=this._data,item;for(var id in data){if(data.hasOwnProperty(id)){item=this._getItem(id,type);if(!filter||filter(item)){mappedItems.push(callback(item,id))}}}if(options&&options.order){this._sort(mappedItems,options.order)}return mappedItems};DataSet.prototype._filterFields=function(item,fields){if(!item){return item}var filteredItem={};for(var field in item){if(item.hasOwnProperty(field)&&fields.indexOf(field)!=-1){filteredItem[field]=item[field]}}return filteredItem};DataSet.prototype._sort=function(items,order){if(util.isString(order)){var name=order;items.sort(function(a,b){var av=a[name];var bv=b[name];return av>bv?1:av<bv?-1:0})}else if(typeof order===\"function\"){items.sort(order)}else{throw new TypeError(\"Order must be a function or a string\")}};DataSet.prototype.remove=function(id,senderId){var removedIds=[],i,len,removedId;if(Array.isArray(id)){for(i=0,len=id.length;i<len;i++){removedId=this._remove(id[i]);if(removedId!=null){removedIds.push(removedId)}}}else{removedId=this._remove(id);if(removedId!=null){removedIds.push(removedId)}}if(removedIds.length){this._trigger(\"remove\",{items:removedIds},senderId)}return removedIds};DataSet.prototype._remove=function(id){if(util.isNumber(id)||util.isString(id)){if(this._data[id]){delete this._data[id];this.length--;return id}}else if(id instanceof Object){var itemId=id[this._fieldId];if(itemId&&this._data[itemId]){delete this._data[itemId];this.length--;return itemId}}return null};DataSet.prototype.clear=function(senderId){var ids=Object.keys(this._data);this._data={};this.length=0;this._trigger(\"remove\",{items:ids},senderId);return ids};DataSet.prototype.max=function(field){var data=this._data,max=null,maxField=null;for(var id in data){if(data.hasOwnProperty(id)){var item=data[id];var itemField=item[field];if(itemField!=null&&(!max||itemField>maxField)){max=item;maxField=itemField}}}return max};DataSet.prototype.min=function(field){var data=this._data,min=null,minField=null;for(var id in data){if(data.hasOwnProperty(id)){var item=data[id];var itemField=item[field];if(itemField!=null&&(!min||itemField<minField)){min=item;minField=itemField}}}return min};DataSet.prototype.distinct=function(field){var data=this._data;var values=[];var fieldType=this._options.type&&this._options.type[field]||null;var count=0;var i;for(var prop in data){if(data.hasOwnProperty(prop)){var item=data[prop];var value=item[field];var exists=false;for(i=0;i<count;i++){if(values[i]==value){exists=true;break}}if(!exists&&value!==undefined){values[count]=value;count++}}}if(fieldType){for(i=0;i<values.length;i++){values[i]=util.convert(values[i],fieldType)}}return values};DataSet.prototype._addItem=function(item){var id=item[this._fieldId];\nif(id!=undefined){if(this._data[id]){throw new Error(\"Cannot add item: item with id \"+id+\" already exists\")}}else{id=util.randomUUID();item[this._fieldId]=id}var d={};for(var field in item){if(item.hasOwnProperty(field)){var fieldType=this._type[field];d[field]=util.convert(item[field],fieldType)}}this._data[id]=d;this.length++;return id};DataSet.prototype._getItem=function(id,types){var field,value;var raw=this._data[id];if(!raw){return null}var converted={};if(types){for(field in raw){if(raw.hasOwnProperty(field)){value=raw[field];converted[field]=util.convert(value,types[field])}}}else{for(field in raw){if(raw.hasOwnProperty(field)){value=raw[field];converted[field]=value}}}return converted};DataSet.prototype._updateItem=function(item){var id=item[this._fieldId];if(id==undefined){throw new Error(\"Cannot update item: item has no id (item: \"+JSON.stringify(item)+\")\")}var d=this._data[id];if(!d){throw new Error(\"Cannot update item: no item with id \"+id+\" found\")}for(var field in item){if(item.hasOwnProperty(field)){var fieldType=this._type[field];d[field]=util.convert(item[field],fieldType)}}return id};DataSet.prototype._getColumnNames=function(dataTable){var columns=[];for(var col=0,cols=dataTable.getNumberOfColumns();col<cols;col++){columns[col]=dataTable.getColumnId(col)||dataTable.getColumnLabel(col)}return columns};DataSet.prototype._appendRow=function(dataTable,columns,item){var row=dataTable.addRow();for(var col=0,cols=columns.length;col<cols;col++){var field=columns[col];dataTable.setValue(row,col,item[field])}};module.exports=DataSet},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var DataSet=__webpack_require__(3);function DataView(data,options){this._data=null;this._ids={};this.length=0;this._options=options||{};this._fieldId=\"id\";this._subscribers={};var me=this;this.listener=function(){me._onEvent.apply(me,arguments)};this.setData(data)}DataView.prototype.setData=function(data){var ids,i,len;if(this._data){if(this._data.unsubscribe){this._data.unsubscribe(\"*\",this.listener)}ids=[];for(var id in this._ids){if(this._ids.hasOwnProperty(id)){ids.push(id)}}this._ids={};this.length=0;this._trigger(\"remove\",{items:ids})}this._data=data;if(this._data){this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||\"id\";ids=this._data.getIds({filter:this._options&&this._options.filter});for(i=0,len=ids.length;i<len;i++){id=ids[i];this._ids[id]=true}this.length=ids.length;this._trigger(\"add\",{items:ids});if(this._data.on){this._data.on(\"*\",this.listener)}}};DataView.prototype.refresh=function(){var id;var ids=this._data.getIds({filter:this._options&&this._options.filter});var newIds={};var added=[];var removed=[];for(var i=0;i<ids.length;i++){id=ids[i];newIds[id]=true;if(!this._ids[id]){added.push(id);this._ids[id]=true;this.length++}}for(id in this._ids){if(this._ids.hasOwnProperty(id)){if(!newIds[id]){removed.push(id);delete this._ids[id];this.length--}}}if(added.length){this._trigger(\"add\",{items:added})}if(removed.length){this._trigger(\"remove\",{items:removed})}};DataView.prototype.get=function(args){var me=this;var ids,options,data;var firstType=util.getType(arguments[0]);if(firstType==\"String\"||firstType==\"Number\"||firstType==\"Array\"){ids=arguments[0];options=arguments[1];data=arguments[2]}else{options=arguments[0];data=arguments[1]}var viewOptions=util.extend({},this._options,options);if(this._options.filter&&options&&options.filter){viewOptions.filter=function(item){return me._options.filter(item)&&options.filter(item)}}var getArguments=[];if(ids!=undefined){getArguments.push(ids)}getArguments.push(viewOptions);getArguments.push(data);return this._data&&this._data.get.apply(this._data,getArguments)};DataView.prototype.getIds=function(options){var ids;if(this._data){var defaultFilter=this._options.filter;var filter;if(options&&options.filter){if(defaultFilter){filter=function(item){return defaultFilter(item)&&options.filter(item)}}else{filter=options.filter}}else{filter=defaultFilter}ids=this._data.getIds({filter:filter,order:options&&options.order})}else{ids=[]}return ids};DataView.prototype.getDataSet=function(){var dataSet=this;while(dataSet instanceof DataView){dataSet=dataSet._data}return dataSet||null};DataView.prototype._onEvent=function(event,params,senderId){var i,len,id,item,ids=params&¶ms.items,data=this._data,added=[],updated=[],removed=[];if(ids&&data){switch(event){case\"add\":for(i=0,len=ids.length;i<len;i++){id=ids[i];item=this.get(id);if(item){this._ids[id]=true;added.push(id)}}break;case\"update\":for(i=0,len=ids.length;i<len;i++){id=ids[i];item=this.get(id);if(item){if(this._ids[id]){updated.push(id)}else{this._ids[id]=true;added.push(id)}}else{if(this._ids[id]){delete this._ids[id];removed.push(id)}else{}}}break;case\"remove\":for(i=0,len=ids.length;i<len;i++){id=ids[i];if(this._ids[id]){delete this._ids[id];removed.push(id)}}break}this.length+=added.length-removed.length;if(added.length){this._trigger(\"add\",{items:added},senderId)}if(updated.length){this._trigger(\"update\",{items:updated},senderId)}if(removed.length){this._trigger(\"remove\",{items:removed},senderId)}}};DataView.prototype.on=DataSet.prototype.on;DataView.prototype.off=DataSet.prototype.off;DataView.prototype._trigger=DataSet.prototype._trigger;DataView.prototype.subscribe=DataView.prototype.on;DataView.prototype.unsubscribe=DataView.prototype.off;module.exports=DataView},function(module,exports,__webpack_require__){function Queue(options){this.delay=null;this.max=Infinity;this._queue=[];this._timeout=null;this._extended=null;this.setOptions(options)}Queue.prototype.setOptions=function(options){if(options&&typeof options.delay!==\"undefined\"){this.delay=options.delay}if(options&&typeof options.max!==\"undefined\"){this.max=options.max}this._flushIfNeeded()};Queue.extend=function(object,options){var queue=new Queue(options);if(object.flush!==undefined){throw new Error(\"Target object already has a property flush\")}object.flush=function(){queue.flush()};var methods=[{name:\"flush\",original:undefined}];if(options&&options.replace){for(var i=0;i<options.replace.length;i++){var name=options.replace[i];methods.push({name:name,original:object[name]});queue.replace(object,name)}}queue._extended={object:object,methods:methods};return queue};Queue.prototype.destroy=function(){this.flush();if(this._extended){var object=this._extended.object;var methods=this._extended.methods;for(var i=0;i<methods.length;i++){var method=methods[i];if(method.original){object[method.name]=method.original}else{delete object[method.name]}}this._extended=null}};Queue.prototype.replace=function(object,method){var me=this;var original=object[method];if(!original){throw new Error(\"Method \"+method+\" undefined\")}object[method]=function(){var args=[];for(var i=0;i<arguments.length;i++){args[i]=arguments[i]}me.queue({args:args,fn:original,context:this})}};Queue.prototype.queue=function(entry){if(typeof entry===\"function\"){this._queue.push({fn:entry})}else{this._queue.push(entry)}this._flushIfNeeded()};Queue.prototype._flushIfNeeded=function(){if(this._queue.length>this.max){this.flush()}clearTimeout(this._timeout);if(this.queue.length>0&&typeof this.delay===\"number\"){var me=this;this._timeout=setTimeout(function(){me.flush()},this.delay)}};Queue.prototype.flush=function(){while(this._queue.length>0){var entry=this._queue.shift();entry.fn.apply(entry.context||entry.fn,entry.args||[])}};module.exports=Queue},function(module,exports,__webpack_require__){var Emitter=__webpack_require__(56);var DataSet=__webpack_require__(3);var DataView=__webpack_require__(4);var util=__webpack_require__(1);var Point3d=__webpack_require__(10);var Point2d=__webpack_require__(9);var Camera=__webpack_require__(7);var Filter=__webpack_require__(8);var Slider=__webpack_require__(11);var StepNumber=__webpack_require__(12);function Graph3d(container,data,options){if(!(this instanceof Graph3d)){throw new SyntaxError(\"Constructor must be called with the new operator\")}this.containerElement=container;this.width=\"400px\";this.height=\"400px\";this.margin=10;this.defaultXCenter=\"55%\";this.defaultYCenter=\"50%\";this.xLabel=\"x\";this.yLabel=\"y\";this.zLabel=\"z\";var passValueFn=function(v){return v};this.xValueLabel=passValueFn;this.yValueLabel=passValueFn;this.zValueLabel=passValueFn;this.filterLabel=\"time\";this.legendLabel=\"value\";this.style=Graph3d.STYLE.DOT;this.showPerspective=true;this.showGrid=true;this.keepAspectRatio=true;this.showShadow=false;this.showGrayBottom=false;this.showTooltip=false;this.verticalRatio=.5;this.animationInterval=1e3;this.animationPreload=false;this.camera=new Camera;this.eye=new Point3d(0,0,-1);this.dataTable=null;this.dataPoints=null;this.colX=undefined;this.colY=undefined;this.colZ=undefined;this.colValue=undefined;this.colFilter=undefined;this.xMin=0;this.xStep=undefined;this.xMax=1;this.yMin=0;this.yStep=undefined;this.yMax=1;this.zMin=0;this.zStep=undefined;this.zMax=1;this.valueMin=0;this.valueMax=1;this.xBarWidth=1;this.yBarWidth=1;this.colorAxis=\"#4D4D4D\";this.colorGrid=\"#D3D3D3\";this.colorDot=\"#7DC1FF\";this.colorDotBorder=\"#3267D2\";this.create();this.setOptions(options);if(data){this.setData(data)}}Emitter(Graph3d.prototype);Graph3d.prototype._setScale=function(){this.scale=new Point3d(1/(this.xMax-this.xMin),1/(this.yMax-this.yMin),1/(this.zMax-this.zMin));if(this.keepAspectRatio){if(this.scale.x<this.scale.y){this.scale.y=this.scale.x}else{this.scale.x=this.scale.y}}this.scale.z*=this.verticalRatio;this.scale.value=1/(this.valueMax-this.valueMin);var xCenter=(this.xMax+this.xMin)/2*this.scale.x;var yCenter=(this.yMax+this.yMin)/2*this.scale.y;var zCenter=(this.zMax+this.zMin)/2*this.scale.z;this.camera.setArmLocation(xCenter,yCenter,zCenter)};Graph3d.prototype._convert3Dto2D=function(point3d){var translation=this._convertPointToTranslation(point3d);return this._convertTranslationToScreen(translation)};Graph3d.prototype._convertPointToTranslation=function(point3d){var ax=point3d.x*this.scale.x,ay=point3d.y*this.scale.y,az=point3d.z*this.scale.z,cx=this.camera.getCameraLocation().x,cy=this.camera.getCameraLocation().y,cz=this.camera.getCameraLocation().z,sinTx=Math.sin(this.camera.getCameraRotation().x),cosTx=Math.cos(this.camera.getCameraRotation().x),sinTy=Math.sin(this.camera.getCameraRotation().y),cosTy=Math.cos(this.camera.getCameraRotation().y),sinTz=Math.sin(this.camera.getCameraRotation().z),cosTz=Math.cos(this.camera.getCameraRotation().z),dx=cosTy*(sinTz*(ay-cy)+cosTz*(ax-cx))-sinTy*(az-cz),dy=sinTx*(cosTy*(az-cz)+sinTy*(sinTz*(ay-cy)+cosTz*(ax-cx)))+cosTx*(cosTz*(ay-cy)-sinTz*(ax-cx)),dz=cosTx*(cosTy*(az-cz)+sinTy*(sinTz*(ay-cy)+cosTz*(ax-cx)))-sinTx*(cosTz*(ay-cy)-sinTz*(ax-cx));return new Point3d(dx,dy,dz)};Graph3d.prototype._convertTranslationToScreen=function(translation){var ex=this.eye.x,ey=this.eye.y,ez=this.eye.z,dx=translation.x,dy=translation.y,dz=translation.z;var bx;var by;if(this.showPerspective){bx=(dx-ex)*(ez/dz);by=(dy-ey)*(ez/dz)}else{bx=dx*-(ez/this.camera.getArmLength());by=dy*-(ez/this.camera.getArmLength())}return new Point2d(this.xcenter+bx*this.frame.canvas.clientWidth,this.ycenter-by*this.frame.canvas.clientWidth)};Graph3d.prototype._setBackgroundColor=function(backgroundColor){var fill=\"white\";var stroke=\"gray\";var strokeWidth=1;if(typeof backgroundColor===\"string\"){fill=backgroundColor;stroke=\"none\";strokeWidth=0}else if(typeof backgroundColor===\"object\"){if(backgroundColor.fill!==undefined)fill=backgroundColor.fill;if(backgroundColor.stroke!==undefined)stroke=backgroundColor.stroke;if(backgroundColor.strokeWidth!==undefined)strokeWidth=backgroundColor.strokeWidth}else if(backgroundColor===undefined){}else{throw\"Unsupported type of backgroundColor\"}this.frame.style.backgroundColor=fill;this.frame.style.borderColor=stroke;this.frame.style.borderWidth=strokeWidth+\"px\";this.frame.style.borderStyle=\"solid\"};Graph3d.STYLE={BAR:0,BARCOLOR:1,BARSIZE:2,DOT:3,DOTLINE:4,DOTCOLOR:5,DOTSIZE:6,GRID:7,LINE:8,SURFACE:9};Graph3d.prototype._getStyleNumber=function(styleName){switch(styleName){case\"dot\":return Graph3d.STYLE.DOT;case\"dot-line\":return Graph3d.STYLE.DOTLINE;case\"dot-color\":return Graph3d.STYLE.DOTCOLOR;case\"dot-size\":return Graph3d.STYLE.DOTSIZE;case\"line\":return Graph3d.STYLE.LINE;case\"grid\":return Graph3d.STYLE.GRID;case\"surface\":return Graph3d.STYLE.SURFACE;case\"bar\":return Graph3d.STYLE.BAR;case\"bar-color\":return Graph3d.STYLE.BARCOLOR;case\"bar-size\":return Graph3d.STYLE.BARSIZE}return-1};Graph3d.prototype._determineColumnIndexes=function(data,style){if(this.style===Graph3d.STYLE.DOT||this.style===Graph3d.STYLE.DOTLINE||this.style===Graph3d.STYLE.LINE||this.style===Graph3d.STYLE.GRID||this.style===Graph3d.STYLE.SURFACE||this.style===Graph3d.STYLE.BAR){this.colX=0;this.colY=1;this.colZ=2;this.colValue=undefined;if(data.getNumberOfColumns()>3){this.colFilter=3}}else if(this.style===Graph3d.STYLE.DOTCOLOR||this.style===Graph3d.STYLE.DOTSIZE||this.style===Graph3d.STYLE.BARCOLOR||this.style===Graph3d.STYLE.BARSIZE){this.colX=0;this.colY=1;this.colZ=2;this.colValue=3;if(data.getNumberOfColumns()>4){this.colFilter=4}}else{throw'Unknown style \"'+this.style+'\"'}};Graph3d.prototype.getNumberOfRows=function(data){return data.length};Graph3d.prototype.getNumberOfColumns=function(data){var counter=0;for(var column in data[0]){if(data[0].hasOwnProperty(column)){counter++}}return counter};Graph3d.prototype.getDistinctValues=function(data,column){var distinctValues=[];for(var i=0;i<data.length;i++){if(distinctValues.indexOf(data[i][column])==-1){distinctValues.push(data[i][column])}}return distinctValues};Graph3d.prototype.getColumnRange=function(data,column){var minMax={min:data[0][column],max:data[0][column]};for(var i=0;i<data.length;i++){if(minMax.min>data[i][column]){minMax.min=data[i][column]}if(minMax.max<data[i][column]){minMax.max=data[i][column]}}return minMax};Graph3d.prototype._dataInitialize=function(rawData,style){var me=this;if(this.dataSet){this.dataSet.off(\"*\",this._onChange)}if(rawData===undefined)return;if(Array.isArray(rawData)){rawData=new DataSet(rawData)}var data;if(rawData instanceof DataSet||rawData instanceof DataView){data=rawData.get()}else{throw new Error(\"Array, DataSet, or DataView expected\")}if(data.length==0)return;this.dataSet=rawData;this.dataTable=data;this._onChange=function(){me.setData(me.dataSet)};this.dataSet.on(\"*\",this._onChange);this.colX=\"x\";this.colY=\"y\";this.colZ=\"z\";this.colValue=\"style\";this.colFilter=\"filter\";if(data[0].hasOwnProperty(\"filter\")){if(this.dataFilter===undefined){this.dataFilter=new Filter(rawData,this.colFilter,this);this.dataFilter.setOnLoadCallback(function(){me.redraw()})}}var withBars=this.style==Graph3d.STYLE.BAR||this.style==Graph3d.STYLE.BARCOLOR||this.style==Graph3d.STYLE.BARSIZE;if(withBars){if(this.defaultXBarWidth!==undefined){this.xBarWidth=this.defaultXBarWidth}else{var dataX=this.getDistinctValues(data,this.colX);this.xBarWidth=dataX[1]-dataX[0]||1}if(this.defaultYBarWidth!==undefined){this.yBarWidth=this.defaultYBarWidth}else{var dataY=this.getDistinctValues(data,this.colY);this.yBarWidth=dataY[1]-dataY[0]||1}}var xRange=this.getColumnRange(data,this.colX);if(withBars){xRange.min-=this.xBarWidth/2;xRange.max+=this.xBarWidth/2}this.xMin=this.defaultXMin!==undefined?this.defaultXMin:xRange.min;this.xMax=this.defaultXMax!==undefined?this.defaultXMax:xRange.max;if(this.xMax<=this.xMin)this.xMax=this.xMin+1;this.xStep=this.defaultXStep!==undefined?this.defaultXStep:(this.xMax-this.xMin)/5;var yRange=this.getColumnRange(data,this.colY);if(withBars){yRange.min-=this.yBarWidth/2;yRange.max+=this.yBarWidth/2}this.yMin=this.defaultYMin!==undefined?this.defaultYMin:yRange.min;this.yMax=this.defaultYMax!==undefined?this.defaultYMax:yRange.max;if(this.yMax<=this.yMin)this.yMax=this.yMin+1;this.yStep=this.defaultYStep!==undefined?this.defaultYStep:(this.yMax-this.yMin)/5;var zRange=this.getColumnRange(data,this.colZ);this.zMin=this.defaultZMin!==undefined?this.defaultZMin:zRange.min;this.zMax=this.defaultZMax!==undefined?this.defaultZMax:zRange.max;if(this.zMax<=this.zMin)this.zMax=this.zMin+1;this.zStep=this.defaultZStep!==undefined?this.defaultZStep:(this.zMax-this.zMin)/5;if(this.colValue!==undefined){var valueRange=this.getColumnRange(data,this.colValue);this.valueMin=this.defaultValueMin!==undefined?this.defaultValueMin:valueRange.min;this.valueMax=this.defaultValueMax!==undefined?this.defaultValueMax:valueRange.max;if(this.valueMax<=this.valueMin)this.valueMax=this.valueMin+1}this._setScale()};Graph3d.prototype._getDataPoints=function(data){var x,y,i,z,obj,point;var dataPoints=[];if(this.style===Graph3d.STYLE.GRID||this.style===Graph3d.STYLE.SURFACE){var dataX=[];var dataY=[];for(i=0;i<this.getNumberOfRows(data);i++){x=data[i][this.colX]||0;y=data[i][this.colY]||0;if(dataX.indexOf(x)===-1){dataX.push(x)}if(dataY.indexOf(y)===-1){dataY.push(y)}}var sortNumber=function(a,b){return a-b};dataX.sort(sortNumber);dataY.sort(sortNumber);var dataMatrix=[];for(i=0;i<data.length;i++){x=data[i][this.colX]||0;y=data[i][this.colY]||0;z=data[i][this.colZ]||0;var xIndex=dataX.indexOf(x);var yIndex=dataY.indexOf(y);if(dataMatrix[xIndex]===undefined){dataMatrix[xIndex]=[]}var point3d=new Point3d;point3d.x=x;point3d.y=y;point3d.z=z;obj={};obj.point=point3d;obj.trans=undefined;obj.screen=undefined;obj.bottom=new Point3d(x,y,this.zMin);dataMatrix[xIndex][yIndex]=obj;dataPoints.push(obj)}for(x=0;x<dataMatrix.length;x++){for(y=0;y<dataMatrix[x].length;y++){if(dataMatrix[x][y]){dataMatrix[x][y].pointRight=x<dataMatrix.length-1?dataMatrix[x+1][y]:undefined;dataMatrix[x][y].pointTop=y<dataMatrix[x].length-1?dataMatrix[x][y+1]:undefined;dataMatrix[x][y].pointCross=x<dataMatrix.length-1&&y<dataMatrix[x].length-1?dataMatrix[x+1][y+1]:undefined}}}}else{for(i=0;i<data.length;i++){point=new Point3d;point.x=data[i][this.colX]||0;point.y=data[i][this.colY]||0;point.z=data[i][this.colZ]||0;if(this.colValue!==undefined){point.value=data[i][this.colValue]||0}obj={};obj.point=point;obj.bottom=new Point3d(point.x,point.y,this.zMin);obj.trans=undefined;obj.screen=undefined;dataPoints.push(obj)}}return dataPoints};Graph3d.prototype.create=function(){while(this.containerElement.hasChildNodes()){this.containerElement.removeChild(this.containerElement.firstChild)}this.frame=document.createElement(\"div\");this.frame.style.position=\"relative\";this.frame.style.overflow=\"hidden\";this.frame.canvas=document.createElement(\"canvas\");this.frame.canvas.style.position=\"relative\";this.frame.appendChild(this.frame.canvas);{var noCanvas=document.createElement(\"DIV\");noCanvas.style.color=\"red\";noCanvas.style.fontWeight=\"bold\";noCanvas.style.padding=\"10px\";noCanvas.innerHTML=\"Error: your browser does not support HTML canvas\";this.frame.canvas.appendChild(noCanvas)}this.frame.filter=document.createElement(\"div\");this.frame.filter.style.position=\"absolute\";this.frame.filter.style.bottom=\"0px\";this.frame.filter.style.left=\"0px\";this.frame.filter.style.width=\"100%\";this.frame.appendChild(this.frame.filter);var me=this;var onmousedown=function(event){me._onMouseDown(event)};var ontouchstart=function(event){me._onTouchStart(event)};var onmousewheel=function(event){me._onWheel(event)};var ontooltip=function(event){me._onTooltip(event)};util.addEventListener(this.frame.canvas,\"keydown\",onkeydown);util.addEventListener(this.frame.canvas,\"mousedown\",onmousedown);util.addEventListener(this.frame.canvas,\"touchstart\",ontouchstart);util.addEventListener(this.frame.canvas,\"mousewheel\",onmousewheel);util.addEventListener(this.frame.canvas,\"mousemove\",ontooltip);this.containerElement.appendChild(this.frame)};Graph3d.prototype.setSize=function(width,height){this.frame.style.width=width;this.frame.style.height=height;this._resizeCanvas()};Graph3d.prototype._resizeCanvas=function(){this.frame.canvas.style.width=\"100%\";this.frame.canvas.style.height=\"100%\";this.frame.canvas.width=this.frame.canvas.clientWidth;this.frame.canvas.height=this.frame.canvas.clientHeight;this.frame.filter.style.width=this.frame.canvas.clientWidth-2*10+\"px\"};Graph3d.prototype.animationStart=function(){if(!this.frame.filter||!this.frame.filter.slider)throw\"No animation available\";this.frame.filter.slider.play()};Graph3d.prototype.animationStop=function(){if(!this.frame.filter||!this.frame.filter.slider)return;this.frame.filter.slider.stop()};Graph3d.prototype._resizeCenter=function(){if(this.defaultXCenter.charAt(this.defaultXCenter.length-1)===\"%\"){this.xcenter=parseFloat(this.defaultXCenter)/100*this.frame.canvas.clientWidth}else{this.xcenter=parseFloat(this.defaultXCenter)}if(this.defaultYCenter.charAt(this.defaultYCenter.length-1)===\"%\"){this.ycenter=parseFloat(this.defaultYCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight)}else{this.ycenter=parseFloat(this.defaultYCenter)}};Graph3d.prototype.setCameraPosition=function(pos){if(pos===undefined){return}if(pos.horizontal!==undefined&&pos.vertical!==undefined){this.camera.setArmRotation(pos.horizontal,pos.vertical)}if(pos.distance!==undefined){this.camera.setArmLength(pos.distance)}this.redraw()};Graph3d.prototype.getCameraPosition=function(){var pos=this.camera.getArmRotation();pos.distance=this.camera.getArmLength();return pos};Graph3d.prototype._readData=function(data){this._dataInitialize(data,this.style);if(this.dataFilter){this.dataPoints=this.dataFilter._getDataPoints()}else{this.dataPoints=this._getDataPoints(this.dataTable)}this._redrawFilter()};Graph3d.prototype.setData=function(data){this._readData(data);this.redraw();if(this.animationAutoStart&&this.dataFilter){this.animationStart()}};Graph3d.prototype.setOptions=function(options){var cameraPosition=undefined;this.animationStop();if(options!==undefined){if(options.width!==undefined)this.width=options.width;if(options.height!==undefined)this.height=options.height;if(options.xCenter!==undefined)this.defaultXCenter=options.xCenter;if(options.yCenter!==undefined)this.defaultYCenter=options.yCenter;if(options.filterLabel!==undefined)this.filterLabel=options.filterLabel;if(options.legendLabel!==undefined)this.legendLabel=options.legendLabel;if(options.xLabel!==undefined)this.xLabel=options.xLabel;if(options.yLabel!==undefined)this.yLabel=options.yLabel;if(options.zLabel!==undefined)this.zLabel=options.zLabel;if(options.xValueLabel!==undefined)this.xValueLabel=options.xValueLabel;if(options.yValueLabel!==undefined)this.yValueLabel=options.yValueLabel;if(options.zValueLabel!==undefined)this.zValueLabel=options.zValueLabel;if(options.style!==undefined){var styleNumber=this._getStyleNumber(options.style);if(styleNumber!==-1){this.style=styleNumber}}if(options.showGrid!==undefined)this.showGrid=options.showGrid;if(options.showPerspective!==undefined)this.showPerspective=options.showPerspective;if(options.showShadow!==undefined)this.showShadow=options.showShadow;if(options.tooltip!==undefined)this.showTooltip=options.tooltip;if(options.showAnimationControls!==undefined)this.showAnimationControls=options.showAnimationControls;if(options.keepAspectRatio!==undefined)this.keepAspectRatio=options.keepAspectRatio;if(options.verticalRatio!==undefined)this.verticalRatio=options.verticalRatio;if(options.animationInterval!==undefined)this.animationInterval=options.animationInterval;if(options.animationPreload!==undefined)this.animationPreload=options.animationPreload;if(options.animationAutoStart!==undefined)this.animationAutoStart=options.animationAutoStart;if(options.xBarWidth!==undefined)this.defaultXBarWidth=options.xBarWidth;if(options.yBarWidth!==undefined)this.defaultYBarWidth=options.yBarWidth;if(options.xMin!==undefined)this.defaultXMin=options.xMin;if(options.xStep!==undefined)this.defaultXStep=options.xStep;if(options.xMax!==undefined)this.defaultXMax=options.xMax;if(options.yMin!==undefined)this.defaultYMin=options.yMin;if(options.yStep!==undefined)this.defaultYStep=options.yStep;if(options.yMax!==undefined)this.defaultYMax=options.yMax;if(options.zMin!==undefined)this.defaultZMin=options.zMin;if(options.zStep!==undefined)this.defaultZStep=options.zStep;if(options.zMax!==undefined)this.defaultZMax=options.zMax;if(options.valueMin!==undefined)this.defaultValueMin=options.valueMin;if(options.valueMax!==undefined)this.defaultValueMax=options.valueMax;if(options.cameraPosition!==undefined)cameraPosition=options.cameraPosition;if(cameraPosition!==undefined){this.camera.setArmRotation(cameraPosition.horizontal,cameraPosition.vertical);this.camera.setArmLength(cameraPosition.distance)}else{this.camera.setArmRotation(1,.5);this.camera.setArmLength(1.7)}}this._setBackgroundColor(options&&options.backgroundColor);this.setSize(this.width,this.height);if(this.dataTable){this.setData(this.dataTable)}if(this.animationAutoStart&&this.dataFilter){this.animationStart()}};Graph3d.prototype.redraw=function(){if(this.dataPoints===undefined){throw\"Error: graph data not initialized\"}this._resizeCanvas();this._resizeCenter();this._redrawSlider();this._redrawClear();this._redrawAxis();if(this.style===Graph3d.STYLE.GRID||this.style===Graph3d.STYLE.SURFACE){this._redrawDataGrid()}else if(this.style===Graph3d.STYLE.LINE){this._redrawDataLine()}else if(this.style===Graph3d.STYLE.BAR||this.style===Graph3d.STYLE.BARCOLOR||this.style===Graph3d.STYLE.BARSIZE){this._redrawDataBar()}else{this._redrawDataDot()}this._redrawInfo();this._redrawLegend()};Graph3d.prototype._redrawClear=function(){var canvas=this.frame.canvas;var ctx=canvas.getContext(\"2d\");ctx.clearRect(0,0,canvas.width,canvas.height)};Graph3d.prototype._redrawLegend=function(){var y;if(this.style===Graph3d.STYLE.DOTCOLOR||this.style===Graph3d.STYLE.DOTSIZE){var dotSize=this.frame.clientWidth*.02;var widthMin,widthMax;if(this.style===Graph3d.STYLE.DOTSIZE){widthMin=dotSize/2;widthMax=dotSize/2+dotSize*2}else{widthMin=20;widthMax=20}var height=Math.max(this.frame.clientHeight*.25,100);var top=this.margin;var right=this.frame.clientWidth-this.margin;var left=right-widthMax;var bottom=top+height}var canvas=this.frame.canvas;var ctx=canvas.getContext(\"2d\");ctx.lineWidth=1;ctx.font=\"14px arial\";if(this.style===Graph3d.STYLE.DOTCOLOR){var ymin=0;var ymax=height;for(y=ymin;y<ymax;y++){var f=(y-ymin)/(ymax-ymin);var hue=f*240;var color=this._hsv2rgb(hue,1,1);ctx.strokeStyle=color;ctx.beginPath();ctx.moveTo(left,top+y);ctx.lineTo(right,top+y);ctx.stroke()}ctx.strokeStyle=this.colorAxis;ctx.strokeRect(left,top,widthMax,height)}if(this.style===Graph3d.STYLE.DOTSIZE){ctx.strokeStyle=this.colorAxis;ctx.fillStyle=this.colorDot;ctx.beginPath();ctx.moveTo(left,top);ctx.lineTo(right,top);ctx.lineTo(right-widthMax+widthMin,bottom);ctx.lineTo(left,bottom);ctx.closePath();ctx.fill();ctx.stroke()}if(this.style===Graph3d.STYLE.DOTCOLOR||this.style===Graph3d.STYLE.DOTSIZE){var gridLineLen=5;var step=new StepNumber(this.valueMin,this.valueMax,(this.valueMax-this.valueMin)/5,true);step.start();if(step.getCurrent()<this.valueMin){step.next()}while(!step.end()){y=bottom-(step.getCurrent()-this.valueMin)/(this.valueMax-this.valueMin)*height;ctx.beginPath();ctx.moveTo(left-gridLineLen,y);ctx.lineTo(left,y);ctx.stroke();ctx.textAlign=\"right\";ctx.textBaseline=\"middle\";ctx.fillStyle=this.colorAxis;ctx.fillText(step.getCurrent(),left-2*gridLineLen,y);step.next()}ctx.textAlign=\"right\";ctx.textBaseline=\"top\";var label=this.legendLabel;ctx.fillText(label,right,bottom+this.margin)}};Graph3d.prototype._redrawFilter=function(){this.frame.filter.innerHTML=\"\";if(this.dataFilter){var options={visible:this.showAnimationControls};var slider=new Slider(this.frame.filter,options);this.frame.filter.slider=slider;this.frame.filter.style.padding=\"10px\";slider.setValues(this.dataFilter.values);slider.setPlayInterval(this.animationInterval);var me=this;var onchange=function(){var index=slider.getIndex();me.dataFilter.selectValue(index);me.dataPoints=me.dataFilter._getDataPoints();me.redraw()};slider.setOnChangeCallback(onchange)}else{this.frame.filter.slider=undefined}};Graph3d.prototype._redrawSlider=function(){if(this.frame.filter.slider!==undefined){this.frame.filter.slider.redraw()}};Graph3d.prototype._redrawInfo=function(){if(this.dataFilter){var canvas=this.frame.canvas;var ctx=canvas.getContext(\"2d\");ctx.font=\"14px arial\";ctx.lineStyle=\"gray\";ctx.fillStyle=\"gray\";ctx.textAlign=\"left\";ctx.textBaseline=\"top\";var x=this.margin;var y=this.margin;ctx.fillText(this.dataFilter.getLabel()+\": \"+this.dataFilter.getSelectedValue(),x,y)}};Graph3d.prototype._redrawAxis=function(){var canvas=this.frame.canvas,ctx=canvas.getContext(\"2d\"),from,to,step,prettyStep,text,xText,yText,zText,offset,xOffset,yOffset,xMin2d,xMax2d;ctx.font=24/this.camera.getArmLength()+\"px arial\";var gridLenX=.025/this.scale.x;var gridLenY=.025/this.scale.y;var textMargin=5/this.camera.getArmLength();var armAngle=this.camera.getArmRotation().horizontal;ctx.lineWidth=1;prettyStep=this.defaultXStep===undefined;step=new StepNumber(this.xMin,this.xMax,this.xStep,prettyStep);step.start();if(step.getCurrent()<this.xMin){step.next()}while(!step.end()){var x=step.getCurrent();if(this.showGrid){from=this._convert3Dto2D(new Point3d(x,this.yMin,this.zMin));to=this._convert3Dto2D(new Point3d(x,this.yMax,this.zMin));ctx.strokeStyle=this.colorGrid;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke()}else{from=this._convert3Dto2D(new Point3d(x,this.yMin,this.zMin));to=this._convert3Dto2D(new Point3d(x,this.yMin+gridLenX,this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke();from=this._convert3Dto2D(new Point3d(x,this.yMax,this.zMin));to=this._convert3Dto2D(new Point3d(x,this.yMax-gridLenX,this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke()}yText=Math.cos(armAngle)>0?this.yMin:this.yMax;text=this._convert3Dto2D(new Point3d(x,yText,this.zMin));if(Math.cos(armAngle*2)>0){ctx.textAlign=\"center\";ctx.textBaseline=\"top\";text.y+=textMargin}else if(Math.sin(armAngle*2)<0){ctx.textAlign=\"right\";ctx.textBaseline=\"middle\"}else{ctx.textAlign=\"left\";ctx.textBaseline=\"middle\"}ctx.fillStyle=this.colorAxis;ctx.fillText(\" \"+this.xValueLabel(step.getCurrent())+\" \",text.x,text.y);step.next()}ctx.lineWidth=1;prettyStep=this.defaultYStep===undefined;step=new StepNumber(this.yMin,this.yMax,this.yStep,prettyStep);step.start();if(step.getCurrent()<this.yMin){step.next()}while(!step.end()){if(this.showGrid){from=this._convert3Dto2D(new Point3d(this.xMin,step.getCurrent(),this.zMin));to=this._convert3Dto2D(new Point3d(this.xMax,step.getCurrent(),this.zMin));ctx.strokeStyle=this.colorGrid;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke()}else{from=this._convert3Dto2D(new Point3d(this.xMin,step.getCurrent(),this.zMin));to=this._convert3Dto2D(new Point3d(this.xMin+gridLenY,step.getCurrent(),this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke();from=this._convert3Dto2D(new Point3d(this.xMax,step.getCurrent(),this.zMin));to=this._convert3Dto2D(new Point3d(this.xMax-gridLenY,step.getCurrent(),this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke()}xText=Math.sin(armAngle)>0?this.xMin:this.xMax;text=this._convert3Dto2D(new Point3d(xText,step.getCurrent(),this.zMin));if(Math.cos(armAngle*2)<0){ctx.textAlign=\"center\";ctx.textBaseline=\"top\";text.y+=textMargin}else if(Math.sin(armAngle*2)>0){ctx.textAlign=\"right\";ctx.textBaseline=\"middle\"}else{ctx.textAlign=\"left\";ctx.textBaseline=\"middle\"}ctx.fillStyle=this.colorAxis;ctx.fillText(\" \"+this.yValueLabel(step.getCurrent())+\" \",text.x,text.y);step.next()}ctx.lineWidth=1;prettyStep=this.defaultZStep===undefined;step=new StepNumber(this.zMin,this.zMax,this.zStep,prettyStep);step.start();if(step.getCurrent()<this.zMin){step.next()}xText=Math.cos(armAngle)>0?this.xMin:this.xMax;yText=Math.sin(armAngle)<0?this.yMin:this.yMax;while(!step.end()){from=this._convert3Dto2D(new Point3d(xText,yText,step.getCurrent()));ctx.strokeStyle=this.colorAxis;\nctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(from.x-textMargin,from.y);ctx.stroke();ctx.textAlign=\"right\";ctx.textBaseline=\"middle\";ctx.fillStyle=this.colorAxis;ctx.fillText(this.zValueLabel(step.getCurrent())+\" \",from.x-5,from.y);step.next()}ctx.lineWidth=1;from=this._convert3Dto2D(new Point3d(xText,yText,this.zMin));to=this._convert3Dto2D(new Point3d(xText,yText,this.zMax));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke();ctx.lineWidth=1;xMin2d=this._convert3Dto2D(new Point3d(this.xMin,this.yMin,this.zMin));xMax2d=this._convert3Dto2D(new Point3d(this.xMax,this.yMin,this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(xMin2d.x,xMin2d.y);ctx.lineTo(xMax2d.x,xMax2d.y);ctx.stroke();xMin2d=this._convert3Dto2D(new Point3d(this.xMin,this.yMax,this.zMin));xMax2d=this._convert3Dto2D(new Point3d(this.xMax,this.yMax,this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(xMin2d.x,xMin2d.y);ctx.lineTo(xMax2d.x,xMax2d.y);ctx.stroke();ctx.lineWidth=1;from=this._convert3Dto2D(new Point3d(this.xMin,this.yMin,this.zMin));to=this._convert3Dto2D(new Point3d(this.xMin,this.yMax,this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke();from=this._convert3Dto2D(new Point3d(this.xMax,this.yMin,this.zMin));to=this._convert3Dto2D(new Point3d(this.xMax,this.yMax,this.zMin));ctx.strokeStyle=this.colorAxis;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke();var xLabel=this.xLabel;if(xLabel.length>0){yOffset=.1/this.scale.y;xText=(this.xMin+this.xMax)/2;yText=Math.cos(armAngle)>0?this.yMin-yOffset:this.yMax+yOffset;text=this._convert3Dto2D(new Point3d(xText,yText,this.zMin));if(Math.cos(armAngle*2)>0){ctx.textAlign=\"center\";ctx.textBaseline=\"top\"}else if(Math.sin(armAngle*2)<0){ctx.textAlign=\"right\";ctx.textBaseline=\"middle\"}else{ctx.textAlign=\"left\";ctx.textBaseline=\"middle\"}ctx.fillStyle=this.colorAxis;ctx.fillText(xLabel,text.x,text.y)}var yLabel=this.yLabel;if(yLabel.length>0){xOffset=.1/this.scale.x;xText=Math.sin(armAngle)>0?this.xMin-xOffset:this.xMax+xOffset;yText=(this.yMin+this.yMax)/2;text=this._convert3Dto2D(new Point3d(xText,yText,this.zMin));if(Math.cos(armAngle*2)<0){ctx.textAlign=\"center\";ctx.textBaseline=\"top\"}else if(Math.sin(armAngle*2)>0){ctx.textAlign=\"right\";ctx.textBaseline=\"middle\"}else{ctx.textAlign=\"left\";ctx.textBaseline=\"middle\"}ctx.fillStyle=this.colorAxis;ctx.fillText(yLabel,text.x,text.y)}var zLabel=this.zLabel;if(zLabel.length>0){offset=30;xText=Math.cos(armAngle)>0?this.xMin:this.xMax;yText=Math.sin(armAngle)<0?this.yMin:this.yMax;zText=(this.zMin+this.zMax)/2;text=this._convert3Dto2D(new Point3d(xText,yText,zText));ctx.textAlign=\"right\";ctx.textBaseline=\"middle\";ctx.fillStyle=this.colorAxis;ctx.fillText(zLabel,text.x-offset,text.y)}};Graph3d.prototype._hsv2rgb=function(H,S,V){var R,G,B,C,Hi,X;C=V*S;Hi=Math.floor(H/60);X=C*(1-Math.abs(H/60%2-1));switch(Hi){case 0:R=C;G=X;B=0;break;case 1:R=X;G=C;B=0;break;case 2:R=0;G=C;B=X;break;case 3:R=0;G=X;B=C;break;case 4:R=X;G=0;B=C;break;case 5:R=C;G=0;B=X;break;default:R=0;G=0;B=0;break}return\"RGB(\"+parseInt(R*255)+\",\"+parseInt(G*255)+\",\"+parseInt(B*255)+\")\"};Graph3d.prototype._redrawDataGrid=function(){var canvas=this.frame.canvas,ctx=canvas.getContext(\"2d\"),point,right,top,cross,i,topSideVisible,fillStyle,strokeStyle,lineWidth,h,s,v,zAvg;if(this.dataPoints===undefined||this.dataPoints.length<=0)return;for(i=0;i<this.dataPoints.length;i++){var trans=this._convertPointToTranslation(this.dataPoints[i].point);var screen=this._convertTranslationToScreen(trans);this.dataPoints[i].trans=trans;this.dataPoints[i].screen=screen;var transBottom=this._convertPointToTranslation(this.dataPoints[i].bottom);this.dataPoints[i].dist=this.showPerspective?transBottom.length():-transBottom.z}var sortDepth=function(a,b){return b.dist-a.dist};this.dataPoints.sort(sortDepth);if(this.style===Graph3d.STYLE.SURFACE){for(i=0;i<this.dataPoints.length;i++){point=this.dataPoints[i];right=this.dataPoints[i].pointRight;top=this.dataPoints[i].pointTop;cross=this.dataPoints[i].pointCross;if(point!==undefined&&right!==undefined&&top!==undefined&&cross!==undefined){if(this.showGrayBottom||this.showShadow){var aDiff=Point3d.subtract(cross.trans,point.trans);var bDiff=Point3d.subtract(top.trans,right.trans);var crossproduct=Point3d.crossProduct(aDiff,bDiff);var len=crossproduct.length();topSideVisible=crossproduct.z>0}else{topSideVisible=true}if(topSideVisible){zAvg=(point.point.z+right.point.z+top.point.z+cross.point.z)/4;h=(1-(zAvg-this.zMin)*this.scale.z/this.verticalRatio)*240;s=1;if(this.showShadow){v=Math.min(1+crossproduct.x/len/2,1);fillStyle=this._hsv2rgb(h,s,v);strokeStyle=fillStyle}else{v=1;fillStyle=this._hsv2rgb(h,s,v);strokeStyle=this.colorAxis}}else{fillStyle=\"gray\";strokeStyle=this.colorAxis}lineWidth=.5;ctx.lineWidth=lineWidth;ctx.fillStyle=fillStyle;ctx.strokeStyle=strokeStyle;ctx.beginPath();ctx.moveTo(point.screen.x,point.screen.y);ctx.lineTo(right.screen.x,right.screen.y);ctx.lineTo(cross.screen.x,cross.screen.y);ctx.lineTo(top.screen.x,top.screen.y);ctx.closePath();ctx.fill();ctx.stroke()}}}else{for(i=0;i<this.dataPoints.length;i++){point=this.dataPoints[i];right=this.dataPoints[i].pointRight;top=this.dataPoints[i].pointTop;if(point!==undefined){if(this.showPerspective){lineWidth=2/-point.trans.z}else{lineWidth=2*-(this.eye.z/this.camera.getArmLength())}}if(point!==undefined&&right!==undefined){zAvg=(point.point.z+right.point.z)/2;h=(1-(zAvg-this.zMin)*this.scale.z/this.verticalRatio)*240;ctx.lineWidth=lineWidth;ctx.strokeStyle=this._hsv2rgb(h,1,1);ctx.beginPath();ctx.moveTo(point.screen.x,point.screen.y);ctx.lineTo(right.screen.x,right.screen.y);ctx.stroke()}if(point!==undefined&&top!==undefined){zAvg=(point.point.z+top.point.z)/2;h=(1-(zAvg-this.zMin)*this.scale.z/this.verticalRatio)*240;ctx.lineWidth=lineWidth;ctx.strokeStyle=this._hsv2rgb(h,1,1);ctx.beginPath();ctx.moveTo(point.screen.x,point.screen.y);ctx.lineTo(top.screen.x,top.screen.y);ctx.stroke()}}}};Graph3d.prototype._redrawDataDot=function(){var canvas=this.frame.canvas;var ctx=canvas.getContext(\"2d\");var i;if(this.dataPoints===undefined||this.dataPoints.length<=0)return;for(i=0;i<this.dataPoints.length;i++){var trans=this._convertPointToTranslation(this.dataPoints[i].point);var screen=this._convertTranslationToScreen(trans);this.dataPoints[i].trans=trans;this.dataPoints[i].screen=screen;var transBottom=this._convertPointToTranslation(this.dataPoints[i].bottom);this.dataPoints[i].dist=this.showPerspective?transBottom.length():-transBottom.z}var sortDepth=function(a,b){return b.dist-a.dist};this.dataPoints.sort(sortDepth);var dotSize=this.frame.clientWidth*.02;for(i=0;i<this.dataPoints.length;i++){var point=this.dataPoints[i];if(this.style===Graph3d.STYLE.DOTLINE){var from=this._convert3Dto2D(point.bottom);ctx.lineWidth=1;ctx.strokeStyle=this.colorGrid;ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(point.screen.x,point.screen.y);ctx.stroke()}var size;if(this.style===Graph3d.STYLE.DOTSIZE){size=dotSize/2+2*dotSize*(point.point.value-this.valueMin)/(this.valueMax-this.valueMin)}else{size=dotSize}var radius;if(this.showPerspective){radius=size/-point.trans.z}else{radius=size*-(this.eye.z/this.camera.getArmLength())}if(radius<0){radius=0}var hue,color,borderColor;if(this.style===Graph3d.STYLE.DOTCOLOR){hue=(1-(point.point.value-this.valueMin)*this.scale.value)*240;color=this._hsv2rgb(hue,1,1);borderColor=this._hsv2rgb(hue,1,.8)}else if(this.style===Graph3d.STYLE.DOTSIZE){color=this.colorDot;borderColor=this.colorDotBorder}else{hue=(1-(point.point.z-this.zMin)*this.scale.z/this.verticalRatio)*240;color=this._hsv2rgb(hue,1,1);borderColor=this._hsv2rgb(hue,1,.8)}ctx.lineWidth=1;ctx.strokeStyle=borderColor;ctx.fillStyle=color;ctx.beginPath();ctx.arc(point.screen.x,point.screen.y,radius,0,Math.PI*2,true);ctx.fill();ctx.stroke()}};Graph3d.prototype._redrawDataBar=function(){var canvas=this.frame.canvas;var ctx=canvas.getContext(\"2d\");var i,j,surface,corners;if(this.dataPoints===undefined||this.dataPoints.length<=0)return;for(i=0;i<this.dataPoints.length;i++){var trans=this._convertPointToTranslation(this.dataPoints[i].point);var screen=this._convertTranslationToScreen(trans);this.dataPoints[i].trans=trans;this.dataPoints[i].screen=screen;var transBottom=this._convertPointToTranslation(this.dataPoints[i].bottom);this.dataPoints[i].dist=this.showPerspective?transBottom.length():-transBottom.z}var sortDepth=function(a,b){return b.dist-a.dist};this.dataPoints.sort(sortDepth);var xWidth=this.xBarWidth/2;var yWidth=this.yBarWidth/2;for(i=0;i<this.dataPoints.length;i++){var point=this.dataPoints[i];var hue,color,borderColor;if(this.style===Graph3d.STYLE.BARCOLOR){hue=(1-(point.point.value-this.valueMin)*this.scale.value)*240;color=this._hsv2rgb(hue,1,1);borderColor=this._hsv2rgb(hue,1,.8)}else if(this.style===Graph3d.STYLE.BARSIZE){color=this.colorDot;borderColor=this.colorDotBorder}else{hue=(1-(point.point.z-this.zMin)*this.scale.z/this.verticalRatio)*240;color=this._hsv2rgb(hue,1,1);borderColor=this._hsv2rgb(hue,1,.8)}if(this.style===Graph3d.STYLE.BARSIZE){xWidth=this.xBarWidth/2*((point.point.value-this.valueMin)/(this.valueMax-this.valueMin)*.8+.2);yWidth=this.yBarWidth/2*((point.point.value-this.valueMin)/(this.valueMax-this.valueMin)*.8+.2)}var me=this;var point3d=point.point;var top=[{point:new Point3d(point3d.x-xWidth,point3d.y-yWidth,point3d.z)},{point:new Point3d(point3d.x+xWidth,point3d.y-yWidth,point3d.z)},{point:new Point3d(point3d.x+xWidth,point3d.y+yWidth,point3d.z)},{point:new Point3d(point3d.x-xWidth,point3d.y+yWidth,point3d.z)}];var bottom=[{point:new Point3d(point3d.x-xWidth,point3d.y-yWidth,this.zMin)},{point:new Point3d(point3d.x+xWidth,point3d.y-yWidth,this.zMin)},{point:new Point3d(point3d.x+xWidth,point3d.y+yWidth,this.zMin)},{point:new Point3d(point3d.x-xWidth,point3d.y+yWidth,this.zMin)}];top.forEach(function(obj){obj.screen=me._convert3Dto2D(obj.point)});bottom.forEach(function(obj){obj.screen=me._convert3Dto2D(obj.point)});var surfaces=[{corners:top,center:Point3d.avg(bottom[0].point,bottom[2].point)},{corners:[top[0],top[1],bottom[1],bottom[0]],center:Point3d.avg(bottom[1].point,bottom[0].point)},{corners:[top[1],top[2],bottom[2],bottom[1]],center:Point3d.avg(bottom[2].point,bottom[1].point)},{corners:[top[2],top[3],bottom[3],bottom[2]],center:Point3d.avg(bottom[3].point,bottom[2].point)},{corners:[top[3],top[0],bottom[0],bottom[3]],center:Point3d.avg(bottom[0].point,bottom[3].point)}];point.surfaces=surfaces;for(j=0;j<surfaces.length;j++){surface=surfaces[j];var transCenter=this._convertPointToTranslation(surface.center);surface.dist=this.showPerspective?transCenter.length():-transCenter.z}surfaces.sort(function(a,b){var diff=b.dist-a.dist;if(diff)return diff;if(a.corners===top)return 1;if(b.corners===top)return-1;return 0});ctx.lineWidth=1;ctx.strokeStyle=borderColor;ctx.fillStyle=color;for(j=2;j<surfaces.length;j++){surface=surfaces[j];corners=surface.corners;ctx.beginPath();ctx.moveTo(corners[3].screen.x,corners[3].screen.y);ctx.lineTo(corners[0].screen.x,corners[0].screen.y);ctx.lineTo(corners[1].screen.x,corners[1].screen.y);ctx.lineTo(corners[2].screen.x,corners[2].screen.y);ctx.lineTo(corners[3].screen.x,corners[3].screen.y);ctx.fill();ctx.stroke()}}};Graph3d.prototype._redrawDataLine=function(){var canvas=this.frame.canvas,ctx=canvas.getContext(\"2d\"),point,i;if(this.dataPoints===undefined||this.dataPoints.length<=0)return;for(i=0;i<this.dataPoints.length;i++){var trans=this._convertPointToTranslation(this.dataPoints[i].point);var screen=this._convertTranslationToScreen(trans);this.dataPoints[i].trans=trans;this.dataPoints[i].screen=screen}if(this.dataPoints.length>0){point=this.dataPoints[0];ctx.lineWidth=1;ctx.strokeStyle=\"blue\";ctx.beginPath();ctx.moveTo(point.screen.x,point.screen.y)}for(i=1;i<this.dataPoints.length;i++){point=this.dataPoints[i];ctx.lineTo(point.screen.x,point.screen.y)}if(this.dataPoints.length>0){ctx.stroke()}};Graph3d.prototype._onMouseDown=function(event){event=event||window.event;if(this.leftButtonDown){this._onMouseUp(event)}this.leftButtonDown=event.which?event.which===1:event.button===1;if(!this.leftButtonDown&&!this.touchDown)return;this.startMouseX=getMouseX(event);this.startMouseY=getMouseY(event);this.startStart=new Date(this.start);this.startEnd=new Date(this.end);this.startArmRotation=this.camera.getArmRotation();this.frame.style.cursor=\"move\";var me=this;this.onmousemove=function(event){me._onMouseMove(event)};this.onmouseup=function(event){me._onMouseUp(event)};util.addEventListener(document,\"mousemove\",me.onmousemove);util.addEventListener(document,\"mouseup\",me.onmouseup);util.preventDefault(event)};Graph3d.prototype._onMouseMove=function(event){event=event||window.event;var diffX=parseFloat(getMouseX(event))-this.startMouseX;var diffY=parseFloat(getMouseY(event))-this.startMouseY;var horizontalNew=this.startArmRotation.horizontal+diffX/200;var verticalNew=this.startArmRotation.vertical+diffY/200;var snapAngle=4;var snapValue=Math.sin(snapAngle/360*2*Math.PI);if(Math.abs(Math.sin(horizontalNew))<snapValue){horizontalNew=Math.round(horizontalNew/Math.PI)*Math.PI-.001}if(Math.abs(Math.cos(horizontalNew))<snapValue){horizontalNew=(Math.round(horizontalNew/Math.PI-.5)+.5)*Math.PI-.001}if(Math.abs(Math.sin(verticalNew))<snapValue){verticalNew=Math.round(verticalNew/Math.PI)*Math.PI}if(Math.abs(Math.cos(verticalNew))<snapValue){verticalNew=(Math.round(verticalNew/Math.PI-.5)+.5)*Math.PI}this.camera.setArmRotation(horizontalNew,verticalNew);this.redraw();var parameters=this.getCameraPosition();this.emit(\"cameraPositionChange\",parameters);util.preventDefault(event)};Graph3d.prototype._onMouseUp=function(event){this.frame.style.cursor=\"auto\";this.leftButtonDown=false;util.removeEventListener(document,\"mousemove\",this.onmousemove);util.removeEventListener(document,\"mouseup\",this.onmouseup);util.preventDefault(event)};Graph3d.prototype._onTooltip=function(event){var delay=300;var boundingRect=this.frame.getBoundingClientRect();var mouseX=getMouseX(event)-boundingRect.left;var mouseY=getMouseY(event)-boundingRect.top;if(!this.showTooltip){return}if(this.tooltipTimeout){clearTimeout(this.tooltipTimeout)}if(this.leftButtonDown){this._hideTooltip();return}if(this.tooltip&&this.tooltip.dataPoint){var dataPoint=this._dataPointFromXY(mouseX,mouseY);if(dataPoint!==this.tooltip.dataPoint){if(dataPoint){this._showTooltip(dataPoint)}else{this._hideTooltip()}}}else{var me=this;this.tooltipTimeout=setTimeout(function(){me.tooltipTimeout=null;var dataPoint=me._dataPointFromXY(mouseX,mouseY);if(dataPoint){me._showTooltip(dataPoint)}},delay)}};Graph3d.prototype._onTouchStart=function(event){this.touchDown=true;var me=this;this.ontouchmove=function(event){me._onTouchMove(event)};this.ontouchend=function(event){me._onTouchEnd(event)};util.addEventListener(document,\"touchmove\",me.ontouchmove);util.addEventListener(document,\"touchend\",me.ontouchend);this._onMouseDown(event)};Graph3d.prototype._onTouchMove=function(event){this._onMouseMove(event)};Graph3d.prototype._onTouchEnd=function(event){this.touchDown=false;util.removeEventListener(document,\"touchmove\",this.ontouchmove);util.removeEventListener(document,\"touchend\",this.ontouchend);this._onMouseUp(event)};Graph3d.prototype._onWheel=function(event){if(!event)event=window.event;var delta=0;if(event.wheelDelta){delta=event.wheelDelta/120}else if(event.detail){delta=-event.detail/3}if(delta){var oldLength=this.camera.getArmLength();var newLength=oldLength*(1-delta/10);this.camera.setArmLength(newLength);this.redraw();this._hideTooltip()}var parameters=this.getCameraPosition();this.emit(\"cameraPositionChange\",parameters);util.preventDefault(event)};Graph3d.prototype._insideTriangle=function(point,triangle){var a=triangle[0],b=triangle[1],c=triangle[2];function sign(x){return x>0?1:x<0?-1:0}var as=sign((b.x-a.x)*(point.y-a.y)-(b.y-a.y)*(point.x-a.x));var bs=sign((c.x-b.x)*(point.y-b.y)-(c.y-b.y)*(point.x-b.x));var cs=sign((a.x-c.x)*(point.y-c.y)-(a.y-c.y)*(point.x-c.x));return(as==0||bs==0||as==bs)&&(bs==0||cs==0||bs==cs)&&(as==0||cs==0||as==cs)};Graph3d.prototype._dataPointFromXY=function(x,y){var i,distMax=100,dataPoint=null,closestDataPoint=null,closestDist=null,center=new Point2d(x,y);if(this.style===Graph3d.STYLE.BAR||this.style===Graph3d.STYLE.BARCOLOR||this.style===Graph3d.STYLE.BARSIZE){for(i=this.dataPoints.length-1;i>=0;i--){dataPoint=this.dataPoints[i];var surfaces=dataPoint.surfaces;if(surfaces){for(var s=surfaces.length-1;s>=0;s--){var surface=surfaces[s];var corners=surface.corners;var triangle1=[corners[0].screen,corners[1].screen,corners[2].screen];var triangle2=[corners[2].screen,corners[3].screen,corners[0].screen];if(this._insideTriangle(center,triangle1)||this._insideTriangle(center,triangle2)){return dataPoint}}}}}else{for(i=0;i<this.dataPoints.length;i++){dataPoint=this.dataPoints[i];var point=dataPoint.screen;if(point){var distX=Math.abs(x-point.x);var distY=Math.abs(y-point.y);var dist=Math.sqrt(distX*distX+distY*distY);if((closestDist===null||dist<closestDist)&&dist<distMax){closestDist=dist;closestDataPoint=dataPoint}}}}return closestDataPoint};Graph3d.prototype._showTooltip=function(dataPoint){var content,line,dot;if(!this.tooltip){content=document.createElement(\"div\");content.style.position=\"absolute\";content.style.padding=\"10px\";content.style.border=\"1px solid #4d4d4d\";content.style.color=\"#1a1a1a\";content.style.background=\"rgba(255,255,255,0.7)\";content.style.borderRadius=\"2px\";content.style.boxShadow=\"5px 5px 10px rgba(128,128,128,0.5)\";line=document.createElement(\"div\");line.style.position=\"absolute\";line.style.height=\"40px\";line.style.width=\"0\";line.style.borderLeft=\"1px solid #4d4d4d\";dot=document.createElement(\"div\");dot.style.position=\"absolute\";dot.style.height=\"0\";dot.style.width=\"0\";dot.style.border=\"5px solid #4d4d4d\";dot.style.borderRadius=\"5px\";this.tooltip={dataPoint:null,dom:{content:content,line:line,dot:dot}}}else{content=this.tooltip.dom.content;line=this.tooltip.dom.line;dot=this.tooltip.dom.dot}this._hideTooltip();this.tooltip.dataPoint=dataPoint;if(typeof this.showTooltip===\"function\"){content.innerHTML=this.showTooltip(dataPoint.point)}else{content.innerHTML=\"<table>\"+\"<tr><td>x:</td><td>\"+dataPoint.point.x+\"</td></tr>\"+\"<tr><td>y:</td><td>\"+dataPoint.point.y+\"</td></tr>\"+\"<tr><td>z:</td><td>\"+dataPoint.point.z+\"</td></tr>\"+\"</table>\"}content.style.left=\"0\";content.style.top=\"0\";this.frame.appendChild(content);this.frame.appendChild(line);this.frame.appendChild(dot);var contentWidth=content.offsetWidth;var contentHeight=content.offsetHeight;var lineHeight=line.offsetHeight;var dotWidth=dot.offsetWidth;var dotHeight=dot.offsetHeight;var left=dataPoint.screen.x-contentWidth/2;left=Math.min(Math.max(left,10),this.frame.clientWidth-10-contentWidth);line.style.left=dataPoint.screen.x+\"px\";line.style.top=dataPoint.screen.y-lineHeight+\"px\";content.style.left=left+\"px\";content.style.top=dataPoint.screen.y-lineHeight-contentHeight+\"px\";dot.style.left=dataPoint.screen.x-dotWidth/2+\"px\";dot.style.top=dataPoint.screen.y-dotHeight/2+\"px\"};Graph3d.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var prop in this.tooltip.dom){if(this.tooltip.dom.hasOwnProperty(prop)){var elem=this.tooltip.dom[prop];if(elem&&elem.parentNode){elem.parentNode.removeChild(elem)}}}}};function getMouseX(event){if(\"clientX\"in event)return event.clientX;return event.targetTouches[0]&&event.targetTouches[0].clientX||0}function getMouseY(event){if(\"clientY\"in event)return event.clientY;return event.targetTouches[0]&&event.targetTouches[0].clientY||0}module.exports=Graph3d},function(module,exports,__webpack_require__){var Point3d=__webpack_require__(10);function Camera(){this.armLocation=new Point3d;this.armRotation={};this.armRotation.horizontal=0;this.armRotation.vertical=0;this.armLength=1.7;this.cameraLocation=new Point3d;this.cameraRotation=new Point3d(.5*Math.PI,0,0);this.calculateCameraOrientation()}Camera.prototype.setArmLocation=function(x,y,z){this.armLocation.x=x;this.armLocation.y=y;this.armLocation.z=z;this.calculateCameraOrientation()};Camera.prototype.setArmRotation=function(horizontal,vertical){if(horizontal!==undefined){this.armRotation.horizontal=horizontal}if(vertical!==undefined){this.armRotation.vertical=vertical;if(this.armRotation.vertical<0)this.armRotation.vertical=0;if(this.armRotation.vertical>.5*Math.PI)this.armRotation.vertical=.5*Math.PI}if(horizontal!==undefined||vertical!==undefined){this.calculateCameraOrientation()}};Camera.prototype.getArmRotation=function(){var rot={};rot.horizontal=this.armRotation.horizontal;rot.vertical=this.armRotation.vertical;return rot};Camera.prototype.setArmLength=function(length){if(length===undefined)return;this.armLength=length;if(this.armLength<.71)this.armLength=.71;if(this.armLength>5)this.armLength=5;this.calculateCameraOrientation()};Camera.prototype.getArmLength=function(){return this.armLength};Camera.prototype.getCameraLocation=function(){return this.cameraLocation};Camera.prototype.getCameraRotation=function(){return this.cameraRotation};Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical);this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical);this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical);this.cameraRotation.x=Math.PI/2-this.armRotation.vertical;this.cameraRotation.y=0;this.cameraRotation.z=-this.armRotation.horizontal};module.exports=Camera},function(module,exports,__webpack_require__){var DataView=__webpack_require__(4);function Filter(data,column,graph){this.data=data;this.column=column;this.graph=graph;this.index=undefined;this.value=undefined;this.values=graph.getDistinctValues(data.get(),this.column);this.values.sort(function(a,b){return a>b?1:a<b?-1:0});if(this.values.length>0){this.selectValue(0)}this.dataPoints=[];this.loaded=false;this.onLoadCallback=undefined;if(graph.animationPreload){this.loaded=false;this.loadInBackground()}else{this.loaded=true}}Filter.prototype.isLoaded=function(){return this.loaded};Filter.prototype.getLoadedProgress=function(){var len=this.values.length;var i=0;while(this.dataPoints[i]){i++}return Math.round(i/len*100)};Filter.prototype.getLabel=function(){return this.graph.filterLabel};Filter.prototype.getColumn=function(){return this.column};Filter.prototype.getSelectedValue=function(){if(this.index===undefined)return undefined;return this.values[this.index]};Filter.prototype.getValues=function(){return this.values};Filter.prototype.getValue=function(index){if(index>=this.values.length)throw\"Error: index out of range\";return this.values[index]};Filter.prototype._getDataPoints=function(index){if(index===undefined)index=this.index;if(index===undefined)return[];var dataPoints;if(this.dataPoints[index]){dataPoints=this.dataPoints[index]}else{var f={};f.column=this.column;f.value=this.values[index];var dataView=new DataView(this.data,{filter:function(item){return item[f.column]==f.value}}).get();dataPoints=this.graph._getDataPoints(dataView);this.dataPoints[index]=dataPoints}return dataPoints};Filter.prototype.setOnLoadCallback=function(callback){this.onLoadCallback=callback};Filter.prototype.selectValue=function(index){if(index>=this.values.length)throw\"Error: index out of range\";this.index=index;this.value=this.values[index]};Filter.prototype.loadInBackground=function(index){if(index===undefined)index=0;var frame=this.graph.frame;if(index<this.values.length){var dataPointsTemp=this._getDataPoints(index);if(frame.progress===undefined){frame.progress=document.createElement(\"DIV\");frame.progress.style.position=\"absolute\";frame.progress.style.color=\"gray\";frame.appendChild(frame.progress)}var progress=this.getLoadedProgress();frame.progress.innerHTML=\"Loading animation... \"+progress+\"%\";frame.progress.style.bottom=60+\"px\";frame.progress.style.left=10+\"px\";var me=this;setTimeout(function(){me.loadInBackground(index+1)},10);this.loaded=false}else{this.loaded=true;if(frame.progress!==undefined){frame.removeChild(frame.progress);frame.progress=undefined}if(this.onLoadCallback)this.onLoadCallback()}};module.exports=Filter},function(module,exports,__webpack_require__){function Point2d(x,y){this.x=x!==undefined?x:0;this.y=y!==undefined?y:0}module.exports=Point2d},function(module,exports,__webpack_require__){function Point3d(x,y,z){this.x=x!==undefined?x:0;this.y=y!==undefined?y:0;this.z=z!==undefined?z:0}Point3d.subtract=function(a,b){var sub=new Point3d;sub.x=a.x-b.x;sub.y=a.y-b.y;sub.z=a.z-b.z;return sub};Point3d.add=function(a,b){var sum=new Point3d;sum.x=a.x+b.x;sum.y=a.y+b.y;sum.z=a.z+b.z;return sum};Point3d.avg=function(a,b){return new Point3d((a.x+b.x)/2,(a.y+b.y)/2,(a.z+b.z)/2)};Point3d.crossProduct=function(a,b){var crossproduct=new Point3d;crossproduct.x=a.y*b.z-a.z*b.y;crossproduct.y=a.z*b.x-a.x*b.z;crossproduct.z=a.x*b.y-a.y*b.x;return crossproduct};Point3d.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)};module.exports=Point3d},function(module,exports,__webpack_require__){var util=__webpack_require__(1);function Slider(container,options){if(container===undefined){throw\"Error: No container element defined\"}this.container=container;this.visible=options&&options.visible!=undefined?options.visible:true;if(this.visible){this.frame=document.createElement(\"DIV\");this.frame.style.width=\"100%\";this.frame.style.position=\"relative\";this.container.appendChild(this.frame);this.frame.prev=document.createElement(\"INPUT\");this.frame.prev.type=\"BUTTON\";this.frame.prev.value=\"Prev\";this.frame.appendChild(this.frame.prev);this.frame.play=document.createElement(\"INPUT\");this.frame.play.type=\"BUTTON\";this.frame.play.value=\"Play\";this.frame.appendChild(this.frame.play);this.frame.next=document.createElement(\"INPUT\");this.frame.next.type=\"BUTTON\";this.frame.next.value=\"Next\";this.frame.appendChild(this.frame.next);this.frame.bar=document.createElement(\"INPUT\");this.frame.bar.type=\"BUTTON\";this.frame.bar.style.position=\"absolute\";this.frame.bar.style.border=\"1px solid red\";this.frame.bar.style.width=\"100px\";this.frame.bar.style.height=\"6px\";this.frame.bar.style.borderRadius=\"2px\";this.frame.bar.style.MozBorderRadius=\"2px\";this.frame.bar.style.border=\"1px solid #7F7F7F\";this.frame.bar.style.backgroundColor=\"#E5E5E5\";this.frame.appendChild(this.frame.bar);this.frame.slide=document.createElement(\"INPUT\");this.frame.slide.type=\"BUTTON\";this.frame.slide.style.margin=\"0px\";this.frame.slide.value=\" \";this.frame.slide.style.position=\"relative\";this.frame.slide.style.left=\"-100px\";this.frame.appendChild(this.frame.slide);var me=this;this.frame.slide.onmousedown=function(event){me._onMouseDown(event)};this.frame.prev.onclick=function(event){me.prev(event)};this.frame.play.onclick=function(event){me.togglePlay(event)};this.frame.next.onclick=function(event){me.next(event)}}this.onChangeCallback=undefined;this.values=[];this.index=undefined;this.playTimeout=undefined;this.playInterval=1e3;this.playLoop=true}Slider.prototype.prev=function(){var index=this.getIndex();if(index>0){index--;this.setIndex(index)}};Slider.prototype.next=function(){var index=this.getIndex();if(index<this.values.length-1){index++;this.setIndex(index)}};Slider.prototype.playNext=function(){var start=new Date;var index=this.getIndex();if(index<this.values.length-1){index++;this.setIndex(index)}else if(this.playLoop){index=0;this.setIndex(index)}var end=new Date;var diff=end-start;var interval=Math.max(this.playInterval-diff,0);var me=this;this.playTimeout=setTimeout(function(){me.playNext()},interval)};Slider.prototype.togglePlay=function(){if(this.playTimeout===undefined){this.play()}else{this.stop()}};Slider.prototype.play=function(){if(this.playTimeout)return;this.playNext();if(this.frame){this.frame.play.value=\"Stop\"}};Slider.prototype.stop=function(){clearInterval(this.playTimeout);this.playTimeout=undefined;if(this.frame){this.frame.play.value=\"Play\"}};Slider.prototype.setOnChangeCallback=function(callback){this.onChangeCallback=callback};Slider.prototype.setPlayInterval=function(interval){this.playInterval=interval};Slider.prototype.getPlayInterval=function(interval){return this.playInterval};Slider.prototype.setPlayLoop=function(doLoop){this.playLoop=doLoop};Slider.prototype.onChange=function(){if(this.onChangeCallback!==undefined){this.onChangeCallback()}};Slider.prototype.redraw=function(){if(this.frame){this.frame.bar.style.top=this.frame.clientHeight/2-this.frame.bar.offsetHeight/2+\"px\";this.frame.bar.style.width=this.frame.clientWidth-this.frame.prev.clientWidth-this.frame.play.clientWidth-this.frame.next.clientWidth-30+\"px\";var left=this.indexToLeft(this.index);this.frame.slide.style.left=left+\"px\"}};Slider.prototype.setValues=function(values){this.values=values;if(this.values.length>0)this.setIndex(0);else this.index=undefined};Slider.prototype.setIndex=function(index){if(index<this.values.length){this.index=index;this.redraw();this.onChange()}else{throw\"Error: index out of range\"}};Slider.prototype.getIndex=function(){return this.index};Slider.prototype.get=function(){return this.values[this.index]};Slider.prototype._onMouseDown=function(event){var leftButtonDown=event.which?event.which===1:event.button===1;if(!leftButtonDown)return;this.startClientX=event.clientX;this.startSlideX=parseFloat(this.frame.slide.style.left);this.frame.style.cursor=\"move\";var me=this;this.onmousemove=function(event){me._onMouseMove(event)};this.onmouseup=function(event){me._onMouseUp(event)};util.addEventListener(document,\"mousemove\",this.onmousemove);util.addEventListener(document,\"mouseup\",this.onmouseup);util.preventDefault(event)};Slider.prototype.leftToIndex=function(left){var width=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;var x=left-3;var index=Math.round(x/width*(this.values.length-1));if(index<0)index=0;if(index>this.values.length-1)index=this.values.length-1;return index};Slider.prototype.indexToLeft=function(index){var width=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;var x=index/(this.values.length-1)*width;var left=x+3;return left};Slider.prototype._onMouseMove=function(event){var diff=event.clientX-this.startClientX;var x=this.startSlideX+diff;var index=this.leftToIndex(x);this.setIndex(index);util.preventDefault()};Slider.prototype._onMouseUp=function(event){this.frame.style.cursor=\"auto\";util.removeEventListener(document,\"mousemove\",this.onmousemove);util.removeEventListener(document,\"mouseup\",this.onmouseup);util.preventDefault()};module.exports=Slider},function(module,exports,__webpack_require__){function StepNumber(start,end,step,prettyStep){this._start=0;this._end=0;this._step=1;this.prettyStep=true;this.precision=5;this._current=0;this.setRange(start,end,step,prettyStep)}StepNumber.prototype.setRange=function(start,end,step,prettyStep){this._start=start?start:0;this._end=end?end:0;this.setStep(step,prettyStep)};StepNumber.prototype.setStep=function(step,prettyStep){if(step===undefined||step<=0)return;if(prettyStep!==undefined)this.prettyStep=prettyStep;if(this.prettyStep===true)this._step=StepNumber.calculatePrettyStep(step);else this._step=step};StepNumber.calculatePrettyStep=function(step){var log10=function(x){return Math.log(x)/Math.LN10};var step1=Math.pow(10,Math.round(log10(step))),step2=2*Math.pow(10,Math.round(log10(step/2))),step5=5*Math.pow(10,Math.round(log10(step/5)));var prettyStep=step1;if(Math.abs(step2-step)<=Math.abs(prettyStep-step))prettyStep=step2;if(Math.abs(step5-step)<=Math.abs(prettyStep-step))prettyStep=step5;if(prettyStep<=0){prettyStep=1}return prettyStep};StepNumber.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))\n};StepNumber.prototype.getStep=function(){return this._step};StepNumber.prototype.start=function(){this._current=this._start-this._start%this._step};StepNumber.prototype.next=function(){this._current+=this._step};StepNumber.prototype.end=function(){return this._current>this._end};module.exports=StepNumber},function(module,exports,__webpack_require__){var Emitter=__webpack_require__(56);var Hammer=__webpack_require__(45);var util=__webpack_require__(1);var DataSet=__webpack_require__(3);var DataView=__webpack_require__(4);var Range=__webpack_require__(17);var Core=__webpack_require__(46);var TimeAxis=__webpack_require__(35);var CurrentTime=__webpack_require__(26);var CustomTime=__webpack_require__(27);var ItemSet=__webpack_require__(32);function Timeline(container,items,groups,options){if(!(this instanceof Timeline)){throw new SyntaxError(\"Constructor must be called with the new operator\")}if(!(Array.isArray(groups)||groups instanceof DataSet)&&groups instanceof Object){var forthArgument=options;options=groups;groups=forthArgument}var me=this;this.defaultOptions={start:null,end:null,autoResize:true,orientation:\"bottom\",width:null,height:null,maxHeight:null,minHeight:null};this.options=util.deepExtend({},this.defaultOptions);this._create(container);this.components=[];this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{getScale:function(){return me.timeAxis.step.scale},getStep:function(){return me.timeAxis.step.step},toScreen:me._toScreen.bind(me),toGlobalScreen:me._toGlobalScreen.bind(me),toTime:me._toTime.bind(me),toGlobalTime:me._toGlobalTime.bind(me)}};this.range=new Range(this.body);this.components.push(this.range);this.body.range=this.range;this.timeAxis=new TimeAxis(this.body);this.components.push(this.timeAxis);this.currentTime=new CurrentTime(this.body);this.components.push(this.currentTime);this.customTime=new CustomTime(this.body);this.components.push(this.customTime);this.itemSet=new ItemSet(this.body);this.components.push(this.itemSet);this.itemsData=null;this.groupsData=null;if(options){this.setOptions(options)}if(groups){this.setGroups(groups)}if(items){this.setItems(items)}else{this._redraw()}}Timeline.prototype=new Core;Timeline.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:true});this._redraw()};Timeline.prototype.setItems=function(items){var initialLoad=this.itemsData==null;var newDataSet;if(!items){newDataSet=null}else if(items instanceof DataSet||items instanceof DataView){newDataSet=items}else{newDataSet=new DataSet(items,{type:{start:\"Date\",end:\"Date\"}})}this.itemsData=newDataSet;this.itemSet&&this.itemSet.setItems(newDataSet);if(initialLoad){if(this.options.start!=undefined||this.options.end!=undefined){if(this.options.start==undefined||this.options.end==undefined){var dataRange=this._getDataRange()}var start=this.options.start!=undefined?this.options.start:dataRange.start;var end=this.options.end!=undefined?this.options.end:dataRange.end;this.setWindow(start,end,{animate:false})}else{this.fit({animate:false})}}};Timeline.prototype.setGroups=function(groups){var newDataSet;if(!groups){newDataSet=null}else if(groups instanceof DataSet||groups instanceof DataView){newDataSet=groups}else{newDataSet=new DataSet(groups)}this.groupsData=newDataSet;this.itemSet.setGroups(newDataSet)};Timeline.prototype.setSelection=function(ids,options){this.itemSet&&this.itemSet.setSelection(ids);if(options&&options.focus){this.focus(ids,options)}};Timeline.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]};Timeline.prototype.focus=function(id,options){if(!this.itemsData||id==undefined)return;var ids=Array.isArray(id)?id:[id];var itemsData=this.itemsData.getDataSet().get(ids,{type:{start:\"Date\",end:\"Date\"}});var start=null;var end=null;itemsData.forEach(function(itemData){var s=itemData.start.valueOf();var e=\"end\"in itemData?itemData.end.valueOf():itemData.start.valueOf();if(start===null||s<start){start=s}if(end===null||e>end){end=e}});if(start!==null&&end!==null){var middle=(start+end)/2;var interval=Math.max(this.range.end-this.range.start,(end-start)*1.1);var animate=options&&options.animate!==undefined?options.animate:true;this.range.setRange(middle-interval/2,middle+interval/2,animate)}};Timeline.prototype.getItemRange=function(){var dataset=this.itemsData.getDataSet(),min=null,max=null;if(dataset){var minItem=dataset.min(\"start\");min=minItem?util.convert(minItem.start,\"Date\").valueOf():null;var maxStartItem=dataset.max(\"start\");if(maxStartItem){max=util.convert(maxStartItem.start,\"Date\").valueOf()}var maxEndItem=dataset.max(\"end\");if(maxEndItem){if(max==null){max=util.convert(maxEndItem.end,\"Date\").valueOf()}else{max=Math.max(max,util.convert(maxEndItem.end,\"Date\").valueOf())}}}return{min:min!=null?new Date(min):null,max:max!=null?new Date(max):null}};module.exports=Timeline},function(module,exports,__webpack_require__){var Emitter=__webpack_require__(56);var Hammer=__webpack_require__(45);var util=__webpack_require__(1);var DataSet=__webpack_require__(3);var DataView=__webpack_require__(4);var Range=__webpack_require__(17);var Core=__webpack_require__(46);var TimeAxis=__webpack_require__(35);var CurrentTime=__webpack_require__(26);var CustomTime=__webpack_require__(27);var LineGraph=__webpack_require__(34);function Graph2d(container,items,groups,options){if(!(Array.isArray(groups)||groups instanceof DataSet)&&groups instanceof Object){var forthArgument=options;options=groups;groups=forthArgument}var me=this;this.defaultOptions={start:null,end:null,autoResize:true,orientation:\"bottom\",width:null,height:null,maxHeight:null,minHeight:null};this.options=util.deepExtend({},this.defaultOptions);this._create(container);this.components=[];this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{toScreen:me._toScreen.bind(me),toGlobalScreen:me._toGlobalScreen.bind(me),toTime:me._toTime.bind(me),toGlobalTime:me._toGlobalTime.bind(me)}};this.range=new Range(this.body);this.components.push(this.range);this.body.range=this.range;this.timeAxis=new TimeAxis(this.body);this.components.push(this.timeAxis);this.currentTime=new CurrentTime(this.body);this.components.push(this.currentTime);this.customTime=new CustomTime(this.body);this.components.push(this.customTime);this.linegraph=new LineGraph(this.body);this.components.push(this.linegraph);this.itemsData=null;this.groupsData=null;if(options){this.setOptions(options)}if(groups){this.setGroups(groups)}if(items){this.setItems(items)}else{this._redraw()}}Graph2d.prototype=new Core;Graph2d.prototype.setItems=function(items){var initialLoad=this.itemsData==null;var newDataSet;if(!items){newDataSet=null}else if(items instanceof DataSet||items instanceof DataView){newDataSet=items}else{newDataSet=new DataSet(items,{type:{start:\"Date\",end:\"Date\"}})}this.itemsData=newDataSet;this.linegraph&&this.linegraph.setItems(newDataSet);if(initialLoad){if(this.options.start!=undefined||this.options.end!=undefined){var start=this.options.start!=undefined?this.options.start:null;var end=this.options.end!=undefined?this.options.end:null;this.setWindow(start,end,{animate:false})}else{this.fit({animate:false})}}};Graph2d.prototype.setGroups=function(groups){var newDataSet;if(!groups){newDataSet=null}else if(groups instanceof DataSet||groups instanceof DataView){newDataSet=groups}else{newDataSet=new DataSet(groups)}this.groupsData=newDataSet;this.linegraph.setGroups(newDataSet)};Graph2d.prototype.getLegend=function(groupId,width,height){if(width===undefined){width=15}if(height===undefined){height=15}if(this.linegraph.groups[groupId]!==undefined){return this.linegraph.groups[groupId].getLegend(width,height)}else{return\"cannot find group:\"+groupId}};Graph2d.prototype.isGroupVisible=function(groupId){if(this.linegraph.groups[groupId]!==undefined){return this.linegraph.groups[groupId].visible&&(this.linegraph.options.groups.visibility[groupId]===undefined||this.linegraph.options.groups.visibility[groupId]==true)}else{return false}};Graph2d.prototype.getItemRange=function(){var min=null;var max=null;for(var groupId in this.linegraph.groups){if(this.linegraph.groups.hasOwnProperty(groupId)){if(this.linegraph.groups[groupId].visible==true){for(var i=0;i<this.linegraph.groups[groupId].itemsData.length;i++){var item=this.linegraph.groups[groupId].itemsData[i];var value=util.convert(item.x,\"Date\").valueOf();min=min==null?value:min>value?value:min;max=max==null?value:max<value?value:max}}}}return{min:min!=null?new Date(min):null,max:max!=null?new Date(max):null}};module.exports=Graph2d},function(module,exports,__webpack_require__){var moment=__webpack_require__(44);exports.convertHiddenOptions=function(body,hiddenDates){body.hiddenDates=[];if(hiddenDates){if(Array.isArray(hiddenDates)==true){for(var i=0;i<hiddenDates.length;i++){if(hiddenDates[i].repeat===undefined){var dateItem={};dateItem.start=moment(hiddenDates[i].start).toDate().valueOf();dateItem.end=moment(hiddenDates[i].end).toDate().valueOf();body.hiddenDates.push(dateItem)}}body.hiddenDates.sort(function(a,b){return a.start-b.start})}}};exports.updateHiddenDates=function(body,hiddenDates){if(hiddenDates&&body.domProps.centerContainer.width!==undefined){exports.convertHiddenOptions(body,hiddenDates);var start=moment(body.range.start);var end=moment(body.range.end);var totalRange=body.range.end-body.range.start;var pixelTime=totalRange/body.domProps.centerContainer.width;for(var i=0;i<hiddenDates.length;i++){if(hiddenDates[i].repeat!==undefined){var startDate=moment(hiddenDates[i].start);var endDate=moment(hiddenDates[i].end);if(startDate._d==\"Invalid Date\"){throw new Error(\"Supplied start date is not valid: \"+hiddenDates[i].start)}if(endDate._d==\"Invalid Date\"){throw new Error(\"Supplied end date is not valid: \"+hiddenDates[i].end)}var duration=endDate-startDate;if(duration>=4*pixelTime){var offset=0;var runUntil=end.clone();switch(hiddenDates[i].repeat){case\"daily\":if(startDate.day()!=endDate.day()){offset=1}startDate.dayOfYear(start.dayOfYear());startDate.year(start.year());startDate.subtract(7,\"days\");endDate.dayOfYear(start.dayOfYear());endDate.year(start.year());endDate.subtract(7-offset,\"days\");runUntil.add(1,\"weeks\");break;case\"weekly\":var dayOffset=endDate.diff(startDate,\"days\");var day=startDate.day();startDate.date(start.date());startDate.month(start.month());startDate.year(start.year());endDate=startDate.clone();startDate.day(day);endDate.day(day);endDate.add(dayOffset,\"days\");startDate.subtract(1,\"weeks\");endDate.subtract(1,\"weeks\");runUntil.add(1,\"weeks\");break;case\"monthly\":if(startDate.month()!=endDate.month()){offset=1}startDate.month(start.month());startDate.year(start.year());startDate.subtract(1,\"months\");endDate.month(start.month());endDate.year(start.year());endDate.subtract(1,\"months\");endDate.add(offset,\"months\");runUntil.add(1,\"months\");break;case\"yearly\":if(startDate.year()!=endDate.year()){offset=1}startDate.year(start.year());startDate.subtract(1,\"years\");endDate.year(start.year());endDate.subtract(1,\"years\");endDate.add(offset,\"years\");runUntil.add(1,\"years\");break;default:console.log(\"Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:\",hiddenDates[i].repeat);return}while(startDate<runUntil){body.hiddenDates.push({start:startDate.valueOf(),end:endDate.valueOf()});switch(hiddenDates[i].repeat){case\"daily\":startDate.add(1,\"days\");endDate.add(1,\"days\");break;case\"weekly\":startDate.add(1,\"weeks\");endDate.add(1,\"weeks\");break;case\"monthly\":startDate.add(1,\"months\");endDate.add(1,\"months\");break;case\"yearly\":startDate.add(1,\"y\");endDate.add(1,\"y\");break;default:console.log(\"Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:\",hiddenDates[i].repeat);return}}body.hiddenDates.push({start:startDate.valueOf(),end:endDate.valueOf()})}}}exports.removeDuplicates(body);var startHidden=exports.isHidden(body.range.start,body.hiddenDates);var endHidden=exports.isHidden(body.range.end,body.hiddenDates);var rangeStart=body.range.start;var rangeEnd=body.range.end;if(startHidden.hidden==true){rangeStart=body.range.startToFront==true?startHidden.startDate-1:startHidden.endDate+1}if(endHidden.hidden==true){rangeEnd=body.range.endToFront==true?endHidden.startDate-1:endHidden.endDate+1}if(startHidden.hidden==true||endHidden.hidden==true){body.range._applyRange(rangeStart,rangeEnd)}}};exports.removeDuplicates=function(body){var hiddenDates=body.hiddenDates;var safeDates=[];for(var i=0;i<hiddenDates.length;i++){for(var j=0;j<hiddenDates.length;j++){if(i!=j&&hiddenDates[j].remove!=true&&hiddenDates[i].remove!=true){if(hiddenDates[j].start>=hiddenDates[i].start&&hiddenDates[j].end<=hiddenDates[i].end){hiddenDates[j].remove=true}else if(hiddenDates[j].start>=hiddenDates[i].start&&hiddenDates[j].start<=hiddenDates[i].end){hiddenDates[i].end=hiddenDates[j].end;hiddenDates[j].remove=true}else if(hiddenDates[j].end>=hiddenDates[i].start&&hiddenDates[j].end<=hiddenDates[i].end){hiddenDates[i].start=hiddenDates[j].start;hiddenDates[j].remove=true}}}}for(var i=0;i<hiddenDates.length;i++){if(hiddenDates[i].remove!==true){safeDates.push(hiddenDates[i])}}body.hiddenDates=safeDates;body.hiddenDates.sort(function(a,b){return a.start-b.start})};exports.printDates=function(dates){for(var i=0;i<dates.length;i++){console.log(i,new Date(dates[i].start),new Date(dates[i].end),dates[i].start,dates[i].end,dates[i].remove)}};exports.stepOverHiddenDates=function(timeStep,previousTime){var stepInHidden=false;var currentValue=timeStep.current.valueOf();for(var i=0;i<timeStep.hiddenDates.length;i++){var startDate=timeStep.hiddenDates[i].start;var endDate=timeStep.hiddenDates[i].end;if(currentValue>=startDate&¤tValue<endDate){stepInHidden=true;break}}if(stepInHidden==true&¤tValue<timeStep._end.valueOf()&¤tValue!=previousTime){var prevValue=moment(previousTime);var newValue=moment(endDate);if(prevValue.year()!=newValue.year()){timeStep.switchedYear=true}else if(prevValue.month()!=newValue.month()){timeStep.switchedMonth=true}else if(prevValue.dayOfYear()!=newValue.dayOfYear()){timeStep.switchedDay=true}timeStep.current=newValue.toDate()}};exports.toScreen=function(Core,time,width){if(Core.body.hiddenDates.length==0){var conversion=Core.range.conversion(width);return(time.valueOf()-conversion.offset)*conversion.scale}else{var hidden=exports.isHidden(time,Core.body.hiddenDates);if(hidden.hidden==true){time=hidden.startDate}var duration=exports.getHiddenDurationBetween(Core.body.hiddenDates,Core.range.start,Core.range.end);time=exports.correctTimeForHidden(Core.body.hiddenDates,Core.range,time);var conversion=Core.range.conversion(width,duration);return(time.valueOf()-conversion.offset)*conversion.scale}};exports.toTime=function(Core,x,width){if(Core.body.hiddenDates.length==0){var conversion=Core.range.conversion(width);return new Date(x/conversion.scale+conversion.offset)}else{var hiddenDuration=exports.getHiddenDurationBetween(Core.body.hiddenDates,Core.range.start,Core.range.end);var totalDuration=Core.range.end-Core.range.start-hiddenDuration;var partialDuration=totalDuration*x/width;var accumulatedHiddenDuration=exports.getAccumulatedHiddenDuration(Core.body.hiddenDates,Core.range,partialDuration);var newTime=new Date(accumulatedHiddenDuration+partialDuration+Core.range.start);return newTime}};exports.getHiddenDurationBetween=function(hiddenDates,start,end){var duration=0;for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(startDate>=start&&endDate<end){duration+=endDate-startDate}}return duration};exports.correctTimeForHidden=function(hiddenDates,range,time){time=moment(time).toDate().valueOf();time-=exports.getHiddenDurationBefore(hiddenDates,range,time);return time};exports.getHiddenDurationBefore=function(hiddenDates,range,time){var timeOffset=0;time=moment(time).toDate().valueOf();for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(startDate>=range.start&&endDate<range.end){if(time>=endDate){timeOffset+=endDate-startDate}}}return timeOffset};exports.getAccumulatedHiddenDuration=function(hiddenDates,range,requiredDuration){var hiddenDuration=0;var duration=0;var previousPoint=range.start;for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(startDate>=range.start&&endDate<range.end){duration+=startDate-previousPoint;previousPoint=endDate;if(duration>=requiredDuration){break}else{hiddenDuration+=endDate-startDate}}}return hiddenDuration};exports.snapAwayFromHidden=function(hiddenDates,time,direction,correctionEnabled){var isHidden=exports.isHidden(time,hiddenDates);if(isHidden.hidden==true){if(direction<0){if(correctionEnabled==true){return isHidden.startDate-(isHidden.endDate-time)-1}else{return isHidden.startDate-1}}else{if(correctionEnabled==true){return isHidden.endDate+(time-isHidden.startDate)+1}else{return isHidden.endDate+1}}}else{return time}};exports.isHidden=function(time,hiddenDates){for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(time>=startDate&&time<endDate){return{hidden:true,startDate:startDate,endDate:endDate};break}}return{hidden:false,startDate:startDate,endDate:endDate}}},function(module,exports,__webpack_require__){function DataStep(start,end,minimumStep,containerHeight,customRange,alignZeros){this.current=0;this.autoScale=true;this.stepIndex=0;this.step=1;this.scale=1;this.marginStart;this.marginEnd;this.deadSpace=0;this.majorSteps=[1,2,5,10];this.minorSteps=[.25,.5,1,2];this.alignZeros=alignZeros;this.setRange(start,end,minimumStep,containerHeight,customRange)}DataStep.prototype.setRange=function(start,end,minimumStep,containerHeight,customRange){this._start=customRange.min===undefined?start:customRange.min;this._end=customRange.max===undefined?end:customRange.max;if(this._start==this._end){this._start-=.75;this._end+=1}if(this.autoScale==true){this.setMinimumStep(minimumStep,containerHeight)}this.setFirst(customRange)};DataStep.prototype.setMinimumStep=function(minimumStep,containerHeight){var size=this._end-this._start;var safeSize=size*1.2;var minimumStepValue=minimumStep*(safeSize/containerHeight);var orderOfMagnitude=Math.round(Math.log(safeSize)/Math.LN10);var minorStepIdx=-1;var magnitudefactor=Math.pow(10,orderOfMagnitude);var start=0;if(orderOfMagnitude<0){start=orderOfMagnitude}var solutionFound=false;for(var i=start;Math.abs(i)<=Math.abs(orderOfMagnitude);i++){magnitudefactor=Math.pow(10,i);for(var j=0;j<this.minorSteps.length;j++){var stepSize=magnitudefactor*this.minorSteps[j];if(stepSize>=minimumStepValue){solutionFound=true;minorStepIdx=j;break}}if(solutionFound==true){break}}this.stepIndex=minorStepIdx;this.scale=magnitudefactor;this.step=magnitudefactor*this.minorSteps[minorStepIdx]};DataStep.prototype.setFirst=function(customRange){if(customRange===undefined){customRange={}}var niceStart=customRange.min===undefined?this._start-this.scale*2*this.minorSteps[this.stepIndex]:customRange.min;var niceEnd=customRange.max===undefined?this._end+this.scale*this.minorSteps[this.stepIndex]:customRange.max;this.marginEnd=customRange.max===undefined?this.roundToMinor(niceEnd):customRange.max;this.marginStart=customRange.min===undefined?this.roundToMinor(niceStart):customRange.min;if(this.alignZeros==true&&(this.marginEnd-this.marginStart)%this.step!=0){this.marginEnd+=this.marginEnd%this.step}this.deadSpace=this.roundToMinor(niceEnd)-niceEnd+this.roundToMinor(niceStart)-niceStart;this.marginRange=this.marginEnd-this.marginStart;this.current=this.marginEnd};DataStep.prototype.roundToMinor=function(value){var rounded=value-value%(this.scale*this.minorSteps[this.stepIndex]);if(value%(this.scale*this.minorSteps[this.stepIndex])>.5*(this.scale*this.minorSteps[this.stepIndex])){return rounded+this.scale*this.minorSteps[this.stepIndex]}else{return rounded}};DataStep.prototype.hasNext=function(){return this.current>=this.marginStart};DataStep.prototype.next=function(){var prev=this.current;this.current-=this.step;if(this.current==prev){this.current=this._end}};DataStep.prototype.previous=function(){this.current+=this.step;this.marginEnd+=this.step;this.marginRange=this.marginEnd-this.marginStart};DataStep.prototype.getCurrent=function(decimals){var current=Math.abs(this.current)<this.step/2?0:this.current;var toPrecision=\"\"+Number(current).toPrecision(5);if(decimals!==undefined&&!isNaN(Number(decimals))){var exp=\"\";var index=toPrecision.indexOf(\"e\");if(index!=-1){exp=toPrecision.slice(index);toPrecision=toPrecision.slice(0,index)}index=Math.max(toPrecision.indexOf(\",\"),toPrecision.indexOf(\".\"));if(index===-1){if(decimals!==0){toPrecision+=\".\"}index=toPrecision.length+decimals}else if(decimals!==0){index+=decimals+1}if(index>toPrecision.length){for(var cnt=index-toPrecision.length;cnt>0;cnt--){toPrecision+=\"0\"}}else{toPrecision=toPrecision.slice(0,index)}toPrecision+=exp}else{if(toPrecision.indexOf(\",\")!=-1||toPrecision.indexOf(\".\")!=-1){for(var i=toPrecision.length-1;i>0;i--){if(toPrecision[i]==\"0\"){toPrecision=toPrecision.slice(0,i)}else if(toPrecision[i]==\".\"||toPrecision[i]==\",\"){toPrecision=toPrecision.slice(0,i);break}else{break}}}}return toPrecision};DataStep.prototype.isMajor=function(){return this.current%(this.scale*this.majorSteps[this.stepIndex])==0};module.exports=DataStep},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var hammerUtil=__webpack_require__(47);var moment=__webpack_require__(44);var Component=__webpack_require__(25);var DateUtil=__webpack_require__(15);function Range(body,options){var now=moment().hours(0).minutes(0).seconds(0).milliseconds(0);this.start=now.clone().add(-3,\"days\").valueOf();this.end=now.clone().add(4,\"days\").valueOf();this.body=body;this.deltaDifference=0;this.scaleOffset=0;this.startToFront=false;this.endToFront=true;this.defaultOptions={start:null,end:null,direction:\"horizontal\",moveable:true,zoomable:true,min:null,max:null,zoomMin:10,zoomMax:1e3*60*60*24*365*1e4};this.options=util.extend({},this.defaultOptions);this.props={touch:{}};this.animateTimer=null;this.body.emitter.on(\"dragstart\",this._onDragStart.bind(this));this.body.emitter.on(\"drag\",this._onDrag.bind(this));this.body.emitter.on(\"dragend\",this._onDragEnd.bind(this));this.body.emitter.on(\"hold\",this._onHold.bind(this));this.body.emitter.on(\"mousewheel\",this._onMouseWheel.bind(this));this.body.emitter.on(\"DOMMouseScroll\",this._onMouseWheel.bind(this));this.body.emitter.on(\"touch\",this._onTouch.bind(this));this.body.emitter.on(\"pinch\",this._onPinch.bind(this));this.setOptions(options)}Range.prototype=new Component;Range.prototype.setOptions=function(options){if(options){var fields=[\"direction\",\"min\",\"max\",\"zoomMin\",\"zoomMax\",\"moveable\",\"zoomable\",\"activate\",\"hiddenDates\"];util.selectiveExtend(fields,this.options,options);if(\"start\"in options||\"end\"in options){this.setRange(options.start,options.end)}}};function validateDirection(direction){if(direction!=\"horizontal\"&&direction!=\"vertical\"){throw new TypeError('Unknown direction \"'+direction+'\". '+'Choose \"horizontal\" or \"vertical\".')}}Range.prototype.setRange=function(start,end,animate,byUser){if(byUser!==true){byUser=false}var _start=start!=undefined?util.convert(start,\"Date\").valueOf():null;var _end=end!=undefined?util.convert(end,\"Date\").valueOf():null;this._cancelAnimation();if(animate){var me=this;var initStart=this.start;var initEnd=this.end;var duration=typeof animate===\"number\"?animate:500;var initTime=(new Date).valueOf();var anyChanged=false;var next=function(){if(!me.props.touch.dragging){var now=(new Date).valueOf();var time=now-initTime;var done=time>duration;var s=done||_start===null?_start:util.easeInOutQuad(time,initStart,_start,duration);var e=done||_end===null?_end:util.easeInOutQuad(time,initEnd,_end,duration);changed=me._applyRange(s,e);DateUtil.updateHiddenDates(me.body,me.options.hiddenDates);anyChanged=anyChanged||changed;if(changed){me.body.emitter.emit(\"rangechange\",{start:new Date(me.start),end:new Date(me.end),byUser:byUser})}if(done){if(anyChanged){me.body.emitter.emit(\"rangechanged\",{start:new Date(me.start),end:new Date(me.end),byUser:byUser})}}else{me.animateTimer=setTimeout(next,20)}}};return next()}else{var changed=this._applyRange(_start,_end);DateUtil.updateHiddenDates(this.body,this.options.hiddenDates);if(changed){var params={start:new Date(this.start),end:new Date(this.end),byUser:byUser};this.body.emitter.emit(\"rangechange\",params);this.body.emitter.emit(\"rangechanged\",params)}}};Range.prototype._cancelAnimation=function(){if(this.animateTimer){clearTimeout(this.animateTimer);this.animateTimer=null}};Range.prototype._applyRange=function(start,end){var newStart=start!=null?util.convert(start,\"Date\").valueOf():this.start,newEnd=end!=null?util.convert(end,\"Date\").valueOf():this.end,max=this.options.max!=null?util.convert(this.options.max,\"Date\").valueOf():null,min=this.options.min!=null?util.convert(this.options.min,\"Date\").valueOf():null,diff;if(isNaN(newStart)||newStart===null){throw new Error('Invalid start \"'+start+'\"')}if(isNaN(newEnd)||newEnd===null){throw new Error('Invalid end \"'+end+'\"')}if(newEnd<newStart){newEnd=newStart}if(min!==null){if(newStart<min){diff=min-newStart;newStart+=diff;newEnd+=diff;if(max!=null){if(newEnd>max){newEnd=max}}}}if(max!==null){if(newEnd>max){diff=newEnd-max;newStart-=diff;newEnd-=diff;if(min!=null){if(newStart<min){newStart=min}}}}if(this.options.zoomMin!==null){var zoomMin=parseFloat(this.options.zoomMin);if(zoomMin<0){zoomMin=0}if(newEnd-newStart<zoomMin){if(this.end-this.start===zoomMin&&newStart>this.start&&newEnd<this.end){newStart=this.start;newEnd=this.end}else{diff=zoomMin-(newEnd-newStart);newStart-=diff/2;newEnd+=diff/2}}}if(this.options.zoomMax!==null){var zoomMax=parseFloat(this.options.zoomMax);if(zoomMax<0){zoomMax=0}if(newEnd-newStart>zoomMax){if(this.end-this.start===zoomMax&&newStart<this.start&&newEnd>this.end){newStart=this.start;newEnd=this.end}else{diff=newEnd-newStart-zoomMax;newStart+=diff/2;newEnd-=diff/2}}}var changed=this.start!=newStart||this.end!=newEnd;if(!(newStart>=this.start&&newStart<=this.end||newEnd>=this.start&&newEnd<=this.end)&&!(this.start>=newStart&&this.start<=newEnd||this.end>=newStart&&this.end<=newEnd)){this.body.emitter.emit(\"checkRangedItems\")}this.start=newStart;this.end=newEnd;return changed};Range.prototype.getRange=function(){return{start:this.start,end:this.end}};Range.prototype.conversion=function(width,totalHidden){return Range.conversion(this.start,this.end,width,totalHidden)};Range.conversion=function(start,end,width,totalHidden){if(totalHidden===undefined){totalHidden=0}if(width!=0&&end-start!=0){return{offset:start,scale:width/(end-start-totalHidden)}}else{return{offset:0,scale:1}}};Range.prototype._onDragStart=function(event){this.deltaDifference=0;this.previousDelta=0;if(!this.options.moveable)return;if(!this.props.touch.allowDragging)return;this.props.touch.start=this.start;this.props.touch.end=this.end;this.props.touch.dragging=true;if(this.body.dom.root){this.body.dom.root.style.cursor=\"move\"}};Range.prototype._onDrag=function(event){if(!this.options.moveable)return;if(!this.props.touch.allowDragging)return;var direction=this.options.direction;validateDirection(direction);var delta=direction==\"horizontal\"?event.gesture.deltaX:event.gesture.deltaY;delta-=this.deltaDifference;var interval=this.props.touch.end-this.props.touch.start;var duration=DateUtil.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);interval-=duration;var width=direction==\"horizontal\"?this.body.domProps.center.width:this.body.domProps.center.height;var diffRange=-delta/width*interval;var newStart=this.props.touch.start+diffRange;var newEnd=this.props.touch.end+diffRange;var safeStart=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newStart,this.previousDelta-delta,true);var safeEnd=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newEnd,this.previousDelta-delta,true);if(safeStart!=newStart||safeEnd!=newEnd){this.deltaDifference+=delta;this.props.touch.start=safeStart;this.props.touch.end=safeEnd;this._onDrag(event);return}this.previousDelta=delta;this._applyRange(newStart,newEnd);this.body.emitter.emit(\"rangechange\",{start:new Date(this.start),end:new Date(this.end),byUser:true})};Range.prototype._onDragEnd=function(event){if(!this.options.moveable)return;if(!this.props.touch.allowDragging)return;this.props.touch.dragging=false;if(this.body.dom.root){this.body.dom.root.style.cursor=\"auto\"}this.body.emitter.emit(\"rangechanged\",{start:new Date(this.start),end:new Date(this.end),byUser:true})};Range.prototype._onMouseWheel=function(event){if(!(this.options.zoomable&&this.options.moveable))return;var delta=0;if(event.wheelDelta){delta=event.wheelDelta/120}else if(event.detail){delta=-event.detail/3}if(delta){var scale;if(delta<0){scale=1-delta/5}else{scale=1/(1+delta/5)}var gesture=hammerUtil.fakeGesture(this,event),pointer=getPointer(gesture.center,this.body.dom.center),pointerDate=this._pointerToDate(pointer);this.zoom(scale,pointerDate,delta)}event.preventDefault()};Range.prototype._onTouch=function(event){this.props.touch.start=this.start;this.props.touch.end=this.end;this.props.touch.allowDragging=true;this.props.touch.center=null;this.scaleOffset=0;this.deltaDifference=0};Range.prototype._onHold=function(){this.props.touch.allowDragging=false};Range.prototype._onPinch=function(event){if(!(this.options.zoomable&&this.options.moveable))return;this.props.touch.allowDragging=false;if(event.gesture.touches.length>1){if(!this.props.touch.center){this.props.touch.center=getPointer(event.gesture.center,this.body.dom.center)}var scale=1/(event.gesture.scale+this.scaleOffset);var centerDate=this._pointerToDate(this.props.touch.center);var hiddenDuration=DateUtil.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var hiddenDurationBefore=DateUtil.getHiddenDurationBefore(this.body.hiddenDates,this,centerDate);var hiddenDurationAfter=hiddenDuration-hiddenDurationBefore;var newStart=centerDate-hiddenDurationBefore+(this.props.touch.start-(centerDate-hiddenDurationBefore))*scale;var newEnd=centerDate+hiddenDurationAfter+(this.props.touch.end-(centerDate+hiddenDurationAfter))*scale;this.startToFront=1-scale>0?false:true;this.endToFront=scale-1>0?false:true;var safeStart=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newStart,1-scale,true);var safeEnd=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newEnd,scale-1,true);if(safeStart!=newStart||safeEnd!=newEnd){this.props.touch.start=safeStart;this.props.touch.end=safeEnd;this.scaleOffset=1-event.gesture.scale;newStart=safeStart;newEnd=safeEnd}this.setRange(newStart,newEnd,false,true);this.startToFront=false;this.endToFront=true}};Range.prototype._pointerToDate=function(pointer){var conversion;var direction=this.options.direction;validateDirection(direction);if(direction==\"horizontal\"){return this.body.util.toTime(pointer.x).valueOf()}else{var height=this.body.domProps.center.height;conversion=this.conversion(height);return pointer.y/conversion.scale+conversion.offset}};function getPointer(touch,element){return{x:touch.pageX-util.getAbsoluteLeft(element),y:touch.pageY-util.getAbsoluteTop(element)}}Range.prototype.zoom=function(scale,center,delta){if(center==null){center=(this.start+this.end)/2}var hiddenDuration=DateUtil.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var hiddenDurationBefore=DateUtil.getHiddenDurationBefore(this.body.hiddenDates,this,center);var hiddenDurationAfter=hiddenDuration-hiddenDurationBefore;var newStart=center-hiddenDurationBefore+(this.start-(center-hiddenDurationBefore))*scale;var newEnd=center+hiddenDurationAfter+(this.end-(center+hiddenDurationAfter))*scale;this.startToFront=delta>0?false:true;this.endToFront=-delta>0?false:true;var safeStart=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newStart,delta,true);\nvar safeEnd=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newEnd,-delta,true);if(safeStart!=newStart||safeEnd!=newEnd){newStart=safeStart;newEnd=safeEnd}this.setRange(newStart,newEnd,false,true);this.startToFront=false;this.endToFront=true};Range.prototype.move=function(delta){var diff=this.end-this.start;var newStart=this.start+diff*delta;var newEnd=this.end+diff*delta;this.start=newStart;this.end=newEnd};Range.prototype.moveTo=function(moveTo){var center=(this.start+this.end)/2;var diff=center-moveTo;var newStart=this.start-diff;var newEnd=this.end-diff;this.setRange(newStart,newEnd)};module.exports=Range},function(module,exports,__webpack_require__){var EPSILON=.001;exports.orderByStart=function(items){items.sort(function(a,b){return a.data.start-b.data.start})};exports.orderByEnd=function(items){items.sort(function(a,b){var aTime=\"end\"in a.data?a.data.end:a.data.start,bTime=\"end\"in b.data?b.data.end:b.data.start;return aTime-bTime})};exports.stack=function(items,margin,force){var i,iMax;if(force){for(i=0,iMax=items.length;i<iMax;i++){items[i].top=null}}for(i=0,iMax=items.length;i<iMax;i++){var item=items[i];if(item.stack&&item.top===null){item.top=margin.axis;do{var collidingItem=null;for(var j=0,jj=items.length;j<jj;j++){var other=items[j];if(other.top!==null&&other!==item&&other.stack&&exports.collision(item,other,margin.item)){collidingItem=other;break}}if(collidingItem!=null){item.top=collidingItem.top+collidingItem.height+margin.item.vertical}}while(collidingItem)}}};exports.nostack=function(items,margin,subgroups){var i,iMax,newTop;for(i=0,iMax=items.length;i<iMax;i++){if(items[i].data.subgroup!==undefined){newTop=margin.axis;for(var subgroup in subgroups){if(subgroups.hasOwnProperty(subgroup)){if(subgroups[subgroup].visible==true&&subgroups[subgroup].index<subgroups[items[i].data.subgroup].index){newTop+=subgroups[subgroup].height+margin.item.vertical}}}items[i].top=newTop}else{items[i].top=margin.axis}}};exports.collision=function(a,b,margin){return a.left-margin.horizontal+EPSILON<b.left+b.width&&a.left+a.width+margin.horizontal-EPSILON>b.left&&a.top-margin.vertical+EPSILON<b.top+b.height&&a.top+a.height+margin.vertical-EPSILON>b.top}},function(module,exports,__webpack_require__){var moment=__webpack_require__(44);var DateUtil=__webpack_require__(15);var util=__webpack_require__(1);function TimeStep(start,end,minimumStep,hiddenDates){this.current=new Date;this._start=new Date;this._end=new Date;this.autoScale=true;this.scale=\"day\";this.step=1;this.setRange(start,end,minimumStep);this.switchedDay=false;this.switchedMonth=false;this.switchedYear=false;this.hiddenDates=hiddenDates;if(hiddenDates===undefined){this.hiddenDates=[]}this.format=TimeStep.FORMAT}TimeStep.FORMAT={minorLabels:{millisecond:\"SSS\",second:\"s\",minute:\"HH:mm\",hour:\"HH:mm\",weekday:\"ddd D\",day:\"D\",month:\"MMM\",year:\"YYYY\"},majorLabels:{millisecond:\"HH:mm:ss\",second:\"D MMMM HH:mm\",minute:\"ddd D MMMM\",hour:\"ddd D MMMM\",weekday:\"MMMM YYYY\",day:\"MMMM YYYY\",month:\"YYYY\",year:\"\"}};TimeStep.prototype.setFormat=function(format){var defaultFormat=util.deepExtend({},TimeStep.FORMAT);this.format=util.deepExtend(defaultFormat,format)};TimeStep.prototype.setRange=function(start,end,minimumStep){if(!(start instanceof Date)||!(end instanceof Date)){throw\"No legal start or end date in method setRange\"}this._start=start!=undefined?new Date(start.valueOf()):new Date;this._end=end!=undefined?new Date(end.valueOf()):new Date;if(this.autoScale){this.setMinimumStep(minimumStep)}};TimeStep.prototype.first=function(){this.current=new Date(this._start.valueOf());this.roundToMinor()};TimeStep.prototype.roundToMinor=function(){switch(this.scale){case\"year\":this.current.setFullYear(this.step*Math.floor(this.current.getFullYear()/this.step));this.current.setMonth(0);case\"month\":this.current.setDate(1);case\"day\":case\"weekday\":this.current.setHours(0);case\"hour\":this.current.setMinutes(0);case\"minute\":this.current.setSeconds(0);case\"second\":this.current.setMilliseconds(0)}if(this.step!=1){switch(this.scale){case\"millisecond\":this.current.setMilliseconds(this.current.getMilliseconds()-this.current.getMilliseconds()%this.step);break;case\"second\":this.current.setSeconds(this.current.getSeconds()-this.current.getSeconds()%this.step);break;case\"minute\":this.current.setMinutes(this.current.getMinutes()-this.current.getMinutes()%this.step);break;case\"hour\":this.current.setHours(this.current.getHours()-this.current.getHours()%this.step);break;case\"weekday\":case\"day\":this.current.setDate(this.current.getDate()-1-(this.current.getDate()-1)%this.step+1);break;case\"month\":this.current.setMonth(this.current.getMonth()-this.current.getMonth()%this.step);break;case\"year\":this.current.setFullYear(this.current.getFullYear()-this.current.getFullYear()%this.step);break;default:break}}};TimeStep.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()};TimeStep.prototype.next=function(){var prev=this.current.valueOf();if(this.current.getMonth()<6){switch(this.scale){case\"millisecond\":this.current=new Date(this.current.valueOf()+this.step);break;case\"second\":this.current=new Date(this.current.valueOf()+this.step*1e3);break;case\"minute\":this.current=new Date(this.current.valueOf()+this.step*1e3*60);break;case\"hour\":this.current=new Date(this.current.valueOf()+this.step*1e3*60*60);var h=this.current.getHours();this.current.setHours(h-h%this.step);break;case\"weekday\":case\"day\":this.current.setDate(this.current.getDate()+this.step);break;case\"month\":this.current.setMonth(this.current.getMonth()+this.step);break;case\"year\":this.current.setFullYear(this.current.getFullYear()+this.step);break;default:break}}else{switch(this.scale){case\"millisecond\":this.current=new Date(this.current.valueOf()+this.step);break;case\"second\":this.current.setSeconds(this.current.getSeconds()+this.step);break;case\"minute\":this.current.setMinutes(this.current.getMinutes()+this.step);break;case\"hour\":this.current.setHours(this.current.getHours()+this.step);break;case\"weekday\":case\"day\":this.current.setDate(this.current.getDate()+this.step);break;case\"month\":this.current.setMonth(this.current.getMonth()+this.step);break;case\"year\":this.current.setFullYear(this.current.getFullYear()+this.step);break;default:break}}if(this.step!=1){switch(this.scale){case\"millisecond\":if(this.current.getMilliseconds()<this.step)this.current.setMilliseconds(0);break;case\"second\":if(this.current.getSeconds()<this.step)this.current.setSeconds(0);break;case\"minute\":if(this.current.getMinutes()<this.step)this.current.setMinutes(0);break;case\"hour\":if(this.current.getHours()<this.step)this.current.setHours(0);break;case\"weekday\":case\"day\":if(this.current.getDate()<this.step+1)this.current.setDate(1);break;case\"month\":if(this.current.getMonth()<this.step)this.current.setMonth(0);break;case\"year\":break;default:break}}if(this.current.valueOf()==prev){this.current=new Date(this._end.valueOf())}DateUtil.stepOverHiddenDates(this,prev)};TimeStep.prototype.getCurrent=function(){return this.current};TimeStep.prototype.setScale=function(params){if(params&&typeof params.scale==\"string\"){this.scale=params.scale;this.step=params.step>0?params.step:1;this.autoScale=false}};TimeStep.prototype.setAutoScale=function(enable){this.autoScale=enable};TimeStep.prototype.setMinimumStep=function(minimumStep){if(minimumStep==undefined){return}var stepYear=1e3*60*60*24*30*12;var stepMonth=1e3*60*60*24*30;var stepDay=1e3*60*60*24;var stepHour=1e3*60*60;var stepMinute=1e3*60;var stepSecond=1e3;var stepMillisecond=1;if(stepYear*1e3>minimumStep){this.scale=\"year\";this.step=1e3}if(stepYear*500>minimumStep){this.scale=\"year\";this.step=500}if(stepYear*100>minimumStep){this.scale=\"year\";this.step=100}if(stepYear*50>minimumStep){this.scale=\"year\";this.step=50}if(stepYear*10>minimumStep){this.scale=\"year\";this.step=10}if(stepYear*5>minimumStep){this.scale=\"year\";this.step=5}if(stepYear>minimumStep){this.scale=\"year\";this.step=1}if(stepMonth*3>minimumStep){this.scale=\"month\";this.step=3}if(stepMonth>minimumStep){this.scale=\"month\";this.step=1}if(stepDay*5>minimumStep){this.scale=\"day\";this.step=5}if(stepDay*2>minimumStep){this.scale=\"day\";this.step=2}if(stepDay>minimumStep){this.scale=\"day\";this.step=1}if(stepDay/2>minimumStep){this.scale=\"weekday\";this.step=1}if(stepHour*4>minimumStep){this.scale=\"hour\";this.step=4}if(stepHour>minimumStep){this.scale=\"hour\";this.step=1}if(stepMinute*15>minimumStep){this.scale=\"minute\";this.step=15}if(stepMinute*10>minimumStep){this.scale=\"minute\";this.step=10}if(stepMinute*5>minimumStep){this.scale=\"minute\";this.step=5}if(stepMinute>minimumStep){this.scale=\"minute\";this.step=1}if(stepSecond*15>minimumStep){this.scale=\"second\";this.step=15}if(stepSecond*10>minimumStep){this.scale=\"second\";this.step=10}if(stepSecond*5>minimumStep){this.scale=\"second\";this.step=5}if(stepSecond>minimumStep){this.scale=\"second\";this.step=1}if(stepMillisecond*200>minimumStep){this.scale=\"millisecond\";this.step=200}if(stepMillisecond*100>minimumStep){this.scale=\"millisecond\";this.step=100}if(stepMillisecond*50>minimumStep){this.scale=\"millisecond\";this.step=50}if(stepMillisecond*10>minimumStep){this.scale=\"millisecond\";this.step=10}if(stepMillisecond*5>minimumStep){this.scale=\"millisecond\";this.step=5}if(stepMillisecond>minimumStep){this.scale=\"millisecond\";this.step=1}};TimeStep.snap=function(date,scale,step){var clone=new Date(date.valueOf());if(scale==\"year\"){var year=clone.getFullYear()+Math.round(clone.getMonth()/12);clone.setFullYear(Math.round(year/step)*step);clone.setMonth(0);clone.setDate(0);clone.setHours(0);clone.setMinutes(0);clone.setSeconds(0);clone.setMilliseconds(0)}else if(scale==\"month\"){if(clone.getDate()>15){clone.setDate(1);clone.setMonth(clone.getMonth()+1)}else{clone.setDate(1)}clone.setHours(0);clone.setMinutes(0);clone.setSeconds(0);clone.setMilliseconds(0)}else if(scale==\"day\"){switch(step){case 5:case 2:clone.setHours(Math.round(clone.getHours()/24)*24);break;default:clone.setHours(Math.round(clone.getHours()/12)*12);break}clone.setMinutes(0);clone.setSeconds(0);clone.setMilliseconds(0)}else if(scale==\"weekday\"){switch(step){case 5:case 2:clone.setHours(Math.round(clone.getHours()/12)*12);break;default:clone.setHours(Math.round(clone.getHours()/6)*6);break}clone.setMinutes(0);clone.setSeconds(0);clone.setMilliseconds(0)}else if(scale==\"hour\"){switch(step){case 4:clone.setMinutes(Math.round(clone.getMinutes()/60)*60);break;default:clone.setMinutes(Math.round(clone.getMinutes()/30)*30);break}clone.setSeconds(0);clone.setMilliseconds(0)}else if(scale==\"minute\"){switch(step){case 15:case 10:clone.setMinutes(Math.round(clone.getMinutes()/5)*5);clone.setSeconds(0);break;case 5:clone.setSeconds(Math.round(clone.getSeconds()/60)*60);break;default:clone.setSeconds(Math.round(clone.getSeconds()/30)*30);break}clone.setMilliseconds(0)}else if(scale==\"second\"){switch(step){case 15:case 10:clone.setSeconds(Math.round(clone.getSeconds()/5)*5);clone.setMilliseconds(0);break;case 5:clone.setMilliseconds(Math.round(clone.getMilliseconds()/1e3)*1e3);break;default:clone.setMilliseconds(Math.round(clone.getMilliseconds()/500)*500);break}}else if(scale==\"millisecond\"){var _step=step>5?step/2:1;clone.setMilliseconds(Math.round(clone.getMilliseconds()/_step)*_step)}return clone};TimeStep.prototype.isMajor=function(){if(this.switchedYear==true){this.switchedYear=false;switch(this.scale){case\"year\":case\"month\":case\"weekday\":case\"day\":case\"hour\":case\"minute\":case\"second\":case\"millisecond\":return true;default:return false}}else if(this.switchedMonth==true){this.switchedMonth=false;switch(this.scale){case\"weekday\":case\"day\":case\"hour\":case\"minute\":case\"second\":case\"millisecond\":return true;default:return false}}else if(this.switchedDay==true){this.switchedDay=false;switch(this.scale){case\"millisecond\":case\"second\":case\"minute\":case\"hour\":return true;default:return false}}switch(this.scale){case\"millisecond\":return this.current.getMilliseconds()==0;case\"second\":return this.current.getSeconds()==0;case\"minute\":return this.current.getHours()==0&&this.current.getMinutes()==0;case\"hour\":return this.current.getHours()==0;case\"weekday\":case\"day\":return this.current.getDate()==1;case\"month\":return this.current.getMonth()==0;case\"year\":return false;default:return false}};TimeStep.prototype.getLabelMinor=function(date){if(date==undefined){date=this.current}var format=this.format.minorLabels[this.scale];return format&&format.length>0?moment(date).format(format):\"\"};TimeStep.prototype.getLabelMajor=function(date){if(date==undefined){date=this.current}var format=this.format.majorLabels[this.scale];return format&&format.length>0?moment(date).format(format):\"\"};TimeStep.prototype.getClassName=function(){var m=moment(this.current);var date=m.locale?m.locale(\"en\"):m.lang(\"en\");var step=this.step;function even(value){return value/step%2==0?\" even\":\" odd\"}function today(date){if(date.isSame(new Date,\"day\")){return\" today\"}if(date.isSame(moment().add(1,\"day\"),\"day\")){return\" tomorrow\"}if(date.isSame(moment().add(-1,\"day\"),\"day\")){return\" yesterday\"}return\"\"}function currentWeek(date){return date.isSame(new Date,\"week\")?\" current-week\":\"\"}function currentMonth(date){return date.isSame(new Date,\"month\")?\" current-month\":\"\"}function currentYear(date){return date.isSame(new Date,\"year\")?\" current-year\":\"\"}switch(this.scale){case\"millisecond\":return even(date.milliseconds()).trim();case\"second\":return even(date.seconds()).trim();case\"minute\":return even(date.minutes()).trim();case\"hour\":var hours=date.hours();if(this.step==4){hours=hours+\"-\"+(hours+4)}return hours+\"h\"+today(date)+even(date.hours());case\"weekday\":return date.format(\"dddd\").toLowerCase()+today(date)+currentWeek(date)+even(date.date());case\"day\":var day=date.date();var month=date.format(\"MMMM\").toLowerCase();return\"day\"+day+\" \"+month+currentMonth(date)+even(day-1);case\"month\":return date.format(\"MMMM\").toLowerCase()+currentMonth(date)+even(date.month());case\"year\":var year=date.year();return\"year\"+year+currentYear(date)+even(year);default:return\"\"}};module.exports=TimeStep},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(45);var util=__webpack_require__(1);function Item(data,conversion,options){this.id=null;this.parent=null;this.data=data;this.dom=null;this.conversion=conversion||{};this.options=options||{};this.selected=false;this.displayed=false;this.dirty=true;this.top=null;this.left=null;this.width=null;this.height=null}Item.prototype.stack=true;Item.prototype.select=function(){this.selected=true;this.dirty=true;if(this.displayed)this.redraw()};Item.prototype.unselect=function(){this.selected=false;this.dirty=true;if(this.displayed)this.redraw()};Item.prototype.setData=function(data){this.data=data;this.dirty=true;if(this.displayed)this.redraw()};Item.prototype.setParent=function(parent){if(this.displayed){this.hide();this.parent=parent;if(this.parent){this.show()}}else{this.parent=parent}};Item.prototype.isVisible=function(range){return false};Item.prototype.show=function(){return false};Item.prototype.hide=function(){return false};Item.prototype.redraw=function(){};Item.prototype.repositionX=function(){};Item.prototype.repositionY=function(){};Item.prototype._repaintDeleteButton=function(anchor){if(this.selected&&this.options.editable.remove&&!this.dom.deleteButton){var me=this;var deleteButton=document.createElement(\"div\");deleteButton.className=\"delete\";deleteButton.title=\"Delete this item\";Hammer(deleteButton,{preventDefault:true}).on(\"tap\",function(event){me.parent.removeFromDataSet(me);event.stopPropagation()});anchor.appendChild(deleteButton);this.dom.deleteButton=deleteButton}else if(!this.selected&&this.dom.deleteButton){if(this.dom.deleteButton.parentNode){this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton)}this.dom.deleteButton=null}};Item.prototype._updateContents=function(element){var content;if(this.options.template){var itemData=this.parent.itemSet.itemsData.get(this.id);content=this.options.template(itemData)}else{content=this.data.content}if(content!==this.content){if(content instanceof Element){element.innerHTML=\"\";element.appendChild(content)}else if(content!=undefined){element.innerHTML=content}else{if(!(this.data.type==\"background\"&&this.data.content===undefined)){throw new Error('Property \"content\" missing in item '+this.id)}}this.content=content}};Item.prototype._updateTitle=function(element){if(this.data.title!=null){element.title=this.data.title||\"\"}else{element.removeAttribute(\"title\")}};Item.prototype._updateDataAttributes=function(element){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var attributes=[];if(Array.isArray(this.options.dataAttributes)){attributes=this.options.dataAttributes}else if(this.options.dataAttributes==\"all\"){attributes=Object.keys(this.data)}else{return}for(var i=0;i<attributes.length;i++){var name=attributes[i];var value=this.data[name];if(value!=null){element.setAttribute(\"data-\"+name,value)}else{element.removeAttribute(\"data-\"+name)}}}};Item.prototype._updateStyle=function(element){if(this.style){util.removeCssText(element,this.style);this.style=null}if(this.data.style){util.addCssText(element,this.data.style);this.style=this.data.style}};module.exports=Item},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(45);var Item=__webpack_require__(20);var BackgroundGroup=__webpack_require__(31);var RangeItem=__webpack_require__(24);function BackgroundItem(data,conversion,options){this.props={content:{width:0}};this.overflow=false;if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data.id)}if(data.end==undefined){throw new Error('Property \"end\" missing in item '+data.id)}}Item.call(this,data,conversion,options);this.emptyContent=false}BackgroundItem.prototype=new Item(null,null,null);BackgroundItem.prototype.baseClassName=\"item background\";BackgroundItem.prototype.stack=false;BackgroundItem.prototype.isVisible=function(range){return this.data.start<range.end&&this.data.end>range.start};BackgroundItem.prototype.redraw=function(){var dom=this.dom;if(!dom){this.dom={};dom=this.dom;dom.box=document.createElement(\"div\");dom.content=document.createElement(\"div\");dom.content.className=\"content\";dom.box.appendChild(dom.content);this.dirty=true}if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!dom.box.parentNode){var background=this.parent.dom.background;if(!background){throw new Error(\"Cannot redraw item: parent has no background container element\")}background.appendChild(dom.box)}this.displayed=true;if(this.dirty){this._updateContents(this.dom.content);this._updateTitle(this.dom.content);this._updateDataAttributes(this.dom.content);this._updateStyle(this.dom.box);var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" selected\":\"\");dom.box.className=this.baseClassName+className;this.overflow=window.getComputedStyle(dom.content).overflow!==\"hidden\";this.props.content.width=this.dom.content.offsetWidth;this.height=0;this.dirty=false}};BackgroundItem.prototype.show=RangeItem.prototype.show;BackgroundItem.prototype.hide=RangeItem.prototype.hide;BackgroundItem.prototype.repositionX=RangeItem.prototype.repositionX;BackgroundItem.prototype.repositionY=function(margin){var onTop=this.options.orientation===\"top\";this.dom.content.style.top=onTop?\"\":\"0\";this.dom.content.style.bottom=onTop?\"0\":\"\";var height;if(this.data.subgroup!==undefined){var itemSubgroup=this.data.subgroup;var subgroups=this.parent.subgroups;var subgroupIndex=subgroups[itemSubgroup].index;if(onTop==true){height=this.parent.subgroups[itemSubgroup].height+margin.item.vertical;height+=subgroupIndex==0?margin.axis-.5*margin.item.vertical:0;var newTop=this.parent.top;for(var subgroup in subgroups){if(subgroups.hasOwnProperty(subgroup)){if(subgroups[subgroup].visible==true&&subgroups[subgroup].index<subgroupIndex){newTop+=subgroups[subgroup].height+margin.item.vertical}}}newTop+=subgroupIndex!=0?margin.axis-.5*margin.item.vertical:0;this.dom.box.style.top=newTop+\"px\";this.dom.box.style.bottom=\"\"}else{var newTop=this.parent.top;for(var subgroup in subgroups){if(subgroups.hasOwnProperty(subgroup)){if(subgroups[subgroup].visible==true&&subgroups[subgroup].index>subgroupIndex){newTop+=subgroups[subgroup].height+margin.item.vertical}}}height=this.parent.subgroups[itemSubgroup].height+margin.item.vertical;this.dom.box.style.top=newTop+\"px\";this.dom.box.style.bottom=\"\"}}else{if(this.parent instanceof BackgroundGroup){height=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height);this.dom.box.style.top=onTop?\"0\":\"\";this.dom.box.style.bottom=onTop?\"\":\"0\"}else{height=this.parent.height;this.dom.box.style.top=this.parent.top+\"px\";this.dom.box.style.bottom=\"\"}}this.dom.box.style.height=height+\"px\"};module.exports=BackgroundItem},function(module,exports,__webpack_require__){var Item=__webpack_require__(20);var util=__webpack_require__(1);function BoxItem(data,conversion,options){this.props={dot:{width:0,height:0},line:{width:0,height:0}};if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data)}}Item.call(this,data,conversion,options)}BoxItem.prototype=new Item(null,null,null);BoxItem.prototype.isVisible=function(range){var interval=(range.end-range.start)/4;return this.data.start>range.start-interval&&this.data.start<range.end+interval};BoxItem.prototype.redraw=function(){var dom=this.dom;if(!dom){this.dom={};dom=this.dom;dom.box=document.createElement(\"DIV\");dom.content=document.createElement(\"DIV\");dom.content.className=\"content\";dom.box.appendChild(dom.content);dom.line=document.createElement(\"DIV\");dom.line.className=\"line\";dom.dot=document.createElement(\"DIV\");dom.dot.className=\"dot\";dom.box[\"timeline-item\"]=this;this.dirty=true}if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!dom.box.parentNode){var foreground=this.parent.dom.foreground;if(!foreground)throw new Error(\"Cannot redraw item: parent has no foreground container element\");foreground.appendChild(dom.box)}if(!dom.line.parentNode){var background=this.parent.dom.background;if(!background)throw new Error(\"Cannot redraw item: parent has no background container element\");background.appendChild(dom.line)}if(!dom.dot.parentNode){var axis=this.parent.dom.axis;if(!background)throw new Error(\"Cannot redraw item: parent has no axis container element\");axis.appendChild(dom.dot)}this.displayed=true;if(this.dirty){this._updateContents(this.dom.content);this._updateTitle(this.dom.box);this._updateDataAttributes(this.dom.box);this._updateStyle(this.dom.box);var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" selected\":\"\");dom.box.className=\"item box\"+className;dom.line.className=\"item line\"+className;dom.dot.className=\"item dot\"+className;this.props.dot.height=dom.dot.offsetHeight;this.props.dot.width=dom.dot.offsetWidth;this.props.line.width=dom.line.offsetWidth;this.width=dom.box.offsetWidth;this.height=dom.box.offsetHeight;this.dirty=false}this._repaintDeleteButton(dom.box)};BoxItem.prototype.show=function(){if(!this.displayed){this.redraw()}};BoxItem.prototype.hide=function(){if(this.displayed){var dom=this.dom;if(dom.box.parentNode)dom.box.parentNode.removeChild(dom.box);if(dom.line.parentNode)dom.line.parentNode.removeChild(dom.line);if(dom.dot.parentNode)dom.dot.parentNode.removeChild(dom.dot);this.top=null;this.left=null;this.displayed=false}};BoxItem.prototype.repositionX=function(){var start=this.conversion.toScreen(this.data.start);var align=this.options.align;var left;var box=this.dom.box;var line=this.dom.line;var dot=this.dom.dot;if(align==\"right\"){this.left=start-this.width}else if(align==\"left\"){this.left=start}else{this.left=start-this.width/2}box.style.left=this.left+\"px\";line.style.left=start-this.props.line.width/2+\"px\";dot.style.left=start-this.props.dot.width/2+\"px\"};BoxItem.prototype.repositionY=function(){var orientation=this.options.orientation;var box=this.dom.box;var line=this.dom.line;var dot=this.dom.dot;if(orientation==\"top\"){box.style.top=(this.top||0)+\"px\";line.style.top=\"0\";line.style.height=this.parent.top+this.top+1+\"px\";line.style.bottom=\"\"}else{var itemSetHeight=this.parent.itemSet.props.height;var lineHeight=itemSetHeight-this.parent.top-this.parent.height+this.top;box.style.top=(this.parent.height-this.top-this.height||0)+\"px\";line.style.top=itemSetHeight-lineHeight+\"px\";line.style.bottom=\"0\"}dot.style.top=-this.props.dot.height/2+\"px\"};module.exports=BoxItem},function(module,exports,__webpack_require__){var Item=__webpack_require__(20);function PointItem(data,conversion,options){this.props={dot:{top:0,width:0,height:0},content:{height:0,marginLeft:0}};if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data)}}Item.call(this,data,conversion,options)}PointItem.prototype=new Item(null,null,null);PointItem.prototype.isVisible=function(range){var interval=(range.end-range.start)/4;return this.data.start>range.start-interval&&this.data.start<range.end+interval};PointItem.prototype.redraw=function(){var dom=this.dom;if(!dom){this.dom={};dom=this.dom;dom.point=document.createElement(\"div\");dom.content=document.createElement(\"div\");dom.content.className=\"content\";dom.point.appendChild(dom.content);dom.dot=document.createElement(\"div\");dom.point.appendChild(dom.dot);dom.point[\"timeline-item\"]=this;this.dirty=true}if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!dom.point.parentNode){var foreground=this.parent.dom.foreground;if(!foreground){throw new Error(\"Cannot redraw item: parent has no foreground container element\")}foreground.appendChild(dom.point)}this.displayed=true;if(this.dirty){this._updateContents(this.dom.content);this._updateTitle(this.dom.point);this._updateDataAttributes(this.dom.point);this._updateStyle(this.dom.point);var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" selected\":\"\");dom.point.className=\"item point\"+className;dom.dot.className=\"item dot\"+className;this.width=dom.point.offsetWidth;this.height=dom.point.offsetHeight;this.props.dot.width=dom.dot.offsetWidth;this.props.dot.height=dom.dot.offsetHeight;this.props.content.height=dom.content.offsetHeight;dom.content.style.marginLeft=2*this.props.dot.width+\"px\";dom.dot.style.top=(this.height-this.props.dot.height)/2+\"px\";dom.dot.style.left=this.props.dot.width/2+\"px\";this.dirty=false}this._repaintDeleteButton(dom.point)};PointItem.prototype.show=function(){if(!this.displayed){this.redraw()}};PointItem.prototype.hide=function(){if(this.displayed){if(this.dom.point.parentNode){this.dom.point.parentNode.removeChild(this.dom.point)}this.top=null;this.left=null;this.displayed=false}};PointItem.prototype.repositionX=function(){var start=this.conversion.toScreen(this.data.start);this.left=start-this.props.dot.width;this.dom.point.style.left=this.left+\"px\"};PointItem.prototype.repositionY=function(){var orientation=this.options.orientation,point=this.dom.point;if(orientation==\"top\"){point.style.top=this.top+\"px\"}else{point.style.top=this.parent.height-this.top-this.height+\"px\"}};module.exports=PointItem},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(45);var Item=__webpack_require__(20);function RangeItem(data,conversion,options){this.props={content:{width:0}};this.overflow=false;if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data.id)}if(data.end==undefined){throw new Error('Property \"end\" missing in item '+data.id)}}Item.call(this,data,conversion,options)}RangeItem.prototype=new Item(null,null,null);RangeItem.prototype.baseClassName=\"item range\";RangeItem.prototype.isVisible=function(range){return this.data.start<range.end&&this.data.end>range.start};RangeItem.prototype.redraw=function(){var dom=this.dom;if(!dom){this.dom={};dom=this.dom;dom.box=document.createElement(\"div\");dom.content=document.createElement(\"div\");dom.content.className=\"content\";dom.box.appendChild(dom.content);dom.box[\"timeline-item\"]=this;this.dirty=true}if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!dom.box.parentNode){var foreground=this.parent.dom.foreground;if(!foreground){throw new Error(\"Cannot redraw item: parent has no foreground container element\")}foreground.appendChild(dom.box)}this.displayed=true;if(this.dirty){this._updateContents(this.dom.content);this._updateTitle(this.dom.box);this._updateDataAttributes(this.dom.box);this._updateStyle(this.dom.box);var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" selected\":\"\");dom.box.className=this.baseClassName+className;this.overflow=window.getComputedStyle(dom.content).overflow!==\"hidden\";this.dom.content.style.maxWidth=\"none\";this.props.content.width=this.dom.content.offsetWidth;this.height=this.dom.box.offsetHeight;this.dom.content.style.maxWidth=\"\";this.dirty=false}this._repaintDeleteButton(dom.box);this._repaintDragLeft();this._repaintDragRight()};RangeItem.prototype.show=function(){if(!this.displayed){this.redraw()}};RangeItem.prototype.hide=function(){if(this.displayed){var box=this.dom.box;if(box.parentNode){box.parentNode.removeChild(box)}this.top=null;this.left=null;this.displayed=false}};RangeItem.prototype.repositionX=function(){var parentWidth=this.parent.width;var start=this.conversion.toScreen(this.data.start);var end=this.conversion.toScreen(this.data.end);var contentLeft;var contentWidth;if(start<-parentWidth){start=-parentWidth}if(end>2*parentWidth){end=2*parentWidth}var boxWidth=Math.max(end-start,1);if(this.overflow){this.left=start;this.width=boxWidth+this.props.content.width;contentWidth=this.props.content.width}else{this.left=start;this.width=boxWidth;contentWidth=Math.min(end-start-2*this.options.padding,this.props.content.width)}this.dom.box.style.left=this.left+\"px\";this.dom.box.style.width=boxWidth+\"px\";switch(this.options.align){case\"left\":this.dom.content.style.left=\"0\";break;case\"right\":this.dom.content.style.left=Math.max(boxWidth-contentWidth-2*this.options.padding,0)+\"px\";break;case\"center\":this.dom.content.style.left=Math.max((boxWidth-contentWidth-2*this.options.padding)/2,0)+\"px\";break;default:if(this.overflow){if(end>0){contentLeft=Math.max(-start,0)}else{contentLeft=-contentWidth}}else{if(start<0){contentLeft=Math.min(-start,end-start-contentWidth-2*this.options.padding)}else{contentLeft=0}}this.dom.content.style.left=contentLeft+\"px\"}};RangeItem.prototype.repositionY=function(){var orientation=this.options.orientation,box=this.dom.box;if(orientation==\"top\"){box.style.top=this.top+\"px\"}else{box.style.top=this.parent.height-this.top-this.height+\"px\"}};RangeItem.prototype._repaintDragLeft=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragLeft){var dragLeft=document.createElement(\"div\");dragLeft.className=\"drag-left\";dragLeft.dragLeftItem=this;Hammer(dragLeft,{preventDefault:true}).on(\"drag\",function(){});this.dom.box.appendChild(dragLeft);this.dom.dragLeft=dragLeft}else if(!this.selected&&this.dom.dragLeft){if(this.dom.dragLeft.parentNode){this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft)}this.dom.dragLeft=null}};RangeItem.prototype._repaintDragRight=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragRight){var dragRight=document.createElement(\"div\");dragRight.className=\"drag-right\";dragRight.dragRightItem=this;Hammer(dragRight,{preventDefault:true}).on(\"drag\",function(){});this.dom.box.appendChild(dragRight);this.dom.dragRight=dragRight}else if(!this.selected&&this.dom.dragRight){if(this.dom.dragRight.parentNode){this.dom.dragRight.parentNode.removeChild(this.dom.dragRight)}this.dom.dragRight=null}};module.exports=RangeItem},function(module,exports,__webpack_require__){function Component(body,options){this.options=null;this.props=null}Component.prototype.setOptions=function(options){if(options){util.extend(this.options,options)}};Component.prototype.redraw=function(){return false\n};Component.prototype.destroy=function(){};Component.prototype._isResized=function(){var resized=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;this.props._previousWidth=this.props.width;this.props._previousHeight=this.props.height;return resized};module.exports=Component},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Component=__webpack_require__(25);var moment=__webpack_require__(44);var locales=__webpack_require__(48);function CurrentTime(body,options){this.body=body;this.defaultOptions={showCurrentTime:true,locales:locales,locale:\"en\"};this.options=util.extend({},this.defaultOptions);this.offset=0;this._create();this.setOptions(options)}CurrentTime.prototype=new Component;CurrentTime.prototype._create=function(){var bar=document.createElement(\"div\");bar.className=\"currenttime\";bar.style.position=\"absolute\";bar.style.top=\"0px\";bar.style.height=\"100%\";this.bar=bar};CurrentTime.prototype.destroy=function(){this.options.showCurrentTime=false;this.redraw();this.body=null};CurrentTime.prototype.setOptions=function(options){if(options){util.selectiveExtend([\"showCurrentTime\",\"locale\",\"locales\"],this.options,options)}};CurrentTime.prototype.redraw=function(){if(this.options.showCurrentTime){var parent=this.body.dom.backgroundVertical;if(this.bar.parentNode!=parent){if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}parent.appendChild(this.bar);this.start()}var now=new Date((new Date).valueOf()+this.offset);var x=this.body.util.toScreen(now);var locale=this.options.locales[this.options.locale];var title=locale.current+\" \"+locale.time+\": \"+moment(now).format(\"dddd, MMMM Do YYYY, H:mm:ss\");title=title.charAt(0).toUpperCase()+title.substring(1);this.bar.style.left=x+\"px\";this.bar.title=title}else{if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}this.stop()}return false};CurrentTime.prototype.start=function(){var me=this;function update(){me.stop();var scale=me.body.range.conversion(me.body.domProps.center.width).scale;var interval=1/scale/10;if(interval<30)interval=30;if(interval>1e3)interval=1e3;me.redraw();me.currentTimeTimer=setTimeout(update,interval)}update()};CurrentTime.prototype.stop=function(){if(this.currentTimeTimer!==undefined){clearTimeout(this.currentTimeTimer);delete this.currentTimeTimer}};CurrentTime.prototype.setCurrentTime=function(time){var t=util.convert(time,\"Date\").valueOf();var now=(new Date).valueOf();this.offset=t-now;this.redraw()};CurrentTime.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)};module.exports=CurrentTime},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(45);var util=__webpack_require__(1);var Component=__webpack_require__(25);var moment=__webpack_require__(44);var locales=__webpack_require__(48);function CustomTime(body,options){this.body=body;this.defaultOptions={showCustomTime:false,locales:locales,locale:\"en\"};this.options=util.extend({},this.defaultOptions);this.customTime=new Date;this.eventParams={};this._create();this.setOptions(options)}CustomTime.prototype=new Component;CustomTime.prototype.setOptions=function(options){if(options){util.selectiveExtend([\"showCustomTime\",\"locale\",\"locales\"],this.options,options)}};CustomTime.prototype._create=function(){var bar=document.createElement(\"div\");bar.className=\"customtime\";bar.style.position=\"absolute\";bar.style.top=\"0px\";bar.style.height=\"100%\";this.bar=bar;var drag=document.createElement(\"div\");drag.style.position=\"relative\";drag.style.top=\"0px\";drag.style.left=\"-10px\";drag.style.height=\"100%\";drag.style.width=\"20px\";bar.appendChild(drag);this.hammer=Hammer(bar,{prevent_default:true});this.hammer.on(\"dragstart\",this._onDragStart.bind(this));this.hammer.on(\"drag\",this._onDrag.bind(this));this.hammer.on(\"dragend\",this._onDragEnd.bind(this))};CustomTime.prototype.destroy=function(){this.options.showCustomTime=false;this.redraw();this.hammer.enable(false);this.hammer=null;this.body=null};CustomTime.prototype.redraw=function(){if(this.options.showCustomTime){var parent=this.body.dom.backgroundVertical;if(this.bar.parentNode!=parent){if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}parent.appendChild(this.bar)}var x=this.body.util.toScreen(this.customTime);var locale=this.options.locales[this.options.locale];var title=locale.time+\": \"+moment(this.customTime).format(\"dddd, MMMM Do YYYY, H:mm:ss\");title=title.charAt(0).toUpperCase()+title.substring(1);this.bar.style.left=x+\"px\";this.bar.title=title}else{if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}}return false};CustomTime.prototype.setCustomTime=function(time){this.customTime=util.convert(time,\"Date\");this.redraw()};CustomTime.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())};CustomTime.prototype._onDragStart=function(event){this.eventParams.dragging=true;this.eventParams.customTime=this.customTime;event.stopPropagation();event.preventDefault()};CustomTime.prototype._onDrag=function(event){if(!this.eventParams.dragging)return;var deltaX=event.gesture.deltaX,x=this.body.util.toScreen(this.eventParams.customTime)+deltaX,time=this.body.util.toTime(x);this.setCustomTime(time);this.body.emitter.emit(\"timechange\",{time:new Date(this.customTime.valueOf())});event.stopPropagation();event.preventDefault()};CustomTime.prototype._onDragEnd=function(event){if(!this.eventParams.dragging)return;this.body.emitter.emit(\"timechanged\",{time:new Date(this.customTime.valueOf())});event.stopPropagation();event.preventDefault()};module.exports=CustomTime},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var DOMutil=__webpack_require__(2);var Component=__webpack_require__(25);var DataStep=__webpack_require__(16);function DataAxis(body,options,svg,linegraphOptions){this.id=util.randomUUID();this.body=body;this.defaultOptions={orientation:\"left\",showMinorLabels:true,showMajorLabels:true,icons:true,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:\"40px\",visible:true,alignZeros:true,customRange:{left:{min:undefined,max:undefined},right:{min:undefined,max:undefined}},title:{left:{text:undefined},right:{text:undefined}},format:{left:{decimals:undefined},right:{decimals:undefined}}};this.linegraphOptions=linegraphOptions;this.linegraphSVG=svg;this.props={};this.DOMelements={lines:{},labels:{},title:{}};this.dom={};this.range={start:0,end:0};this.options=util.extend({},this.defaultOptions);this.conversionFactor=1;this.setOptions(options);this.width=Number((\"\"+this.options.width).replace(\"px\",\"\"));this.minWidth=this.width;this.height=this.linegraphSVG.offsetHeight;this.hidden=false;this.stepPixels=25;this.stepPixelsForced=25;this.zeroCrossing=-1;this.lineOffset=0;this.master=true;this.svgElements={};this.iconsRemoved=false;this.groups={};this.amountOfGroups=0;this._create();var me=this;this.body.emitter.on(\"verticalDrag\",function(){me.dom.lineContainer.style.top=me.body.domProps.scrollTop+\"px\"})}DataAxis.prototype=new Component;DataAxis.prototype.addGroup=function(label,graphOptions){if(!this.groups.hasOwnProperty(label)){this.groups[label]=graphOptions}this.amountOfGroups+=1};DataAxis.prototype.updateGroup=function(label,graphOptions){this.groups[label]=graphOptions};DataAxis.prototype.removeGroup=function(label){if(this.groups.hasOwnProperty(label)){delete this.groups[label];this.amountOfGroups-=1}};DataAxis.prototype.setOptions=function(options){if(options){var redraw=false;if(this.options.orientation!=options.orientation&&options.orientation!==undefined){redraw=true}var fields=[\"orientation\",\"showMinorLabels\",\"showMajorLabels\",\"icons\",\"majorLinesOffset\",\"minorLinesOffset\",\"labelOffsetX\",\"labelOffsetY\",\"iconWidth\",\"width\",\"visible\",\"customRange\",\"title\",\"format\",\"alignZeros\"];util.selectiveExtend(fields,this.options,options);this.minWidth=Number((\"\"+this.options.width).replace(\"px\",\"\"));if(redraw==true&&this.dom.frame){this.hide();this.show()}}};DataAxis.prototype._create=function(){this.dom.frame=document.createElement(\"div\");this.dom.frame.style.width=this.options.width;this.dom.frame.style.height=this.height;this.dom.lineContainer=document.createElement(\"div\");this.dom.lineContainer.style.width=\"100%\";this.dom.lineContainer.style.height=this.height;this.dom.lineContainer.style.position=\"relative\";this.svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");this.svg.style.position=\"absolute\";this.svg.style.top=\"0px\";this.svg.style.height=\"100%\";this.svg.style.width=\"100%\";this.svg.style.display=\"block\";this.dom.frame.appendChild(this.svg)};DataAxis.prototype._redrawGroupIcons=function(){DOMutil.prepareElements(this.svgElements);var x;var iconWidth=this.options.iconWidth;var iconHeight=15;var iconOffset=4;var y=iconOffset+.5*iconHeight;if(this.options.orientation==\"left\"){x=iconOffset}else{x=this.width-iconWidth-iconOffset}for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){this.groups[groupId].drawIcon(x,y,this.svgElements,this.svg,iconWidth,iconHeight);y+=iconHeight+iconOffset}}}DOMutil.cleanupElements(this.svgElements);this.iconsRemoved=false};DataAxis.prototype._cleanupIcons=function(){if(this.iconsRemoved==false){DOMutil.prepareElements(this.svgElements);DOMutil.cleanupElements(this.svgElements);this.iconsRemoved=true}};DataAxis.prototype.show=function(){this.hidden=false;if(!this.dom.frame.parentNode){if(this.options.orientation==\"left\"){this.body.dom.left.appendChild(this.dom.frame)}else{this.body.dom.right.appendChild(this.dom.frame)}}if(!this.dom.lineContainer.parentNode){this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)}};DataAxis.prototype.hide=function(){this.hidden=true;if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}if(this.dom.lineContainer.parentNode){this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)}};DataAxis.prototype.setRange=function(start,end){if(this.master==false&&this.options.alignZeros==true&&this.zeroCrossing!=-1){if(start>0){start=0}}this.range.start=start;this.range.end=end};DataAxis.prototype.redraw=function(){var resized=false;var activeGroups=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+\"px\";for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){activeGroups++}}}if(this.amountOfGroups==0||activeGroups==0){this.hide()}else{this.show();this.height=Number(this.linegraphSVG.style.height.replace(\"px\",\"\"));this.dom.lineContainer.style.height=this.height+\"px\";this.width=this.options.visible==true?Number((\"\"+this.options.width).replace(\"px\",\"\")):0;var props=this.props;var frame=this.dom.frame;frame.className=\"dataaxis\";this._calculateCharSize();var orientation=this.options.orientation;var showMinorLabels=this.options.showMinorLabels;var showMajorLabels=this.options.showMajorLabels;props.minorLabelHeight=showMinorLabels?props.minorCharHeight:0;props.majorLabelHeight=showMajorLabels?props.majorCharHeight:0;props.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset;props.minorLineHeight=1;props.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset;props.majorLineHeight=1;if(orientation==\"left\"){frame.style.top=\"0\";frame.style.left=\"0\";frame.style.bottom=\"\";frame.style.width=this.width+\"px\";frame.style.height=this.height+\"px\";this.props.width=this.body.domProps.left.width;this.props.height=this.body.domProps.left.height}else{frame.style.top=\"\";frame.style.bottom=\"0\";frame.style.left=\"0\";frame.style.width=this.width+\"px\";frame.style.height=this.height+\"px\";this.props.width=this.body.domProps.right.width;this.props.height=this.body.domProps.right.height}resized=this._redrawLabels();resized=this._isResized()||resized;if(this.options.icons==true){this._redrawGroupIcons()}else{this._cleanupIcons()}this._redrawTitle(orientation)}return resized};DataAxis.prototype._redrawLabels=function(){var resized=false;DOMutil.prepareElements(this.DOMelements.lines);DOMutil.prepareElements(this.DOMelements.labels);var orientation=this.options[\"orientation\"];var minimumStep=this.master?this.props.majorCharHeight||10:this.stepPixelsForced;var step=new DataStep(this.range.start,this.range.end,minimumStep,this.dom.frame.offsetHeight,this.options.customRange[this.options.orientation],this.master==false&&this.options.alignZeros);this.step=step;var stepPixels=(this.dom.frame.offsetHeight-step.deadSpace*(this.dom.frame.offsetHeight/step.marginRange))/((step.marginRange-step.deadSpace)/step.step);this.stepPixels=stepPixels;var amountOfSteps=this.height/stepPixels;var stepDifference=0;if(this.master==false){stepPixels=this.stepPixelsForced;stepDifference=Math.round(this.dom.frame.offsetHeight/stepPixels-amountOfSteps);for(var i=0;i<.5*stepDifference;i++){step.previous()}amountOfSteps=this.height/stepPixels;if(this.zeroCrossing!=-1&&this.options.alignZeros==true){var zeroStepDifference=step.marginEnd/step.step-this.zeroCrossing;if(zeroStepDifference>0){for(var i=0;i<zeroStepDifference;i++){step.next()}}else if(zeroStepDifference<0){for(var i=0;i<-zeroStepDifference;i++){step.previous()}}}}else{amountOfSteps+=.25}this.valueAtZero=step.marginEnd;var marginStartPos=0;var max=1;var decimals;if(this.options.format[orientation]!==undefined){decimals=this.options.format[orientation].decimals}this.maxLabelSize=0;var y=0;while(max<Math.round(amountOfSteps)){step.next();y=Math.round(max*stepPixels);marginStartPos=max*stepPixels;var isMajor=step.isMajor();if(this.options[\"showMinorLabels\"]&&isMajor==false||this.master==false&&this.options[\"showMinorLabels\"]==true){this._redrawLabel(y-2,step.getCurrent(decimals),orientation,\"yAxis minor\",this.props.minorCharHeight)}if(isMajor&&this.options[\"showMajorLabels\"]&&this.master==true||this.options[\"showMinorLabels\"]==false&&this.master==false&&isMajor==true){if(y>=0){this._redrawLabel(y-2,step.getCurrent(decimals),orientation,\"yAxis major\",this.props.majorCharHeight)}this._redrawLine(y,orientation,\"grid horizontal major\",this.options.majorLinesOffset,this.props.majorLineWidth)}else{this._redrawLine(y,orientation,\"grid horizontal minor\",this.options.minorLinesOffset,this.props.minorLineWidth)}if(this.master==true&&step.current==0){this.zeroCrossing=max}max++}if(this.master==false){this.conversionFactor=y/(this.valueAtZero-step.current)}else{this.conversionFactor=this.dom.frame.offsetHeight/step.marginRange}var titleWidth=0;if(this.options.title[orientation]!==undefined&&this.options.title[orientation].text!==undefined){titleWidth=this.props.titleCharHeight}var offset=this.options.icons==true?Math.max(this.options.iconWidth,titleWidth)+this.options.labelOffsetX+15:titleWidth+this.options.labelOffsetX+15;if(this.maxLabelSize>this.width-offset&&this.options.visible==true){this.width=this.maxLabelSize+offset;this.options.width=this.width+\"px\";DOMutil.cleanupElements(this.DOMelements.lines);DOMutil.cleanupElements(this.DOMelements.labels);this.redraw();resized=true}else if(this.maxLabelSize<this.width-offset&&this.options.visible==true&&this.width>this.minWidth){this.width=Math.max(this.minWidth,this.maxLabelSize+offset);this.options.width=this.width+\"px\";DOMutil.cleanupElements(this.DOMelements.lines);DOMutil.cleanupElements(this.DOMelements.labels);this.redraw();resized=true}else{DOMutil.cleanupElements(this.DOMelements.lines);DOMutil.cleanupElements(this.DOMelements.labels);resized=false}return resized};DataAxis.prototype.convertValue=function(value){var invertedValue=this.valueAtZero-value;var convertedValue=invertedValue*this.conversionFactor;return convertedValue};DataAxis.prototype._redrawLabel=function(y,text,orientation,className,characterHeight){var label=DOMutil.getDOMElement(\"div\",this.DOMelements.labels,this.dom.frame);label.className=className;label.innerHTML=text;if(orientation==\"left\"){label.style.left=\"-\"+this.options.labelOffsetX+\"px\";label.style.textAlign=\"right\"}else{label.style.right=\"-\"+this.options.labelOffsetX+\"px\";label.style.textAlign=\"left\"}label.style.top=y-.5*characterHeight+this.options.labelOffsetY+\"px\";text+=\"\";var largestWidth=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);if(this.maxLabelSize<text.length*largestWidth){this.maxLabelSize=text.length*largestWidth}};DataAxis.prototype._redrawLine=function(y,orientation,className,offset,width){if(this.master==true){var line=DOMutil.getDOMElement(\"div\",this.DOMelements.lines,this.dom.lineContainer);line.className=className;line.innerHTML=\"\";if(orientation==\"left\"){line.style.left=this.width-offset+\"px\"}else{line.style.right=this.width-offset+\"px\"}line.style.width=width+\"px\";line.style.top=y+\"px\"}};DataAxis.prototype._redrawTitle=function(orientation){DOMutil.prepareElements(this.DOMelements.title);if(this.options.title[orientation]!==undefined&&this.options.title[orientation].text!==undefined){var title=DOMutil.getDOMElement(\"div\",this.DOMelements.title,this.dom.frame);title.className=\"yAxis title \"+orientation;title.innerHTML=this.options.title[orientation].text;if(this.options.title[orientation].style!==undefined){util.addCssText(title,this.options.title[orientation].style)}if(orientation==\"left\"){title.style.left=this.props.titleCharHeight+\"px\"}else{title.style.right=this.props.titleCharHeight+\"px\"}title.style.width=this.height+\"px\"}DOMutil.cleanupElements(this.DOMelements.title)};DataAxis.prototype._calculateCharSize=function(){if(!(\"minorCharHeight\"in this.props)){var textMinor=document.createTextNode(\"0\");var measureCharMinor=document.createElement(\"div\");measureCharMinor.className=\"yAxis minor measure\";measureCharMinor.appendChild(textMinor);this.dom.frame.appendChild(measureCharMinor);this.props.minorCharHeight=measureCharMinor.clientHeight;this.props.minorCharWidth=measureCharMinor.clientWidth;this.dom.frame.removeChild(measureCharMinor)}if(!(\"majorCharHeight\"in this.props)){var textMajor=document.createTextNode(\"0\");var measureCharMajor=document.createElement(\"div\");measureCharMajor.className=\"yAxis major measure\";measureCharMajor.appendChild(textMajor);this.dom.frame.appendChild(measureCharMajor);this.props.majorCharHeight=measureCharMajor.clientHeight;this.props.majorCharWidth=measureCharMajor.clientWidth;this.dom.frame.removeChild(measureCharMajor)}if(!(\"titleCharHeight\"in this.props)){var textTitle=document.createTextNode(\"0\");var measureCharTitle=document.createElement(\"div\");measureCharTitle.className=\"yAxis title measure\";measureCharTitle.appendChild(textTitle);this.dom.frame.appendChild(measureCharTitle);this.props.titleCharHeight=measureCharTitle.clientHeight;this.props.titleCharWidth=measureCharTitle.clientWidth;this.dom.frame.removeChild(measureCharTitle)}};module.exports=DataAxis},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var DOMutil=__webpack_require__(2);var Line=__webpack_require__(49);var Bar=__webpack_require__(50);var Points=__webpack_require__(51);function GraphGroup(group,groupId,options,groupsUsingDefaultStyles){this.id=groupId;var fields=[\"sampling\",\"style\",\"sort\",\"yAxisOrientation\",\"barChart\",\"drawPoints\",\"shaded\",\"catmullRom\"];this.options=util.selectiveBridgeObject(fields,options);this.usingDefaultStyle=group.className===undefined;this.groupsUsingDefaultStyles=groupsUsingDefaultStyles;this.zeroPosition=0;this.update(group);if(this.usingDefaultStyle==true){this.groupsUsingDefaultStyles[0]+=1}this.itemsData=[];this.visible=group.visible===undefined?true:group.visible}GraphGroup.prototype.setItems=function(items){if(items!=null){this.itemsData=items;if(this.options.sort==true){this.itemsData.sort(function(a,b){return a.x-b.x})}}else{this.itemsData=[]}};GraphGroup.prototype.setZeroPosition=function(pos){this.zeroPosition=pos};GraphGroup.prototype.setOptions=function(options){if(options!==undefined){var fields=[\"sampling\",\"style\",\"sort\",\"yAxisOrientation\",\"barChart\"];util.selectiveDeepExtend(fields,this.options,options);util.mergeOptions(this.options,options,\"catmullRom\");util.mergeOptions(this.options,options,\"drawPoints\");util.mergeOptions(this.options,options,\"shaded\");if(options.catmullRom){if(typeof options.catmullRom==\"object\"){if(options.catmullRom.parametrization){if(options.catmullRom.parametrization==\"uniform\"){this.options.catmullRom.alpha=0}else if(options.catmullRom.parametrization==\"chordal\"){this.options.catmullRom.alpha=1}else{this.options.catmullRom.parametrization=\"centripetal\";this.options.catmullRom.alpha=.5}}}}}if(this.options.style==\"line\"){this.type=new Line(this.id,this.options)}else if(this.options.style==\"bar\"){this.type=new Bar(this.id,this.options)}else if(this.options.style==\"points\"){this.type=new Points(this.id,this.options)}};GraphGroup.prototype.update=function(group){this.group=group;this.content=group.content||\"graph\";this.className=group.className||this.className||\"graphGroup\"+this.groupsUsingDefaultStyles[0]%10;this.visible=group.visible===undefined?true:group.visible;this.style=group.style;this.setOptions(group.options)};GraphGroup.prototype.drawIcon=function(x,y,JSONcontainer,SVGcontainer,iconWidth,iconHeight){var fillHeight=iconHeight*.5;var path,fillPath;var outline=DOMutil.getSVGElement(\"rect\",JSONcontainer,SVGcontainer);outline.setAttributeNS(null,\"x\",x);outline.setAttributeNS(null,\"y\",y-fillHeight);outline.setAttributeNS(null,\"width\",iconWidth);outline.setAttributeNS(null,\"height\",2*fillHeight);outline.setAttributeNS(null,\"class\",\"outline\");if(this.options.style==\"line\"){path=DOMutil.getSVGElement(\"path\",JSONcontainer,SVGcontainer);path.setAttributeNS(null,\"class\",this.className);if(this.style!==undefined){path.setAttributeNS(null,\"style\",this.style)}path.setAttributeNS(null,\"d\",\"M\"+x+\",\"+y+\" L\"+(x+iconWidth)+\",\"+y+\"\");if(this.options.shaded.enabled==true){fillPath=DOMutil.getSVGElement(\"path\",JSONcontainer,SVGcontainer);if(this.options.shaded.orientation==\"top\"){fillPath.setAttributeNS(null,\"d\",\"M\"+x+\", \"+(y-fillHeight)+\"L\"+x+\",\"+y+\" L\"+(x+iconWidth)+\",\"+y+\" L\"+(x+iconWidth)+\",\"+(y-fillHeight))}else{fillPath.setAttributeNS(null,\"d\",\"M\"+x+\",\"+y+\" \"+\"L\"+x+\",\"+(y+fillHeight)+\" \"+\"L\"+(x+iconWidth)+\",\"+(y+fillHeight)+\"L\"+(x+iconWidth)+\",\"+y)}fillPath.setAttributeNS(null,\"class\",this.className+\" iconFill\")}if(this.options.drawPoints.enabled==true){DOMutil.drawPoint(x+.5*iconWidth,y,this,JSONcontainer,SVGcontainer)}}else{var barWidth=Math.round(.3*iconWidth);var bar1Height=Math.round(.4*iconHeight);var bar2Height=Math.round(.75*iconHeight);var offset=Math.round((iconWidth-2*barWidth)/3);DOMutil.drawBar(x+.5*barWidth+offset,y+fillHeight-bar1Height-1,barWidth,bar1Height,this.className+\" bar\",JSONcontainer,SVGcontainer);DOMutil.drawBar(x+1.5*barWidth+offset+2,y+fillHeight-bar2Height-1,barWidth,bar2Height,this.className+\" bar\",JSONcontainer,SVGcontainer)}};GraphGroup.prototype.getLegend=function(iconWidth,iconHeight){var svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");this.drawIcon(0,.5*iconHeight,[],svg,iconWidth,iconHeight);return{icon:svg,label:this.content,orientation:this.options.yAxisOrientation}};GraphGroup.prototype.getYRange=function(groupData){return this.type.getYRange(groupData)};GraphGroup.prototype.draw=function(dataset,group,framework){this.type.draw(dataset,group,framework)};module.exports=GraphGroup},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var stack=__webpack_require__(18);var RangeItem=__webpack_require__(24);function Group(groupId,data,itemSet){this.groupId=groupId;this.subgroups={};this.subgroupIndex=0;this.subgroupOrderer=data&&data.subgroupOrder;this.itemSet=itemSet;this.dom={};this.props={label:{width:0,height:0}};this.className=null;this.items={};this.visibleItems=[];this.orderedItems={byStart:[],byEnd:[]};this.checkRangedItems=false;var me=this;this.itemSet.body.emitter.on(\"checkRangedItems\",function(){me.checkRangedItems=true});this._create();this.setData(data)}Group.prototype._create=function(){var label=document.createElement(\"div\");label.className=\"vlabel\";this.dom.label=label;var inner=document.createElement(\"div\");inner.className=\"inner\";label.appendChild(inner);this.dom.inner=inner;var foreground=document.createElement(\"div\");foreground.className=\"group\";foreground[\"timeline-group\"]=this;this.dom.foreground=foreground;this.dom.background=document.createElement(\"div\");this.dom.background.className=\"group\";this.dom.axis=document.createElement(\"div\");this.dom.axis.className=\"group\";this.dom.marker=document.createElement(\"div\");this.dom.marker.style.visibility=\"hidden\";this.dom.marker.innerHTML=\"?\";this.dom.background.appendChild(this.dom.marker)};Group.prototype.setData=function(data){var content=data&&data.content;if(content instanceof Element){this.dom.inner.appendChild(content)}else if(content!==undefined&&content!==null){this.dom.inner.innerHTML=content}else{this.dom.inner.innerHTML=this.groupId||\"\"}this.dom.label.title=data&&data.title||\"\";if(!this.dom.inner.firstChild){util.addClassName(this.dom.inner,\"hidden\")}else{util.removeClassName(this.dom.inner,\"hidden\")}var className=data&&data.className||null;if(className!=this.className){if(this.className){util.removeClassName(this.dom.label,this.className);util.removeClassName(this.dom.foreground,this.className);util.removeClassName(this.dom.background,this.className);util.removeClassName(this.dom.axis,this.className)}util.addClassName(this.dom.label,className);util.addClassName(this.dom.foreground,className);util.addClassName(this.dom.background,className);util.addClassName(this.dom.axis,className);this.className=className}if(this.style){util.removeCssText(this.dom.label,this.style);this.style=null}if(data&&data.style){util.addCssText(this.dom.label,data.style);this.style=data.style}};Group.prototype.getLabelWidth=function(){return this.props.label.width};Group.prototype.redraw=function(range,margin,restack){var resized=false;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,range);var markerHeight=this.dom.marker.clientHeight;if(markerHeight!=this.lastMarkerHeight){this.lastMarkerHeight=markerHeight;util.forEach(this.items,function(item){item.dirty=true;if(item.displayed)item.redraw()});restack=true}if(this.itemSet.options.stack){stack.stack(this.visibleItems,margin,restack)}else{stack.nostack(this.visibleItems,margin,this.subgroups)}var height=this._calculateHeight(margin);var foreground=this.dom.foreground;this.top=foreground.offsetTop;this.left=foreground.offsetLeft;this.width=foreground.offsetWidth;resized=util.updateProperty(this,\"height\",height)||resized;resized=util.updateProperty(this.props.label,\"width\",this.dom.inner.clientWidth)||resized;resized=util.updateProperty(this.props.label,\"height\",this.dom.inner.clientHeight)||resized;this.dom.background.style.height=height+\"px\";this.dom.foreground.style.height=height+\"px\";this.dom.label.style.height=height+\"px\";for(var i=0,ii=this.visibleItems.length;i<ii;i++){var item=this.visibleItems[i];item.repositionY(margin)}return resized};Group.prototype._calculateHeight=function(margin){var height;var visibleItems=this.visibleItems;this.resetSubgroups();var me=this;if(visibleItems.length){var min=visibleItems[0].top;var max=visibleItems[0].top+visibleItems[0].height;util.forEach(visibleItems,function(item){min=Math.min(min,item.top);max=Math.max(max,item.top+item.height);if(item.data.subgroup!==undefined){me.subgroups[item.data.subgroup].height=Math.max(me.subgroups[item.data.subgroup].height,item.height);me.subgroups[item.data.subgroup].visible=true}});if(min>margin.axis){var offset=min-margin.axis;max-=offset;util.forEach(visibleItems,function(item){item.top-=offset})}height=max+margin.item.vertical/2}else{height=margin.axis+margin.item.vertical}height=Math.max(height,this.props.label.height);return height};Group.prototype.show=function(){if(!this.dom.label.parentNode){this.itemSet.dom.labelSet.appendChild(this.dom.label)}if(!this.dom.foreground.parentNode){this.itemSet.dom.foreground.appendChild(this.dom.foreground)}if(!this.dom.background.parentNode){this.itemSet.dom.background.appendChild(this.dom.background)}if(!this.dom.axis.parentNode){this.itemSet.dom.axis.appendChild(this.dom.axis)}};Group.prototype.hide=function(){var label=this.dom.label;if(label.parentNode){label.parentNode.removeChild(label)}var foreground=this.dom.foreground;if(foreground.parentNode){foreground.parentNode.removeChild(foreground)}var background=this.dom.background;if(background.parentNode){background.parentNode.removeChild(background)}var axis=this.dom.axis;if(axis.parentNode){axis.parentNode.removeChild(axis)}};Group.prototype.add=function(item){this.items[item.id]=item;item.setParent(this);if(item.data.subgroup!==undefined){if(this.subgroups[item.data.subgroup]===undefined){this.subgroups[item.data.subgroup]={height:0,visible:false,index:this.subgroupIndex,items:[]};this.subgroupIndex++}this.subgroups[item.data.subgroup].items.push(item)}this.orderSubgroups();if(this.visibleItems.indexOf(item)==-1){var range=this.itemSet.body.range;this._checkIfVisible(item,this.visibleItems,range)}};Group.prototype.orderSubgroups=function(){if(this.subgroupOrderer!==undefined){var sortArray=[];if(typeof this.subgroupOrderer==\"string\"){for(var subgroup in this.subgroups){sortArray.push({subgroup:subgroup,sortField:this.subgroups[subgroup].items[0].data[this.subgroupOrderer]})}sortArray.sort(function(a,b){return a.sortField-b.sortField})}else if(typeof this.subgroupOrderer==\"function\"){for(var subgroup in this.subgroups){sortArray.push(this.subgroups[subgroup].items[0].data)}sortArray.sort(this.subgroupOrderer)}if(sortArray.length>0){for(var i=0;i<sortArray.length;i++){this.subgroups[sortArray[i].subgroup].index=i}}}};Group.prototype.resetSubgroups=function(){for(var subgroup in this.subgroups){if(this.subgroups.hasOwnProperty(subgroup)){this.subgroups[subgroup].visible=false}}};Group.prototype.remove=function(item){delete this.items[item.id];item.setParent(null);var index=this.visibleItems.indexOf(item);if(index!=-1)this.visibleItems.splice(index,1)};Group.prototype.removeFromDataSet=function(item){this.itemSet.removeItem(item.id)};Group.prototype.order=function(){var array=util.toArray(this.items);var startArray=[];var endArray=[];for(var i=0;i<array.length;i++){if(array[i].data.end!==undefined){endArray.push(array[i])}startArray.push(array[i])}this.orderedItems={byStart:startArray,byEnd:endArray};stack.orderByStart(this.orderedItems.byStart);stack.orderByEnd(this.orderedItems.byEnd)};Group.prototype._updateVisibleItems=function(orderedItems,oldVisibleItems,range){var visibleItems=[];var visibleItemsLookup={};var interval=(range.end-range.start)/4;var lowerBound=range.start-interval;var upperBound=range.end+interval;var item,i;var searchFunction=function(value){if(value<lowerBound){return-1}else if(value<=upperBound){return 0}else{return 1}};if(oldVisibleItems.length>0){for(i=0;i<oldVisibleItems.length;i++){this._checkIfVisibleWithReference(oldVisibleItems[i],visibleItems,visibleItemsLookup,range)}}var initialPosByStart=util.binarySearchCustom(orderedItems.byStart,searchFunction,\"data\",\"start\");this._traceVisible(initialPosByStart,orderedItems.byStart,visibleItems,visibleItemsLookup,function(item){return item.data.start<lowerBound||item.data.start>upperBound});if(this.checkRangedItems==true){this.checkRangedItems=false;for(i=0;i<orderedItems.byEnd.length;i++){this._checkIfVisibleWithReference(orderedItems.byEnd[i],visibleItems,visibleItemsLookup,range)}}else{var initialPosByEnd=util.binarySearchCustom(orderedItems.byEnd,searchFunction,\"data\",\"end\");this._traceVisible(initialPosByEnd,orderedItems.byEnd,visibleItems,visibleItemsLookup,function(item){return item.data.end<lowerBound||item.data.end>upperBound})}for(i=0;i<visibleItems.length;i++){item=visibleItems[i];\nif(!item.displayed)item.show();item.repositionX()}return visibleItems};Group.prototype._traceVisible=function(initialPos,items,visibleItems,visibleItemsLookup,breakCondition){var item;var i;if(initialPos!=-1){for(i=initialPos;i>=0;i--){item=items[i];if(breakCondition(item)){break}else{if(visibleItemsLookup[item.id]===undefined){visibleItemsLookup[item.id]=true;visibleItems.push(item)}}}for(i=initialPos+1;i<items.length;i++){item=items[i];if(breakCondition(item)){break}else{if(visibleItemsLookup[item.id]===undefined){visibleItemsLookup[item.id]=true;visibleItems.push(item)}}}}};Group.prototype._checkIfVisible=function(item,visibleItems,range){if(item.isVisible(range)){if(!item.displayed)item.show();item.repositionX();visibleItems.push(item)}else{if(item.displayed)item.hide()}};Group.prototype._checkIfVisibleWithReference=function(item,visibleItems,visibleItemsLookup,range){if(item.isVisible(range)){if(visibleItemsLookup[item.id]===undefined){visibleItemsLookup[item.id]=true;visibleItems.push(item)}}else{if(item.displayed)item.hide()}};module.exports=Group},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Group=__webpack_require__(30);function BackgroundGroup(groupId,data,itemSet){Group.call(this,groupId,data,itemSet);this.width=0;this.height=0;this.top=0;this.left=0}BackgroundGroup.prototype=Object.create(Group.prototype);BackgroundGroup.prototype.redraw=function(range,margin,restack){var resized=false;this.visibleItems=this._updateVisibleItems(this.orderedItems,this.visibleItems,range);this.width=this.dom.background.offsetWidth;this.dom.background.style.height=\"0\";for(var i=0,ii=this.visibleItems.length;i<ii;i++){var item=this.visibleItems[i];item.repositionY(margin)}return resized};BackgroundGroup.prototype.show=function(){if(!this.dom.background.parentNode){this.itemSet.dom.background.appendChild(this.dom.background)}};module.exports=BackgroundGroup},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(45);var util=__webpack_require__(1);var DataSet=__webpack_require__(3);var DataView=__webpack_require__(4);var TimeStep=__webpack_require__(19);var Component=__webpack_require__(25);var Group=__webpack_require__(30);var BackgroundGroup=__webpack_require__(31);var BoxItem=__webpack_require__(22);var PointItem=__webpack_require__(23);var RangeItem=__webpack_require__(24);var BackgroundItem=__webpack_require__(21);var UNGROUPED=\"__ungrouped__\";var BACKGROUND=\"__background__\";function ItemSet(body,options){this.body=body;this.defaultOptions={type:null,orientation:\"bottom\",align:\"auto\",stack:true,groupOrder:null,selectable:true,editable:{updateTime:false,updateGroup:false,add:false,remove:false},snap:TimeStep.snap,onAdd:function(item,callback){callback(item)},onUpdate:function(item,callback){callback(item)},onMove:function(item,callback){callback(item)},onRemove:function(item,callback){callback(item)},onMoving:function(item,callback){callback(item)},margin:{item:{horizontal:10,vertical:10},axis:20},padding:5};this.options=util.extend({},this.defaultOptions);this.itemOptions={type:{start:\"Date\",end:\"Date\"}};this.conversion={toScreen:body.util.toScreen,toTime:body.util.toTime};this.dom={};this.props={};this.hammer=null;var me=this;this.itemsData=null;this.groupsData=null;this.itemListeners={add:function(event,params,senderId){me._onAdd(params.items)},update:function(event,params,senderId){me._onUpdate(params.items)},remove:function(event,params,senderId){me._onRemove(params.items)}};this.groupListeners={add:function(event,params,senderId){me._onAddGroups(params.items)},update:function(event,params,senderId){me._onUpdateGroups(params.items)},remove:function(event,params,senderId){me._onRemoveGroups(params.items)}};this.items={};this.groups={};this.groupIds=[];this.selection=[];this.stackDirty=true;this.touchParams={};this._create();this.setOptions(options)}ItemSet.prototype=new Component;ItemSet.types={background:BackgroundItem,box:BoxItem,range:RangeItem,point:PointItem};ItemSet.prototype._create=function(){var frame=document.createElement(\"div\");frame.className=\"itemset\";frame[\"timeline-itemset\"]=this;this.dom.frame=frame;var background=document.createElement(\"div\");background.className=\"background\";frame.appendChild(background);this.dom.background=background;var foreground=document.createElement(\"div\");foreground.className=\"foreground\";frame.appendChild(foreground);this.dom.foreground=foreground;var axis=document.createElement(\"div\");axis.className=\"axis\";this.dom.axis=axis;var labelSet=document.createElement(\"div\");labelSet.className=\"labelset\";this.dom.labelSet=labelSet;this._updateUngrouped();var backgroundGroup=new BackgroundGroup(BACKGROUND,null,this);backgroundGroup.show();this.groups[BACKGROUND]=backgroundGroup;this.hammer=Hammer(this.body.dom.centerContainer,{preventDefault:true});this.hammer.on(\"touch\",this._onTouch.bind(this));this.hammer.on(\"dragstart\",this._onDragStart.bind(this));this.hammer.on(\"drag\",this._onDrag.bind(this));this.hammer.on(\"dragend\",this._onDragEnd.bind(this));this.hammer.on(\"tap\",this._onSelectItem.bind(this));this.hammer.on(\"hold\",this._onMultiSelectItem.bind(this));this.hammer.on(\"doubletap\",this._onAddItem.bind(this));this.show()};ItemSet.prototype.setOptions=function(options){if(options){var fields=[\"type\",\"align\",\"orientation\",\"padding\",\"stack\",\"selectable\",\"groupOrder\",\"dataAttributes\",\"template\",\"hide\",\"snap\"];util.selectiveExtend(fields,this.options,options);if(\"margin\"in options){if(typeof options.margin===\"number\"){this.options.margin.axis=options.margin;this.options.margin.item.horizontal=options.margin;this.options.margin.item.vertical=options.margin}else if(typeof options.margin===\"object\"){util.selectiveExtend([\"axis\"],this.options.margin,options.margin);if(\"item\"in options.margin){if(typeof options.margin.item===\"number\"){this.options.margin.item.horizontal=options.margin.item;this.options.margin.item.vertical=options.margin.item}else if(typeof options.margin.item===\"object\"){util.selectiveExtend([\"horizontal\",\"vertical\"],this.options.margin.item,options.margin.item)}}}}if(\"editable\"in options){if(typeof options.editable===\"boolean\"){this.options.editable.updateTime=options.editable;this.options.editable.updateGroup=options.editable;this.options.editable.add=options.editable;this.options.editable.remove=options.editable}else if(typeof options.editable===\"object\"){util.selectiveExtend([\"updateTime\",\"updateGroup\",\"add\",\"remove\"],this.options.editable,options.editable)}}var addCallback=function(name){var fn=options[name];if(fn){if(!(fn instanceof Function)){throw new Error(\"option \"+name+\" must be a function \"+name+\"(item, callback)\")}this.options[name]=fn}}.bind(this);[\"onAdd\",\"onUpdate\",\"onRemove\",\"onMove\",\"onMoving\"].forEach(addCallback);this.markDirty()}};ItemSet.prototype.markDirty=function(options){this.groupIds=[];this.stackDirty=true;if(options&&options.refreshItems){util.forEach(this.items,function(item){item.dirty=true;if(item.displayed)item.redraw()})}};ItemSet.prototype.destroy=function(){this.hide();this.setItems(null);this.setGroups(null);this.hammer=null;this.body=null;this.conversion=null};ItemSet.prototype.hide=function(){if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}if(this.dom.axis.parentNode){this.dom.axis.parentNode.removeChild(this.dom.axis)}if(this.dom.labelSet.parentNode){this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)}};ItemSet.prototype.show=function(){if(!this.dom.frame.parentNode){this.body.dom.center.appendChild(this.dom.frame)}if(!this.dom.axis.parentNode){this.body.dom.backgroundVertical.appendChild(this.dom.axis)}if(!this.dom.labelSet.parentNode){this.body.dom.left.appendChild(this.dom.labelSet)}};ItemSet.prototype.setSelection=function(ids){var i,ii,id,item;if(ids==undefined)ids=[];if(!Array.isArray(ids))ids=[ids];for(i=0,ii=this.selection.length;i<ii;i++){id=this.selection[i];item=this.items[id];if(item)item.unselect()}this.selection=[];for(i=0,ii=ids.length;i<ii;i++){id=ids[i];item=this.items[id];if(item){this.selection.push(id);item.select()}}};ItemSet.prototype.getSelection=function(){return this.selection.concat([])};ItemSet.prototype.getVisibleItems=function(){var range=this.body.range.getRange();var left=this.body.util.toScreen(range.start);var right=this.body.util.toScreen(range.end);var ids=[];for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){var group=this.groups[groupId];var rawVisibleItems=group.visibleItems;for(var i=0;i<rawVisibleItems.length;i++){var item=rawVisibleItems[i];if(item.left<right&&item.left+item.width>left){ids.push(item.id)}}}}return ids};ItemSet.prototype._deselect=function(id){var selection=this.selection;for(var i=0,ii=selection.length;i<ii;i++){if(selection[i]==id){selection.splice(i,1);break}}};ItemSet.prototype.redraw=function(){var margin=this.options.margin,range=this.body.range,asSize=util.option.asSize,options=this.options,orientation=options.orientation,resized=false,frame=this.dom.frame,editable=options.editable.updateTime||options.editable.updateGroup;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top;this.props.left=this.body.domProps.left.width+this.body.domProps.border.left;frame.className=\"itemset\"+(editable?\" editable\":\"\");resized=this._orderGroups()||resized;var visibleInterval=range.end-range.start;var zoomed=visibleInterval!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;if(zoomed)this.stackDirty=true;this.lastVisibleInterval=visibleInterval;this.props.lastWidth=this.props.width;var restack=this.stackDirty;var firstGroup=this._firstGroup();var firstMargin={item:margin.item,axis:margin.axis};var nonFirstMargin={item:margin.item,axis:margin.item.vertical/2};var height=0;var minHeight=margin.axis+margin.item.vertical;this.groups[BACKGROUND].redraw(range,nonFirstMargin,restack);util.forEach(this.groups,function(group){var groupMargin=group==firstGroup?firstMargin:nonFirstMargin;var groupResized=group.redraw(range,groupMargin,restack);resized=groupResized||resized;height+=group.height});height=Math.max(height,minHeight);this.stackDirty=false;frame.style.height=asSize(height);this.props.width=frame.offsetWidth;this.props.height=height;this.dom.axis.style.top=asSize(orientation==\"top\"?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height);this.dom.axis.style.left=\"0\";resized=this._isResized()||resized;return resized};ItemSet.prototype._firstGroup=function(){var firstGroupIndex=this.options.orientation==\"top\"?0:this.groupIds.length-1;var firstGroupId=this.groupIds[firstGroupIndex];var firstGroup=this.groups[firstGroupId]||this.groups[UNGROUPED];return firstGroup||null};ItemSet.prototype._updateUngrouped=function(){var ungrouped=this.groups[UNGROUPED];var background=this.groups[BACKGROUND];var item,itemId;if(this.groupsData){if(ungrouped){ungrouped.hide();delete this.groups[UNGROUPED];for(itemId in this.items){if(this.items.hasOwnProperty(itemId)){item=this.items[itemId];item.parent&&item.parent.remove(item);var groupId=this._getGroupId(item.data);var group=this.groups[groupId];group&&group.add(item)||item.hide()}}}}else{if(!ungrouped){var id=null;var data=null;ungrouped=new Group(id,data,this);this.groups[UNGROUPED]=ungrouped;for(itemId in this.items){if(this.items.hasOwnProperty(itemId)){item=this.items[itemId];ungrouped.add(item)}}ungrouped.show()}}};ItemSet.prototype.getLabelSet=function(){return this.dom.labelSet};ItemSet.prototype.setItems=function(items){var me=this,ids,oldItemsData=this.itemsData;if(!items){this.itemsData=null}else if(items instanceof DataSet||items instanceof DataView){this.itemsData=items}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(oldItemsData){util.forEach(this.itemListeners,function(callback,event){oldItemsData.off(event,callback)});ids=oldItemsData.getIds();this._onRemove(ids)}if(this.itemsData){var id=this.id;util.forEach(this.itemListeners,function(callback,event){me.itemsData.on(event,callback,id)});ids=this.itemsData.getIds();this._onAdd(ids);this._updateUngrouped()}};ItemSet.prototype.getItems=function(){return this.itemsData};ItemSet.prototype.setGroups=function(groups){var me=this,ids;if(this.groupsData){util.forEach(this.groupListeners,function(callback,event){me.groupsData.unsubscribe(event,callback)});ids=this.groupsData.getIds();this.groupsData=null;this._onRemoveGroups(ids)}if(!groups){this.groupsData=null}else if(groups instanceof DataSet||groups instanceof DataView){this.groupsData=groups}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(this.groupsData){var id=this.id;util.forEach(this.groupListeners,function(callback,event){me.groupsData.on(event,callback,id)});ids=this.groupsData.getIds();this._onAddGroups(ids)}this._updateUngrouped();this._order();this.body.emitter.emit(\"change\",{queue:true})};ItemSet.prototype.getGroups=function(){return this.groupsData};ItemSet.prototype.removeItem=function(id){var item=this.itemsData.get(id),dataset=this.itemsData.getDataSet();if(item){this.options.onRemove(item,function(item){if(item){dataset.remove(id)}})}};ItemSet.prototype._getType=function(itemData){return itemData.type||this.options.type||(itemData.end?\"range\":\"box\")};ItemSet.prototype._getGroupId=function(itemData){var type=this._getType(itemData);if(type==\"background\"&&itemData.group==undefined){return BACKGROUND}else{return this.groupsData?itemData.group:UNGROUPED}};ItemSet.prototype._onUpdate=function(ids){var me=this;ids.forEach(function(id){var itemData=me.itemsData.get(id,me.itemOptions);var item=me.items[id];var type=me._getType(itemData);var constructor=ItemSet.types[type];if(item){if(!constructor||!(item instanceof constructor)){me._removeItem(item);item=null}else{me._updateItem(item,itemData)}}if(!item){if(constructor){item=new constructor(itemData,me.conversion,me.options);item.id=id;me._addItem(item)}else if(type==\"rangeoverflow\"){throw new TypeError('Item type \"rangeoverflow\" is deprecated. Use css styling instead: '+\".vis.timeline .item.range .content {overflow: visible;}\")}else{throw new TypeError('Unknown item type \"'+type+'\"')}}});this._order();this.stackDirty=true;this.body.emitter.emit(\"change\",{queue:true})};ItemSet.prototype._onAdd=ItemSet.prototype._onUpdate;ItemSet.prototype._onRemove=function(ids){var count=0;var me=this;ids.forEach(function(id){var item=me.items[id];if(item){count++;me._removeItem(item)}});if(count){this._order();this.stackDirty=true;this.body.emitter.emit(\"change\",{queue:true})}};ItemSet.prototype._order=function(){util.forEach(this.groups,function(group){group.order()})};ItemSet.prototype._onUpdateGroups=function(ids){this._onAddGroups(ids)};ItemSet.prototype._onAddGroups=function(ids){var me=this;ids.forEach(function(id){var groupData=me.groupsData.get(id);var group=me.groups[id];if(!group){if(id==UNGROUPED||id==BACKGROUND){throw new Error(\"Illegal group id. \"+id+\" is a reserved id.\")}var groupOptions=Object.create(me.options);util.extend(groupOptions,{height:null});group=new Group(id,groupData,me);me.groups[id]=group;for(var itemId in me.items){if(me.items.hasOwnProperty(itemId)){var item=me.items[itemId];if(item.data.group==id){group.add(item)}}}group.order();group.show()}else{group.setData(groupData)}});this.body.emitter.emit(\"change\",{queue:true})};ItemSet.prototype._onRemoveGroups=function(ids){var groups=this.groups;ids.forEach(function(id){var group=groups[id];if(group){group.hide();delete groups[id]}});this.markDirty();this.body.emitter.emit(\"change\",{queue:true})};ItemSet.prototype._orderGroups=function(){if(this.groupsData){var groupIds=this.groupsData.getIds({order:this.options.groupOrder});var changed=!util.equalArray(groupIds,this.groupIds);if(changed){var groups=this.groups;groupIds.forEach(function(groupId){groups[groupId].hide()});groupIds.forEach(function(groupId){groups[groupId].show()});this.groupIds=groupIds}return changed}else{return false}};ItemSet.prototype._addItem=function(item){this.items[item.id]=item;var groupId=this._getGroupId(item.data);var group=this.groups[groupId];if(group)group.add(item)};ItemSet.prototype._updateItem=function(item,itemData){var oldGroupId=item.data.group;item.setData(itemData);if(oldGroupId!=item.data.group){var oldGroup=this.groups[oldGroupId];if(oldGroup)oldGroup.remove(item);var groupId=this._getGroupId(item.data);var group=this.groups[groupId];if(group)group.add(item)}};ItemSet.prototype._removeItem=function(item){item.hide();delete this.items[item.id];var index=this.selection.indexOf(item.id);if(index!=-1)this.selection.splice(index,1);item.parent&&item.parent.remove(item)};ItemSet.prototype._constructByEndArray=function(array){var endArray=[];for(var i=0;i<array.length;i++){if(array[i]instanceof RangeItem){endArray.push(array[i])}}return endArray};ItemSet.prototype._onTouch=function(event){this.touchParams.item=ItemSet.itemFromTarget(event)};ItemSet.prototype._onDragStart=function(event){if(!this.options.editable.updateTime&&!this.options.editable.updateGroup){return}var item=this.touchParams.item||null;var me=this;var props;if(item&&item.selected){var dragLeftItem=event.target.dragLeftItem;var dragRightItem=event.target.dragRightItem;if(dragLeftItem){props={item:dragLeftItem,initialX:event.gesture.center.clientX};if(me.options.editable.updateTime){props.start=item.data.start.valueOf()}if(me.options.editable.updateGroup){if(\"group\"in item.data)props.group=item.data.group}this.touchParams.itemProps=[props]}else if(dragRightItem){props={item:dragRightItem,initialX:event.gesture.center.clientX};if(me.options.editable.updateTime){props.end=item.data.end.valueOf()}if(me.options.editable.updateGroup){if(\"group\"in item.data)props.group=item.data.group}this.touchParams.itemProps=[props]}else{this.touchParams.itemProps=this.getSelection().map(function(id){var item=me.items[id];var props={item:item,initialX:event.gesture.center.clientX};if(me.options.editable.updateTime){if(\"start\"in item.data){props.start=item.data.start.valueOf();if(\"end\"in item.data){props.duration=item.data.end.valueOf()-props.start}}}if(me.options.editable.updateGroup){if(\"group\"in item.data)props.group=item.data.group}return props})}event.stopPropagation()}};ItemSet.prototype._onDrag=function(event){event.preventDefault();if(this.touchParams.itemProps){var me=this;var snap=this.options.snap||null;var xOffset=this.body.dom.root.offsetLeft+this.body.domProps.left.width;var scale=this.body.util.getScale();var step=this.body.util.getStep();this.touchParams.itemProps.forEach(function(props){var newProps={};var current=me.body.util.toTime(event.gesture.center.clientX-xOffset);var initial=me.body.util.toTime(props.initialX-xOffset);var offset=current-initial;if(\"start\"in props){var start=new Date(props.start+offset);newProps.start=snap?snap(start,scale,step):start}if(\"end\"in props){var end=new Date(props.end+offset);newProps.end=snap?snap(end,scale,step):end}else if(\"duration\"in props){newProps.end=new Date(newProps.start.valueOf()+props.duration)}if(\"group\"in props){var group=me.groupFromTarget(event);newProps.group=group&&group.groupId}var itemData=util.extend({},props.item.data,newProps);me.options.onMoving(itemData,function(itemData){if(itemData){me._updateItemProps(props.item,itemData)}})});this.stackDirty=true;this.body.emitter.emit(\"change\");event.stopPropagation()}};ItemSet.prototype._updateItemProps=function(item,props){if(\"start\"in props)item.data.start=props.start;if(\"end\"in props)item.data.end=props.end;if(\"group\"in props&&item.data.group!=props.group){this._moveToGroup(item,props.group)}};ItemSet.prototype._moveToGroup=function(item,groupId){var group=this.groups[groupId];if(group&&group.groupId!=item.data.group){var oldGroup=item.parent;oldGroup.remove(item);oldGroup.order();group.add(item);group.order();item.data.group=group.groupId}};ItemSet.prototype._onDragEnd=function(event){event.preventDefault();if(this.touchParams.itemProps){var changes=[],me=this,dataset=this.itemsData.getDataSet();var itemProps=this.touchParams.itemProps;this.touchParams.itemProps=null;itemProps.forEach(function(props){var id=props.item.id,itemData=me.itemsData.get(id,me.itemOptions);var changed=false;if(\"start\"in props.item.data){changed=props.start!=props.item.data.start.valueOf();itemData.start=util.convert(props.item.data.start,dataset._options.type&&dataset._options.type.start||\"Date\")}if(\"end\"in props.item.data){changed=changed||props.end!=props.item.data.end.valueOf();itemData.end=util.convert(props.item.data.end,dataset._options.type&&dataset._options.type.end||\"Date\")}if(\"group\"in props.item.data){changed=changed||props.group!=props.item.data.group;itemData.group=props.item.data.group}if(changed){me.options.onMove(itemData,function(itemData){if(itemData){itemData[dataset._fieldId]=id;changes.push(itemData)}else{me._updateItemProps(props.item,props);me.stackDirty=true;me.body.emitter.emit(\"change\")}})}});if(changes.length){dataset.update(changes)}event.stopPropagation()}};ItemSet.prototype._onSelectItem=function(event){if(!this.options.selectable)return;var ctrlKey=event.gesture.srcEvent&&event.gesture.srcEvent.ctrlKey;var shiftKey=event.gesture.srcEvent&&event.gesture.srcEvent.shiftKey;if(ctrlKey||shiftKey){this._onMultiSelectItem(event);return}var oldSelection=this.getSelection();var item=ItemSet.itemFromTarget(event);var selection=item?[item.id]:[];this.setSelection(selection);var newSelection=this.getSelection();if(newSelection.length>0||oldSelection.length>0){this.body.emitter.emit(\"select\",{items:newSelection})}};ItemSet.prototype._onAddItem=function(event){if(!this.options.selectable)return;if(!this.options.editable.add)return;var me=this,snap=this.options.snap||null,item=ItemSet.itemFromTarget(event);if(item){var itemData=me.itemsData.get(item.id);this.options.onUpdate(itemData,function(itemData){if(itemData){me.itemsData.getDataSet().update(itemData)}})}else{var xAbs=util.getAbsoluteLeft(this.dom.frame);var x=event.gesture.center.pageX-xAbs;var start=this.body.util.toTime(x);var scale=this.body.util.getScale();var step=this.body.util.getStep();var newItem={start:snap?snap(start,scale,step):start,content:\"new item\"};if(this.options.type===\"range\"){var end=this.body.util.toTime(x+this.props.width/5);newItem.end=snap?snap(end,scale,step):end}newItem[this.itemsData._fieldId]=util.randomUUID();var group=this.groupFromTarget(event);if(group){newItem.group=group.groupId}this.options.onAdd(newItem,function(item){if(item){me.itemsData.getDataSet().add(item)}})}};ItemSet.prototype._onMultiSelectItem=function(event){if(!this.options.selectable)return;var selection,item=ItemSet.itemFromTarget(event);if(item){selection=this.getSelection();var shiftKey=event.gesture.touches[0]&&event.gesture.touches[0].shiftKey||false;if(shiftKey){selection.push(item.id);var range=ItemSet._getItemRange(this.itemsData.get(selection,this.itemOptions));selection=[];for(var id in this.items){if(this.items.hasOwnProperty(id)){var _item=this.items[id];var start=_item.data.start;var end=_item.data.end!==undefined?_item.data.end:start;if(start>=range.min&&end<=range.max){selection.push(_item.id)}}}}else{var index=selection.indexOf(item.id);if(index==-1){selection.push(item.id)}else{selection.splice(index,1)}}this.setSelection(selection);this.body.emitter.emit(\"select\",{items:this.getSelection()})}};ItemSet._getItemRange=function(itemsData){var max=null;var min=null;itemsData.forEach(function(data){if(min==null||data.start<min){min=data.start}if(data.end!=undefined){if(max==null||data.end>max){max=data.end}}else{if(max==null||data.start>max){max=data.start}}});return{min:min,max:max}};ItemSet.itemFromTarget=function(event){var target=event.target;while(target){if(target.hasOwnProperty(\"timeline-item\")){return target[\"timeline-item\"]}target=target.parentNode}return null};ItemSet.prototype.groupFromTarget=function(event){var clientY=event.gesture.center.clientY;for(var i=0;i<this.groupIds.length;i++){var groupId=this.groupIds[i];var group=this.groups[groupId];var foreground=group.dom.foreground;var top=util.getAbsoluteTop(foreground);if(clientY>top&&clientY<top+foreground.offsetHeight){return group}if(this.options.orientation===\"top\"){if(i===this.groupIds.length-1&&clientY>top){return group}}else{if(i===0&&clientY<top+foreground.offset){return group}}}return null};ItemSet.itemSetFromTarget=function(event){var target=event.target;while(target){if(target.hasOwnProperty(\"timeline-itemset\")){return target[\"timeline-itemset\"]}target=target.parentNode}return null};module.exports=ItemSet},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var DOMutil=__webpack_require__(2);var Component=__webpack_require__(25);function Legend(body,options,side,linegraphOptions){this.body=body;this.defaultOptions={enabled:true,icons:true,iconSize:20,iconSpacing:6,left:{visible:true,position:\"top-left\"},right:{visible:true,position:\"top-left\"}};this.side=side;this.options=util.extend({},this.defaultOptions);this.linegraphOptions=linegraphOptions;this.svgElements={};this.dom={};this.groups={};this.amountOfGroups=0;this._create();this.setOptions(options)}Legend.prototype=new Component;Legend.prototype.clear=function(){this.groups={};this.amountOfGroups=0};Legend.prototype.addGroup=function(label,graphOptions){if(!this.groups.hasOwnProperty(label)){this.groups[label]=graphOptions}this.amountOfGroups+=1};Legend.prototype.updateGroup=function(label,graphOptions){this.groups[label]=graphOptions};Legend.prototype.removeGroup=function(label){if(this.groups.hasOwnProperty(label)){delete this.groups[label];this.amountOfGroups-=1}};Legend.prototype._create=function(){this.dom.frame=document.createElement(\"div\");this.dom.frame.className=\"legend\";this.dom.frame.style.position=\"absolute\";this.dom.frame.style.top=\"10px\";this.dom.frame.style.display=\"block\";this.dom.textArea=document.createElement(\"div\");this.dom.textArea.className=\"legendText\";this.dom.textArea.style.position=\"relative\";this.dom.textArea.style.top=\"0px\";this.svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");this.svg.style.position=\"absolute\";this.svg.style.top=0+\"px\";this.svg.style.width=this.options.iconSize+5+\"px\";this.svg.style.height=\"100%\";this.dom.frame.appendChild(this.svg);this.dom.frame.appendChild(this.dom.textArea)};Legend.prototype.hide=function(){if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}};Legend.prototype.show=function(){if(!this.dom.frame.parentNode){this.body.dom.center.appendChild(this.dom.frame)}};Legend.prototype.setOptions=function(options){var fields=[\"enabled\",\"orientation\",\"icons\",\"left\",\"right\"];util.selectiveDeepExtend(fields,this.options,options)};Legend.prototype.redraw=function(){var activeGroups=0;for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){activeGroups++}}}if(this.options[this.side].visible==false||this.amountOfGroups==0||this.options.enabled==false||activeGroups==0){this.hide()}else{this.show();if(this.options[this.side].position==\"top-left\"||this.options[this.side].position==\"bottom-left\"){this.dom.frame.style.left=\"4px\";this.dom.frame.style.textAlign=\"left\";this.dom.textArea.style.textAlign=\"left\";this.dom.textArea.style.left=this.options.iconSize+15+\"px\";this.dom.textArea.style.right=\"\";this.svg.style.left=0+\"px\";this.svg.style.right=\"\"}else{this.dom.frame.style.right=\"4px\";this.dom.frame.style.textAlign=\"right\";this.dom.textArea.style.textAlign=\"right\";this.dom.textArea.style.right=this.options.iconSize+15+\"px\";this.dom.textArea.style.left=\"\";this.svg.style.right=0+\"px\";this.svg.style.left=\"\"}if(this.options[this.side].position==\"top-left\"||this.options[this.side].position==\"top-right\"){this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace(\"px\",\"\"))+\"px\";this.dom.frame.style.bottom=\"\"}else{var scrollableHeight=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+scrollableHeight+Number(this.body.dom.center.style.top.replace(\"px\",\"\"))+\"px\";this.dom.frame.style.top=\"\"}if(this.options.icons==false){this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+\"px\";this.dom.textArea.style.right=\"\";this.dom.textArea.style.left=\"\";this.svg.style.width=\"0px\"}else{this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+\"px\";this.drawLegendIcons()}var content=\"\";for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){content+=this.groups[groupId].content+\"<br />\"}}}this.dom.textArea.innerHTML=content;this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+\"px\"}};Legend.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){DOMutil.prepareElements(this.svgElements);var padding=window.getComputedStyle(this.dom.frame).paddingTop;var iconOffset=Number(padding.replace(\"px\",\"\"));var x=iconOffset;var iconWidth=this.options.iconSize;var iconHeight=.75*this.options.iconSize;var y=iconOffset+.5*iconHeight+3;this.svg.style.width=iconWidth+5+iconOffset+\"px\";for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){this.groups[groupId].drawIcon(x,y,this.svgElements,this.svg,iconWidth,iconHeight);y+=iconHeight+this.options.iconSpacing}}}DOMutil.cleanupElements(this.svgElements)}};module.exports=Legend},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var DOMutil=__webpack_require__(2);var DataSet=__webpack_require__(3);var DataView=__webpack_require__(4);var Component=__webpack_require__(25);var DataAxis=__webpack_require__(28);var GraphGroup=__webpack_require__(29);var Legend=__webpack_require__(33);var BarGraphFunctions=__webpack_require__(50);var UNGROUPED=\"__ungrouped__\";function LineGraph(body,options){this.id=util.randomUUID();this.body=body;this.defaultOptions={yAxisOrientation:\"left\",defaultGroup:\"default\",sort:true,sampling:true,graphHeight:\"400px\",shaded:{enabled:false,orientation:\"bottom\"},style:\"line\",barChart:{width:50,handleOverlap:\"overlap\",align:\"center\"},catmullRom:{enabled:true,parametrization:\"centripetal\",alpha:.5},drawPoints:{enabled:true,size:6,style:\"square\"},dataAxis:{showMinorLabels:true,showMajorLabels:true,icons:false,width:\"40px\",visible:true,alignZeros:true,customRange:{left:{min:undefined,max:undefined},right:{min:undefined,max:undefined}}},legend:{enabled:false,icons:true,left:{visible:true,position:\"top-left\"},right:{visible:true,position:\"top-right\"}},groups:{visibility:{}}};this.options=util.extend({},this.defaultOptions);this.dom={};this.props={};this.hammer=null;this.groups={};this.abortedGraphUpdate=false;this.updateSVGheight=false;this.updateSVGheightOnResize=false;var me=this;this.itemsData=null;this.groupsData=null;this.itemListeners={add:function(event,params,senderId){me._onAdd(params.items)},update:function(event,params,senderId){me._onUpdate(params.items)},remove:function(event,params,senderId){me._onRemove(params.items)}};this.groupListeners={add:function(event,params,senderId){me._onAddGroups(params.items)},update:function(event,params,senderId){me._onUpdateGroups(params.items)},remove:function(event,params,senderId){me._onRemoveGroups(params.items)}};this.items={};this.selection=[];this.lastStart=this.body.range.start;this.touchParams={};this.svgElements={};this.setOptions(options);this.groupsUsingDefaultStyles=[0];this.COUNTER=0;this.body.emitter.on(\"rangechanged\",function(){me.lastStart=me.body.range.start;me.svg.style.left=util.option.asSize(-me.props.width);me.redraw.call(me,true)});this._create();this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups};\nthis.body.emitter.emit(\"change\")}LineGraph.prototype=new Component;LineGraph.prototype._create=function(){var frame=document.createElement(\"div\");frame.className=\"LineGraph\";this.dom.frame=frame;this.svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");this.svg.style.position=\"relative\";this.svg.style.height=(\"\"+this.options.graphHeight).replace(\"px\",\"\")+\"px\";this.svg.style.display=\"block\";frame.appendChild(this.svg);this.options.dataAxis.orientation=\"left\";this.yAxisLeft=new DataAxis(this.body,this.options.dataAxis,this.svg,this.options.groups);this.options.dataAxis.orientation=\"right\";this.yAxisRight=new DataAxis(this.body,this.options.dataAxis,this.svg,this.options.groups);delete this.options.dataAxis.orientation;this.legendLeft=new Legend(this.body,this.options.legend,\"left\",this.options.groups);this.legendRight=new Legend(this.body,this.options.legend,\"right\",this.options.groups);this.show()};LineGraph.prototype.setOptions=function(options){if(options){var fields=[\"sampling\",\"defaultGroup\",\"height\",\"graphHeight\",\"yAxisOrientation\",\"style\",\"barChart\",\"dataAxis\",\"sort\",\"groups\"];if(options.graphHeight===undefined&&options.height!==undefined&&this.body.domProps.centerContainer.height!==undefined){this.updateSVGheight=true;this.updateSVGheightOnResize=true}else if(this.body.domProps.centerContainer.height!==undefined&&options.graphHeight!==undefined){if(parseInt((options.graphHeight+\"\").replace(\"px\",\"\"))<this.body.domProps.centerContainer.height){this.updateSVGheight=true}}util.selectiveDeepExtend(fields,this.options,options);util.mergeOptions(this.options,options,\"catmullRom\");util.mergeOptions(this.options,options,\"drawPoints\");util.mergeOptions(this.options,options,\"shaded\");util.mergeOptions(this.options,options,\"legend\");if(options.catmullRom){if(typeof options.catmullRom==\"object\"){if(options.catmullRom.parametrization){if(options.catmullRom.parametrization==\"uniform\"){this.options.catmullRom.alpha=0}else if(options.catmullRom.parametrization==\"chordal\"){this.options.catmullRom.alpha=1}else{this.options.catmullRom.parametrization=\"centripetal\";this.options.catmullRom.alpha=.5}}}}if(this.yAxisLeft){if(options.dataAxis!==undefined){this.yAxisLeft.setOptions(this.options.dataAxis);this.yAxisRight.setOptions(this.options.dataAxis)}}if(this.legendLeft){if(options.legend!==undefined){this.legendLeft.setOptions(this.options.legend);this.legendRight.setOptions(this.options.legend)}}if(this.groups.hasOwnProperty(UNGROUPED)){this.groups[UNGROUPED].setOptions(options)}}if(this.dom.frame){this.redraw(true)}};LineGraph.prototype.hide=function(){if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}};LineGraph.prototype.show=function(){if(!this.dom.frame.parentNode){this.body.dom.center.appendChild(this.dom.frame)}};LineGraph.prototype.setItems=function(items){var me=this,ids,oldItemsData=this.itemsData;if(!items){this.itemsData=null}else if(items instanceof DataSet||items instanceof DataView){this.itemsData=items}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(oldItemsData){util.forEach(this.itemListeners,function(callback,event){oldItemsData.off(event,callback)});ids=oldItemsData.getIds();this._onRemove(ids)}if(this.itemsData){var id=this.id;util.forEach(this.itemListeners,function(callback,event){me.itemsData.on(event,callback,id)});ids=this.itemsData.getIds();this._onAdd(ids)}this._updateUngrouped();this.redraw(true)};LineGraph.prototype.setGroups=function(groups){var me=this;var ids;if(this.groupsData){util.forEach(this.groupListeners,function(callback,event){me.groupsData.unsubscribe(event,callback)});ids=this.groupsData.getIds();this.groupsData=null;this._onRemoveGroups(ids)}if(!groups){this.groupsData=null}else if(groups instanceof DataSet||groups instanceof DataView){this.groupsData=groups}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(this.groupsData){var id=this.id;util.forEach(this.groupListeners,function(callback,event){me.groupsData.on(event,callback,id)});ids=this.groupsData.getIds();this._onAddGroups(ids)}this._onUpdate()};LineGraph.prototype._onUpdate=function(ids){this._updateUngrouped();this._updateAllGroupData();this.redraw(true)};LineGraph.prototype._onAdd=function(ids){this._onUpdate(ids)};LineGraph.prototype._onRemove=function(ids){this._onUpdate(ids)};LineGraph.prototype._onUpdateGroups=function(groupIds){for(var i=0;i<groupIds.length;i++){var group=this.groupsData.get(groupIds[i]);this._updateGroup(group,groupIds[i])}this.redraw(true)};LineGraph.prototype._onAddGroups=function(groupIds){this._onUpdateGroups(groupIds)};LineGraph.prototype._onRemoveGroups=function(groupIds){for(var i=0;i<groupIds.length;i++){if(this.groups.hasOwnProperty(groupIds[i])){if(this.groups[groupIds[i]].options.yAxisOrientation==\"right\"){this.yAxisRight.removeGroup(groupIds[i]);this.legendRight.removeGroup(groupIds[i]);this.legendRight.redraw()}else{this.yAxisLeft.removeGroup(groupIds[i]);this.legendLeft.removeGroup(groupIds[i]);this.legendLeft.redraw()}delete this.groups[groupIds[i]]}}this._updateUngrouped();this.redraw(true)};LineGraph.prototype._updateGroup=function(group,groupId){if(!this.groups.hasOwnProperty(groupId)){this.groups[groupId]=new GraphGroup(group,groupId,this.options,this.groupsUsingDefaultStyles);if(this.groups[groupId].options.yAxisOrientation==\"right\"){this.yAxisRight.addGroup(groupId,this.groups[groupId]);this.legendRight.addGroup(groupId,this.groups[groupId])}else{this.yAxisLeft.addGroup(groupId,this.groups[groupId]);this.legendLeft.addGroup(groupId,this.groups[groupId])}}else{this.groups[groupId].update(group);if(this.groups[groupId].options.yAxisOrientation==\"right\"){this.yAxisRight.updateGroup(groupId,this.groups[groupId]);this.legendRight.updateGroup(groupId,this.groups[groupId])}else{this.yAxisLeft.updateGroup(groupId,this.groups[groupId]);this.legendLeft.updateGroup(groupId,this.groups[groupId])}}this.legendLeft.redraw();this.legendRight.redraw()};LineGraph.prototype._updateAllGroupData=function(){if(this.itemsData!=null){var groupsContent={};var groupId;for(groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){groupsContent[groupId]=[]}}for(var itemId in this.itemsData._data){if(this.itemsData._data.hasOwnProperty(itemId)){var item=this.itemsData._data[itemId];if(groupsContent[item.group]===undefined){throw new Error(\"Cannot find referenced group. Possible reason: items added before groups? Groups need to be added before items, as items refer to groups.\")}item.x=util.convert(item.x,\"Date\");groupsContent[item.group].push(item)}}for(groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){this.groups[groupId].setItems(groupsContent[groupId])}}}};LineGraph.prototype._updateUngrouped=function(){if(this.itemsData&&this.itemsData!=null){var ungroupedCounter=0;for(var itemId in this.itemsData._data){if(this.itemsData._data.hasOwnProperty(itemId)){var item=this.itemsData._data[itemId];if(item!=undefined){if(item.hasOwnProperty(\"group\")){if(item.group===undefined){item.group=UNGROUPED}}else{item.group=UNGROUPED}ungroupedCounter=item.group==UNGROUPED?ungroupedCounter+1:ungroupedCounter}}}if(ungroupedCounter==0){delete this.groups[UNGROUPED];this.legendLeft.removeGroup(UNGROUPED);this.legendRight.removeGroup(UNGROUPED);this.yAxisLeft.removeGroup(UNGROUPED);this.yAxisRight.removeGroup(UNGROUPED)}else{var group={id:UNGROUPED,content:this.options.defaultGroup};this._updateGroup(group,UNGROUPED)}}else{delete this.groups[UNGROUPED];this.legendLeft.removeGroup(UNGROUPED);this.legendRight.removeGroup(UNGROUPED);this.yAxisLeft.removeGroup(UNGROUPED);this.yAxisRight.removeGroup(UNGROUPED)}this.legendLeft.redraw();this.legendRight.redraw()};LineGraph.prototype.redraw=function(forceGraphUpdate){var resized=false;this.props.width=this.dom.frame.offsetWidth;this.props.height=this.body.domProps.centerContainer.height;if(this.lastWidth===undefined&&this.props.width){forceGraphUpdate=true}resized=this._isResized()||resized;var visibleInterval=this.body.range.end-this.body.range.start;var zoomed=visibleInterval!=this.lastVisibleInterval;this.lastVisibleInterval=visibleInterval;if(resized==true){this.svg.style.width=util.option.asSize(3*this.props.width);this.svg.style.left=util.option.asSize(-this.props.width);if((this.options.height+\"\").indexOf(\"%\")!=-1||this.updateSVGheightOnResize==true){this.updateSVGheight=true}}if(this.updateSVGheight==true){if(this.options.graphHeight!=this.body.domProps.centerContainer.height+\"px\"){this.options.graphHeight=this.body.domProps.centerContainer.height+\"px\";this.svg.style.height=this.body.domProps.centerContainer.height+\"px\"}this.updateSVGheight=false}else{this.svg.style.height=(\"\"+this.options.graphHeight).replace(\"px\",\"\")+\"px\"}if(resized==true||zoomed==true||this.abortedGraphUpdate==true||forceGraphUpdate==true){resized=this._updateGraph()||resized}else{if(this.lastStart!=0){var offset=this.body.range.start-this.lastStart;var range=this.body.range.end-this.body.range.start;if(this.props.width!=0){var rangePerPixelInv=this.props.width/range;var xOffset=offset*rangePerPixelInv;this.svg.style.left=-this.props.width-xOffset+\"px\"}}}this.legendLeft.redraw();this.legendRight.redraw();return resized};LineGraph.prototype._updateGraph=function(){DOMutil.prepareElements(this.svgElements);if(this.props.width!=0&&this.itemsData!=null){var group,i;var preprocessedGroupData={};var processedGroupData={};var groupRanges={};var changeCalled=false;var groupIds=[];for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){group=this.groups[groupId];if(group.visible==true&&(this.options.groups.visibility[groupId]===undefined||this.options.groups.visibility[groupId]==true)){groupIds.push(groupId)}}}if(groupIds.length>0){var minDate=this.body.util.toGlobalTime(-this.body.domProps.root.width);var maxDate=this.body.util.toGlobalTime(2*this.body.domProps.root.width);var groupsData={};this._getRelevantData(groupIds,groupsData,minDate,maxDate);this._applySampling(groupIds,groupsData);for(i=0;i<groupIds.length;i++){preprocessedGroupData[groupIds[i]]=this._convertXcoordinates(groupsData[groupIds[i]])}this._getYRanges(groupIds,preprocessedGroupData,groupRanges);changeCalled=this._updateYAxis(groupIds,groupRanges);var MAX_CYCLES=5;if(changeCalled==true&&this.COUNTER<MAX_CYCLES){DOMutil.cleanupElements(this.svgElements);this.abortedGraphUpdate=true;this.COUNTER++;this.body.emitter.emit(\"change\");return true}else{if(this.COUNTER>MAX_CYCLES){console.log(\"WARNING: there may be an infinite loop in the _updateGraph emitter cycle.\")}this.COUNTER=0;this.abortedGraphUpdate=false;for(i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];processedGroupData[groupIds[i]]=this._convertYcoordinates(groupsData[groupIds[i]],group)}for(i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];if(group.options.style!=\"bar\"){group.draw(processedGroupData[groupIds[i]],group,this.framework)}}BarGraphFunctions.draw(groupIds,processedGroupData,this.framework)}}}DOMutil.cleanupElements(this.svgElements);return false};LineGraph.prototype._getRelevantData=function(groupIds,groupsData,minDate,maxDate){var group,i,j,item;if(groupIds.length>0){for(i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];groupsData[groupIds[i]]=[];var dataContainer=groupsData[groupIds[i]];if(group.options.sort==true){var guess=Math.max(0,util.binarySearchValue(group.itemsData,minDate,\"x\",\"before\"));for(j=guess;j<group.itemsData.length;j++){item=group.itemsData[j];if(item!==undefined){if(item.x>maxDate){dataContainer.push(item);break}else{dataContainer.push(item)}}}}else{for(j=0;j<group.itemsData.length;j++){item=group.itemsData[j];if(item!==undefined){if(item.x>minDate&&item.x<maxDate){dataContainer.push(item)}}}}}}};LineGraph.prototype._applySampling=function(groupIds,groupsData){var group;if(groupIds.length>0){for(var i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];if(group.options.sampling==true){var dataContainer=groupsData[groupIds[i]];if(dataContainer.length>0){var increment=1;var amountOfPoints=dataContainer.length;var xDistance=this.body.util.toGlobalScreen(dataContainer[dataContainer.length-1].x)-this.body.util.toGlobalScreen(dataContainer[0].x);var pointsPerPixel=amountOfPoints/xDistance;increment=Math.min(Math.ceil(.2*amountOfPoints),Math.max(1,Math.round(pointsPerPixel)));var sampledData=[];for(var j=0;j<amountOfPoints;j+=increment){sampledData.push(dataContainer[j])}groupsData[groupIds[i]]=sampledData}}}}};LineGraph.prototype._getYRanges=function(groupIds,groupsData,groupRanges){var groupData,group,i;var barCombinedDataLeft=[];var barCombinedDataRight=[];var options;if(groupIds.length>0){for(i=0;i<groupIds.length;i++){groupData=groupsData[groupIds[i]];options=this.groups[groupIds[i]].options;if(groupData.length>0){group=this.groups[groupIds[i]];if(options.barChart.handleOverlap==\"stack\"&&options.style==\"bar\"){if(options.yAxisOrientation==\"left\"){barCombinedDataLeft=barCombinedDataLeft.concat(group.getYRange(groupData))}else{barCombinedDataRight=barCombinedDataRight.concat(group.getYRange(groupData))}}else{groupRanges[groupIds[i]]=group.getYRange(groupData,groupIds[i])}}}BarGraphFunctions.getStackedBarYRange(barCombinedDataLeft,groupRanges,groupIds,\"__barchartLeft\",\"left\");BarGraphFunctions.getStackedBarYRange(barCombinedDataRight,groupRanges,groupIds,\"__barchartRight\",\"right\")}};LineGraph.prototype._updateYAxis=function(groupIds,groupRanges){var resized=false;var yAxisLeftUsed=false;var yAxisRightUsed=false;var minLeft=1e9,minRight=1e9,maxLeft=-1e9,maxRight=-1e9,minVal,maxVal;if(groupIds.length>0){for(var i=0;i<groupIds.length;i++){var group=this.groups[groupIds[i]];if(group&&group.options.yAxisOrientation!=\"right\"){yAxisLeftUsed=true;minLeft=0;maxLeft=0}else if(group&&group.options.yAxisOrientation){yAxisRightUsed=true;minRight=0;maxRight=0}}for(var i=0;i<groupIds.length;i++){if(groupRanges.hasOwnProperty(groupIds[i])){if(groupRanges[groupIds[i]].ignore!==true){minVal=groupRanges[groupIds[i]].min;maxVal=groupRanges[groupIds[i]].max;if(groupRanges[groupIds[i]].yAxisOrientation!=\"right\"){yAxisLeftUsed=true;minLeft=minLeft>minVal?minVal:minLeft;maxLeft=maxLeft<maxVal?maxVal:maxLeft}else{yAxisRightUsed=true;minRight=minRight>minVal?minVal:minRight;maxRight=maxRight<maxVal?maxVal:maxRight}}}}if(yAxisLeftUsed==true){this.yAxisLeft.setRange(minLeft,maxLeft)}if(yAxisRightUsed==true){this.yAxisRight.setRange(minRight,maxRight)}}resized=this._toggleAxisVisiblity(yAxisLeftUsed,this.yAxisLeft)||resized;resized=this._toggleAxisVisiblity(yAxisRightUsed,this.yAxisRight)||resized;if(yAxisRightUsed==true&&yAxisLeftUsed==true){this.yAxisLeft.drawIcons=true;this.yAxisRight.drawIcons=true}else{this.yAxisLeft.drawIcons=false;this.yAxisRight.drawIcons=false}this.yAxisRight.master=!yAxisLeftUsed;if(this.yAxisRight.master==false){if(yAxisRightUsed==true){this.yAxisLeft.lineOffset=this.yAxisRight.width}else{this.yAxisLeft.lineOffset=0}resized=this.yAxisLeft.redraw()||resized;this.yAxisRight.stepPixelsForced=this.yAxisLeft.stepPixels;this.yAxisRight.zeroCrossing=this.yAxisLeft.zeroCrossing;resized=this.yAxisRight.redraw()||resized}else{resized=this.yAxisRight.redraw()||resized}if(groupIds.indexOf(\"__barchartLeft\")!=-1){groupIds.splice(groupIds.indexOf(\"__barchartLeft\"),1)}if(groupIds.indexOf(\"__barchartRight\")!=-1){groupIds.splice(groupIds.indexOf(\"__barchartRight\"),1)}return resized};LineGraph.prototype._toggleAxisVisiblity=function(axisUsed,axis){var changed=false;if(axisUsed==false){if(axis.dom.frame.parentNode&&axis.hidden==false){axis.hide();changed=true}}else{if(!axis.dom.frame.parentNode&&axis.hidden==true){axis.show();changed=true}}return changed};LineGraph.prototype._convertXcoordinates=function(datapoints){var extractedData=[];var xValue,yValue;var toScreen=this.body.util.toScreen;for(var i=0;i<datapoints.length;i++){xValue=toScreen(datapoints[i].x)+this.props.width;yValue=datapoints[i].y;extractedData.push({x:xValue,y:yValue})}return extractedData};LineGraph.prototype._convertYcoordinates=function(datapoints,group){var extractedData=[];var xValue,yValue;var toScreen=this.body.util.toScreen;var axis=this.yAxisLeft;var svgHeight=Number(this.svg.style.height.replace(\"px\",\"\"));if(group.options.yAxisOrientation==\"right\"){axis=this.yAxisRight}for(var i=0;i<datapoints.length;i++){xValue=toScreen(datapoints[i].x)+this.props.width;yValue=Math.round(axis.convertValue(datapoints[i].y));extractedData.push({x:xValue,y:yValue})}group.setZeroPosition(Math.min(svgHeight,axis.convertValue(0)));return extractedData};module.exports=LineGraph},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Component=__webpack_require__(25);var TimeStep=__webpack_require__(19);var DateUtil=__webpack_require__(15);var moment=__webpack_require__(44);function TimeAxis(body,options){this.dom={foreground:null,lines:[],majorTexts:[],minorTexts:[],redundant:{lines:[],majorTexts:[],minorTexts:[]}};this.props={range:{start:0,end:0,minimumStep:0},lineTop:0};this.defaultOptions={orientation:\"bottom\",showMinorLabels:true,showMajorLabels:true,format:null,timeAxis:null};this.options=util.extend({},this.defaultOptions);this.body=body;this._create();this.setOptions(options)}TimeAxis.prototype=new Component;TimeAxis.prototype.setOptions=function(options){if(options){util.selectiveExtend([\"orientation\",\"showMinorLabels\",\"showMajorLabels\",\"hiddenDates\",\"format\",\"timeAxis\"],this.options,options);if(\"locale\"in options){if(typeof moment.locale===\"function\"){moment.locale(options.locale)}else{moment.lang(options.locale)}}}};TimeAxis.prototype._create=function(){this.dom.foreground=document.createElement(\"div\");this.dom.background=document.createElement(\"div\");this.dom.foreground.className=\"timeaxis foreground\";this.dom.background.className=\"timeaxis background\"};TimeAxis.prototype.destroy=function(){if(this.dom.foreground.parentNode){this.dom.foreground.parentNode.removeChild(this.dom.foreground)}if(this.dom.background.parentNode){this.dom.background.parentNode.removeChild(this.dom.background)}this.body=null};TimeAxis.prototype.redraw=function(){var options=this.options;var props=this.props;var foreground=this.dom.foreground;var background=this.dom.background;var parent=options.orientation==\"top\"?this.body.dom.top:this.body.dom.bottom;var parentChanged=foreground.parentNode!==parent;this._calculateCharSize();var orientation=this.options.orientation,showMinorLabels=this.options.showMinorLabels,showMajorLabels=this.options.showMajorLabels;props.minorLabelHeight=showMinorLabels?props.minorCharHeight:0;props.majorLabelHeight=showMajorLabels?props.majorCharHeight:0;props.height=props.minorLabelHeight+props.majorLabelHeight;props.width=foreground.offsetWidth;props.minorLineHeight=this.body.domProps.root.height-props.majorLabelHeight-(options.orientation==\"top\"?this.body.domProps.bottom.height:this.body.domProps.top.height);props.minorLineWidth=1;props.majorLineHeight=props.minorLineHeight+props.majorLabelHeight;props.majorLineWidth=1;var foregroundNextSibling=foreground.nextSibling;var backgroundNextSibling=background.nextSibling;foreground.parentNode&&foreground.parentNode.removeChild(foreground);background.parentNode&&background.parentNode.removeChild(background);foreground.style.height=this.props.height+\"px\";this._repaintLabels();if(foregroundNextSibling){parent.insertBefore(foreground,foregroundNextSibling)}else{parent.appendChild(foreground)}if(backgroundNextSibling){this.body.dom.backgroundVertical.insertBefore(background,backgroundNextSibling)}else{this.body.dom.backgroundVertical.appendChild(background)}return this._isResized()||parentChanged};TimeAxis.prototype._repaintLabels=function(){var orientation=this.options.orientation;var start=util.convert(this.body.range.start,\"Number\");var end=util.convert(this.body.range.end,\"Number\");var timeLabelsize=this.body.util.toTime((this.props.minorCharWidth||10)*7).valueOf();var minimumStep=timeLabelsize-DateUtil.getHiddenDurationBefore(this.body.hiddenDates,this.body.range,timeLabelsize);minimumStep-=this.body.util.toTime(0).valueOf();var step=new TimeStep(new Date(start),new Date(end),minimumStep,this.body.hiddenDates);if(this.options.format){step.setFormat(this.options.format)}if(this.options.timeAxis){step.setScale(this.options.timeAxis)}this.step=step;var dom=this.dom;dom.redundant.lines=dom.lines;dom.redundant.majorTexts=dom.majorTexts;dom.redundant.minorTexts=dom.minorTexts;dom.lines=[];dom.majorTexts=[];dom.minorTexts=[];var cur;var x=0;var isMajor;var xPrev=0;var width=0;var prevLine;var xFirstMajorLabel=undefined;var max=0;var className;step.first();while(step.hasNext()&&max<1e3){max++;cur=step.getCurrent();isMajor=step.isMajor();className=step.getClassName();xPrev=x;x=this.body.util.toScreen(cur);width=x-xPrev;if(prevLine){prevLine.style.width=width+\"px\"}if(this.options.showMinorLabels){this._repaintMinorText(x,step.getLabelMinor(),orientation,className)}if(isMajor&&this.options.showMajorLabels){if(x>0){if(xFirstMajorLabel==undefined){xFirstMajorLabel=x}this._repaintMajorText(x,step.getLabelMajor(),orientation,className)}prevLine=this._repaintMajorLine(x,orientation,className)}else{prevLine=this._repaintMinorLine(x,orientation,className)}step.next()}if(this.options.showMajorLabels){var leftTime=this.body.util.toTime(0),leftText=step.getLabelMajor(leftTime),widthText=leftText.length*(this.props.majorCharWidth||10)+10;if(xFirstMajorLabel==undefined||widthText<xFirstMajorLabel){this._repaintMajorText(0,leftText,orientation,className)}}util.forEach(this.dom.redundant,function(arr){while(arr.length){var elem=arr.pop();if(elem&&elem.parentNode){elem.parentNode.removeChild(elem)}}})};TimeAxis.prototype._repaintMinorText=function(x,text,orientation,className){var label=this.dom.redundant.minorTexts.shift();if(!label){var content=document.createTextNode(\"\");label=document.createElement(\"div\");label.appendChild(content);this.dom.foreground.appendChild(label)}this.dom.minorTexts.push(label);label.childNodes[0].nodeValue=text;label.style.top=orientation==\"top\"?this.props.majorLabelHeight+\"px\":\"0\";label.style.left=x+\"px\";label.className=\"text minor \"+className};TimeAxis.prototype._repaintMajorText=function(x,text,orientation,className){var label=this.dom.redundant.majorTexts.shift();if(!label){var content=document.createTextNode(text);label=document.createElement(\"div\");label.appendChild(content);this.dom.foreground.appendChild(label)}this.dom.majorTexts.push(label);label.childNodes[0].nodeValue=text;label.className=\"text major \"+className;label.style.top=orientation==\"top\"?\"0\":this.props.minorLabelHeight+\"px\";label.style.left=x+\"px\"};TimeAxis.prototype._repaintMinorLine=function(x,orientation,className){var line=this.dom.redundant.lines.shift();if(!line){line=document.createElement(\"div\");this.dom.background.appendChild(line)}this.dom.lines.push(line);var props=this.props;if(orientation==\"top\"){line.style.top=props.majorLabelHeight+\"px\"}else{line.style.top=this.body.domProps.top.height+\"px\"}line.style.height=props.minorLineHeight+\"px\";line.style.left=x-props.minorLineWidth/2+\"px\";line.className=\"grid vertical minor \"+className;return line};TimeAxis.prototype._repaintMajorLine=function(x,orientation,className){var line=this.dom.redundant.lines.shift();if(!line){line=document.createElement(\"div\");this.dom.background.appendChild(line)}this.dom.lines.push(line);var props=this.props;if(orientation==\"top\"){line.style.top=\"0\"}else{line.style.top=this.body.domProps.top.height+\"px\"}line.style.left=x-props.majorLineWidth/2+\"px\";line.style.height=props.majorLineHeight+\"px\";line.className=\"grid vertical major \"+className;return line};TimeAxis.prototype._calculateCharSize=function(){if(!this.dom.measureCharMinor){this.dom.measureCharMinor=document.createElement(\"DIV\");this.dom.measureCharMinor.className=\"text minor measure\";this.dom.measureCharMinor.style.position=\"absolute\";this.dom.measureCharMinor.appendChild(document.createTextNode(\"0\"));this.dom.foreground.appendChild(this.dom.measureCharMinor)}this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight;this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth;if(!this.dom.measureCharMajor){this.dom.measureCharMajor=document.createElement(\"DIV\");this.dom.measureCharMajor.className=\"text major measure\";this.dom.measureCharMajor.style.position=\"absolute\";this.dom.measureCharMajor.appendChild(document.createTextNode(\"0\"));this.dom.foreground.appendChild(this.dom.measureCharMajor)}this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight;this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth};module.exports=TimeAxis},function(module,exports,__webpack_require__){var Emitter=__webpack_require__(56);var Hammer=__webpack_require__(45);var keycharm=__webpack_require__(59);var util=__webpack_require__(1);var hammerUtil=__webpack_require__(47);var DataSet=__webpack_require__(3);var DataView=__webpack_require__(4);var dotparser=__webpack_require__(42);var gephiParser=__webpack_require__(43);var Groups=__webpack_require__(38);var Images=__webpack_require__(39);var Node=__webpack_require__(40);var Edge=__webpack_require__(37);var Popup=__webpack_require__(41);var MixinLoader=__webpack_require__(52);var Activator=__webpack_require__(53);var locales=__webpack_require__(54);__webpack_require__(55);function Network(container,data,options){if(!(this instanceof Network)){throw new SyntaxError(\"Constructor must be called with the new operator\")}this._determineBrowserMethod();this._initializeMixinLoaders();this.containerElement=container;this.renderRefreshRate=60;this.renderTimestep=1e3/this.renderRefreshRate;this.renderTime=0;this.physicsTime=0;this.runDoubleSpeed=false;this.physicsDiscreteStepsize=.5;this.initializing=true;this.triggerFunctions={add:null,edit:null,editEdge:null,connect:null,del:null};var customScalingFunction=function(min,max,total,value){if(max==min){return.5}else{var scale=1/(max-min);return Math.max(0,(value-min)*scale)}};this.defaultOptions={nodes:{customScalingFunction:customScalingFunction,mass:1,radiusMin:10,radiusMax:30,radius:10,shape:\"ellipse\",image:undefined,widthMin:16,widthMax:64,fontColor:\"black\",fontSize:14,fontFace:\"verdana\",fontFill:undefined,fontStrokeWidth:0,fontStrokeColor:\"#ffffff\",fontDrawThreshold:3,scaleFontWithValue:false,fontSizeMin:14,fontSizeMax:30,fontSizeMaxVisible:30,level:-1,color:{border:\"#2B7CE9\",background:\"#97C2FC\",highlight:{border:\"#2B7CE9\",background:\"#D2E5FF\"},hover:{border:\"#2B7CE9\",background:\"#D2E5FF\"}},group:undefined,borderWidth:1,borderWidthSelected:undefined},edges:{customScalingFunction:customScalingFunction,widthMin:1,widthMax:15,width:1,widthSelectionMultiplier:2,hoverWidth:1.5,style:\"line\",color:{color:\"#848484\",highlight:\"#848484\",hover:\"#848484\"},opacity:1,fontColor:\"#343434\",fontSize:14,fontFace:\"arial\",fontFill:\"white\",fontStrokeWidth:0,fontStrokeColor:\"white\",labelAlignment:\"horizontal\",arrowScaleFactor:1,dash:{length:10,gap:5,altLength:undefined},inheritColor:\"from\"},configurePhysics:false,physics:{barnesHut:{enabled:true,thetaInverted:1/.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09},repulsion:{centralGravity:0,springLength:200,springConstant:.05,nodeDistance:100,damping:.09},hierarchicalRepulsion:{enabled:false,centralGravity:0,springLength:100,springConstant:.01,nodeDistance:150,damping:.09},damping:null,centralGravity:null,springLength:null,springConstant:null},clustering:{enabled:false,initialMaxNodes:100,clusterThreshold:500,reduceToNodes:300,chainThreshold:.4,clusterEdgeThreshold:20,sectorThreshold:100,screenSizeThreshold:.2,fontSizeMultiplier:4,maxFontSize:1e3,forceAmplification:.1,distanceAmplification:.1,edgeGrowth:20,nodeScaling:{width:1,height:1,radius:1},maxNodeSizeIncrements:600,activeAreaBoxSize:80,clusterLevelDifference:2,clusterByZoom:true},navigation:{enabled:false},keyboard:{enabled:false,speed:{x:10,y:10,zoom:.02},bindToWindow:true},dataManipulation:{enabled:false,initiallyVisible:false},hierarchicalLayout:{enabled:false,levelSeparation:150,nodeSpacing:100,direction:\"UD\",layout:\"hubsize\"},freezeForStabilization:false,smoothCurves:{enabled:true,dynamic:true,type:\"continuous\",roundness:.5},maxVelocity:50,minVelocity:.1,stabilize:true,stabilizationIterations:1e3,zoomExtentOnStabilize:true,locale:\"en\",locales:locales,tooltip:{delay:300,fontColor:\"black\",fontSize:14,fontFace:\"verdana\",color:{border:\"#666\",background:\"#FFFFC6\"}},dragNetwork:true,dragNodes:true,zoomable:true,hover:false,hideEdgesOnDrag:false,hideNodesOnDrag:false,width:\"100%\",height:\"100%\",selectable:true};this.constants=util.extend({},this.defaultOptions);this.pixelRatio=1;this.hoverObj={nodes:{},edges:{}};this.controlNodesActive=false;this.navigationHammers={existing:[],_new:[]};this.animationSpeed=1/this.renderRefreshRate;this.animationEasingFunction=\"easeInOutQuint\";this.animating=false;this.easingTime=0;this.sourceScale=0;this.targetScale=0;this.sourceTranslation=0;this.targetTranslation=0;this.lockedOnNodeId=null;this.lockedOnNodeOffset=null;this.touchTime=0;var network=this;this.groups=new Groups;this.images=new Images;this.images.setOnloadCallback(function(status){network._redraw()});this.xIncrement=0;this.yIncrement=0;this.zoomIncrement=0;this._loadPhysicsSystem();this._create();this._loadSectorSystem();this._loadClusterSystem();this._loadSelectionSystem();this._loadHierarchySystem();this._setTranslation(this.frame.clientWidth/2,this.frame.clientHeight/2);this._setScale(1);this.setOptions(options);this.freezeSimulationEnabled=false;this.cachedFunctions={};this.startedStabilization=false;this.stabilized=false;this.stabilizationIterations=null;this.draggingNodes=false;this.calculationNodes={};this.calculationNodeIndices=[];this.nodeIndices=[];this.nodes={};this.edges={};this.canvasTopLeft={x:0,y:0};this.canvasBottomRight={x:0,y:0};this.pointerPosition={x:0,y:0};this.areaCenter={};this.scale=1;this.previousScale=this.scale;this.nodesData=null;this.edgesData=null;this.nodesListeners={add:function(event,params){network._addNodes(params.items);network.start()},update:function(event,params){network._updateNodes(params.items,params.data);network.start()},remove:function(event,params){network._removeNodes(params.items);network.start()}};this.edgesListeners={add:function(event,params){network._addEdges(params.items);network.start()},update:function(event,params){network._updateEdges(params.items);network.start()},remove:function(event,params){network._removeEdges(params.items);network.start()}};this.moving=true;this.timer=undefined;this.setData(data,this.constants.clustering.enabled||this.constants.hierarchicalLayout.enabled);this.initializing=false;if(this.constants.hierarchicalLayout.enabled==true){this._setupHierarchicalLayout()}else{if(this.constants.stabilize==false){this.zoomExtent({duration:0},true,this.constants.clustering.enabled)}}if(this.constants.clustering.enabled){this.startWithClustering()}}Emitter(Network.prototype);Network.prototype._determineBrowserMethod=function(){var browserType=navigator.userAgent.toLowerCase();this.requiresTimeout=false;if(browserType.indexOf(\"msie 9.0\")!=-1){this.requiresTimeout=true}else if(browserType.indexOf(\"safari\")!=-1){if(browserType.indexOf(\"chrome\")<=-1){this.requiresTimeout=true}}};Network.prototype._getScriptPath=function(){var scripts=document.getElementsByTagName(\"script\");for(var i=0;i<scripts.length;i++){var src=scripts[i].src;var match=src&&/\\/?vis(.min)?\\.js$/.exec(src);if(match){return src.substring(0,src.length-match[0].length)}}return null};Network.prototype._getRange=function(specificNodes){var minY=1e9,maxY=-1e9,minX=1e9,maxX=-1e9,node;if(specificNodes.length>0){for(var i=0;i<specificNodes.length;i++){node=this.nodes[specificNodes[i]];if(minX>node.boundingBox.left){minX=node.boundingBox.left}if(maxX<node.boundingBox.right){maxX=node.boundingBox.right}if(minY>node.boundingBox.bottom){minY=node.boundingBox.top}if(maxY<node.boundingBox.top){maxY=node.boundingBox.bottom}}}else{for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];\nif(minX>node.boundingBox.left){minX=node.boundingBox.left}if(maxX<node.boundingBox.right){maxX=node.boundingBox.right}if(minY>node.boundingBox.bottom){minY=node.boundingBox.top}if(maxY<node.boundingBox.top){maxY=node.boundingBox.bottom}}}}if(minX==1e9&&maxX==-1e9&&minY==1e9&&maxY==-1e9){minY=0,maxY=0,minX=0,maxX=0}return{minX:minX,maxX:maxX,minY:minY,maxY:maxY}};Network.prototype._findCenter=function(range){return{x:.5*(range.maxX+range.minX),y:.5*(range.maxY+range.minY)}};Network.prototype.zoomExtent=function(options,initialZoom,disableStart){this._redraw(true);if(initialZoom===undefined){initialZoom=false}if(disableStart===undefined){disableStart=false}if(options===undefined){options={nodes:[]}}if(options.nodes===undefined){options.nodes=[]}var range;var zoomLevel;if(initialZoom==true){var positionDefined=0;for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){var node=this.nodes[nodeId];if(node.predefinedPosition==true){positionDefined+=1}}}if(positionDefined>.5*this.nodeIndices.length){this.zoomExtent(options,false,disableStart);return}range=this._getRange(options.nodes);var numberOfNodes=this.nodeIndices.length;if(this.constants.smoothCurves==true){if(this.constants.clustering.enabled==true&&numberOfNodes>=this.constants.clustering.initialMaxNodes){zoomLevel=49.07548/(numberOfNodes+142.05338)+91444e-8}else{zoomLevel=12.662/(numberOfNodes+7.4147)+.0964822}}else{if(this.constants.clustering.enabled==true&&numberOfNodes>=this.constants.clustering.initialMaxNodes){zoomLevel=77.5271985/(numberOfNodes+187.266146)+476710517e-13}else{zoomLevel=30.5062972/(numberOfNodes+19.93597763)+.08413486}}var factor=Math.min(this.frame.canvas.clientWidth/600,this.frame.canvas.clientHeight/600);zoomLevel*=factor}else{range=this._getRange(options.nodes);var xDistance=Math.abs(range.maxX-range.minX)*1.1;var yDistance=Math.abs(range.maxY-range.minY)*1.1;var xZoomLevel=this.frame.canvas.clientWidth/xDistance;var yZoomLevel=this.frame.canvas.clientHeight/yDistance;zoomLevel=xZoomLevel<=yZoomLevel?xZoomLevel:yZoomLevel}if(zoomLevel>1){zoomLevel=1}var center=this._findCenter(range);if(disableStart==false){var options={position:center,scale:zoomLevel,animation:options};this.moveTo(options);this.moving=true;this.start()}else{center.x*=zoomLevel;center.y*=zoomLevel;center.x-=.5*this.frame.canvas.clientWidth;center.y-=.5*this.frame.canvas.clientHeight;this._setScale(zoomLevel);this._setTranslation(-center.x,-center.y)}};Network.prototype._updateNodeIndexList=function(){this._clearNodeIndexList();for(var idx in this.nodes){if(this.nodes.hasOwnProperty(idx)){this.nodeIndices.push(idx)}}};Network.prototype.setData=function(data,disableStart){if(disableStart===undefined){disableStart=false}this._unselectAll(true);this.initializing=true;if(data&&data.dot&&(data.nodes||data.edges)){throw new SyntaxError('Data must contain either parameter \"dot\" or '+' parameter pair \"nodes\" and \"edges\", but not both.')}if(this.constants.dataManipulation.enabled==true){this._createManipulatorBar()}this.setOptions(data&&data.options);if(data&&data.dot){if(data&&data.dot){var dotData=dotparser.DOTToGraph(data.dot);this.setData(dotData);return}}else if(data&&data.gephi){if(data&&data.gephi){var gephiData=gephiParser.parseGephi(data.gephi);this.setData(gephiData);return}}else{this._setNodes(data&&data.nodes);this._setEdges(data&&data.edges)}this._putDataInSector();if(disableStart==false){if(this.constants.hierarchicalLayout.enabled==true){this._resetLevels();this._setupHierarchicalLayout()}else{if(this.constants.stabilize==true){this._stabilize()}}this.start()}this.initializing=false};Network.prototype.setOptions=function(options){if(options){var prop;var fields=[\"nodes\",\"edges\",\"smoothCurves\",\"hierarchicalLayout\",\"clustering\",\"navigation\",\"keyboard\",\"dataManipulation\",\"onAdd\",\"onEdit\",\"onEditEdge\",\"onConnect\",\"onDelete\",\"clickToUse\"];util.selectiveNotDeepExtend(fields,this.constants,options);util.selectiveNotDeepExtend([\"color\"],this.constants.nodes,options.nodes);util.selectiveNotDeepExtend([\"color\",\"length\"],this.constants.edges,options.edges);if(options.physics){util.mergeOptions(this.constants.physics,options.physics,\"barnesHut\");util.mergeOptions(this.constants.physics,options.physics,\"repulsion\");if(options.physics.hierarchicalRepulsion){this.constants.hierarchicalLayout.enabled=true;this.constants.physics.hierarchicalRepulsion.enabled=true;this.constants.physics.barnesHut.enabled=false;for(prop in options.physics.hierarchicalRepulsion){if(options.physics.hierarchicalRepulsion.hasOwnProperty(prop)){this.constants.physics.hierarchicalRepulsion[prop]=options.physics.hierarchicalRepulsion[prop]}}}}if(options.onAdd){this.triggerFunctions.add=options.onAdd}if(options.onEdit){this.triggerFunctions.edit=options.onEdit}if(options.onEditEdge){this.triggerFunctions.editEdge=options.onEditEdge}if(options.onConnect){this.triggerFunctions.connect=options.onConnect}if(options.onDelete){this.triggerFunctions.del=options.onDelete}util.mergeOptions(this.constants,options,\"smoothCurves\");util.mergeOptions(this.constants,options,\"hierarchicalLayout\");util.mergeOptions(this.constants,options,\"clustering\");util.mergeOptions(this.constants,options,\"navigation\");util.mergeOptions(this.constants,options,\"keyboard\");util.mergeOptions(this.constants,options,\"dataManipulation\");if(options.dataManipulation){this.editMode=this.constants.dataManipulation.initiallyVisible}if(options.edges){if(options.edges.color!==undefined){if(util.isString(options.edges.color)){this.constants.edges.color={};this.constants.edges.color.color=options.edges.color;this.constants.edges.color.highlight=options.edges.color;this.constants.edges.color.hover=options.edges.color}else{if(options.edges.color.color!==undefined){this.constants.edges.color.color=options.edges.color.color}if(options.edges.color.highlight!==undefined){this.constants.edges.color.highlight=options.edges.color.highlight}if(options.edges.color.hover!==undefined){this.constants.edges.color.hover=options.edges.color.hover}}this.constants.edges.inheritColor=false}if(!options.edges.fontColor){if(options.edges.color!==undefined){if(util.isString(options.edges.color)){this.constants.edges.fontColor=options.edges.color}else if(options.edges.color.color!==undefined){this.constants.edges.fontColor=options.edges.color.color}}}}if(options.nodes){if(options.nodes.color){var newColorObj=util.parseColor(options.nodes.color);this.constants.nodes.color.background=newColorObj.background;this.constants.nodes.color.border=newColorObj.border;this.constants.nodes.color.highlight.background=newColorObj.highlight.background;this.constants.nodes.color.highlight.border=newColorObj.highlight.border;this.constants.nodes.color.hover.background=newColorObj.hover.background;this.constants.nodes.color.hover.border=newColorObj.hover.border}}if(options.groups){for(var groupname in options.groups){if(options.groups.hasOwnProperty(groupname)){var group=options.groups[groupname];this.groups.add(groupname,group)}}}if(options.tooltip){for(prop in options.tooltip){if(options.tooltip.hasOwnProperty(prop)){this.constants.tooltip[prop]=options.tooltip[prop]}}if(options.tooltip.color){this.constants.tooltip.color=util.parseColor(options.tooltip.color)}}if(\"clickToUse\"in options){if(options.clickToUse){if(!this.activator){this.activator=new Activator(this.frame);this.activator.on(\"change\",this._createKeyBinds.bind(this))}}else{if(this.activator){this.activator.destroy();delete this.activator}}}if(options.labels){throw new Error('Option \"labels\" is deprecated. Use options \"locale\" and \"locales\" instead.')}this._loadPhysicsSystem();this._loadNavigationControls();this._loadManipulationSystem();this._configureSmoothCurves();this._bindHammer();this._createKeyBinds();this._markAllEdgesAsDirty();this.setSize(this.constants.width,this.constants.height);this.moving=true;this.start()}};Network.prototype._create=function(){while(this.containerElement.hasChildNodes()){this.containerElement.removeChild(this.containerElement.firstChild)}this.frame=document.createElement(\"div\");this.frame.className=\"vis network-frame\";this.frame.style.position=\"relative\";this.frame.style.overflow=\"hidden\";this.frame.tabIndex=900;this.frame.canvas=document.createElement(\"canvas\");this.frame.canvas.style.position=\"relative\";this.frame.appendChild(this.frame.canvas);if(!this.frame.canvas.getContext){var noCanvas=document.createElement(\"DIV\");noCanvas.style.color=\"red\";noCanvas.style.fontWeight=\"bold\";noCanvas.style.padding=\"10px\";noCanvas.innerHTML=\"Error: your browser does not support HTML canvas\";this.frame.canvas.appendChild(noCanvas)}else{var ctx=this.frame.canvas.getContext(\"2d\");this.pixelRatio=(window.devicePixelRatio||1)/(ctx.webkitBackingStorePixelRatio||ctx.mozBackingStorePixelRatio||ctx.msBackingStorePixelRatio||ctx.oBackingStorePixelRatio||ctx.backingStorePixelRatio||1);this.frame.canvas.getContext(\"2d\").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}this._bindHammer()};Network.prototype._bindHammer=function(){var me=this;if(this.hammer!==undefined){this.hammer.dispose()}this.drag={};this.pinch={};this.hammer=Hammer(this.frame.canvas,{prevent_default:true});this.hammer.on(\"tap\",me._onTap.bind(me));this.hammer.on(\"doubletap\",me._onDoubleTap.bind(me));this.hammer.on(\"hold\",me._onHold.bind(me));this.hammer.on(\"touch\",me._onTouch.bind(me));this.hammer.on(\"dragstart\",me._onDragStart.bind(me));this.hammer.on(\"drag\",me._onDrag.bind(me));this.hammer.on(\"dragend\",me._onDragEnd.bind(me));if(this.constants.zoomable==true){this.hammer.on(\"mousewheel\",me._onMouseWheel.bind(me));this.hammer.on(\"DOMMouseScroll\",me._onMouseWheel.bind(me));this.hammer.on(\"pinch\",me._onPinch.bind(me))}this.hammer.on(\"mousemove\",me._onMouseMoveTitle.bind(me));this.hammerFrame=Hammer(this.frame,{prevent_default:true});this.hammerFrame.on(\"release\",me._onRelease.bind(me));this.containerElement.appendChild(this.frame)};Network.prototype._createKeyBinds=function(){var me=this;if(this.keycharm!==undefined){this.keycharm.destroy()}if(this.constants.keyboard.bindToWindow==true){this.keycharm=keycharm({container:window,preventDefault:false})}else{this.keycharm=keycharm({container:this.frame,preventDefault:false})}this.keycharm.reset();if(this.constants.keyboard.enabled&&this.isActive()){this.keycharm.bind(\"up\",this._moveUp.bind(me),\"keydown\");this.keycharm.bind(\"up\",this._yStopMoving.bind(me),\"keyup\");this.keycharm.bind(\"down\",this._moveDown.bind(me),\"keydown\");this.keycharm.bind(\"down\",this._yStopMoving.bind(me),\"keyup\");this.keycharm.bind(\"left\",this._moveLeft.bind(me),\"keydown\");this.keycharm.bind(\"left\",this._xStopMoving.bind(me),\"keyup\");this.keycharm.bind(\"right\",this._moveRight.bind(me),\"keydown\");this.keycharm.bind(\"right\",this._xStopMoving.bind(me),\"keyup\");this.keycharm.bind(\"=\",this._zoomIn.bind(me),\"keydown\");this.keycharm.bind(\"=\",this._stopZoom.bind(me),\"keyup\");this.keycharm.bind(\"num+\",this._zoomIn.bind(me),\"keydown\");this.keycharm.bind(\"num+\",this._stopZoom.bind(me),\"keyup\");this.keycharm.bind(\"num-\",this._zoomOut.bind(me),\"keydown\");this.keycharm.bind(\"num-\",this._stopZoom.bind(me),\"keyup\");this.keycharm.bind(\"-\",this._zoomOut.bind(me),\"keydown\");this.keycharm.bind(\"-\",this._stopZoom.bind(me),\"keyup\");this.keycharm.bind(\"[\",this._zoomIn.bind(me),\"keydown\");this.keycharm.bind(\"[\",this._stopZoom.bind(me),\"keyup\");this.keycharm.bind(\"]\",this._zoomOut.bind(me),\"keydown\");this.keycharm.bind(\"]\",this._stopZoom.bind(me),\"keyup\");this.keycharm.bind(\"pageup\",this._zoomIn.bind(me),\"keydown\");this.keycharm.bind(\"pageup\",this._stopZoom.bind(me),\"keyup\");this.keycharm.bind(\"pagedown\",this._zoomOut.bind(me),\"keydown\");this.keycharm.bind(\"pagedown\",this._stopZoom.bind(me),\"keyup\")}if(this.constants.dataManipulation.enabled==true){this.keycharm.bind(\"esc\",this._createManipulatorBar.bind(me));this.keycharm.bind(\"delete\",this._deleteSelected.bind(me))}};Network.prototype.destroy=function(){this.start=function(){};this.redraw=function(){};this.timer=false;this._cleanupPhysicsConfiguration();this.keycharm.reset();this.hammer.dispose();this.off();this._recursiveDOMDelete(this.containerElement)};Network.prototype._recursiveDOMDelete=function(DOMobject){while(DOMobject.hasChildNodes()==true){this._recursiveDOMDelete(DOMobject.firstChild);DOMobject.removeChild(DOMobject.firstChild)}};Network.prototype._getPointer=function(touch){return{x:touch.pageX-util.getAbsoluteLeft(this.frame.canvas),y:touch.pageY-util.getAbsoluteTop(this.frame.canvas)}};Network.prototype._onTouch=function(event){if((new Date).valueOf()-this.touchTime>100){this.drag.pointer=this._getPointer(event.gesture.center);this.drag.pinched=false;this.pinch.scale=this._getScale();this.touchTime=(new Date).valueOf();this._handleTouch(this.drag.pointer)}};Network.prototype._onDragStart=function(event){this._handleDragStart(event)};Network.prototype._handleDragStart=function(event){if(this.drag.pointer===undefined){this._onTouch(event)}var node=this._getNodeAt(this.drag.pointer);this.drag.dragging=true;this.drag.selection=[];this.drag.translation=this._getTranslation();this.drag.nodeId=null;this.draggingNodes=false;if(node!=null&&this.constants.dragNodes==true){this.draggingNodes=true;this.drag.nodeId=node.id;if(!node.isSelected()){this._selectObject(node,false)}this.emit(\"dragStart\",{nodeIds:this.getSelection().nodes});for(var objectId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(objectId)){var object=this.selectionObj.nodes[objectId];var s={id:object.id,node:object,x:object.x,y:object.y,xFixed:object.xFixed,yFixed:object.yFixed};object.xFixed=true;object.yFixed=true;this.drag.selection.push(s)}}}};Network.prototype._onDrag=function(event){this._handleOnDrag(event)};Network.prototype._handleOnDrag=function(event){if(this.drag.pinched){return}this.releaseNode();var pointer=this._getPointer(event.gesture.center);var me=this;var drag=this.drag;var selection=drag.selection;if(selection&&selection.length&&this.constants.dragNodes==true){var deltaX=pointer.x-drag.pointer.x;var deltaY=pointer.y-drag.pointer.y;selection.forEach(function(s){var node=s.node;if(!s.xFixed){node.x=me._XconvertDOMtoCanvas(me._XconvertCanvasToDOM(s.x)+deltaX)}if(!s.yFixed){node.y=me._YconvertDOMtoCanvas(me._YconvertCanvasToDOM(s.y)+deltaY)}});if(!this.moving){this.moving=true;this.start()}}else{if(this.constants.dragNetwork==true){if(this.drag.pointer===undefined){this._handleDragStart(event);return}var diffX=pointer.x-this.drag.pointer.x;var diffY=pointer.y-this.drag.pointer.y;this._setTranslation(this.drag.translation.x+diffX,this.drag.translation.y+diffY);this._redraw()}}};Network.prototype._onDragEnd=function(event){this._handleDragEnd(event)};Network.prototype._handleDragEnd=function(event){this.drag.dragging=false;var selection=this.drag.selection;if(selection&&selection.length){selection.forEach(function(s){s.node.xFixed=s.xFixed;s.node.yFixed=s.yFixed});this.moving=true;this.start()}else{this._redraw()}if(this.draggingNodes==false){this.emit(\"dragEnd\",{nodeIds:[]})}else{this.emit(\"dragEnd\",{nodeIds:this.getSelection().nodes})}};Network.prototype._onTap=function(event){var pointer=this._getPointer(event.gesture.center);this.pointerPosition=pointer;this._handleTap(pointer)};Network.prototype._onDoubleTap=function(event){var pointer=this._getPointer(event.gesture.center);this._handleDoubleTap(pointer)};Network.prototype._onHold=function(event){var pointer=this._getPointer(event.gesture.center);this.pointerPosition=pointer;this._handleOnHold(pointer)};Network.prototype._onRelease=function(event){var pointer=this._getPointer(event.gesture.center);this._handleOnRelease(pointer)};Network.prototype._onPinch=function(event){var pointer=this._getPointer(event.gesture.center);this.drag.pinched=true;if(!(\"scale\"in this.pinch)){this.pinch.scale=1}var scale=this.pinch.scale*event.gesture.scale;this._zoom(scale,pointer)};Network.prototype._zoom=function(scale,pointer){if(this.constants.zoomable==true){var scaleOld=this._getScale();if(scale<1e-5){scale=1e-5}if(scale>10){scale=10}var preScaleDragPointer=null;if(this.drag!==undefined){if(this.drag.dragging==true){preScaleDragPointer=this.DOMtoCanvas(this.drag.pointer)}}var translation=this._getTranslation();var scaleFrac=scale/scaleOld;var tx=(1-scaleFrac)*pointer.x+translation.x*scaleFrac;var ty=(1-scaleFrac)*pointer.y+translation.y*scaleFrac;this.areaCenter={x:this._XconvertDOMtoCanvas(pointer.x),y:this._YconvertDOMtoCanvas(pointer.y)};this._setScale(scale);this._setTranslation(tx,ty);this.updateClustersDefault();if(preScaleDragPointer!=null){var postScaleDragPointer=this.canvasToDOM(preScaleDragPointer);this.drag.pointer.x=postScaleDragPointer.x;this.drag.pointer.y=postScaleDragPointer.y}this._redraw();if(scaleOld<scale){this.emit(\"zoom\",{direction:\"+\"})}else{this.emit(\"zoom\",{direction:\"-\"})}return scale}};Network.prototype._onMouseWheel=function(event){var delta=0;if(event.wheelDelta){delta=event.wheelDelta/120}else if(event.detail){delta=-event.detail/3}if(delta){var scale=this._getScale();var zoom=delta/10;if(delta<0){zoom=zoom/(1-zoom)}scale*=1+zoom;var gesture=hammerUtil.fakeGesture(this,event);var pointer=this._getPointer(gesture.center);this._zoom(scale,pointer)}event.preventDefault()};Network.prototype._onMouseMoveTitle=function(event){var gesture=hammerUtil.fakeGesture(this,event);var pointer=this._getPointer(gesture.center);if(this.popupObj){this._checkHidePopup(pointer)}if(this.constants.keyboard.bindToWindow==false&&this.constants.keyboard.enabled==true){this.frame.focus()}var me=this;var checkShow=function(){me._checkShowPopup(pointer)};if(this.popupTimer){clearInterval(this.popupTimer)}if(!this.drag.dragging){this.popupTimer=setTimeout(checkShow,this.constants.tooltip.delay)}if(this.constants.hover==true){for(var edgeId in this.hoverObj.edges){if(this.hoverObj.edges.hasOwnProperty(edgeId)){this.hoverObj.edges[edgeId].hover=false;delete this.hoverObj.edges[edgeId]}}var obj=this._getNodeAt(pointer);if(obj==null){obj=this._getEdgeAt(pointer)}if(obj!=null){this._hoverObject(obj)}for(var nodeId in this.hoverObj.nodes){if(this.hoverObj.nodes.hasOwnProperty(nodeId)){if(obj instanceof Node&&obj.id!=nodeId||obj instanceof Edge||obj==null){this._blurObject(this.hoverObj.nodes[nodeId]);delete this.hoverObj.nodes[nodeId]}}}this.redraw()}};Network.prototype._checkShowPopup=function(pointer){var obj={left:this._XconvertDOMtoCanvas(pointer.x),top:this._YconvertDOMtoCanvas(pointer.y),right:this._XconvertDOMtoCanvas(pointer.x),bottom:this._YconvertDOMtoCanvas(pointer.y)};var id;var lastPopupNode=this.popupObj;var nodeUnderCursor=false;if(this.popupObj==undefined){var nodes=this.nodes;var overlappingNodes=[];for(id in nodes){if(nodes.hasOwnProperty(id)){var node=nodes[id];if(node.isOverlappingWith(obj)){if(node.getTitle()!==undefined){overlappingNodes.push(id)}}}}if(overlappingNodes.length>0){this.popupObj=this.nodes[overlappingNodes[overlappingNodes.length-1]];nodeUnderCursor=true}}if(this.popupObj===undefined&&nodeUnderCursor==false){var edges=this.edges;var overlappingEdges=[];for(id in edges){if(edges.hasOwnProperty(id)){var edge=edges[id];if(edge.connected&&edge.getTitle()!==undefined&&edge.isOverlappingWith(obj)){overlappingEdges.push(id)}}}if(overlappingEdges.length>0){this.popupObj=this.edges[overlappingEdges[overlappingEdges.length-1]]}}if(this.popupObj){if(this.popupObj!=lastPopupNode){var me=this;if(!me.popup){me.popup=new Popup(me.frame,me.constants.tooltip)}me.popup.setPosition(pointer.x-3,pointer.y-3);me.popup.setText(me.popupObj.getTitle());me.popup.show()}}else{if(this.popup){this.popup.hide()}}};Network.prototype._checkHidePopup=function(pointer){if(!this.popupObj||!this._getNodeAt(pointer)){this.popupObj=undefined;if(this.popup){this.popup.hide()}}};Network.prototype.setSize=function(width,height){var emitEvent=false;var oldWidth=this.frame.canvas.width;var oldHeight=this.frame.canvas.height;if(width!=this.constants.width||height!=this.constants.height||this.frame.style.width!=width||this.frame.style.height!=height){this.frame.style.width=width;this.frame.style.height=height;this.frame.canvas.style.width=\"100%\";this.frame.canvas.style.height=\"100%\";this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio;this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio;this.constants.width=width;this.constants.height=height;emitEvent=true}else{if(this.frame.canvas.width!=this.frame.canvas.clientWidth*this.pixelRatio){this.frame.canvas.width=this.frame.canvas.clientWidth*this.pixelRatio;emitEvent=true}if(this.frame.canvas.height!=this.frame.canvas.clientHeight*this.pixelRatio){this.frame.canvas.height=this.frame.canvas.clientHeight*this.pixelRatio;emitEvent=true}}if(emitEvent==true){this.emit(\"resize\",{width:this.frame.canvas.width*this.pixelRatio,height:this.frame.canvas.height*this.pixelRatio,oldWidth:oldWidth*this.pixelRatio,oldHeight:oldHeight*this.pixelRatio})}};Network.prototype._setNodes=function(nodes){var oldNodesData=this.nodesData;if(nodes instanceof DataSet||nodes instanceof DataView){this.nodesData=nodes}else if(Array.isArray(nodes)){this.nodesData=new DataSet;this.nodesData.add(nodes)}else if(!nodes){this.nodesData=new DataSet}else{throw new TypeError(\"Array or DataSet expected\")}if(oldNodesData){util.forEach(this.nodesListeners,function(callback,event){oldNodesData.off(event,callback)})}this.nodes={};if(this.nodesData){var me=this;util.forEach(this.nodesListeners,function(callback,event){me.nodesData.on(event,callback)});var ids=this.nodesData.getIds();this._addNodes(ids)}this._updateSelection()};Network.prototype._addNodes=function(ids){var id;for(var i=0,len=ids.length;i<len;i++){id=ids[i];var data=this.nodesData.get(id);var node=new Node(data,this.images,this.groups,this.constants);this.nodes[id]=node;if((node.xFixed==false||node.yFixed==false)&&(node.x===null||node.y===null)){var radius=10*.1*ids.length+10;var angle=2*Math.PI*Math.random();if(node.xFixed==false){node.x=radius*Math.cos(angle)}if(node.yFixed==false){node.y=radius*Math.sin(angle)}}this.moving=true}this._updateNodeIndexList();if(this.constants.hierarchicalLayout.enabled==true&&this.initializing==false){this._resetLevels();this._setupHierarchicalLayout()}this._updateCalculationNodes();this._reconnectEdges();this._updateValueRange(this.nodes);this.updateLabels()};Network.prototype._updateNodes=function(ids,changedData){var nodes=this.nodes;for(var i=0,len=ids.length;i<len;i++){var id=ids[i];var node=nodes[id];var data=changedData[i];if(node){node.setProperties(data,this.constants)}else{node=new Node(properties,this.images,this.groups,this.constants);nodes[id]=node}}this.moving=true;if(this.constants.hierarchicalLayout.enabled==true&&this.initializing==false){this._resetLevels();this._setupHierarchicalLayout()}this._updateNodeIndexList();this._updateValueRange(nodes);this._markAllEdgesAsDirty()};Network.prototype._markAllEdgesAsDirty=function(){for(var edgeId in this.edges){this.edges[edgeId].colorDirty=true}};Network.prototype._removeNodes=function(ids){var nodes=this.nodes;for(var i=0,len=ids.length;i<len;i++){if(this.selectionObj.nodes[ids[i]]!==undefined){this.nodes[ids[i]].unselect();this._removeFromSelection(this.nodes[ids[i]])}}for(var i=0,len=ids.length;i<len;i++){var id=ids[i];delete nodes[id]}this._updateNodeIndexList();if(this.constants.hierarchicalLayout.enabled==true&&this.initializing==false){this._resetLevels();this._setupHierarchicalLayout()}this._updateCalculationNodes();this._reconnectEdges();this._updateSelection();this._updateValueRange(nodes)};Network.prototype._setEdges=function(edges){var oldEdgesData=this.edgesData;if(edges instanceof DataSet||edges instanceof DataView){this.edgesData=edges}else if(Array.isArray(edges)){this.edgesData=new DataSet;this.edgesData.add(edges)}else if(!edges){this.edgesData=new DataSet}else{throw new TypeError(\"Array or DataSet expected\")}if(oldEdgesData){util.forEach(this.edgesListeners,function(callback,event){oldEdgesData.off(event,callback)})}this.edges={};if(this.edgesData){var me=this;util.forEach(this.edgesListeners,function(callback,event){me.edgesData.on(event,callback)});var ids=this.edgesData.getIds();this._addEdges(ids)}this._reconnectEdges()};Network.prototype._addEdges=function(ids){var edges=this.edges,edgesData=this.edgesData;for(var i=0,len=ids.length;i<len;i++){var id=ids[i];var oldEdge=edges[id];if(oldEdge){oldEdge.disconnect()}var data=edgesData.get(id,{showInternalIds:true});edges[id]=new Edge(data,this,this.constants)}this.moving=true;this._updateValueRange(edges);this._createBezierNodes();this._updateCalculationNodes();if(this.constants.hierarchicalLayout.enabled==true&&this.initializing==false){this._resetLevels();this._setupHierarchicalLayout()}};Network.prototype._updateEdges=function(ids){var edges=this.edges,edgesData=this.edgesData;for(var i=0,len=ids.length;i<len;i++){var id=ids[i];var data=edgesData.get(id);var edge=edges[id];if(edge){edge.disconnect();edge.setProperties(data,this.constants);edge.connect()}else{edge=new Edge(data,this,this.constants);this.edges[id]=edge}}this._createBezierNodes();if(this.constants.hierarchicalLayout.enabled==true&&this.initializing==false){this._resetLevels();this._setupHierarchicalLayout()}this.moving=true;this._updateValueRange(edges)};Network.prototype._removeEdges=function(ids){var edges=this.edges;for(var i=0,len=ids.length;i<len;i++){if(this.selectionObj.edges[ids[i]]!==undefined){edges[ids[i]].unselect();this._removeFromSelection(edges[ids[i]])}}for(var i=0,len=ids.length;i<len;i++){var id=ids[i];var edge=edges[id];if(edge){if(edge.via!=null){delete this.sectors[\"support\"][\"nodes\"][edge.via.id]}edge.disconnect();delete edges[id]}}this.moving=true;this._updateValueRange(edges);if(this.constants.hierarchicalLayout.enabled==true&&this.initializing==false){this._resetLevels();this._setupHierarchicalLayout()}this._updateCalculationNodes()};Network.prototype._reconnectEdges=function(){var id,nodes=this.nodes,edges=this.edges;for(id in nodes){if(nodes.hasOwnProperty(id)){nodes[id].edges=[];nodes[id].dynamicEdges=[]}}for(id in edges){if(edges.hasOwnProperty(id)){var edge=edges[id];edge.from=null;edge.to=null;edge.connect()}}};Network.prototype._updateValueRange=function(obj){var id;var valueMin=undefined;var valueMax=undefined;var valueTotal=0;for(id in obj){if(obj.hasOwnProperty(id)){var value=obj[id].getValue();if(value!==undefined){valueMin=valueMin===undefined?value:Math.min(value,valueMin);valueMax=valueMax===undefined?value:Math.max(value,valueMax);valueTotal+=value}}}if(valueMin!==undefined&&valueMax!==undefined){for(id in obj){if(obj.hasOwnProperty(id)){obj[id].setValueRange(valueMin,valueMax,valueTotal)}}}};Network.prototype.redraw=function(){this.setSize(this.constants.width,this.constants.height);this._redraw()};Network.prototype._redraw=function(hidden){var ctx=this.frame.canvas.getContext(\"2d\");ctx.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var w=this.frame.canvas.clientWidth;var h=this.frame.canvas.clientHeight;ctx.clearRect(0,0,w,h);ctx.save();ctx.translate(this.translation.x,this.translation.y);ctx.scale(this.scale,this.scale);this.canvasTopLeft={x:this._XconvertDOMtoCanvas(0),y:this._YconvertDOMtoCanvas(0)};this.canvasBottomRight={x:this._XconvertDOMtoCanvas(this.frame.canvas.clientWidth),y:this._YconvertDOMtoCanvas(this.frame.canvas.clientHeight)};if(!(hidden==true)){this._doInAllSectors(\"_drawAllSectorNodes\",ctx);if(this.drag.dragging==false||this.drag.dragging===undefined||this.constants.hideEdgesOnDrag==false){this._doInAllSectors(\"_drawEdges\",ctx)}}if(this.drag.dragging==false||this.drag.dragging===undefined||this.constants.hideNodesOnDrag==false){this._doInAllSectors(\"_drawNodes\",ctx,false)}if(!(hidden==true)){if(this.controlNodesActive==true){this._doInAllSectors(\"_drawControlNodes\",ctx)}}ctx.restore();if(hidden==true){ctx.clearRect(0,0,w,h)}};Network.prototype._setTranslation=function(offsetX,offsetY){if(this.translation===undefined){this.translation={x:0,y:0}}if(offsetX!==undefined){this.translation.x=offsetX}if(offsetY!==undefined){this.translation.y=offsetY}this.emit(\"viewChanged\")};Network.prototype._getTranslation=function(){return{x:this.translation.x,y:this.translation.y}};Network.prototype._setScale=function(scale){this.scale=scale};Network.prototype._getScale=function(){return this.scale};Network.prototype._XconvertDOMtoCanvas=function(x){return(x-this.translation.x)/this.scale};Network.prototype._XconvertCanvasToDOM=function(x){return x*this.scale+this.translation.x};Network.prototype._YconvertDOMtoCanvas=function(y){return(y-this.translation.y)/this.scale};Network.prototype._YconvertCanvasToDOM=function(y){return y*this.scale+this.translation.y};Network.prototype.canvasToDOM=function(pos){return{x:this._XconvertCanvasToDOM(pos.x),y:this._YconvertCanvasToDOM(pos.y)}};Network.prototype.DOMtoCanvas=function(pos){return{x:this._XconvertDOMtoCanvas(pos.x),y:this._YconvertDOMtoCanvas(pos.y)}};Network.prototype._drawNodes=function(ctx,alwaysShow){if(alwaysShow===undefined){alwaysShow=false}var nodes=this.nodes;var selected=[];for(var id in nodes){if(nodes.hasOwnProperty(id)){nodes[id].setScaleAndPos(this.scale,this.canvasTopLeft,this.canvasBottomRight);if(nodes[id].isSelected()){selected.push(id)}else{if(nodes[id].inArea()||alwaysShow){nodes[id].draw(ctx)}}}}for(var s=0,sMax=selected.length;s<sMax;s++){if(nodes[selected[s]].inArea()||alwaysShow){nodes[selected[s]].draw(ctx)}}};Network.prototype._drawEdges=function(ctx){var edges=this.edges;for(var id in edges){if(edges.hasOwnProperty(id)){var edge=edges[id];edge.setScale(this.scale);if(edge.connected){edges[id].draw(ctx)}}}};Network.prototype._drawControlNodes=function(ctx){var edges=this.edges;for(var id in edges){if(edges.hasOwnProperty(id)){edges[id]._drawControlNodes(ctx)}}};Network.prototype._stabilize=function(){if(this.constants.freezeForStabilization==true){this._freezeDefinedNodes()}var count=0;while(this.moving&&count<this.constants.stabilizationIterations){this._physicsTick();count++}if(this.constants.zoomExtentOnStabilize==true){this.zoomExtent({duration:0},false,true)}if(this.constants.freezeForStabilization==true){this._restoreFrozenNodes()}this.emit(\"stabilizationIterationsDone\")};Network.prototype._freezeDefinedNodes=function(){var nodes=this.nodes;for(var id in nodes){if(nodes.hasOwnProperty(id)){if(nodes[id].x!=null&&nodes[id].y!=null){nodes[id].fixedData.x=nodes[id].xFixed;nodes[id].fixedData.y=nodes[id].yFixed;nodes[id].xFixed=true;nodes[id].yFixed=true}}}};Network.prototype._restoreFrozenNodes=function(){var nodes=this.nodes;for(var id in nodes){if(nodes.hasOwnProperty(id)){if(nodes[id].fixedData.x!=null){nodes[id].xFixed=nodes[id].fixedData.x;nodes[id].yFixed=nodes[id].fixedData.y}}}};Network.prototype._isMoving=function(vmin){var nodes=this.nodes;for(var id in nodes){if(nodes[id]!==undefined){if(nodes[id].isMoving(vmin)==true){return true}}}return false};Network.prototype._discreteStepNodes=function(){var interval=this.physicsDiscreteStepsize;var nodes=this.nodes;var nodeId;var nodesPresent=false;if(this.constants.maxVelocity>0){for(nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){nodes[nodeId].discreteStepLimited(interval,this.constants.maxVelocity);nodesPresent=true}}}else{for(nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){nodes[nodeId].discreteStep(interval);nodesPresent=true}}}if(nodesPresent==true){var vminCorrected=this.constants.minVelocity/Math.max(this.scale,.05);if(vminCorrected>.5*this.constants.maxVelocity){return true}else{return this._isMoving(vminCorrected)}}return false};Network.prototype._revertPhysicsState=function(){var nodes=this.nodes;for(var nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){nodes[nodeId].revertPosition()}}};Network.prototype._revertPhysicsTick=function(){this._doInAllActiveSectors(\"_revertPhysicsState\");if(this.constants.smoothCurves.enabled==true&&this.constants.smoothCurves.dynamic==true){this._doInSupportSector(\"_revertPhysicsState\")}};Network.prototype._physicsTick=function(){if(!this.freezeSimulationEnabled){if(this.moving==true){var mainMovingStatus=false;\nvar supportMovingStatus=false;this._doInAllActiveSectors(\"_initializeForceCalculation\");var mainMoving=this._doInAllActiveSectors(\"_discreteStepNodes\");if(this.constants.smoothCurves.enabled==true&&this.constants.smoothCurves.dynamic==true){supportMovingStatus=this._doInSupportSector(\"_discreteStepNodes\")}for(var i=0;i<mainMoving.length;i++){mainMovingStatus=mainMoving[i]||mainMovingStatus}this.moving=mainMovingStatus||supportMovingStatus;if(this.moving==false){this._revertPhysicsTick()}else{if(this.startedStabilization==false){this.emit(\"startStabilization\");this.startedStabilization=true}}this.stabilizationIterations++}}};Network.prototype._animationStep=function(){this.timer=undefined;this._handleNavigation();if(this.moving==true){var startTime=Date.now();this._physicsTick();var physicsTime=Date.now()-startTime;if((this.renderTimestep-this.renderTime>2*physicsTime||this.runDoubleSpeed==true)&&this.moving==true){this._physicsTick();if(this.renderTime!=0){this.runDoubleSpeed=true}}}var renderStartTime=Date.now();this._redraw();this.renderTime=Date.now()-renderStartTime;this.start()};if(typeof window!==\"undefined\"){window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame}Network.prototype.start=function(){if(this.moving==true||this.xIncrement!=0||this.yIncrement!=0||this.zoomIncrement!=0||this.animating==true){if(!this.timer){if(this.requiresTimeout==true){this.timer=window.setTimeout(this._animationStep.bind(this),this.renderTimestep)}else{this.timer=window.requestAnimationFrame(this._animationStep.bind(this))}}}else{this._redraw();if(this.stabilizationIterations>1){var me=this;var params={iterations:me.stabilizationIterations};this.stabilizationIterations=0;this.startedStabilization=false;setTimeout(function(){me.emit(\"stabilized\",params)},0)}else{this.stabilizationIterations=0}}};Network.prototype._handleNavigation=function(){if(this.xIncrement!=0||this.yIncrement!=0){var translation=this._getTranslation();this._setTranslation(translation.x+this.xIncrement,translation.y+this.yIncrement)}if(this.zoomIncrement!=0){var center={x:this.frame.canvas.clientWidth/2,y:this.frame.canvas.clientHeight/2};this._zoom(this.scale*(1+this.zoomIncrement),center)}};Network.prototype.freezeSimulation=function(freeze){if(freeze==true){this.freezeSimulationEnabled=true;this.moving=false}else{this.freezeSimulationEnabled=false;this.moving=true;this.start()}};Network.prototype._configureSmoothCurves=function(disableStart){if(disableStart===undefined){disableStart=true}if(this.constants.smoothCurves.enabled==true&&this.constants.smoothCurves.dynamic==true){this._createBezierNodes();for(var nodeId in this.sectors[\"support\"][\"nodes\"]){if(this.sectors[\"support\"][\"nodes\"].hasOwnProperty(nodeId)){if(this.edges[this.sectors[\"support\"][\"nodes\"][nodeId].parentEdgeId]===undefined){delete this.sectors[\"support\"][\"nodes\"][nodeId]}}}}else{this.sectors[\"support\"][\"nodes\"]={};for(var edgeId in this.edges){if(this.edges.hasOwnProperty(edgeId)){this.edges[edgeId].via=null}}}this._updateCalculationNodes();if(!disableStart){this.moving=true;this.start()}};Network.prototype._createBezierNodes=function(){if(this.constants.smoothCurves.enabled==true&&this.constants.smoothCurves.dynamic==true){for(var edgeId in this.edges){if(this.edges.hasOwnProperty(edgeId)){var edge=this.edges[edgeId];if(edge.via==null){var nodeId=\"edgeId:\".concat(edge.id);this.sectors[\"support\"][\"nodes\"][nodeId]=new Node({id:nodeId,mass:1,shape:\"circle\",image:\"\",internalMultiplier:1},{},{},this.constants);edge.via=this.sectors[\"support\"][\"nodes\"][nodeId];edge.via.parentEdgeId=edge.id;edge.positionBezierNode()}}}}};Network.prototype._initializeMixinLoaders=function(){for(var mixin in MixinLoader){if(MixinLoader.hasOwnProperty(mixin)){Network.prototype[mixin]=MixinLoader[mixin]}}};Network.prototype.storePosition=function(){console.log(\"storePosition is depricated: use .storePositions() from now on.\");this.storePositions()};Network.prototype.storePositions=function(){var dataArray=[];for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){var node=this.nodes[nodeId];var allowedToMoveX=!this.nodes.xFixed;var allowedToMoveY=!this.nodes.yFixed;if(this.nodesData._data[nodeId].x!=Math.round(node.x)||this.nodesData._data[nodeId].y!=Math.round(node.y)){dataArray.push({id:nodeId,x:Math.round(node.x),y:Math.round(node.y),allowedToMoveX:allowedToMoveX,allowedToMoveY:allowedToMoveY})}}}this.nodesData.update(dataArray)};Network.prototype.getPositions=function(ids){var dataArray={};if(ids!==undefined){if(Array.isArray(ids)==true){for(var i=0;i<ids.length;i++){if(this.nodes[ids[i]]!==undefined){var node=this.nodes[ids[i]];dataArray[ids[i]]={x:Math.round(node.x),y:Math.round(node.y)}}}}else{if(this.nodes[ids]!==undefined){var node=this.nodes[ids];dataArray[ids]={x:Math.round(node.x),y:Math.round(node.y)}}}}else{for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){var node=this.nodes[nodeId];dataArray[nodeId]={x:Math.round(node.x),y:Math.round(node.y)}}}}return dataArray};Network.prototype.focusOnNode=function(nodeId,options){if(this.nodes.hasOwnProperty(nodeId)){if(options===undefined){options={}}var nodePosition={x:this.nodes[nodeId].x,y:this.nodes[nodeId].y};options.position=nodePosition;options.lockedOnNode=nodeId;this.moveTo(options)}else{console.log(\"This nodeId cannot be found.\")}};Network.prototype.moveTo=function(options){if(options===undefined){options={};return}if(options.offset===undefined){options.offset={x:0,y:0}}if(options.offset.x===undefined){options.offset.x=0}if(options.offset.y===undefined){options.offset.y=0}if(options.scale===undefined){options.scale=this._getScale()}if(options.position===undefined){options.position=this._getTranslation()}if(options.animation===undefined){options.animation={duration:0}}if(options.animation===false){options.animation={duration:0}}if(options.animation===true){options.animation={}}if(options.animation.duration===undefined){options.animation.duration=1e3}if(options.animation.easingFunction===undefined){options.animation.easingFunction=\"easeInOutQuad\"}this.animateView(options)};Network.prototype.animateView=function(options){if(options===undefined){options={};return}this.releaseNode();if(options.locked==true){this.lockedOnNodeId=options.lockedOnNode;this.lockedOnNodeOffset=options.offset}if(this.easingTime!=0){this._transitionRedraw(1)}this.sourceScale=this._getScale();this.sourceTranslation=this._getTranslation();this.targetScale=options.scale;this._setScale(this.targetScale);var viewCenter=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight});var distanceFromCenter={x:viewCenter.x-options.position.x,y:viewCenter.y-options.position.y};this.targetTranslation={x:this.sourceTranslation.x+distanceFromCenter.x*this.targetScale+options.offset.x,y:this.sourceTranslation.y+distanceFromCenter.y*this.targetScale+options.offset.y};if(options.animation.duration==0){if(this.lockedOnNodeId!=null){this._classicRedraw=this._redraw;this._redraw=this._lockedRedraw}else{this._setScale(this.targetScale);this._setTranslation(this.targetTranslation.x,this.targetTranslation.y);this._redraw()}}else{this.animating=true;this.animationSpeed=1/(this.renderRefreshRate*options.animation.duration*.001)||1/this.renderRefreshRate;this.animationEasingFunction=options.animation.easingFunction;this._classicRedraw=this._redraw;this._redraw=this._transitionRedraw;this._redraw();this.start()}};Network.prototype._lockedRedraw=function(){var nodePosition={x:this.nodes[this.lockedOnNodeId].x,y:this.nodes[this.lockedOnNodeId].y};var viewCenter=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight});var distanceFromCenter={x:viewCenter.x-nodePosition.x,y:viewCenter.y-nodePosition.y};var sourceTranslation=this._getTranslation();var targetTranslation={x:sourceTranslation.x+distanceFromCenter.x*this.scale+this.lockedOnNodeOffset.x,y:sourceTranslation.y+distanceFromCenter.y*this.scale+this.lockedOnNodeOffset.y};this._setTranslation(targetTranslation.x,targetTranslation.y);this._classicRedraw()};Network.prototype.releaseNode=function(){if(this.lockedOnNodeId!=null){this._redraw=this._classicRedraw;this.lockedOnNodeId=null;this.lockedOnNodeOffset=null}};Network.prototype._transitionRedraw=function(easingTime){this.easingTime=easingTime||this.easingTime+this.animationSpeed;this.easingTime+=this.animationSpeed;var progress=util.easingFunctions[this.animationEasingFunction](this.easingTime);this._setScale(this.sourceScale+(this.targetScale-this.sourceScale)*progress);this._setTranslation(this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*progress,this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*progress);this._classicRedraw();if(this.easingTime>=1){this.animating=false;this.easingTime=0;if(this.lockedOnNodeId!=null){this._redraw=this._lockedRedraw}else{this._redraw=this._classicRedraw}this.emit(\"animationFinished\")}};Network.prototype._classicRedraw=function(){};Network.prototype.isActive=function(){return!this.activator||this.activator.active};Network.prototype.setScale=function(){return this._setScale()};Network.prototype.getScale=function(){return this._getScale()};Network.prototype.getCenterCoordinates=function(){return this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight})};Network.prototype.getBoundingBox=function(nodeId){if(this.nodes[nodeId]!==undefined){return this.nodes[nodeId].boundingBox}};Network.prototype.getConnectedNodes=function(nodeId){var nodeList=[];if(this.nodes[nodeId]!==undefined){var node=this.nodes[nodeId];var nodeObj={nodeId:true};for(var i=0;i<node.edges.length;i++){var edge=node.edges[i];if(edge.toId==nodeId){if(nodeObj[edge.fromId]===undefined){nodeList.push(edge.fromId);nodeObj[edge.fromId]=true}}else if(edge.fromId==nodeId){if(nodeObj[edge.toId]===undefined){nodeList.push(edge.toId);nodeObj[edge.toId]=true}}}}return nodeList};module.exports=Network},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Node=__webpack_require__(40);function Edge(properties,network,networkConstants){if(!network){throw\"No network provided\"}var fields=[\"edges\",\"physics\"];var constants=util.selectiveBridgeObject(fields,networkConstants);this.options=constants.edges;this.physics=constants.physics;this.options[\"smoothCurves\"]=networkConstants[\"smoothCurves\"];this.network=network;this.id=undefined;this.fromId=undefined;this.toId=undefined;this.title=undefined;this.widthSelected=this.options.width*this.options.widthSelectionMultiplier;this.value=undefined;this.selected=false;this.hover=false;this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0};this.dirtyLabel=true;this.colorDirty=true;this.from=null;this.to=null;this.via=null;this.fromBackup=null;this.toBackup=null;this.originalFromId=[];this.originalToId=[];this.connected=false;this.widthFixed=false;this.lengthFixed=false;this.setProperties(properties);this.controlNodesEnabled=false;this.controlNodes={from:null,to:null,positions:{}};this.connectedNode=null}Edge.prototype.setProperties=function(properties){this.colorDirty=true;if(!properties){return}var fields=[\"style\",\"fontSize\",\"fontFace\",\"fontColor\",\"fontFill\",\"fontStrokeWidth\",\"fontStrokeColor\",\"width\",\"widthSelectionMultiplier\",\"hoverWidth\",\"arrowScaleFactor\",\"dash\",\"inheritColor\",\"labelAlignment\",\"opacity\",\"customScalingFunction\"];util.selectiveDeepExtend(fields,this.options,properties);if(properties.from!==undefined){this.fromId=properties.from}if(properties.to!==undefined){this.toId=properties.to}if(properties.id!==undefined){this.id=properties.id}if(properties.label!==undefined){this.label=properties.label;this.dirtyLabel=true}if(properties.title!==undefined){this.title=properties.title}if(properties.value!==undefined){this.value=properties.value}if(properties.length!==undefined){this.physics.springLength=properties.length}if(properties.color!==undefined){this.options.inheritColor=false;if(util.isString(properties.color)){this.options.color.color=properties.color;this.options.color.highlight=properties.color}else{if(properties.color.color!==undefined){this.options.color.color=properties.color.color}if(properties.color.highlight!==undefined){this.options.color.highlight=properties.color.highlight}if(properties.color.hover!==undefined){this.options.color.hover=properties.color.hover}}}this.connect();this.widthFixed=this.widthFixed||properties.width!==undefined;this.lengthFixed=this.lengthFixed||properties.length!==undefined;this.widthSelected=this.options.width*this.options.widthSelectionMultiplier;switch(this.options.style){case\"line\":this.draw=this._drawLine;break;case\"arrow\":this.draw=this._drawArrow;break;case\"arrow-center\":this.draw=this._drawArrowCenter;break;case\"dash-line\":this.draw=this._drawDashLine;break;default:this.draw=this._drawLine;break}};Edge.prototype.connect=function(){this.disconnect();this.from=this.network.nodes[this.fromId]||null;this.to=this.network.nodes[this.toId]||null;this.connected=this.from&&this.to;if(this.connected){this.from.attachEdge(this);this.to.attachEdge(this)}else{if(this.from){this.from.detachEdge(this)}if(this.to){this.to.detachEdge(this)}}};Edge.prototype.disconnect=function(){if(this.from){this.from.detachEdge(this);this.from=null}if(this.to){this.to.detachEdge(this);this.to=null}this.connected=false};Edge.prototype.getTitle=function(){return typeof this.title===\"function\"?this.title():this.title};Edge.prototype.getValue=function(){return this.value};Edge.prototype.setValueRange=function(min,max,total){if(!this.widthFixed&&this.value!==undefined){var scale=this.options.customScalingFunction(min,max,total,this.value);var widthDiff=this.options.widthMax-this.options.widthMin;this.options.width=this.options.widthMin+scale*widthDiff;this.widthSelected=this.options.width*this.options.widthSelectionMultiplier}};Edge.prototype.draw=function(ctx){throw\"Method draw not initialized in edge\"};Edge.prototype.isOverlappingWith=function(obj){if(this.connected){var distMax=10;var xFrom=this.from.x;var yFrom=this.from.y;var xTo=this.to.x;var yTo=this.to.y;var xObj=obj.left;var yObj=obj.top;var dist=this._getDistanceToEdge(xFrom,yFrom,xTo,yTo,xObj,yObj);return dist<distMax}else{return false}};Edge.prototype._getColor=function(){var colorObj=this.options.color;if(this.colorDirty===true){if(this.options.inheritColor==\"to\"){colorObj={highlight:this.to.options.color.highlight.border,hover:this.to.options.color.hover.border,color:util.overrideOpacity(this.from.options.color.border,this.options.opacity)}}else if(this.options.inheritColor==\"from\"||this.options.inheritColor==true){colorObj={highlight:this.from.options.color.highlight.border,hover:this.from.options.color.hover.border,color:util.overrideOpacity(this.from.options.color.border,this.options.opacity)}}this.options.color=colorObj;this.colorDirty=false}if(this.selected==true){return colorObj.highlight}else if(this.hover==true){return colorObj.hover}else{return colorObj.color}};Edge.prototype._drawLine=function(ctx){ctx.strokeStyle=this._getColor();ctx.lineWidth=this._getLineWidth();if(this.from!=this.to){var via=this._line(ctx);var point;if(this.label){if(this.options.smoothCurves.enabled==true&&via!=null){var midpointX=.5*(.5*(this.from.x+via.x)+.5*(this.to.x+via.x));var midpointY=.5*(.5*(this.from.y+via.y)+.5*(this.to.y+via.y));point={x:midpointX,y:midpointY}}else{point=this._pointOnLine(.5)}this._label(ctx,this.label,point.x,point.y)}}else{var x,y;var radius=this.physics.springLength/4;var node=this.from;if(!node.width){node.resize(ctx)}if(node.width>node.height){x=node.x+node.width/2;y=node.y-radius}else{x=node.x+radius;y=node.y-node.height/2}this._circle(ctx,x,y,radius);point=this._pointOnCircle(x,y,radius,.5);this._label(ctx,this.label,point.x,point.y)}};Edge.prototype._getLineWidth=function(){if(this.selected==true){return Math.max(Math.min(this.widthSelected,this.options.widthMax),.3*this.networkScaleInv)}else{if(this.hover==true){return Math.max(Math.min(this.options.hoverWidth,this.options.widthMax),.3*this.networkScaleInv)}else{return Math.max(this.options.width,.3*this.networkScaleInv)}}};Edge.prototype._getViaCoordinates=function(){if(this.options.smoothCurves.dynamic==true&&this.options.smoothCurves.enabled==true){return this.via}else if(this.options.smoothCurves.enabled==false){return{x:0,y:0}}else{var xVia=null;var yVia=null;var factor=this.options.smoothCurves.roundness;var type=this.options.smoothCurves.type;var dx=Math.abs(this.from.x-this.to.x);var dy=Math.abs(this.from.y-this.to.y);if(type==\"discrete\"||type==\"diagonalCross\"){if(Math.abs(this.from.x-this.to.x)<Math.abs(this.from.y-this.to.y)){if(this.from.y>this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dy;yVia=this.from.y-factor*dy}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dy;yVia=this.from.y-factor*dy}}else if(this.from.y<this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dy;yVia=this.from.y+factor*dy}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dy;yVia=this.from.y+factor*dy}}if(type==\"discrete\"){xVia=dx<factor*dy?this.from.x:xVia}}else if(Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)){if(this.from.y>this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dx;yVia=this.from.y-factor*dx}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dx;yVia=this.from.y-factor*dx}}else if(this.from.y<this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dx;yVia=this.from.y+factor*dx}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dx;yVia=this.from.y+factor*dx}}if(type==\"discrete\"){yVia=dy<factor*dx?this.from.y:yVia}}}else if(type==\"straightCross\"){if(Math.abs(this.from.x-this.to.x)<Math.abs(this.from.y-this.to.y)){xVia=this.from.x;if(this.from.y<this.to.y){yVia=this.to.y-(1-factor)*dy}else{yVia=this.to.y+(1-factor)*dy}}else if(Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)){if(this.from.x<this.to.x){xVia=this.to.x-(1-factor)*dx}else{xVia=this.to.x+(1-factor)*dx}yVia=this.from.y}}else if(type==\"horizontal\"){if(this.from.x<this.to.x){xVia=this.to.x-(1-factor)*dx}else{xVia=this.to.x+(1-factor)*dx}yVia=this.from.y}else if(type==\"vertical\"){xVia=this.from.x;if(this.from.y<this.to.y){yVia=this.to.y-(1-factor)*dy}else{yVia=this.to.y+(1-factor)*dy}}else{if(Math.abs(this.from.x-this.to.x)<Math.abs(this.from.y-this.to.y)){if(this.from.y>this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dy;yVia=this.from.y-factor*dy;xVia=this.to.x<xVia?this.to.x:xVia}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dy;yVia=this.from.y-factor*dy;xVia=this.to.x>xVia?this.to.x:xVia}}else if(this.from.y<this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dy;yVia=this.from.y+factor*dy;xVia=this.to.x<xVia?this.to.x:xVia}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dy;yVia=this.from.y+factor*dy;xVia=this.to.x>xVia?this.to.x:xVia}}}else if(Math.abs(this.from.x-this.to.x)>Math.abs(this.from.y-this.to.y)){if(this.from.y>this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dx;yVia=this.from.y-factor*dx;yVia=this.to.y>yVia?this.to.y:yVia}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dx;yVia=this.from.y-factor*dx;yVia=this.to.y>yVia?this.to.y:yVia}}else if(this.from.y<this.to.y){if(this.from.x<this.to.x){xVia=this.from.x+factor*dx;yVia=this.from.y+factor*dx;yVia=this.to.y<yVia?this.to.y:yVia}else if(this.from.x>this.to.x){xVia=this.from.x-factor*dx;yVia=this.from.y+factor*dx;yVia=this.to.y<yVia?this.to.y:yVia}}}}return{x:xVia,y:yVia}}};Edge.prototype._line=function(ctx){ctx.beginPath();ctx.moveTo(this.from.x,this.from.y);if(this.options.smoothCurves.enabled==true){if(this.options.smoothCurves.dynamic==false){var via=this._getViaCoordinates();if(via.x==null){ctx.lineTo(this.to.x,this.to.y);ctx.stroke();return null}else{ctx.quadraticCurveTo(via.x,via.y,this.to.x,this.to.y);ctx.stroke();return via}}else{ctx.quadraticCurveTo(this.via.x,this.via.y,this.to.x,this.to.y);ctx.stroke();return this.via}}else{ctx.lineTo(this.to.x,this.to.y);ctx.stroke();return null}};Edge.prototype._circle=function(ctx,x,y,radius){ctx.beginPath();ctx.arc(x,y,radius,0,2*Math.PI,false);ctx.stroke()};Edge.prototype._label=function(ctx,text,x,y){if(text){ctx.font=(this.from.selected||this.to.selected?\"bold \":\"\")+this.options.fontSize+\"px \"+this.options.fontFace;var yLine;if(this.dirtyLabel==true){var lines=String(text).split(\"\\n\");var lineCount=lines.length;var fontSize=Number(this.options.fontSize);yLine=y+(1-lineCount)/2*fontSize;var width=ctx.measureText(lines[0]).width;for(var i=1;i<lineCount;i++){var lineWidth=ctx.measureText(lines[i]).width;width=lineWidth>width?lineWidth:width}var height=this.options.fontSize*lineCount;var left=x-width/2;var top=y-height/2;this.labelDimensions={top:top,left:left,width:width,height:height,yLine:yLine}}var yLine=this.labelDimensions.yLine;ctx.save();if(this.options.labelAlignment!=\"horizontal\"){ctx.translate(x,yLine);this._rotateForLabelAlignment(ctx);x=0;yLine=0}this._drawLabelRect(ctx);this._drawLabelText(ctx,x,yLine,lines,lineCount,fontSize);ctx.restore()}};Edge.prototype._rotateForLabelAlignment=function(ctx){var dy=this.from.y-this.to.y;var dx=this.from.x-this.to.x;var angleInDegrees=Math.atan2(dy,dx);if(angleInDegrees<-1&&dx<0||angleInDegrees>0&&dx<0){angleInDegrees=angleInDegrees+Math.PI}ctx.rotate(angleInDegrees)};Edge.prototype._drawLabelRect=function(ctx){if(this.options.fontFill!==undefined&&this.options.fontFill!==null&&this.options.fontFill!==\"none\"){ctx.fillStyle=this.options.fontFill;var lineMargin=2;if(this.options.labelAlignment==\"line-center\"){ctx.fillRect(-this.labelDimensions.width*.5,-this.labelDimensions.height*.5,this.labelDimensions.width,this.labelDimensions.height)}else if(this.options.labelAlignment==\"line-above\"){ctx.fillRect(-this.labelDimensions.width*.5,-(this.labelDimensions.height+lineMargin),this.labelDimensions.width,this.labelDimensions.height)}else if(this.options.labelAlignment==\"line-below\"){ctx.fillRect(-this.labelDimensions.width*.5,lineMargin,this.labelDimensions.width,this.labelDimensions.height)}else{ctx.fillRect(this.labelDimensions.left,this.labelDimensions.top,this.labelDimensions.width,this.labelDimensions.height)}}};Edge.prototype._drawLabelText=function(ctx,x,yLine,lines,lineCount,fontSize){ctx.fillStyle=this.options.fontColor||\"black\";ctx.textAlign=\"center\";if(this.options.labelAlignment!=\"horizontal\"){var lineMargin=2;if(this.options.labelAlignment==\"line-above\"){ctx.textBaseline=\"alphabetic\";yLine-=2*lineMargin}else if(this.options.labelAlignment==\"line-below\"){ctx.textBaseline=\"hanging\";yLine+=2*lineMargin}else{ctx.textBaseline=\"middle\"}}else{ctx.textBaseline=\"middle\"}if(this.options.fontStrokeWidth>0){ctx.lineWidth=this.options.fontStrokeWidth;ctx.strokeStyle=this.options.fontStrokeColor;ctx.lineJoin=\"round\"}for(var i=0;i<lineCount;i++){if(this.options.fontStrokeWidth>0){ctx.strokeText(lines[i],x,yLine)}ctx.fillText(lines[i],x,yLine);yLine+=fontSize}};Edge.prototype._drawDashLine=function(ctx){ctx.strokeStyle=this._getColor();ctx.lineWidth=this._getLineWidth();var via=null;if(ctx.setLineDash!==undefined){ctx.save();var pattern=[0];if(this.options.dash.length!==undefined&&this.options.dash.gap!==undefined){pattern=[this.options.dash.length,this.options.dash.gap]}else{pattern=[5,5]}ctx.setLineDash(pattern);ctx.lineDashOffset=0;via=this._line(ctx);ctx.setLineDash([0]);ctx.lineDashOffset=0;ctx.restore()}else{ctx.beginPath();ctx.lineCap=\"round\";if(this.options.dash.altLength!==undefined){ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap,this.options.dash.altLength,this.options.dash.gap])}else if(this.options.dash.length!==undefined&&this.options.dash.gap!==undefined){ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,[this.options.dash.length,this.options.dash.gap])}else{ctx.moveTo(this.from.x,this.from.y);ctx.lineTo(this.to.x,this.to.y)}ctx.stroke()}if(this.label){var point;if(this.options.smoothCurves.enabled==true&&via!=null){var midpointX=.5*(.5*(this.from.x+via.x)+.5*(this.to.x+via.x));var midpointY=.5*(.5*(this.from.y+via.y)+.5*(this.to.y+via.y));point={x:midpointX,y:midpointY}}else{point=this._pointOnLine(.5)}this._label(ctx,this.label,point.x,point.y)}};Edge.prototype._pointOnLine=function(percentage){return{x:(1-percentage)*this.from.x+percentage*this.to.x,y:(1-percentage)*this.from.y+percentage*this.to.y}};Edge.prototype._pointOnCircle=function(x,y,radius,percentage){var angle=(percentage-3/8)*2*Math.PI;return{x:x+radius*Math.cos(angle),y:y-radius*Math.sin(angle)}};Edge.prototype._drawArrowCenter=function(ctx){var point;ctx.strokeStyle=this._getColor();ctx.fillStyle=ctx.strokeStyle;ctx.lineWidth=this._getLineWidth();if(this.from!=this.to){var via=this._line(ctx);var angle=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var length=(10+5*this.options.width)*this.options.arrowScaleFactor;if(this.options.smoothCurves.enabled==true&&via!=null){var midpointX=.5*(.5*(this.from.x+via.x)+.5*(this.to.x+via.x));var midpointY=.5*(.5*(this.from.y+via.y)+.5*(this.to.y+via.y));point={x:midpointX,y:midpointY}}else{point=this._pointOnLine(.5)}ctx.arrow(point.x,point.y,angle,length);ctx.fill();ctx.stroke();if(this.label){this._label(ctx,this.label,point.x,point.y)}}else{var x,y;var radius=.25*Math.max(100,this.physics.springLength);var node=this.from;if(!node.width){node.resize(ctx)}if(node.width>node.height){x=node.x+node.width*.5;y=node.y-radius}else{x=node.x+radius;y=node.y-node.height*.5}this._circle(ctx,x,y,radius);var angle=.2*Math.PI;var length=(10+5*this.options.width)*this.options.arrowScaleFactor;point=this._pointOnCircle(x,y,radius,.5);ctx.arrow(point.x,point.y,angle,length);ctx.fill();ctx.stroke();if(this.label){point=this._pointOnCircle(x,y,radius,.5);this._label(ctx,this.label,point.x,point.y)}}};Edge.prototype._pointOnBezier=function(t){var via=this._getViaCoordinates();var x=Math.pow(1-t,2)*this.from.x+2*t*(1-t)*via.x+Math.pow(t,2)*this.to.x;var y=Math.pow(1-t,2)*this.from.y+2*t*(1-t)*via.y+Math.pow(t,2)*this.to.y;return{x:x,y:y}};Edge.prototype._findBorderPosition=function(from,ctx){var maxIterations=10;var iteration=0;var low=0;var high=1;var pos,angle,distanceToBorder,distanceToNodes,difference;var threshold=.2;var node=this.to;if(from==true){node=this.from}while(low<=high&&iteration<maxIterations){var middle=(low+high)*.5;pos=this._pointOnBezier(middle);angle=Math.atan2(node.y-pos.y,node.x-pos.x);distanceToBorder=node.distanceToBorder(ctx,angle);distanceToNodes=Math.sqrt(Math.pow(pos.x-node.x,2)+Math.pow(pos.y-node.y,2));difference=distanceToBorder-distanceToNodes;if(Math.abs(difference)<threshold){break}else if(difference<0){if(from==false){low=middle}else{high=middle}}else{if(from==false){high=middle}else{low=middle}}iteration++}pos.t=middle;return pos};Edge.prototype._drawArrow=function(ctx){ctx.strokeStyle=this._getColor();ctx.fillStyle=ctx.strokeStyle;ctx.lineWidth=this._getLineWidth();var angle,length,arrowPos;if(this.from!=this.to){this._line(ctx);if(this.options.smoothCurves.enabled==true){var via=this._getViaCoordinates();arrowPos=this._findBorderPosition(false,ctx);var guidePos=this._pointOnBezier(Math.max(0,arrowPos.t-.1));angle=Math.atan2(arrowPos.y-guidePos.y,arrowPos.x-guidePos.x)}else{angle=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var dx=this.to.x-this.from.x;var dy=this.to.y-this.from.y;var edgeSegmentLength=Math.sqrt(dx*dx+dy*dy);var toBorderDist=this.to.distanceToBorder(ctx,angle);var toBorderPoint=(edgeSegmentLength-toBorderDist)/edgeSegmentLength;arrowPos={};arrowPos.x=(1-toBorderPoint)*this.from.x+toBorderPoint*this.to.x;arrowPos.y=(1-toBorderPoint)*this.from.y+toBorderPoint*this.to.y}length=(10+5*this.options.width)*this.options.arrowScaleFactor;ctx.arrow(arrowPos.x,arrowPos.y,angle,length);ctx.fill();ctx.stroke();if(this.label){var point;if(this.options.smoothCurves.enabled==true&&via!=null){point=this._pointOnBezier(.5)}else{point=this._pointOnLine(.5)}this._label(ctx,this.label,point.x,point.y)}}else{var node=this.from;var x,y,arrow;var radius=.25*Math.max(100,this.physics.springLength);if(!node.width){node.resize(ctx)}if(node.width>node.height){x=node.x+node.width*.5;y=node.y-radius;arrow={x:x,y:node.y,angle:.9*Math.PI}}else{x=node.x+radius;y=node.y-node.height*.5;arrow={x:node.x,y:y,angle:.6*Math.PI}}ctx.beginPath();ctx.arc(x,y,radius,0,2*Math.PI,false);ctx.stroke();var length=(10+5*this.options.width)*this.options.arrowScaleFactor;ctx.arrow(arrow.x,arrow.y,arrow.angle,length);ctx.fill();ctx.stroke();if(this.label){point=this._pointOnCircle(x,y,radius,.5);this._label(ctx,this.label,point.x,point.y)}}};Edge.prototype._getDistanceToEdge=function(x1,y1,x2,y2,x3,y3){var returnValue=0;if(this.from!=this.to){if(this.options.smoothCurves.enabled==true){var xVia,yVia;if(this.options.smoothCurves.enabled==true&&this.options.smoothCurves.dynamic==true){xVia=this.via.x;yVia=this.via.y}else{var via=this._getViaCoordinates();xVia=via.x;yVia=via.y}var minDistance=1e9;var distance;var i,t,x,y,lastX,lastY;for(i=0;i<10;i++){t=.1*i;x=Math.pow(1-t,2)*x1+2*t*(1-t)*xVia+Math.pow(t,2)*x2;y=Math.pow(1-t,2)*y1+2*t*(1-t)*yVia+Math.pow(t,2)*y2;if(i>0){distance=this._getDistanceToLine(lastX,lastY,x,y,x3,y3);minDistance=distance<minDistance?distance:minDistance}lastX=x;lastY=y}returnValue=minDistance}else{returnValue=this._getDistanceToLine(x1,y1,x2,y2,x3,y3)}}else{var x,y,dx,dy;var radius=.25*this.physics.springLength;var node=this.from;if(node.width>node.height){x=node.x+.5*node.width;y=node.y-radius}else{x=node.x+radius;y=node.y-.5*node.height}dx=x-x3;dy=y-y3;returnValue=Math.abs(Math.sqrt(dx*dx+dy*dy)-radius)}if(this.labelDimensions.left<x3&&this.labelDimensions.left+this.labelDimensions.width>x3&&this.labelDimensions.top<y3&&this.labelDimensions.top+this.labelDimensions.height>y3){return 0}else{return returnValue}};Edge.prototype._getDistanceToLine=function(x1,y1,x2,y2,x3,y3){var px=x2-x1,py=y2-y1,something=px*px+py*py,u=((x3-x1)*px+(y3-y1)*py)/something;if(u>1){u=1}else if(u<0){u=0}var x=x1+u*px,y=y1+u*py,dx=x-x3,dy=y-y3;return Math.sqrt(dx*dx+dy*dy)};Edge.prototype.setScale=function(scale){this.networkScaleInv=1/scale};Edge.prototype.select=function(){this.selected=true};Edge.prototype.unselect=function(){this.selected=false};Edge.prototype.positionBezierNode=function(){if(this.via!==null&&this.from!==null&&this.to!==null){this.via.x=.5*(this.from.x+this.to.x);this.via.y=.5*(this.from.y+this.to.y)}else if(this.via!==null){this.via.x=0;this.via.y=0}};Edge.prototype._drawControlNodes=function(ctx){if(this.controlNodesEnabled==true){if(this.controlNodes.from===null&&this.controlNodes.to===null){var nodeIdFrom=\"edgeIdFrom:\".concat(this.id);var nodeIdTo=\"edgeIdTo:\".concat(this.id);var constants={nodes:{group:\"\",radius:7,borderWidth:2,borderWidthSelected:2},physics:{damping:0},clustering:{maxNodeSizeIncrements:0,nodeScaling:{width:0,height:0,radius:0}}};this.controlNodes.from=new Node({id:nodeIdFrom,shape:\"dot\",color:{background:\"#ff0000\",border:\"#3c3c3c\",highlight:{background:\"#07f968\"}}},{},{},constants);this.controlNodes.to=new Node({id:nodeIdTo,shape:\"dot\",color:{background:\"#ff0000\",border:\"#3c3c3c\",highlight:{background:\"#07f968\"}}},{},{},constants)}this.controlNodes.positions={};if(this.controlNodes.from.selected==false){this.controlNodes.positions.from=this.getControlNodeFromPosition(ctx);this.controlNodes.from.x=this.controlNodes.positions.from.x;this.controlNodes.from.y=this.controlNodes.positions.from.y}if(this.controlNodes.to.selected==false){this.controlNodes.positions.to=this.getControlNodeToPosition(ctx);this.controlNodes.to.x=this.controlNodes.positions.to.x;this.controlNodes.to.y=this.controlNodes.positions.to.y}this.controlNodes.from.draw(ctx);this.controlNodes.to.draw(ctx)}else{this.controlNodes={from:null,to:null,positions:{}}}};Edge.prototype._enableControlNodes=function(){this.fromBackup=this.from;this.toBackup=this.to;\nthis.controlNodesEnabled=true};Edge.prototype._disableControlNodes=function(){this.fromId=this.from.id;this.toId=this.to.id;if(this.fromId!=this.fromBackup.id){this.fromBackup.detachEdge(this)}else if(this.toId!=this.toBackup.id){this.toBackup.detachEdge(this)}this.fromBackup=null;this.toBackup=null;this.controlNodesEnabled=false};Edge.prototype._getSelectedControlNode=function(x,y){var positions=this.controlNodes.positions;var fromDistance=Math.sqrt(Math.pow(x-positions.from.x,2)+Math.pow(y-positions.from.y,2));var toDistance=Math.sqrt(Math.pow(x-positions.to.x,2)+Math.pow(y-positions.to.y,2));if(fromDistance<15){this.connectedNode=this.from;this.from=this.controlNodes.from;return this.controlNodes.from}else if(toDistance<15){this.connectedNode=this.to;this.to=this.controlNodes.to;return this.controlNodes.to}else{return null}};Edge.prototype._restoreControlNodes=function(){if(this.controlNodes.from.selected==true){this.from=this.connectedNode;this.connectedNode=null;this.controlNodes.from.unselect()}else if(this.controlNodes.to.selected==true){this.to=this.connectedNode;this.connectedNode=null;this.controlNodes.to.unselect()}};Edge.prototype.getControlNodeFromPosition=function(ctx){var controlnodeFromPos;if(this.options.smoothCurves.enabled==true){controlnodeFromPos=this._findBorderPosition(true,ctx)}else{var angle=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var dx=this.to.x-this.from.x;var dy=this.to.y-this.from.y;var edgeSegmentLength=Math.sqrt(dx*dx+dy*dy);var fromBorderDist=this.from.distanceToBorder(ctx,angle+Math.PI);var fromBorderPoint=(edgeSegmentLength-fromBorderDist)/edgeSegmentLength;controlnodeFromPos={};controlnodeFromPos.x=fromBorderPoint*this.from.x+(1-fromBorderPoint)*this.to.x;controlnodeFromPos.y=fromBorderPoint*this.from.y+(1-fromBorderPoint)*this.to.y}return controlnodeFromPos};Edge.prototype.getControlNodeToPosition=function(ctx){var controlnodeFromPos,controlnodeToPos;if(this.options.smoothCurves.enabled==true){controlnodeToPos=this._findBorderPosition(false,ctx)}else{var angle=Math.atan2(this.to.y-this.from.y,this.to.x-this.from.x);var dx=this.to.x-this.from.x;var dy=this.to.y-this.from.y;var edgeSegmentLength=Math.sqrt(dx*dx+dy*dy);var toBorderDist=this.to.distanceToBorder(ctx,angle);var toBorderPoint=(edgeSegmentLength-toBorderDist)/edgeSegmentLength;controlnodeToPos={};controlnodeToPos.x=(1-toBorderPoint)*this.from.x+toBorderPoint*this.to.x;controlnodeToPos.y=(1-toBorderPoint)*this.from.y+toBorderPoint*this.to.y}return controlnodeToPos};module.exports=Edge},function(module,exports,__webpack_require__){var util=__webpack_require__(1);function Groups(){this.clear();this.defaultIndex=0}Groups.DEFAULT=[{border:\"#2B7CE9\",background:\"#97C2FC\",highlight:{border:\"#2B7CE9\",background:\"#D2E5FF\"},hover:{border:\"#2B7CE9\",background:\"#D2E5FF\"}},{border:\"#FFA500\",background:\"#FFFF00\",highlight:{border:\"#FFA500\",background:\"#FFFFA3\"},hover:{border:\"#FFA500\",background:\"#FFFFA3\"}},{border:\"#FA0A10\",background:\"#FB7E81\",highlight:{border:\"#FA0A10\",background:\"#FFAFB1\"},hover:{border:\"#FA0A10\",background:\"#FFAFB1\"}},{border:\"#41A906\",background:\"#7BE141\",highlight:{border:\"#41A906\",background:\"#A1EC76\"},hover:{border:\"#41A906\",background:\"#A1EC76\"}},{border:\"#E129F0\",background:\"#EB7DF4\",highlight:{border:\"#E129F0\",background:\"#F0B3F5\"},hover:{border:\"#E129F0\",background:\"#F0B3F5\"}},{border:\"#7C29F0\",background:\"#AD85E4\",highlight:{border:\"#7C29F0\",background:\"#D3BDF0\"},hover:{border:\"#7C29F0\",background:\"#D3BDF0\"}},{border:\"#C37F00\",background:\"#FFA807\",highlight:{border:\"#C37F00\",background:\"#FFCA66\"},hover:{border:\"#C37F00\",background:\"#FFCA66\"}},{border:\"#4220FB\",background:\"#6E6EFD\",highlight:{border:\"#4220FB\",background:\"#9B9BFD\"},hover:{border:\"#4220FB\",background:\"#9B9BFD\"}},{border:\"#FD5A77\",background:\"#FFC0CB\",highlight:{border:\"#FD5A77\",background:\"#FFD1D9\"},hover:{border:\"#FD5A77\",background:\"#FFD1D9\"}},{border:\"#4AD63A\",background:\"#C2FABC\",highlight:{border:\"#4AD63A\",background:\"#E6FFE3\"},hover:{border:\"#4AD63A\",background:\"#E6FFE3\"}}];Groups.prototype.clear=function(){this.groups={};this.groups.length=function(){var i=0;for(var p in this){if(this.hasOwnProperty(p)){i++}}return i}};Groups.prototype.get=function(groupname){var group=this.groups[groupname];if(group==undefined){var index=this.defaultIndex%Groups.DEFAULT.length;this.defaultIndex++;group={};group.color=Groups.DEFAULT[index];this.groups[groupname]=group}return group};Groups.prototype.add=function(groupname,style){this.groups[groupname]=style;return style};module.exports=Groups},function(module,exports,__webpack_require__){function Images(){this.images={};this.imageBroken={};this.callback=undefined}Images.prototype.setOnloadCallback=function(callback){this.callback=callback};Images.prototype.load=function(url,brokenUrl){var img=this.images[url];if(img===undefined){var me=this;img=new Image;img.onload=function(){if(this.width==0){document.body.appendChild(this);this.width=this.offsetWidth;this.height=this.offsetHeight;document.body.removeChild(this)}if(me.callback){me.images[url]=img;me.callback(this)}};img.onerror=function(){if(brokenUrl===undefined){console.error(\"Could not load image:\",url);delete this.src;if(me.callback){me.callback(this)}}else{if(me.imageBroken[url]===true){if(this.src==brokenUrl){console.error(\"Could not load brokenImage:\",brokenUrl);delete this.src;if(me.callback){me.callback(this)}}else{console.error(\"Could not load image:\",url);this.src=brokenUrl}}else{console.error(\"Could not load image:\",url);this.src=brokenUrl;me.imageBroken[url]=true}}};img.src=url}return img};module.exports=Images},function(module,exports,__webpack_require__){var util=__webpack_require__(1);function Node(properties,imagelist,grouplist,networkConstants){var constants=util.selectiveBridgeObject([\"nodes\"],networkConstants);this.options=constants.nodes;this.selected=false;this.hover=false;this.edges=[];this.dynamicEdges=[];this.reroutedEdges={};this.id=undefined;this.allowedToMoveX=false;this.allowedToMoveY=false;this.xFixed=false;this.yFixed=false;this.horizontalAlignLeft=true;this.verticalAlignTop=true;this.baseRadiusValue=networkConstants.nodes.radius;this.radiusFixed=false;this.level=-1;this.preassignedLevel=false;this.hierarchyEnumerated=false;this.labelDimensions={top:0,left:0,width:0,height:0,yLine:0};this.boundingBox={top:0,left:0,right:0,bottom:0};this.imagelist=imagelist;this.grouplist=grouplist;this.fx=0;this.fy=0;this.vx=0;this.vy=0;this.x=null;this.y=null;this.predefinedPosition=false;this.previousState={vx:0,vy:0,x:0,y:0};this.damping=networkConstants.physics.damping;this.fixedData={x:null,y:null};this.setProperties(properties,constants);this.resetCluster();this.clusterSession=0;this.clusterSizeWidthFactor=networkConstants.clustering.nodeScaling.width;this.clusterSizeHeightFactor=networkConstants.clustering.nodeScaling.height;this.clusterSizeRadiusFactor=networkConstants.clustering.nodeScaling.radius;this.maxNodeSizeIncrements=networkConstants.clustering.maxNodeSizeIncrements;this.growthIndicator=0;this.networkScaleInv=1;this.networkScale=1;this.canvasTopLeft={x:-300,y:-300};this.canvasBottomRight={x:300,y:300};this.parentEdgeId=null}Node.prototype.revertPosition=function(){this.x=this.previousState.x;this.y=this.previousState.y;this.vx=this.previousState.vx;this.vy=this.previousState.vy};Node.prototype.resetCluster=function(){this.formationScale=undefined;this.clusterSize=1;this.containedNodes={};this.containedEdges={};this.clusterSessions=[]};Node.prototype.attachEdge=function(edge){if(this.edges.indexOf(edge)==-1){this.edges.push(edge)}if(this.dynamicEdges.indexOf(edge)==-1){this.dynamicEdges.push(edge)}};Node.prototype.detachEdge=function(edge){var index=this.edges.indexOf(edge);if(index!=-1){this.edges.splice(index,1)}index=this.dynamicEdges.indexOf(edge);if(index!=-1){this.dynamicEdges.splice(index,1)}};Node.prototype.setProperties=function(properties,constants){if(!properties){return}var fields=[\"borderWidth\",\"borderWidthSelected\",\"shape\",\"image\",\"brokenImage\",\"radius\",\"fontColor\",\"fontSize\",\"fontFace\",\"fontFill\",\"fontStrokeWidth\",\"fontStrokeColor\",\"group\",\"mass\",\"fontDrawThreshold\",\"scaleFontWithValue\",\"fontSizeMaxVisible\",\"customScalingFunction\"];util.selectiveDeepExtend(fields,this.options,properties);if(properties.id!==undefined){this.id=properties.id}if(properties.label!==undefined){this.label=properties.label;this.originalLabel=properties.label}if(properties.title!==undefined){this.title=properties.title}if(properties.x!==undefined){this.x=properties.x;this.predefinedPosition=true}if(properties.y!==undefined){this.y=properties.y;this.predefinedPosition=true}if(properties.value!==undefined){this.value=properties.value}if(properties.level!==undefined){this.level=properties.level;this.preassignedLevel=true}if(properties.horizontalAlignLeft!==undefined){this.horizontalAlignLeft=properties.horizontalAlignLeft}if(properties.verticalAlignTop!==undefined){this.verticalAlignTop=properties.verticalAlignTop}if(properties.triggerFunction!==undefined){this.triggerFunction=properties.triggerFunction}if(this.id===undefined){throw\"Node must have an id\"}if(typeof properties.group===\"number\"||typeof properties.group===\"string\"&&properties.group!=\"\"){var groupObj=this.grouplist.get(properties.group);util.deepExtend(this.options,groupObj);this.options.color=util.parseColor(this.options.color)}if(properties.radius!==undefined){this.baseRadiusValue=this.options.radius}if(properties.color!==undefined){this.options.color=util.parseColor(properties.color)}if(this.options.image!==undefined&&this.options.image!=\"\"){if(this.imagelist){this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage)}else{throw\"No imagelist provided\"}}if(properties.allowedToMoveX!==undefined){this.xFixed=!properties.allowedToMoveX;this.allowedToMoveX=properties.allowedToMoveX}else if(properties.x!==undefined&&this.allowedToMoveX==false){this.xFixed=true}if(properties.allowedToMoveY!==undefined){this.yFixed=!properties.allowedToMoveY;this.allowedToMoveY=properties.allowedToMoveY}else if(properties.y!==undefined&&this.allowedToMoveY==false){this.yFixed=true}this.radiusFixed=this.radiusFixed||properties.radius!==undefined;if(this.options.shape===\"image\"||this.options.shape===\"circularImage\"){this.options.radiusMin=constants.nodes.widthMin;this.options.radiusMax=constants.nodes.widthMax}switch(this.options.shape){case\"database\":this.draw=this._drawDatabase;this.resize=this._resizeDatabase;break;case\"box\":this.draw=this._drawBox;this.resize=this._resizeBox;break;case\"circle\":this.draw=this._drawCircle;this.resize=this._resizeCircle;break;case\"ellipse\":this.draw=this._drawEllipse;this.resize=this._resizeEllipse;break;case\"image\":this.draw=this._drawImage;this.resize=this._resizeImage;break;case\"circularImage\":this.draw=this._drawCircularImage;this.resize=this._resizeCircularImage;break;case\"text\":this.draw=this._drawText;this.resize=this._resizeText;break;case\"dot\":this.draw=this._drawDot;this.resize=this._resizeShape;break;case\"square\":this.draw=this._drawSquare;this.resize=this._resizeShape;break;case\"triangle\":this.draw=this._drawTriangle;this.resize=this._resizeShape;break;case\"triangleDown\":this.draw=this._drawTriangleDown;this.resize=this._resizeShape;break;case\"star\":this.draw=this._drawStar;this.resize=this._resizeShape;break;default:this.draw=this._drawEllipse;this.resize=this._resizeEllipse;break}this._reset()};Node.prototype.select=function(){this.selected=true;this._reset()};Node.prototype.unselect=function(){this.selected=false;this._reset()};Node.prototype.clearSizeCache=function(){this._reset()};Node.prototype._reset=function(){this.width=undefined;this.height=undefined};Node.prototype.getTitle=function(){return typeof this.title===\"function\"?this.title():this.title};Node.prototype.distanceToBorder=function(ctx,angle){var borderWidth=1;if(!this.width){this.resize(ctx)}switch(this.options.shape){case\"circle\":case\"dot\":return this.options.radius+borderWidth;case\"ellipse\":var a=this.width/2;var b=this.height/2;var w=Math.sin(angle)*a;var h=Math.cos(angle)*b;return a*b/Math.sqrt(w*w+h*h);case\"box\":case\"image\":case\"text\":default:if(this.width){return Math.min(Math.abs(this.width/2/Math.cos(angle)),Math.abs(this.height/2/Math.sin(angle)))+borderWidth}else{return 0}}};Node.prototype._setForce=function(fx,fy){this.fx=fx;this.fy=fy};Node.prototype._addForce=function(fx,fy){this.fx+=fx;this.fy+=fy};Node.prototype.storeState=function(){this.previousState.x=this.x;this.previousState.y=this.y;this.previousState.vx=this.vx;this.previousState.vy=this.vy};Node.prototype.discreteStep=function(interval){this.storeState();if(!this.xFixed){var dx=this.damping*this.vx;var ax=(this.fx-dx)/this.options.mass;this.vx+=ax*interval;this.x+=this.vx*interval}else{this.fx=0;this.vx=0}if(!this.yFixed){var dy=this.damping*this.vy;var ay=(this.fy-dy)/this.options.mass;this.vy+=ay*interval;this.y+=this.vy*interval}else{this.fy=0;this.vy=0}};Node.prototype.discreteStepLimited=function(interval,maxVelocity){this.storeState();if(!this.xFixed){var dx=this.damping*this.vx;var ax=(this.fx-dx)/this.options.mass;this.vx+=ax*interval;this.vx=Math.abs(this.vx)>maxVelocity?this.vx>0?maxVelocity:-maxVelocity:this.vx;this.x+=this.vx*interval}else{this.fx=0;this.vx=0}if(!this.yFixed){var dy=this.damping*this.vy;var ay=(this.fy-dy)/this.options.mass;this.vy+=ay*interval;this.vy=Math.abs(this.vy)>maxVelocity?this.vy>0?maxVelocity:-maxVelocity:this.vy;this.y+=this.vy*interval}else{this.fy=0;this.vy=0}};Node.prototype.isFixed=function(){return this.xFixed&&this.yFixed};Node.prototype.isMoving=function(vmin){var velocity=Math.sqrt(Math.pow(this.vx,2)+Math.pow(this.vy,2));return velocity>vmin};Node.prototype.isSelected=function(){return this.selected};Node.prototype.getValue=function(){return this.value};Node.prototype.getDistance=function(x,y){var dx=this.x-x,dy=this.y-y;return Math.sqrt(dx*dx+dy*dy)};Node.prototype.setValueRange=function(min,max,total){if(!this.radiusFixed&&this.value!==undefined){var scale=this.options.customScalingFunction(min,max,total,this.value);var radiusDiff=this.options.radiusMax-this.options.radiusMin;if(this.options.scaleFontWithValue==true){var fontDiff=this.options.fontSizeMax-this.options.fontSizeMin;this.options.fontSize=this.options.fontSizeMin+scale*fontDiff}this.options.radius=this.options.radiusMin+scale*radiusDiff}this.baseRadiusValue=this.options.radius};Node.prototype.draw=function(ctx){throw\"Draw method not initialized for node\"};Node.prototype.resize=function(ctx){throw\"Resize method not initialized for node\"};Node.prototype.isOverlappingWith=function(obj){return this.left<obj.right&&this.left+this.width>obj.left&&this.top<obj.bottom&&this.top+this.height>obj.top};Node.prototype._resizeImage=function(ctx){if(!this.width||!this.height){var width,height;if(this.value){this.options.radius=this.baseRadiusValue;var scale=this.imageObj.height/this.imageObj.width;if(scale!==undefined){width=this.options.radius||this.imageObj.width;height=this.options.radius*scale||this.imageObj.height}else{width=0;height=0}}else{width=this.imageObj.width;height=this.imageObj.height}this.width=width;this.height=height;this.growthIndicator=0;if(this.width>0&&this.height>0){this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor;this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor;this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor;this.growthIndicator=this.width-width}}};Node.prototype._drawImageAtPosition=function(ctx){if(this.imageObj.width!=0){if(this.clusterSize>1){var lineWidth=this.clusterSize>1?10:0;lineWidth*=this.networkScaleInv;lineWidth=Math.min(.2*this.width,lineWidth);ctx.globalAlpha=.5;ctx.drawImage(this.imageObj,this.left-lineWidth,this.top-lineWidth,this.width+2*lineWidth,this.height+2*lineWidth)}ctx.globalAlpha=1;ctx.drawImage(this.imageObj,this.left,this.top,this.width,this.height)}};Node.prototype._drawImageLabel=function(ctx){var yLabel;var offset=0;if(this.height){offset=this.height/2;var labelDimensions=this.getTextSize(ctx);if(labelDimensions.lineCount>=1){offset+=labelDimensions.height/2;offset+=3}}yLabel=this.y+offset;this._label(ctx,this.label,this.x,yLabel,undefined)};Node.prototype._drawImage=function(ctx){this._resizeImage(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;this._drawImageAtPosition(ctx);this.boundingBox.top=this.top;this.boundingBox.left=this.left;this.boundingBox.right=this.left+this.width;this.boundingBox.bottom=this.top+this.height;this._drawImageLabel(ctx);this.boundingBox.left=Math.min(this.boundingBox.left,this.labelDimensions.left);this.boundingBox.right=Math.max(this.boundingBox.right,this.labelDimensions.left+this.labelDimensions.width);this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelDimensions.height)};Node.prototype._resizeCircularImage=function(ctx){if(!this.imageObj.src||!this.imageObj.width||!this.imageObj.height){if(!this.width){var diameter=this.options.radius*2;this.width=diameter;this.height=diameter;this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*.5*this.clusterSizeRadiusFactor;this.growthIndicator=this.options.radius-.5*diameter;this._swapToImageResizeWhenImageLoaded=true}}else{if(this._swapToImageResizeWhenImageLoaded){this.width=0;this.height=0;delete this._swapToImageResizeWhenImageLoaded}this._resizeImage(ctx)}};Node.prototype._drawCircularImage=function(ctx){this._resizeCircularImage(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;var centerX=this.left+this.width/2;var centerY=this.top+this.height/2;var radius=Math.abs(this.height/2);this._drawRawCircle(ctx,centerX,centerY,radius);ctx.save();ctx.circle(this.x,this.y,radius);ctx.stroke();ctx.clip();this._drawImageAtPosition(ctx);ctx.restore();this.boundingBox.top=this.y-this.options.radius;this.boundingBox.left=this.x-this.options.radius;this.boundingBox.right=this.x+this.options.radius;this.boundingBox.bottom=this.y+this.options.radius;this._drawImageLabel(ctx);this.boundingBox.left=Math.min(this.boundingBox.left,this.labelDimensions.left);this.boundingBox.right=Math.max(this.boundingBox.right,this.labelDimensions.left+this.labelDimensions.width);this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelDimensions.height)};Node.prototype._resizeBox=function(ctx){if(!this.width){var margin=5;var textSize=this.getTextSize(ctx);this.width=textSize.width+2*margin;this.height=textSize.height+2*margin;this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*.5*this.clusterSizeWidthFactor;this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*.5*this.clusterSizeHeightFactor;this.growthIndicator=this.width-(textSize.width+2*margin)}};Node.prototype._drawBox=function(ctx){this._resizeBox(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;var clusterLineWidth=2.5;var borderWidth=this.options.borderWidth;var selectionLineWidth=this.options.borderWidthSelected||2*this.options.borderWidth;ctx.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border;if(this.clusterSize>1){ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.roundRect(this.left-2*ctx.lineWidth,this.top-2*ctx.lineWidth,this.width+4*ctx.lineWidth,this.height+4*ctx.lineWidth,this.options.radius);ctx.stroke()}ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background;ctx.roundRect(this.left,this.top,this.width,this.height,this.options.radius);ctx.fill();ctx.stroke();this.boundingBox.top=this.top;this.boundingBox.left=this.left;this.boundingBox.right=this.left+this.width;this.boundingBox.bottom=this.top+this.height;this._label(ctx,this.label,this.x,this.y)};Node.prototype._resizeDatabase=function(ctx){if(!this.width){var margin=5;var textSize=this.getTextSize(ctx);var size=textSize.width+2*margin;this.width=size;this.height=size;this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor;this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor;this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor;this.growthIndicator=this.width-size}};Node.prototype._drawDatabase=function(ctx){this._resizeDatabase(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;var clusterLineWidth=2.5;var borderWidth=this.options.borderWidth;var selectionLineWidth=this.options.borderWidthSelected||2*this.options.borderWidth;ctx.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border;if(this.clusterSize>1){ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.database(this.x-this.width/2-2*ctx.lineWidth,this.y-this.height*.5-2*ctx.lineWidth,this.width+4*ctx.lineWidth,this.height+4*ctx.lineWidth);ctx.stroke()}ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background;ctx.database(this.x-this.width/2,this.y-this.height*.5,this.width,this.height);ctx.fill();ctx.stroke();this.boundingBox.top=this.top;this.boundingBox.left=this.left;this.boundingBox.right=this.left+this.width;this.boundingBox.bottom=this.top+this.height;this._label(ctx,this.label,this.x,this.y)};Node.prototype._resizeCircle=function(ctx){if(!this.width){var margin=5;var textSize=this.getTextSize(ctx);var diameter=Math.max(textSize.width,textSize.height)+2*margin;this.options.radius=diameter/2;this.width=diameter;this.height=diameter;this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*.5*this.clusterSizeRadiusFactor;this.growthIndicator=this.options.radius-.5*diameter}};Node.prototype._drawRawCircle=function(ctx,x,y,radius){var clusterLineWidth=2.5;var borderWidth=this.options.borderWidth;var selectionLineWidth=this.options.borderWidthSelected||2*this.options.borderWidth;ctx.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border;if(this.clusterSize>1){ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.circle(x,y,radius+2*ctx.lineWidth);ctx.stroke()}ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background;ctx.circle(this.x,this.y,radius);ctx.fill();ctx.stroke()};Node.prototype._drawCircle=function(ctx){this._resizeCircle(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;this._drawRawCircle(ctx,this.x,this.y,this.options.radius);this.boundingBox.top=this.y-this.options.radius;this.boundingBox.left=this.x-this.options.radius;this.boundingBox.right=this.x+this.options.radius;this.boundingBox.bottom=this.y+this.options.radius;this._label(ctx,this.label,this.x,this.y)};Node.prototype._resizeEllipse=function(ctx){if(!this.width){var textSize=this.getTextSize(ctx);this.width=textSize.width*1.5;this.height=textSize.height*2;if(this.width<this.height){this.width=this.height}var defaultSize=this.width;this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor;this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor;this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor;this.growthIndicator=this.width-defaultSize}};Node.prototype._drawEllipse=function(ctx){this._resizeEllipse(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;var clusterLineWidth=2.5;var borderWidth=this.options.borderWidth;var selectionLineWidth=this.options.borderWidthSelected||2*this.options.borderWidth;ctx.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border;if(this.clusterSize>1){ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.ellipse(this.left-2*ctx.lineWidth,this.top-2*ctx.lineWidth,this.width+4*ctx.lineWidth,this.height+4*ctx.lineWidth);ctx.stroke()}ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background;ctx.ellipse(this.left,this.top,this.width,this.height);ctx.fill();ctx.stroke();this.boundingBox.top=this.top;this.boundingBox.left=this.left;this.boundingBox.right=this.left+this.width;this.boundingBox.bottom=this.top+this.height;this._label(ctx,this.label,this.x,this.y)};Node.prototype._drawDot=function(ctx){this._drawShape(ctx,\"circle\")};Node.prototype._drawTriangle=function(ctx){this._drawShape(ctx,\"triangle\")};Node.prototype._drawTriangleDown=function(ctx){this._drawShape(ctx,\"triangleDown\")};Node.prototype._drawSquare=function(ctx){this._drawShape(ctx,\"square\")};Node.prototype._drawStar=function(ctx){this._drawShape(ctx,\"star\")};Node.prototype._resizeShape=function(ctx){if(!this.width){this.options.radius=this.baseRadiusValue;var size=2*this.options.radius;this.width=size;this.height=size;this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor;this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor;this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*.5*this.clusterSizeRadiusFactor;this.growthIndicator=this.width-size}};Node.prototype._drawShape=function(ctx,shape){this._resizeShape(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;var clusterLineWidth=2.5;var borderWidth=this.options.borderWidth;var selectionLineWidth=this.options.borderWidthSelected||2*this.options.borderWidth;var radiusMultiplier=2;switch(shape){case\"dot\":radiusMultiplier=2;break;case\"square\":radiusMultiplier=2;break;case\"triangle\":radiusMultiplier=3;break;case\"triangleDown\":radiusMultiplier=3;break;case\"star\":radiusMultiplier=4;break}ctx.strokeStyle=this.selected?this.options.color.highlight.border:this.hover?this.options.color.hover.border:this.options.color.border;if(this.clusterSize>1){ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx[shape](this.x,this.y,this.options.radius+radiusMultiplier*ctx.lineWidth);ctx.stroke()}ctx.lineWidth=(this.selected?selectionLineWidth:borderWidth)+(this.clusterSize>1?clusterLineWidth:0);ctx.lineWidth*=this.networkScaleInv;ctx.lineWidth=Math.min(this.width,ctx.lineWidth);ctx.fillStyle=this.selected?this.options.color.highlight.background:this.hover?this.options.color.hover.background:this.options.color.background;ctx[shape](this.x,this.y,this.options.radius);ctx.fill();ctx.stroke();this.boundingBox.top=this.y-this.options.radius;this.boundingBox.left=this.x-this.options.radius;this.boundingBox.right=this.x+this.options.radius;this.boundingBox.bottom=this.y+this.options.radius;if(this.label){this._label(ctx,this.label,this.x,this.y+this.height/2,undefined,\"hanging\",true);this.boundingBox.left=Math.min(this.boundingBox.left,this.labelDimensions.left);this.boundingBox.right=Math.max(this.boundingBox.right,this.labelDimensions.left+this.labelDimensions.width);this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelDimensions.height)}};Node.prototype._resizeText=function(ctx){if(!this.width){var margin=5;var textSize=this.getTextSize(ctx);this.width=textSize.width+2*margin;this.height=textSize.height+2*margin;this.width+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeWidthFactor;this.height+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeHeightFactor;this.options.radius+=Math.min(this.clusterSize-1,this.maxNodeSizeIncrements)*this.clusterSizeRadiusFactor;this.growthIndicator=this.width-(textSize.width+2*margin)}};Node.prototype._drawText=function(ctx){this._resizeText(ctx);this.left=this.x-this.width/2;this.top=this.y-this.height/2;this._label(ctx,this.label,this.x,this.y);this.boundingBox.top=this.top;this.boundingBox.left=this.left;this.boundingBox.right=this.left+this.width;this.boundingBox.bottom=this.top+this.height};Node.prototype._label=function(ctx,text,x,y,align,baseline,labelUnderNode){var relativeFontSize=Number(this.options.fontSize)*this.networkScale;if(text&&relativeFontSize>=this.options.fontDrawThreshold-1){var fontSize=Number(this.options.fontSize);if(relativeFontSize>=this.options.fontSizeMaxVisible){fontSize=Number(this.options.fontSizeMaxVisible)*this.networkScaleInv}var fontColor=this.options.fontColor||\"#000000\";var strokecolor=this.options.fontStrokeColor;if(relativeFontSize<=this.options.fontDrawThreshold){var opacity=Math.max(0,Math.min(1,1-(this.options.fontDrawThreshold-relativeFontSize)));fontColor=util.overrideOpacity(fontColor,opacity);strokecolor=util.overrideOpacity(strokecolor,opacity)}ctx.font=(this.selected?\"bold \":\"\")+fontSize+\"px \"+this.options.fontFace;var lines=text.split(\"\\n\");var lineCount=lines.length;var yLine=y+(1-lineCount)/2*fontSize;if(labelUnderNode==true){yLine=y+(1-lineCount)/(2*fontSize)}var width=ctx.measureText(lines[0]).width;for(var i=1;i<lineCount;i++){var lineWidth=ctx.measureText(lines[i]).width;width=lineWidth>width?lineWidth:width}var height=fontSize*lineCount;var left=x-width/2;var top=y-height/2;if(baseline==\"hanging\"){top+=.5*fontSize;top+=4;yLine+=4}this.labelDimensions={top:top,left:left,width:width,height:height,yLine:yLine};if(this.options.fontFill!==undefined&&this.options.fontFill!==null&&this.options.fontFill!==\"none\"){ctx.fillStyle=this.options.fontFill;ctx.fillRect(left,top,width,height)}ctx.fillStyle=fontColor;ctx.textAlign=align||\"center\";ctx.textBaseline=baseline||\"middle\";if(this.options.fontStrokeWidth>0){ctx.lineWidth=this.options.fontStrokeWidth;ctx.strokeStyle=strokecolor;ctx.lineJoin=\"round\"}for(var i=0;i<lineCount;i++){if(this.options.fontStrokeWidth){ctx.strokeText(lines[i],x,yLine)}ctx.fillText(lines[i],x,yLine);yLine+=fontSize}}};Node.prototype.getTextSize=function(ctx){if(this.label!==undefined){var fontSize=Number(this.options.fontSize);if(fontSize*this.networkScale>this.options.fontSizeMaxVisible){fontSize=Number(this.options.fontSizeMaxVisible)*this.networkScaleInv}ctx.font=(this.selected?\"bold \":\"\")+fontSize+\"px \"+this.options.fontFace;var lines=this.label.split(\"\\n\"),height=(fontSize+4)*lines.length,width=0;for(var i=0,iMax=lines.length;i<iMax;i++){width=Math.max(width,ctx.measureText(lines[i]).width)}return{width:width,height:height,lineCount:lines.length}}else{return{width:0,height:0,lineCount:0}\n}};Node.prototype.inArea=function(){if(this.width!==undefined){return this.x+this.width*this.networkScaleInv>=this.canvasTopLeft.x&&this.x-this.width*this.networkScaleInv<this.canvasBottomRight.x&&this.y+this.height*this.networkScaleInv>=this.canvasTopLeft.y&&this.y-this.height*this.networkScaleInv<this.canvasBottomRight.y}else{return true}};Node.prototype.inView=function(){return this.x>=this.canvasTopLeft.x&&this.x<this.canvasBottomRight.x&&this.y>=this.canvasTopLeft.y&&this.y<this.canvasBottomRight.y};Node.prototype.setScaleAndPos=function(scale,canvasTopLeft,canvasBottomRight){this.networkScaleInv=1/scale;this.networkScale=scale;this.canvasTopLeft=canvasTopLeft;this.canvasBottomRight=canvasBottomRight};Node.prototype.setScale=function(scale){this.networkScaleInv=1/scale;this.networkScale=scale};Node.prototype.clearVelocity=function(){this.vx=0;this.vy=0};Node.prototype.updateVelocity=function(massBeforeClustering){var energyBefore=this.vx*this.vx*massBeforeClustering;this.vx=Math.sqrt(energyBefore/this.options.mass);energyBefore=this.vy*this.vy*massBeforeClustering;this.vy=Math.sqrt(energyBefore/this.options.mass)};module.exports=Node},function(module,exports,__webpack_require__){function Popup(container,x,y,text,style){if(container){this.container=container}else{this.container=document.body}if(style===undefined){if(typeof x===\"object\"){style=x;x=undefined}else if(typeof text===\"object\"){style=text;text=undefined}else{style={fontColor:\"black\",fontSize:14,fontFace:\"verdana\",color:{border:\"#666\",background:\"#FFFFC6\"}}}}this.x=0;this.y=0;this.padding=5;if(x!==undefined&&y!==undefined){this.setPosition(x,y)}if(text!==undefined){this.setText(text)}this.frame=document.createElement(\"div\");this.frame.className=\"network-tooltip\";this.frame.style.color=style.fontColor;this.frame.style.backgroundColor=style.color.background;this.frame.style.borderColor=style.color.border;this.frame.style.fontSize=style.fontSize+\"px\";this.frame.style.fontFamily=style.fontFace;this.container.appendChild(this.frame)}Popup.prototype.setPosition=function(x,y){this.x=parseInt(x);this.y=parseInt(y)};Popup.prototype.setText=function(content){if(content instanceof Element){this.frame.innerHTML=\"\";this.frame.appendChild(content)}else{this.frame.innerHTML=content}};Popup.prototype.show=function(show){if(show===undefined){show=true}if(show){var height=this.frame.clientHeight;var width=this.frame.clientWidth;var maxHeight=this.frame.parentNode.clientHeight;var maxWidth=this.frame.parentNode.clientWidth;var top=this.y-height;if(top+height+this.padding>maxHeight){top=maxHeight-height-this.padding}if(top<this.padding){top=this.padding}var left=this.x;if(left+width+this.padding>maxWidth){left=maxWidth-width-this.padding}if(left<this.padding){left=this.padding}this.frame.style.left=left+\"px\";this.frame.style.top=top+\"px\";this.frame.style.visibility=\"visible\"}else{this.hide()}};Popup.prototype.hide=function(){this.frame.style.visibility=\"hidden\"};module.exports=Popup},function(module,exports,__webpack_require__){function parseDOT(data){dot=data;return parseGraph()}var TOKENTYPE={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3};var DELIMITERS={\"{\":true,\"}\":true,\"[\":true,\"]\":true,\";\":true,\"=\":true,\",\":true,\"->\":true,\"--\":true};var dot=\"\";var index=0;var c=\"\";var token=\"\";var tokenType=TOKENTYPE.NULL;function first(){index=0;c=dot.charAt(0)}function next(){index++;c=dot.charAt(index)}function nextPreview(){return dot.charAt(index+1)}var regexAlphaNumeric=/[a-zA-Z_0-9.:#]/;function isAlphaNumeric(c){return regexAlphaNumeric.test(c)}function merge(a,b){if(!a){a={}}if(b){for(var name in b){if(b.hasOwnProperty(name)){a[name]=b[name]}}}return a}function setValue(obj,path,value){var keys=path.split(\".\");var o=obj;while(keys.length){var key=keys.shift();if(keys.length){if(!o[key]){o[key]={}}o=o[key]}else{o[key]=value}}}function addNode(graph,node){var i,len;var current=null;var graphs=[graph];var root=graph;while(root.parent){graphs.push(root.parent);root=root.parent}if(root.nodes){for(i=0,len=root.nodes.length;i<len;i++){if(node.id===root.nodes[i].id){current=root.nodes[i];break}}}if(!current){current={id:node.id};if(graph.node){current.attr=merge(current.attr,graph.node)}}for(i=graphs.length-1;i>=0;i--){var g=graphs[i];if(!g.nodes){g.nodes=[]}if(g.nodes.indexOf(current)==-1){g.nodes.push(current)}}if(node.attr){current.attr=merge(current.attr,node.attr)}}function addEdge(graph,edge){if(!graph.edges){graph.edges=[]}graph.edges.push(edge);if(graph.edge){var attr=merge({},graph.edge);edge.attr=merge(attr,edge.attr)}}function createEdge(graph,from,to,type,attr){var edge={from:from,to:to,type:type};if(graph.edge){edge.attr=merge({},graph.edge)}edge.attr=merge(edge.attr||{},attr);return edge}function getToken(){tokenType=TOKENTYPE.NULL;token=\"\";while(c==\" \"||c==\"\t\"||c==\"\\n\"||c==\"\\r\"){next()}do{var isComment=false;if(c==\"#\"){var i=index-1;while(dot.charAt(i)==\" \"||dot.charAt(i)==\"\t\"){i--}if(dot.charAt(i)==\"\\n\"||dot.charAt(i)==\"\"){while(c!=\"\"&&c!=\"\\n\"){next()}isComment=true}}if(c==\"/\"&&nextPreview()==\"/\"){while(c!=\"\"&&c!=\"\\n\"){next()}isComment=true}if(c==\"/\"&&nextPreview()==\"*\"){while(c!=\"\"){if(c==\"*\"&&nextPreview()==\"/\"){next();next();break}else{next()}}isComment=true}while(c==\" \"||c==\"\t\"||c==\"\\n\"||c==\"\\r\"){next()}}while(isComment);if(c==\"\"){tokenType=TOKENTYPE.DELIMITER;return}var c2=c+nextPreview();if(DELIMITERS[c2]){tokenType=TOKENTYPE.DELIMITER;token=c2;next();next();return}if(DELIMITERS[c]){tokenType=TOKENTYPE.DELIMITER;token=c;next();return}if(isAlphaNumeric(c)||c==\"-\"){token+=c;next();while(isAlphaNumeric(c)){token+=c;next()}if(token==\"false\"){token=false}else if(token==\"true\"){token=true}else if(!isNaN(Number(token))){token=Number(token)}tokenType=TOKENTYPE.IDENTIFIER;return}if(c=='\"'){next();while(c!=\"\"&&(c!='\"'||c=='\"'&&nextPreview()=='\"')){token+=c;if(c=='\"'){next()}next()}if(c!='\"'){throw newSyntaxError('End of string \" expected')}next();tokenType=TOKENTYPE.IDENTIFIER;return}tokenType=TOKENTYPE.UNKNOWN;while(c!=\"\"){token+=c;next()}throw new SyntaxError('Syntax error in part \"'+chop(token,30)+'\"')}function parseGraph(){var graph={};first();getToken();if(token==\"strict\"){graph.strict=true;getToken()}if(token==\"graph\"||token==\"digraph\"){graph.type=token;getToken()}if(tokenType==TOKENTYPE.IDENTIFIER){graph.id=token;getToken()}if(token!=\"{\"){throw newSyntaxError(\"Angle bracket { expected\")}getToken();parseStatements(graph);if(token!=\"}\"){throw newSyntaxError(\"Angle bracket } expected\")}getToken();if(token!==\"\"){throw newSyntaxError(\"End of file expected\")}getToken();delete graph.node;delete graph.edge;delete graph.graph;return graph}function parseStatements(graph){while(token!==\"\"&&token!=\"}\"){parseStatement(graph);if(token==\";\"){getToken()}}}function parseStatement(graph){var subgraph=parseSubgraph(graph);if(subgraph){parseEdge(graph,subgraph);return}var attr=parseAttributeStatement(graph);if(attr){return}if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Identifier expected\")}var id=token;getToken();if(token==\"=\"){getToken();if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Identifier expected\")}graph[id]=token;getToken()}else{parseNodeStatement(graph,id)}}function parseSubgraph(graph){var subgraph=null;if(token==\"subgraph\"){subgraph={};subgraph.type=\"subgraph\";getToken();if(tokenType==TOKENTYPE.IDENTIFIER){subgraph.id=token;getToken()}}if(token==\"{\"){getToken();if(!subgraph){subgraph={}}subgraph.parent=graph;subgraph.node=graph.node;subgraph.edge=graph.edge;subgraph.graph=graph.graph;parseStatements(subgraph);if(token!=\"}\"){throw newSyntaxError(\"Angle bracket } expected\")}getToken();delete subgraph.node;delete subgraph.edge;delete subgraph.graph;delete subgraph.parent;if(!graph.subgraphs){graph.subgraphs=[]}graph.subgraphs.push(subgraph)}return subgraph}function parseAttributeStatement(graph){if(token==\"node\"){getToken();graph.node=parseAttributeList();return\"node\"}else if(token==\"edge\"){getToken();graph.edge=parseAttributeList();return\"edge\"}else if(token==\"graph\"){getToken();graph.graph=parseAttributeList();return\"graph\"}return null}function parseNodeStatement(graph,id){var node={id:id};var attr=parseAttributeList();if(attr){node.attr=attr}addNode(graph,node);parseEdge(graph,id)}function parseEdge(graph,from){while(token==\"->\"||token==\"--\"){var to;var type=token;getToken();var subgraph=parseSubgraph(graph);if(subgraph){to=subgraph}else{if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Identifier or subgraph expected\")}to=token;addNode(graph,{id:to});getToken()}var attr=parseAttributeList();var edge=createEdge(graph,from,to,type,attr);addEdge(graph,edge);from=to}}function parseAttributeList(){var attr=null;while(token==\"[\"){getToken();attr={};while(token!==\"\"&&token!=\"]\"){if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Attribute name expected\")}var name=token;getToken();if(token!=\"=\"){throw newSyntaxError(\"Equal sign = expected\")}getToken();if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Attribute value expected\")}var value=token;setValue(attr,name,value);getToken();if(token==\",\"){getToken()}}if(token!=\"]\"){throw newSyntaxError(\"Bracket ] expected\")}getToken()}return attr}function newSyntaxError(message){return new SyntaxError(message+', got \"'+chop(token,30)+'\" (char '+index+\")\")}function chop(text,maxLength){return text.length<=maxLength?text:text.substr(0,27)+\"...\"}function forEach2(array1,array2,fn){if(Array.isArray(array1)){array1.forEach(function(elem1){if(Array.isArray(array2)){array2.forEach(function(elem2){fn(elem1,elem2)})}else{fn(elem1,array2)}})}else{if(Array.isArray(array2)){array2.forEach(function(elem2){fn(array1,elem2)})}else{fn(array1,array2)}}}function DOTToGraph(data){var dotData=parseDOT(data);var graphData={nodes:[],edges:[],options:{}};if(dotData.nodes){dotData.nodes.forEach(function(dotNode){var graphNode={id:dotNode.id,label:String(dotNode.label||dotNode.id)};merge(graphNode,dotNode.attr);if(graphNode.image){graphNode.shape=\"image\"}graphData.nodes.push(graphNode)})}if(dotData.edges){var convertEdge=function(dotEdge){var graphEdge={from:dotEdge.from,to:dotEdge.to};merge(graphEdge,dotEdge.attr);graphEdge.style=dotEdge.type==\"->\"?\"arrow\":\"line\";return graphEdge};dotData.edges.forEach(function(dotEdge){var from,to;if(dotEdge.from instanceof Object){from=dotEdge.from.nodes}else{from={id:dotEdge.from}}if(dotEdge.to instanceof Object){to=dotEdge.to.nodes}else{to={id:dotEdge.to}}if(dotEdge.from instanceof Object&&dotEdge.from.edges){dotEdge.from.edges.forEach(function(subEdge){var graphEdge=convertEdge(subEdge);graphData.edges.push(graphEdge)})}forEach2(from,to,function(from,to){var subEdge=createEdge(graphData,from.id,to.id,dotEdge.type,dotEdge.attr);var graphEdge=convertEdge(subEdge);graphData.edges.push(graphEdge)});if(dotEdge.to instanceof Object&&dotEdge.to.edges){dotEdge.to.edges.forEach(function(subEdge){var graphEdge=convertEdge(subEdge);graphData.edges.push(graphEdge)})}})}if(dotData.attr){graphData.options=dotData.attr}return graphData}exports.parseDOT=parseDOT;exports.DOTToGraph=DOTToGraph},function(module,exports,__webpack_require__){function parseGephi(gephiJSON,options){var edges=[];var nodes=[];this.options={edges:{inheritColor:true},nodes:{allowedToMove:false,parseColor:false}};if(options!==undefined){this.options.nodes[\"allowedToMove\"]=options.allowedToMove|false;this.options.nodes[\"parseColor\"]=options.parseColor|false;this.options.edges[\"inheritColor\"]=options.inheritColor|true}var gEdges=gephiJSON.edges;var gNodes=gephiJSON.nodes;for(var i=0;i<gEdges.length;i++){var edge={};var gEdge=gEdges[i];edge[\"id\"]=gEdge.id;edge[\"from\"]=gEdge.source;edge[\"to\"]=gEdge.target;edge[\"attributes\"]=gEdge.attributes;edge[\"color\"]=gEdge.color;edge[\"inheritColor\"]=edge[\"color\"]!==undefined?false:this.options.inheritColor;edges.push(edge)}for(var i=0;i<gNodes.length;i++){var node={};var gNode=gNodes[i];node[\"id\"]=gNode.id;node[\"attributes\"]=gNode.attributes;node[\"x\"]=gNode.x;node[\"y\"]=gNode.y;node[\"label\"]=gNode.label;if(this.options.nodes.parseColor==true){node[\"color\"]=gNode.color}else{node[\"color\"]=gNode.color!==undefined?{background:gNode.color,border:gNode.color}:undefined}node[\"radius\"]=gNode.size;node[\"allowedToMoveX\"]=this.options.nodes.allowedToMove;node[\"allowedToMoveY\"]=this.options.nodes.allowedToMove;nodes.push(node)}return{nodes:nodes,edges:edges}}exports.parseGephi=parseGephi},function(module,exports,__webpack_require__){module.exports=typeof window!==\"undefined\"&&window[\"moment\"]||__webpack_require__(58)},function(module,exports,__webpack_require__){if(typeof window!==\"undefined\"){module.exports=window[\"Hammer\"]||__webpack_require__(57)}else{module.exports=function(){throw Error(\"hammer.js is only available in a browser, not in node.js.\")}}},function(module,exports,__webpack_require__){var Emitter=__webpack_require__(56);var Hammer=__webpack_require__(45);var util=__webpack_require__(1);var DataSet=__webpack_require__(3);var DataView=__webpack_require__(4);var Range=__webpack_require__(17);var ItemSet=__webpack_require__(32);var Activator=__webpack_require__(53);var DateUtil=__webpack_require__(15);function Core(){}Emitter(Core.prototype);Core.prototype._create=function(container){this.dom={};this.dom.root=document.createElement(\"div\");this.dom.background=document.createElement(\"div\");this.dom.backgroundVertical=document.createElement(\"div\");this.dom.backgroundHorizontal=document.createElement(\"div\");this.dom.centerContainer=document.createElement(\"div\");this.dom.leftContainer=document.createElement(\"div\");this.dom.rightContainer=document.createElement(\"div\");this.dom.center=document.createElement(\"div\");this.dom.left=document.createElement(\"div\");this.dom.right=document.createElement(\"div\");this.dom.top=document.createElement(\"div\");this.dom.bottom=document.createElement(\"div\");this.dom.shadowTop=document.createElement(\"div\");this.dom.shadowBottom=document.createElement(\"div\");this.dom.shadowTopLeft=document.createElement(\"div\");this.dom.shadowBottomLeft=document.createElement(\"div\");this.dom.shadowTopRight=document.createElement(\"div\");this.dom.shadowBottomRight=document.createElement(\"div\");this.dom.root.className=\"vis timeline root\";this.dom.background.className=\"vispanel background\";this.dom.backgroundVertical.className=\"vispanel background vertical\";this.dom.backgroundHorizontal.className=\"vispanel background horizontal\";this.dom.centerContainer.className=\"vispanel center\";this.dom.leftContainer.className=\"vispanel left\";this.dom.rightContainer.className=\"vispanel right\";this.dom.top.className=\"vispanel top\";this.dom.bottom.className=\"vispanel bottom\";this.dom.left.className=\"content\";this.dom.center.className=\"content\";this.dom.right.className=\"content\";this.dom.shadowTop.className=\"shadow top\";this.dom.shadowBottom.className=\"shadow bottom\";this.dom.shadowTopLeft.className=\"shadow top\";this.dom.shadowBottomLeft.className=\"shadow bottom\";this.dom.shadowTopRight.className=\"shadow top\";this.dom.shadowBottomRight.className=\"shadow bottom\";this.dom.root.appendChild(this.dom.background);this.dom.root.appendChild(this.dom.backgroundVertical);this.dom.root.appendChild(this.dom.backgroundHorizontal);this.dom.root.appendChild(this.dom.centerContainer);this.dom.root.appendChild(this.dom.leftContainer);this.dom.root.appendChild(this.dom.rightContainer);this.dom.root.appendChild(this.dom.top);this.dom.root.appendChild(this.dom.bottom);this.dom.centerContainer.appendChild(this.dom.center);this.dom.leftContainer.appendChild(this.dom.left);this.dom.rightContainer.appendChild(this.dom.right);this.dom.centerContainer.appendChild(this.dom.shadowTop);this.dom.centerContainer.appendChild(this.dom.shadowBottom);this.dom.leftContainer.appendChild(this.dom.shadowTopLeft);this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft);this.dom.rightContainer.appendChild(this.dom.shadowTopRight);this.dom.rightContainer.appendChild(this.dom.shadowBottomRight);this.on(\"rangechange\",this._redraw.bind(this));this.on(\"touch\",this._onTouch.bind(this));this.on(\"pinch\",this._onPinch.bind(this));this.on(\"dragstart\",this._onDragStart.bind(this));this.on(\"drag\",this._onDrag.bind(this));var me=this;this.on(\"change\",function(properties){if(properties&&properties.queue==true){if(!me._redrawTimer){me._redrawTimer=setTimeout(function(){me._redrawTimer=null;me._redraw()},0)}}else{me._redraw()}});this.hammer=Hammer(this.dom.root,{preventDefault:true});this.listeners={};var events=[\"touch\",\"pinch\",\"tap\",\"doubletap\",\"hold\",\"dragstart\",\"drag\",\"dragend\",\"mousewheel\",\"DOMMouseScroll\"];events.forEach(function(event){var listener=function(){var args=[event].concat(Array.prototype.slice.call(arguments,0));if(me.isActive()){me.emit.apply(me,args)}};me.hammer.on(event,listener);me.listeners[event]=listener});this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0};this.touch={};this.redrawCount=0;if(!container)throw new Error(\"No container provided\");container.appendChild(this.dom.root)};Core.prototype.setOptions=function(options){if(options){var fields=[\"width\",\"height\",\"minHeight\",\"maxHeight\",\"autoResize\",\"start\",\"end\",\"orientation\",\"clickToUse\",\"dataAttributes\",\"hiddenDates\"];util.selectiveExtend(fields,this.options,options);if(\"hiddenDates\"in this.options){DateUtil.convertHiddenOptions(this.body,this.options.hiddenDates)}if(\"clickToUse\"in options){if(options.clickToUse){if(!this.activator){this.activator=new Activator(this.dom.root)}}else{if(this.activator){this.activator.destroy();delete this.activator}}}this._initAutoResize()}this.components.forEach(function(component){component.setOptions(options)});if(options&&options.order){throw new Error(\"Option order is deprecated. There is no replacement for this feature.\")}this._redraw()};Core.prototype.isActive=function(){return!this.activator||this.activator.active};Core.prototype.destroy=function(){this.clear();this.off();this._stopAutoResize();if(this.dom.root.parentNode){this.dom.root.parentNode.removeChild(this.dom.root)}this.dom=null;if(this.activator){this.activator.destroy();delete this.activator}for(var event in this.listeners){if(this.listeners.hasOwnProperty(event)){delete this.listeners[event]}}this.listeners=null;this.hammer=null;this.components.forEach(function(component){component.destroy()});this.body=null};Core.prototype.setCustomTime=function(time){if(!this.customTime){throw new Error(\"Cannot get custom time: Custom time bar is not enabled\")}this.customTime.setCustomTime(time)};Core.prototype.getCustomTime=function(){if(!this.customTime){throw new Error(\"Cannot get custom time: Custom time bar is not enabled\")}return this.customTime.getCustomTime()};Core.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]};Core.prototype.clear=function(what){if(!what||what.items){this.setItems(null)}if(!what||what.groups){this.setGroups(null)}if(!what||what.options){this.components.forEach(function(component){component.setOptions(component.defaultOptions)});this.setOptions(this.defaultOptions)}};Core.prototype.fit=function(options){var range=this._getDataRange();if(range.start===null&&range.end===null){return}var animate=options&&options.animate!==undefined?options.animate:true;this.range.setRange(range.start,range.end,animate)};Core.prototype._getDataRange=function(){var dataRange=this.getItemRange();var start=dataRange.min;var end=dataRange.max;if(start!=null&&end!=null){var interval=end.valueOf()-start.valueOf();if(interval<=0){interval=24*60*60*1e3}start=new Date(start.valueOf()-interval*.05);end=new Date(end.valueOf()+interval*.05)}return{start:start,end:end}};Core.prototype.setWindow=function(start,end,options){var animate;if(arguments.length==1){var range=arguments[0];animate=range.animate!==undefined?range.animate:true;this.range.setRange(range.start,range.end,animate)}else{animate=options&&options.animate!==undefined?options.animate:true;this.range.setRange(start,end,animate)}};Core.prototype.moveTo=function(time,options){var interval=this.range.end-this.range.start;var t=util.convert(time,\"Date\").valueOf();var start=t-interval/2;var end=t+interval/2;var animate=options&&options.animate!==undefined?options.animate:true;this.range.setRange(start,end,animate)};Core.prototype.getWindow=function(){var range=this.range.getRange();return{start:new Date(range.start),end:new Date(range.end)}};Core.prototype.redraw=function(){this._redraw()};Core.prototype._redraw=function(){var resized=false;var options=this.options;var props=this.props;var dom=this.dom;if(!dom)return;DateUtil.updateHiddenDates(this.body,this.options.hiddenDates);if(options.orientation==\"top\"){util.addClassName(dom.root,\"top\");util.removeClassName(dom.root,\"bottom\")}else{util.removeClassName(dom.root,\"top\");util.addClassName(dom.root,\"bottom\")}dom.root.style.maxHeight=util.option.asSize(options.maxHeight,\"\");dom.root.style.minHeight=util.option.asSize(options.minHeight,\"\");dom.root.style.width=util.option.asSize(options.width,\"\");props.border.left=(dom.centerContainer.offsetWidth-dom.centerContainer.clientWidth)/2;props.border.right=props.border.left;props.border.top=(dom.centerContainer.offsetHeight-dom.centerContainer.clientHeight)/2;props.border.bottom=props.border.top;var borderRootHeight=dom.root.offsetHeight-dom.root.clientHeight;var borderRootWidth=dom.root.offsetWidth-dom.root.clientWidth;if(dom.centerContainer.clientHeight===0){props.border.left=props.border.top;props.border.right=props.border.left}if(dom.root.clientHeight===0){borderRootWidth=borderRootHeight}props.center.height=dom.center.offsetHeight;props.left.height=dom.left.offsetHeight;props.right.height=dom.right.offsetHeight;props.top.height=dom.top.clientHeight||-props.border.top;props.bottom.height=dom.bottom.clientHeight||-props.border.bottom;var contentHeight=Math.max(props.left.height,props.center.height,props.right.height);var autoHeight=props.top.height+contentHeight+props.bottom.height+borderRootHeight+props.border.top+props.border.bottom;dom.root.style.height=util.option.asSize(options.height,autoHeight+\"px\");props.root.height=dom.root.offsetHeight;props.background.height=props.root.height-borderRootHeight;var containerHeight=props.root.height-props.top.height-props.bottom.height-borderRootHeight;props.centerContainer.height=containerHeight;props.leftContainer.height=containerHeight;props.rightContainer.height=props.leftContainer.height;props.root.width=dom.root.offsetWidth;props.background.width=props.root.width-borderRootWidth;props.left.width=dom.leftContainer.clientWidth||-props.border.left;props.leftContainer.width=props.left.width;props.right.width=dom.rightContainer.clientWidth||-props.border.right;props.rightContainer.width=props.right.width;var centerWidth=props.root.width-props.left.width-props.right.width-borderRootWidth;props.center.width=centerWidth;props.centerContainer.width=centerWidth;props.top.width=centerWidth;props.bottom.width=centerWidth;dom.background.style.height=props.background.height+\"px\";dom.backgroundVertical.style.height=props.background.height+\"px\";dom.backgroundHorizontal.style.height=props.centerContainer.height+\"px\";dom.centerContainer.style.height=props.centerContainer.height+\"px\";dom.leftContainer.style.height=props.leftContainer.height+\"px\";dom.rightContainer.style.height=props.rightContainer.height+\"px\";dom.background.style.width=props.background.width+\"px\";dom.backgroundVertical.style.width=props.centerContainer.width+\"px\";dom.backgroundHorizontal.style.width=props.background.width+\"px\";dom.centerContainer.style.width=props.center.width+\"px\";dom.top.style.width=props.top.width+\"px\";dom.bottom.style.width=props.bottom.width+\"px\";dom.background.style.left=\"0\";dom.background.style.top=\"0\";dom.backgroundVertical.style.left=props.left.width+props.border.left+\"px\";dom.backgroundVertical.style.top=\"0\";dom.backgroundHorizontal.style.left=\"0\";dom.backgroundHorizontal.style.top=props.top.height+\"px\";dom.centerContainer.style.left=props.left.width+\"px\";dom.centerContainer.style.top=props.top.height+\"px\";dom.leftContainer.style.left=\"0\";dom.leftContainer.style.top=props.top.height+\"px\";dom.rightContainer.style.left=props.left.width+props.center.width+\"px\";dom.rightContainer.style.top=props.top.height+\"px\";dom.top.style.left=props.left.width+\"px\";dom.top.style.top=\"0\";dom.bottom.style.left=props.left.width+\"px\";dom.bottom.style.top=props.top.height+props.centerContainer.height+\"px\";this._updateScrollTop();var offset=this.props.scrollTop;if(options.orientation==\"bottom\"){offset+=Math.max(this.props.centerContainer.height-this.props.center.height-this.props.border.top-this.props.border.bottom,0)}dom.center.style.left=\"0\";dom.center.style.top=offset+\"px\";dom.left.style.left=\"0\";dom.left.style.top=offset+\"px\";dom.right.style.left=\"0\";dom.right.style.top=offset+\"px\";var visibilityTop=this.props.scrollTop==0?\"hidden\":\"\";var visibilityBottom=this.props.scrollTop==this.props.scrollTopMin?\"hidden\":\"\";dom.shadowTop.style.visibility=visibilityTop;dom.shadowBottom.style.visibility=visibilityBottom;dom.shadowTopLeft.style.visibility=visibilityTop;dom.shadowBottomLeft.style.visibility=visibilityBottom;dom.shadowTopRight.style.visibility=visibilityTop;dom.shadowBottomRight.style.visibility=visibilityBottom;this.components.forEach(function(component){resized=component.redraw()||resized});if(resized){var MAX_REDRAWS=3;if(this.redrawCount<MAX_REDRAWS){this.redrawCount++;this._redraw()}else{console.log(\"WARNING: infinite loop in redraw?\")}this.redrawCount=0}this.emit(\"finishedRedraw\")};Core.prototype.repaint=function(){throw new Error(\"Function repaint is deprecated. Use redraw instead.\")};Core.prototype.setCurrentTime=function(time){if(!this.currentTime){throw new Error(\"Option showCurrentTime must be true\")}this.currentTime.setCurrentTime(time)};Core.prototype.getCurrentTime=function(){if(!this.currentTime){throw new Error(\"Option showCurrentTime must be true\")}return this.currentTime.getCurrentTime()};Core.prototype._toTime=function(x){return DateUtil.toTime(this,x,this.props.center.width)};Core.prototype._toGlobalTime=function(x){return DateUtil.toTime(this,x,this.props.root.width)};Core.prototype._toScreen=function(time){return DateUtil.toScreen(this,time,this.props.center.width)};Core.prototype._toGlobalScreen=function(time){return DateUtil.toScreen(this,time,this.props.root.width)};Core.prototype._initAutoResize=function(){if(this.options.autoResize==true){this._startAutoResize()}else{this._stopAutoResize()}};Core.prototype._startAutoResize=function(){var me=this;this._stopAutoResize();this._onResize=function(){if(me.options.autoResize!=true){me._stopAutoResize();return}if(me.dom.root){if(me.dom.root.offsetWidth!=me.props.lastWidth||me.dom.root.offsetHeight!=me.props.lastHeight){me.props.lastWidth=me.dom.root.offsetWidth;me.props.lastHeight=me.dom.root.offsetHeight;me.emit(\"change\")}}};util.addEventListener(window,\"resize\",this._onResize);this.watchTimer=setInterval(this._onResize,1e3)};Core.prototype._stopAutoResize=function(){if(this.watchTimer){clearInterval(this.watchTimer);this.watchTimer=undefined}util.removeEventListener(window,\"resize\",this._onResize);this._onResize=null};Core.prototype._onTouch=function(event){this.touch.allowDragging=true};Core.prototype._onPinch=function(event){this.touch.allowDragging=false};Core.prototype._onDragStart=function(event){this.touch.initialScrollTop=this.props.scrollTop};Core.prototype._onDrag=function(event){if(!this.touch.allowDragging)return;var delta=event.gesture.deltaY;var oldScrollTop=this._getScrollTop();var newScrollTop=this._setScrollTop(this.touch.initialScrollTop+delta);if(newScrollTop!=oldScrollTop){this._redraw();this.emit(\"verticalDrag\")}};Core.prototype._setScrollTop=function(scrollTop){this.props.scrollTop=scrollTop;this._updateScrollTop();return this.props.scrollTop};Core.prototype._updateScrollTop=function(){var scrollTopMin=Math.min(this.props.centerContainer.height-this.props.center.height,0);if(scrollTopMin!=this.props.scrollTopMin){if(this.options.orientation==\"bottom\"){this.props.scrollTop+=scrollTopMin-this.props.scrollTopMin}this.props.scrollTopMin=scrollTopMin}if(this.props.scrollTop>0)this.props.scrollTop=0;if(this.props.scrollTop<scrollTopMin)this.props.scrollTop=scrollTopMin;return this.props.scrollTop};Core.prototype._getScrollTop=function(){return this.props.scrollTop};module.exports=Core},function(module,exports,__webpack_require__){var Hammer=__webpack_require__(45);exports.fakeGesture=function(element,event){var eventType=null;var touches=Hammer.event.getTouchList(event,eventType);var gesture=Hammer.event.collectEventData(this,eventType,touches,event);if(isNaN(gesture.center.pageX)){gesture.center.pageX=event.pageX}if(isNaN(gesture.center.pageY)){gesture.center.pageY=event.pageY}return gesture}},function(module,exports,__webpack_require__){exports[\"en\"]={current:\"current\",time:\"time\"};exports[\"en_EN\"]=exports[\"en\"];exports[\"en_US\"]=exports[\"en\"];exports[\"nl\"]={custom:\"aangepaste\",time:\"tijd\"};exports[\"nl_NL\"]=exports[\"nl\"];exports[\"nl_BE\"]=exports[\"nl\"]},function(module,exports,__webpack_require__){var DOMutil=__webpack_require__(2);var Points=__webpack_require__(51);function Line(groupId,options){this.groupId=groupId;this.options=options}Line.prototype.getYRange=function(groupData){var yMin=groupData[0].y;var yMax=groupData[0].y;for(var j=0;j<groupData.length;j++){yMin=yMin>groupData[j].y?groupData[j].y:yMin;yMax=yMax<groupData[j].y?groupData[j].y:yMax}return{min:yMin,max:yMax,yAxisOrientation:this.options.yAxisOrientation}};Line.prototype.draw=function(dataset,group,framework){if(dataset!=null){if(dataset.length>0){var path,d;var svgHeight=Number(framework.svg.style.height.replace(\"px\",\"\"));path=DOMutil.getSVGElement(\"path\",framework.svgElements,framework.svg);path.setAttributeNS(null,\"class\",group.className);if(group.style!==undefined){path.setAttributeNS(null,\"style\",group.style)}if(group.options.catmullRom.enabled==true){d=Line._catmullRom(dataset,group)}else{d=Line._linear(dataset)}if(group.options.shaded.enabled==true){var fillPath=DOMutil.getSVGElement(\"path\",framework.svgElements,framework.svg);var dFill;if(group.options.shaded.orientation==\"top\"){dFill=\"M\"+dataset[0].x+\",\"+0+\" \"+d+\"L\"+dataset[dataset.length-1].x+\",\"+0}else{dFill=\"M\"+dataset[0].x+\",\"+svgHeight+\" \"+d+\"L\"+dataset[dataset.length-1].x+\",\"+svgHeight}fillPath.setAttributeNS(null,\"class\",group.className+\" fill\");if(group.options.shaded.style!==undefined){fillPath.setAttributeNS(null,\"style\",group.options.shaded.style)}fillPath.setAttributeNS(null,\"d\",dFill)}path.setAttributeNS(null,\"d\",\"M\"+d);if(group.options.drawPoints.enabled==true){Points.draw(dataset,group,framework)}}}};Line._catmullRomUniform=function(data){var p0,p1,p2,p3,bp1,bp2;var d=Math.round(data[0].x)+\",\"+Math.round(data[0].y)+\" \";var normalization=1/6;var length=data.length;for(var i=0;i<length-1;i++){p0=i==0?data[0]:data[i-1];p1=data[i];p2=data[i+1];p3=i+2<length?data[i+2]:p2;bp1={x:(-p0.x+6*p1.x+p2.x)*normalization,y:(-p0.y+6*p1.y+p2.y)*normalization};bp2={x:(p1.x+6*p2.x-p3.x)*normalization,y:(p1.y+6*p2.y-p3.y)*normalization};d+=\"C\"+bp1.x+\",\"+bp1.y+\" \"+bp2.x+\",\"+bp2.y+\" \"+p2.x+\",\"+p2.y+\" \"}return d};Line._catmullRom=function(data,group){var alpha=group.options.catmullRom.alpha;if(alpha==0||alpha===undefined){return this._catmullRomUniform(data)}else{var p0,p1,p2,p3,bp1,bp2,d1,d2,d3,A,B,N,M;var d3powA,d2powA,d3pow2A,d2pow2A,d1pow2A,d1powA;var d=Math.round(data[0].x)+\",\"+Math.round(data[0].y)+\" \";var length=data.length;for(var i=0;i<length-1;i++){p0=i==0?data[0]:data[i-1];p1=data[i];p2=data[i+1];p3=i+2<length?data[i+2]:p2;d1=Math.sqrt(Math.pow(p0.x-p1.x,2)+Math.pow(p0.y-p1.y,2));d2=Math.sqrt(Math.pow(p1.x-p2.x,2)+Math.pow(p1.y-p2.y,2));d3=Math.sqrt(Math.pow(p2.x-p3.x,2)+Math.pow(p2.y-p3.y,2));d3powA=Math.pow(d3,alpha);d3pow2A=Math.pow(d3,2*alpha);d2powA=Math.pow(d2,alpha);d2pow2A=Math.pow(d2,2*alpha);d1powA=Math.pow(d1,alpha);d1pow2A=Math.pow(d1,2*alpha);A=2*d1pow2A+3*d1powA*d2powA+d2pow2A;B=2*d3pow2A+3*d3powA*d2powA+d2pow2A;N=3*d1powA*(d1powA+d2powA);\nif(N>0){N=1/N}M=3*d3powA*(d3powA+d2powA);if(M>0){M=1/M}bp1={x:(-d2pow2A*p0.x+A*p1.x+d1pow2A*p2.x)*N,y:(-d2pow2A*p0.y+A*p1.y+d1pow2A*p2.y)*N};bp2={x:(d3pow2A*p1.x+B*p2.x-d2pow2A*p3.x)*M,y:(d3pow2A*p1.y+B*p2.y-d2pow2A*p3.y)*M};if(bp1.x==0&&bp1.y==0){bp1=p1}if(bp2.x==0&&bp2.y==0){bp2=p2}d+=\"C\"+bp1.x+\",\"+bp1.y+\" \"+bp2.x+\",\"+bp2.y+\" \"+p2.x+\",\"+p2.y+\" \"}return d}};Line._linear=function(data){var d=\"\";for(var i=0;i<data.length;i++){if(i==0){d+=data[i].x+\",\"+data[i].y}else{d+=\" \"+data[i].x+\",\"+data[i].y}}return d};module.exports=Line},function(module,exports,__webpack_require__){var DOMutil=__webpack_require__(2);var Points=__webpack_require__(51);function Bargraph(groupId,options){this.groupId=groupId;this.options=options}Bargraph.prototype.getYRange=function(groupData){if(this.options.barChart.handleOverlap!=\"stack\"){var yMin=groupData[0].y;var yMax=groupData[0].y;for(var j=0;j<groupData.length;j++){yMin=yMin>groupData[j].y?groupData[j].y:yMin;yMax=yMax<groupData[j].y?groupData[j].y:yMax}return{min:yMin,max:yMax,yAxisOrientation:this.options.yAxisOrientation}}else{var barCombinedData=[];for(var j=0;j<groupData.length;j++){barCombinedData.push({x:groupData[j].x,y:groupData[j].y,groupId:this.groupId})}return barCombinedData}};Bargraph.draw=function(groupIds,processedGroupData,framework){var combinedData=[];var intersections={};var coreDistance;var key,drawData;var group;var i,j;var barPoints=0;for(i=0;i<groupIds.length;i++){group=framework.groups[groupIds[i]];if(group.options.style==\"bar\"){if(group.visible==true&&(framework.options.groups.visibility[groupIds[i]]===undefined||framework.options.groups.visibility[groupIds[i]]==true)){for(j=0;j<processedGroupData[groupIds[i]].length;j++){combinedData.push({x:processedGroupData[groupIds[i]][j].x,y:processedGroupData[groupIds[i]][j].y,groupId:groupIds[i]});barPoints+=1}}}}if(barPoints==0){return}combinedData.sort(function(a,b){if(a.x==b.x){return a.groupId-b.groupId}else{return a.x-b.x}});Bargraph._getDataIntersections(intersections,combinedData);for(i=0;i<combinedData.length;i++){group=framework.groups[combinedData[i].groupId];var minWidth=.1*group.options.barChart.width;key=combinedData[i].x;var heightOffset=0;if(intersections[key]===undefined){if(i+1<combinedData.length){coreDistance=Math.abs(combinedData[i+1].x-key)}if(i>0){coreDistance=Math.min(coreDistance,Math.abs(combinedData[i-1].x-key))}drawData=Bargraph._getSafeDrawData(coreDistance,group,minWidth)}else{var nextKey=i+(intersections[key].amount-intersections[key].resolved);var prevKey=i-(intersections[key].resolved+1);if(nextKey<combinedData.length){coreDistance=Math.abs(combinedData[nextKey].x-key)}if(prevKey>0){coreDistance=Math.min(coreDistance,Math.abs(combinedData[prevKey].x-key))}drawData=Bargraph._getSafeDrawData(coreDistance,group,minWidth);intersections[key].resolved+=1;if(group.options.barChart.handleOverlap==\"stack\"){heightOffset=intersections[key].accumulated;intersections[key].accumulated+=group.zeroPosition-combinedData[i].y}else if(group.options.barChart.handleOverlap==\"sideBySide\"){drawData.width=drawData.width/intersections[key].amount;drawData.offset+=intersections[key].resolved*drawData.width-.5*drawData.width*(intersections[key].amount+1);if(group.options.barChart.align==\"left\"){drawData.offset-=.5*drawData.width}else if(group.options.barChart.align==\"right\"){drawData.offset+=.5*drawData.width}}}DOMutil.drawBar(combinedData[i].x+drawData.offset,combinedData[i].y-heightOffset,drawData.width,group.zeroPosition-combinedData[i].y,group.className+\" bar\",framework.svgElements,framework.svg);if(group.options.drawPoints.enabled==true){DOMutil.drawPoint(combinedData[i].x+drawData.offset,combinedData[i].y,group,framework.svgElements,framework.svg)}}};Bargraph._getDataIntersections=function(intersections,combinedData){var coreDistance;for(var i=0;i<combinedData.length;i++){if(i+1<combinedData.length){coreDistance=Math.abs(combinedData[i+1].x-combinedData[i].x)}if(i>0){coreDistance=Math.min(coreDistance,Math.abs(combinedData[i-1].x-combinedData[i].x))}if(coreDistance==0){if(intersections[combinedData[i].x]===undefined){intersections[combinedData[i].x]={amount:0,resolved:0,accumulated:0}}intersections[combinedData[i].x].amount+=1}}};Bargraph._getSafeDrawData=function(coreDistance,group,minWidth){var width,offset;if(coreDistance<group.options.barChart.width&&coreDistance>0){width=coreDistance<minWidth?minWidth:coreDistance;offset=0;if(group.options.barChart.align==\"left\"){offset-=.5*coreDistance}else if(group.options.barChart.align==\"right\"){offset+=.5*coreDistance}}else{width=group.options.barChart.width;offset=0;if(group.options.barChart.align==\"left\"){offset-=.5*group.options.barChart.width}else if(group.options.barChart.align==\"right\"){offset+=.5*group.options.barChart.width}}return{width:width,offset:offset}};Bargraph.getStackedBarYRange=function(barCombinedData,groupRanges,groupIds,groupLabel,orientation){if(barCombinedData.length>0){barCombinedData.sort(function(a,b){if(a.x==b.x){return a.groupId-b.groupId}else{return a.x-b.x}});var intersections={};Bargraph._getDataIntersections(intersections,barCombinedData);groupRanges[groupLabel]=Bargraph._getStackedBarYRange(intersections,barCombinedData);groupRanges[groupLabel].yAxisOrientation=orientation;groupIds.push(groupLabel)}};Bargraph._getStackedBarYRange=function(intersections,combinedData){var key;var yMin=combinedData[0].y;var yMax=combinedData[0].y;for(var i=0;i<combinedData.length;i++){key=combinedData[i].x;if(intersections[key]===undefined){yMin=yMin>combinedData[i].y?combinedData[i].y:yMin;yMax=yMax<combinedData[i].y?combinedData[i].y:yMax}else{intersections[key].accumulated+=combinedData[i].y}}for(var xpos in intersections){if(intersections.hasOwnProperty(xpos)){yMin=yMin>intersections[xpos].accumulated?intersections[xpos].accumulated:yMin;yMax=yMax<intersections[xpos].accumulated?intersections[xpos].accumulated:yMax}}return{min:yMin,max:yMax}};module.exports=Bargraph},function(module,exports,__webpack_require__){var DOMutil=__webpack_require__(2);function Points(groupId,options){this.groupId=groupId;this.options=options}Points.prototype.getYRange=function(groupData){var yMin=groupData[0].y;var yMax=groupData[0].y;for(var j=0;j<groupData.length;j++){yMin=yMin>groupData[j].y?groupData[j].y:yMin;yMax=yMax<groupData[j].y?groupData[j].y:yMax}return{min:yMin,max:yMax,yAxisOrientation:this.options.yAxisOrientation}};Points.prototype.draw=function(dataset,group,framework,offset){Points.draw(dataset,group,framework,offset)};Points.draw=function(dataset,group,framework,offset){if(offset===undefined){offset=0}for(var i=0;i<dataset.length;i++){DOMutil.drawPoint(dataset[i].x+offset,dataset[i].y,group,framework.svgElements,framework.svg)}};module.exports=Points},function(module,exports,__webpack_require__){var PhysicsMixin=__webpack_require__(60);var ClusterMixin=__webpack_require__(61);var SectorsMixin=__webpack_require__(62);var SelectionMixin=__webpack_require__(63);var ManipulationMixin=__webpack_require__(64);var NavigationMixin=__webpack_require__(65);var HierarchicalLayoutMixin=__webpack_require__(66);exports._loadMixin=function(sourceVariable){for(var mixinFunction in sourceVariable){if(sourceVariable.hasOwnProperty(mixinFunction)){this[mixinFunction]=sourceVariable[mixinFunction]}}};exports._clearMixin=function(sourceVariable){for(var mixinFunction in sourceVariable){if(sourceVariable.hasOwnProperty(mixinFunction)){this[mixinFunction]=undefined}}};exports._loadPhysicsSystem=function(){this._loadMixin(PhysicsMixin);this._loadSelectedForceSolver();if(this.constants.configurePhysics==true){this._loadPhysicsConfiguration()}else{this._cleanupPhysicsConfiguration()}};exports._loadClusterSystem=function(){this.clusterSession=0;this.hubThreshold=5;this._loadMixin(ClusterMixin)};exports._loadSectorSystem=function(){this.sectors={};this.activeSector=[\"default\"];this.sectors[\"active\"]={};this.sectors[\"active\"][\"default\"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:undefined};this.sectors[\"frozen\"]={};this.sectors[\"support\"]={nodes:{},edges:{},nodeIndices:[],formationScale:1,drawingNode:undefined};this.nodeIndices=this.sectors[\"active\"][\"default\"][\"nodeIndices\"];this._loadMixin(SectorsMixin)};exports._loadSelectionSystem=function(){this.selectionObj={nodes:{},edges:{}};this._loadMixin(SelectionMixin)};exports._loadManipulationSystem=function(){this.blockConnectingEdgeSelection=false;this.forceAppendSelection=false;if(this.constants.dataManipulation.enabled==true){if(this.manipulationDiv===undefined){this.manipulationDiv=document.createElement(\"div\");this.manipulationDiv.className=\"network-manipulationDiv\";if(this.editMode==true){this.manipulationDiv.style.display=\"block\"}else{this.manipulationDiv.style.display=\"none\"}this.frame.appendChild(this.manipulationDiv)}if(this.editModeDiv===undefined){this.editModeDiv=document.createElement(\"div\");this.editModeDiv.className=\"network-manipulation-editMode\";if(this.editMode==true){this.editModeDiv.style.display=\"none\"}else{this.editModeDiv.style.display=\"block\"}this.frame.appendChild(this.editModeDiv)}if(this.closeDiv===undefined){this.closeDiv=document.createElement(\"div\");this.closeDiv.className=\"network-manipulation-closeDiv\";this.closeDiv.style.display=this.manipulationDiv.style.display;this.frame.appendChild(this.closeDiv)}this._loadMixin(ManipulationMixin);this._createManipulatorBar()}else{if(this.manipulationDiv!==undefined){this._createManipulatorBar();this.frame.removeChild(this.manipulationDiv);this.frame.removeChild(this.editModeDiv);this.frame.removeChild(this.closeDiv);this.manipulationDiv=undefined;this.editModeDiv=undefined;this.closeDiv=undefined;this._clearMixin(ManipulationMixin)}}};exports._loadNavigationControls=function(){this._loadMixin(NavigationMixin);this._cleanNavigation();if(this.constants.navigation.enabled==true){this._loadNavigationElements()}};exports._loadHierarchySystem=function(){this._loadMixin(HierarchicalLayoutMixin)}},function(module,exports,__webpack_require__){var keycharm=__webpack_require__(59);var Emitter=__webpack_require__(56);var Hammer=__webpack_require__(45);var util=__webpack_require__(1);function Activator(container){this.active=false;this.dom={container:container};this.dom.overlay=document.createElement(\"div\");this.dom.overlay.className=\"overlay\";this.dom.container.appendChild(this.dom.overlay);this.hammer=Hammer(this.dom.overlay,{prevent_default:false});this.hammer.on(\"tap\",this._onTapOverlay.bind(this));var me=this;var events=[\"touch\",\"pinch\",\"doubletap\",\"hold\",\"dragstart\",\"drag\",\"dragend\",\"mousewheel\",\"DOMMouseScroll\"];events.forEach(function(event){me.hammer.on(event,function(event){event.stopPropagation()})});this.windowHammer=Hammer(window,{prevent_default:false});this.windowHammer.on(\"tap\",function(event){if(!_hasParent(event.target,container)){me.deactivate()}});if(this.keycharm!==undefined){this.keycharm.destroy()}this.keycharm=keycharm();this.escListener=this.deactivate.bind(this)}Emitter(Activator.prototype);Activator.current=null;Activator.prototype.destroy=function(){this.deactivate();this.dom.overlay.parentNode.removeChild(this.dom.overlay);this.hammer=null;this.windowHammer=null};Activator.prototype.activate=function(){if(Activator.current){Activator.current.deactivate()}Activator.current=this;this.active=true;this.dom.overlay.style.display=\"none\";util.addClassName(this.dom.container,\"vis-active\");this.emit(\"change\");this.emit(\"activate\");this.keycharm.bind(\"esc\",this.escListener)};Activator.prototype.deactivate=function(){this.active=false;this.dom.overlay.style.display=\"\";util.removeClassName(this.dom.container,\"vis-active\");this.keycharm.unbind(\"esc\",this.escListener);this.emit(\"change\");this.emit(\"deactivate\")};Activator.prototype._onTapOverlay=function(event){this.activate();event.stopPropagation()};function _hasParent(element,parent){while(element){if(element===parent){return true}element=element.parentNode}return false}module.exports=Activator},function(module,exports,__webpack_require__){exports[\"en\"]={edit:\"Edit\",del:\"Delete selected\",back:\"Back\",addNode:\"Add Node\",addEdge:\"Add Edge\",editNode:\"Edit Node\",editEdge:\"Edit Edge\",addDescription:\"Click in an empty space to place a new node.\",edgeDescription:\"Click on a node and drag the edge to another node to connect them.\",editEdgeDescription:\"Click on the control points and drag them to a node to connect to it.\",createEdgeError:\"Cannot link edges to a cluster.\",deleteClusterError:\"Clusters cannot be deleted.\"};exports[\"en_EN\"]=exports[\"en\"];exports[\"en_US\"]=exports[\"en\"];exports[\"nl\"]={edit:\"Wijzigen\",del:\"Selectie verwijderen\",back:\"Terug\",addNode:\"Node toevoegen\",addEdge:\"Link toevoegen\",editNode:\"Node wijzigen\",editEdge:\"Link wijzigen\",addDescription:\"Klik op een leeg gebied om een nieuwe node te maken.\",edgeDescription:\"Klik op een node en sleep de link naar een andere node om ze te verbinden.\",editEdgeDescription:\"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.\",createEdgeError:\"Kan geen link maken naar een cluster.\",deleteClusterError:\"Clusters kunnen niet worden verwijderd.\"};exports[\"nl_NL\"]=exports[\"nl\"];exports[\"nl_BE\"]=exports[\"nl\"]},function(module,exports,__webpack_require__){if(typeof CanvasRenderingContext2D!==\"undefined\"){CanvasRenderingContext2D.prototype.circle=function(x,y,r){this.beginPath();this.arc(x,y,r,0,2*Math.PI,false)};CanvasRenderingContext2D.prototype.square=function(x,y,r){this.beginPath();this.rect(x-r,y-r,r*2,r*2)};CanvasRenderingContext2D.prototype.triangle=function(x,y,r){this.beginPath();var s=r*2;var s2=s/2;var ir=Math.sqrt(3)/6*s;var h=Math.sqrt(s*s-s2*s2);this.moveTo(x,y-(h-ir));this.lineTo(x+s2,y+ir);this.lineTo(x-s2,y+ir);this.lineTo(x,y-(h-ir));this.closePath()};CanvasRenderingContext2D.prototype.triangleDown=function(x,y,r){this.beginPath();var s=r*2;var s2=s/2;var ir=Math.sqrt(3)/6*s;var h=Math.sqrt(s*s-s2*s2);this.moveTo(x,y+(h-ir));this.lineTo(x+s2,y-ir);this.lineTo(x-s2,y-ir);this.lineTo(x,y+(h-ir));this.closePath()};CanvasRenderingContext2D.prototype.star=function(x,y,r){this.beginPath();for(var n=0;n<10;n++){var radius=n%2===0?r*1.3:r*.5;this.lineTo(x+radius*Math.sin(n*2*Math.PI/10),y-radius*Math.cos(n*2*Math.PI/10))}this.closePath()};CanvasRenderingContext2D.prototype.roundRect=function(x,y,w,h,r){var r2d=Math.PI/180;if(w-2*r<0){r=w/2}if(h-2*r<0){r=h/2}this.beginPath();this.moveTo(x+r,y);this.lineTo(x+w-r,y);this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false);this.lineTo(x+w,y+h-r);this.arc(x+w-r,y+h-r,r,0,r2d*90,false);this.lineTo(x+r,y+h);this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false);this.lineTo(x,y+r);this.arc(x+r,y+r,r,r2d*180,r2d*270,false)};CanvasRenderingContext2D.prototype.ellipse=function(x,y,w,h){var kappa=.5522848,ox=w/2*kappa,oy=h/2*kappa,xe=x+w,ye=y+h,xm=x+w/2,ym=y+h/2;this.beginPath();this.moveTo(x,ym);this.bezierCurveTo(x,ym-oy,xm-ox,y,xm,y);this.bezierCurveTo(xm+ox,y,xe,ym-oy,xe,ym);this.bezierCurveTo(xe,ym+oy,xm+ox,ye,xm,ye);this.bezierCurveTo(xm-ox,ye,x,ym+oy,x,ym)};CanvasRenderingContext2D.prototype.database=function(x,y,w,h){var f=1/3;var wEllipse=w;var hEllipse=h*f;var kappa=.5522848,ox=wEllipse/2*kappa,oy=hEllipse/2*kappa,xe=x+wEllipse,ye=y+hEllipse,xm=x+wEllipse/2,ym=y+hEllipse/2,ymb=y+(h-hEllipse/2),yeb=y+h;this.beginPath();this.moveTo(xe,ym);this.bezierCurveTo(xe,ym+oy,xm+ox,ye,xm,ye);this.bezierCurveTo(xm-ox,ye,x,ym+oy,x,ym);this.bezierCurveTo(x,ym-oy,xm-ox,y,xm,y);this.bezierCurveTo(xm+ox,y,xe,ym-oy,xe,ym);this.lineTo(xe,ymb);this.bezierCurveTo(xe,ymb+oy,xm+ox,yeb,xm,yeb);this.bezierCurveTo(xm-ox,yeb,x,ymb+oy,x,ymb);this.lineTo(x,ym)};CanvasRenderingContext2D.prototype.arrow=function(x,y,angle,length){var xt=x-length*Math.cos(angle);var yt=y-length*Math.sin(angle);var xi=x-length*.9*Math.cos(angle);var yi=y-length*.9*Math.sin(angle);var xl=xt+length/3*Math.cos(angle+.5*Math.PI);var yl=yt+length/3*Math.sin(angle+.5*Math.PI);var xr=xt+length/3*Math.cos(angle-.5*Math.PI);var yr=yt+length/3*Math.sin(angle-.5*Math.PI);this.beginPath();this.moveTo(x,y);this.lineTo(xl,yl);this.lineTo(xi,yi);this.lineTo(xr,yr);this.closePath()};CanvasRenderingContext2D.prototype.dashedLine=function(x,y,x2,y2,dashArray){if(!dashArray)dashArray=[10,5];if(dashLength==0)dashLength=.001;var dashCount=dashArray.length;this.moveTo(x,y);var dx=x2-x,dy=y2-y;var slope=dy/dx;var distRemaining=Math.sqrt(dx*dx+dy*dy);var dashIndex=0,draw=true;while(distRemaining>=.1){var dashLength=dashArray[dashIndex++%dashCount];if(dashLength>distRemaining)dashLength=distRemaining;var xStep=Math.sqrt(dashLength*dashLength/(1+slope*slope));if(dx<0)xStep=-xStep;x+=xStep;y+=slope*xStep;this[draw?\"lineTo\":\"moveTo\"](x,y);distRemaining-=dashLength;draw=!draw}}}},function(module,exports,__webpack_require__){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks[event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i){callbacks[i].apply(this,args)}}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks[event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_RESULT__;(function(window,undefined){\"use strict\";var Hammer=function Hammer(element,options){return new Hammer.Instance(element,options||{})};Hammer.VERSION=\"1.1.3\";Hammer.defaults={behavior:{userSelect:\"none\",touchAction:\"pan-y\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};Hammer.DOCUMENT=document;Hammer.HAS_POINTEREVENTS=navigator.pointerEnabled||navigator.msPointerEnabled;Hammer.HAS_TOUCHEVENTS=\"ontouchstart\"in window;Hammer.IS_MOBILE=/mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent);Hammer.NO_MOUSEEVENTS=Hammer.HAS_TOUCHEVENTS&&Hammer.IS_MOBILE||Hammer.HAS_POINTEREVENTS;Hammer.CALCULATE_INTERVAL=25;var EVENT_TYPES={};var DIRECTION_DOWN=Hammer.DIRECTION_DOWN=\"down\";var DIRECTION_LEFT=Hammer.DIRECTION_LEFT=\"left\";var DIRECTION_UP=Hammer.DIRECTION_UP=\"up\";var DIRECTION_RIGHT=Hammer.DIRECTION_RIGHT=\"right\";var POINTER_MOUSE=Hammer.POINTER_MOUSE=\"mouse\";var POINTER_TOUCH=Hammer.POINTER_TOUCH=\"touch\";var POINTER_PEN=Hammer.POINTER_PEN=\"pen\";var EVENT_START=Hammer.EVENT_START=\"start\";var EVENT_MOVE=Hammer.EVENT_MOVE=\"move\";var EVENT_END=Hammer.EVENT_END=\"end\";var EVENT_RELEASE=Hammer.EVENT_RELEASE=\"release\";var EVENT_TOUCH=Hammer.EVENT_TOUCH=\"touch\";Hammer.READY=false;Hammer.plugins=Hammer.plugins||{};Hammer.gestures=Hammer.gestures||{};function setup(){if(Hammer.READY){return}Event.determineEventTypes();Utils.each(Hammer.gestures,function(gesture){Detection.register(gesture)});Event.onTouch(Hammer.DOCUMENT,EVENT_MOVE,Detection.detect);Event.onTouch(Hammer.DOCUMENT,EVENT_END,Detection.detect);Hammer.READY=true}var Utils=Hammer.utils={extend:function extend(dest,src,merge){for(var key in src){if(!src.hasOwnProperty(key)||dest[key]!==undefined&&merge){continue}dest[key]=src[key]}return dest},on:function on(element,type,handler){element.addEventListener(type,handler,false)},off:function off(element,type,handler){element.removeEventListener(type,handler,false)},each:function each(obj,iterator,context){var i,len;if(\"forEach\"in obj){obj.forEach(iterator,context)}else if(obj.length!==undefined){for(i=0,len=obj.length;i<len;i++){if(iterator.call(context,obj[i],i,obj)===false){return}}}else{for(i in obj){if(obj.hasOwnProperty(i)&&iterator.call(context,obj[i],i,obj)===false){return}}}},inStr:function inStr(src,find){return src.indexOf(find)>-1},inArray:function inArray(src,find){if(src.indexOf){var index=src.indexOf(find);return index===-1?false:index}else{for(var i=0,len=src.length;i<len;i++){if(src[i]===find){return i}}return false}},toArray:function toArray(obj){return Array.prototype.slice.call(obj,0)},hasParent:function hasParent(node,parent){while(node){if(node==parent){return true}node=node.parentNode}return false},getCenter:function getCenter(touches){var pageX=[],pageY=[],clientX=[],clientY=[],min=Math.min,max=Math.max;if(touches.length===1){return{pageX:touches[0].pageX,pageY:touches[0].pageY,clientX:touches[0].clientX,clientY:touches[0].clientY}}Utils.each(touches,function(touch){pageX.push(touch.pageX);pageY.push(touch.pageY);clientX.push(touch.clientX);clientY.push(touch.clientY)});return{pageX:(min.apply(Math,pageX)+max.apply(Math,pageX))/2,pageY:(min.apply(Math,pageY)+max.apply(Math,pageY))/2,clientX:(min.apply(Math,clientX)+max.apply(Math,clientX))/2,clientY:(min.apply(Math,clientY)+max.apply(Math,clientY))/2}},getVelocity:function getVelocity(deltaTime,deltaX,deltaY){return{x:Math.abs(deltaX/deltaTime)||0,y:Math.abs(deltaY/deltaTime)||0}},getAngle:function getAngle(touch1,touch2){var x=touch2.clientX-touch1.clientX,y=touch2.clientY-touch1.clientY;return Math.atan2(y,x)*180/Math.PI},getDirection:function getDirection(touch1,touch2){var x=Math.abs(touch1.clientX-touch2.clientX),y=Math.abs(touch1.clientY-touch2.clientY);if(x>=y){return touch1.clientX-touch2.clientX>0?DIRECTION_LEFT:DIRECTION_RIGHT}return touch1.clientY-touch2.clientY>0?DIRECTION_UP:DIRECTION_DOWN},getDistance:function getDistance(touch1,touch2){var x=touch2.clientX-touch1.clientX,y=touch2.clientY-touch1.clientY;return Math.sqrt(x*x+y*y)},getScale:function getScale(start,end){if(start.length>=2&&end.length>=2){return this.getDistance(end[0],end[1])/this.getDistance(start[0],start[1])}return 1},getRotation:function getRotation(start,end){if(start.length>=2&&end.length>=2){return this.getAngle(end[1],end[0])-this.getAngle(start[1],start[0])}return 0},isVertical:function isVertical(direction){return direction==DIRECTION_UP||direction==DIRECTION_DOWN},setPrefixedCss:function setPrefixedCss(element,prop,value,toggle){var prefixes=[\"\",\"Webkit\",\"Moz\",\"O\",\"ms\"];prop=Utils.toCamelCase(prop);for(var i=0;i<prefixes.length;i++){var p=prop;if(prefixes[i]){p=prefixes[i]+p.slice(0,1).toUpperCase()+p.slice(1)}if(p in element.style){element.style[p]=(toggle==null||toggle)&&value||\"\";break}}},toggleBehavior:function toggleBehavior(element,props,toggle){if(!props||!element||!element.style){return}Utils.each(props,function(value,prop){Utils.setPrefixedCss(element,prop,value,toggle)});var falseFn=toggle&&function(){return false};if(props.userSelect==\"none\"){element.onselectstart=falseFn}if(props.userDrag==\"none\"){element.ondragstart=falseFn}},toCamelCase:function toCamelCase(str){return str.replace(/[_-]([a-z])/g,function(s){return s[1].toUpperCase()})}};var Event=Hammer.event={preventMouseEvents:false,started:false,shouldDetect:false,on:function on(element,type,handler,hook){var types=type.split(\" \");Utils.each(types,function(type){Utils.on(element,type,handler);hook&&hook(type)})},off:function off(element,type,handler,hook){var types=type.split(\" \");Utils.each(types,function(type){Utils.off(element,type,handler);hook&&hook(type)})},onTouch:function onTouch(element,eventType,handler){var self=this;var onTouchHandler=function onTouchHandler(ev){var srcType=ev.type.toLowerCase(),isPointer=Hammer.HAS_POINTEREVENTS,isMouse=Utils.inStr(srcType,\"mouse\"),triggerType;if(isMouse&&self.preventMouseEvents){return}else if(isMouse&&eventType==EVENT_START&&ev.button===0){self.preventMouseEvents=false;self.shouldDetect=true}else if(isPointer&&eventType==EVENT_START){self.shouldDetect=ev.buttons===1||PointerEvent.matchType(POINTER_TOUCH,ev)}else if(!isMouse&&eventType==EVENT_START){self.preventMouseEvents=true;self.shouldDetect=true}if(isPointer&&eventType!=EVENT_END){PointerEvent.updatePointer(eventType,ev)}if(self.shouldDetect){triggerType=self.doDetect.call(self,ev,eventType,element,handler)}if(triggerType==EVENT_END){self.preventMouseEvents=false;self.shouldDetect=false;PointerEvent.reset()}if(isPointer&&eventType==EVENT_END){PointerEvent.updatePointer(eventType,ev)}};this.on(element,EVENT_TYPES[eventType],onTouchHandler);return onTouchHandler},doDetect:function doDetect(ev,eventType,element,handler){var touchList=this.getTouchList(ev,eventType);var touchListLength=touchList.length;var triggerType=eventType;var triggerChange=touchList.trigger;var changedLength=touchListLength;if(eventType==EVENT_START){triggerChange=EVENT_TOUCH}else if(eventType==EVENT_END){triggerChange=EVENT_RELEASE;changedLength=touchList.length-(ev.changedTouches?ev.changedTouches.length:1)}if(changedLength>0&&this.started){triggerType=EVENT_MOVE}this.started=true;var evData=this.collectEventData(element,triggerType,touchList,ev);if(eventType!=EVENT_END){handler.call(Detection,evData)}if(triggerChange){evData.changedLength=changedLength;evData.eventType=triggerChange;handler.call(Detection,evData);evData.eventType=triggerType;delete evData.changedLength}if(triggerType==EVENT_END){handler.call(Detection,evData);this.started=false}return triggerType},determineEventTypes:function determineEventTypes(){var types;if(Hammer.HAS_POINTEREVENTS){if(window.PointerEvent){types=[\"pointerdown\",\"pointermove\",\"pointerup pointercancel lostpointercapture\"]}else{types=[\"MSPointerDown\",\"MSPointerMove\",\"MSPointerUp MSPointerCancel MSLostPointerCapture\"]}}else if(Hammer.NO_MOUSEEVENTS){types=[\"touchstart\",\"touchmove\",\"touchend touchcancel\"]}else{types=[\"touchstart mousedown\",\"touchmove mousemove\",\"touchend touchcancel mouseup\"]}EVENT_TYPES[EVENT_START]=types[0];EVENT_TYPES[EVENT_MOVE]=types[1];EVENT_TYPES[EVENT_END]=types[2];return EVENT_TYPES},getTouchList:function getTouchList(ev,eventType){if(Hammer.HAS_POINTEREVENTS){return PointerEvent.getTouchList()}if(ev.touches){if(eventType==EVENT_MOVE){return ev.touches}var identifiers=[];var concat=[].concat(Utils.toArray(ev.touches),Utils.toArray(ev.changedTouches));var touchList=[];Utils.each(concat,function(touch){if(Utils.inArray(identifiers,touch.identifier)===false){touchList.push(touch)}identifiers.push(touch.identifier)});return touchList}ev.identifier=1;return[ev]},collectEventData:function collectEventData(element,eventType,touches,ev){var pointerType=POINTER_TOUCH;if(Utils.inStr(ev.type,\"mouse\")||PointerEvent.matchType(POINTER_MOUSE,ev)){pointerType=POINTER_MOUSE}else if(PointerEvent.matchType(POINTER_PEN,ev)){pointerType=POINTER_PEN}return{center:Utils.getCenter(touches),timeStamp:Date.now(),target:ev.target,touches:touches,eventType:eventType,pointerType:pointerType,srcEvent:ev,preventDefault:function(){var srcEvent=this.srcEvent;srcEvent.preventManipulation&&srcEvent.preventManipulation();srcEvent.preventDefault&&srcEvent.preventDefault()},stopPropagation:function(){this.srcEvent.stopPropagation()},stopDetect:function(){return Detection.stopDetect()}}}};var PointerEvent=Hammer.PointerEvent={pointers:{},getTouchList:function getTouchList(){var touchlist=[];Utils.each(this.pointers,function(pointer){touchlist.push(pointer)});return touchlist},updatePointer:function updatePointer(eventType,pointerEvent){if(eventType==EVENT_END||eventType!=EVENT_END&&pointerEvent.buttons!==1){delete this.pointers[pointerEvent.pointerId]}else{pointerEvent.identifier=pointerEvent.pointerId;this.pointers[pointerEvent.pointerId]=pointerEvent}},matchType:function matchType(pointerType,ev){if(!ev.pointerType){return false}var pt=ev.pointerType,types={};types[POINTER_MOUSE]=pt===(ev.MSPOINTER_TYPE_MOUSE||POINTER_MOUSE);types[POINTER_TOUCH]=pt===(ev.MSPOINTER_TYPE_TOUCH||POINTER_TOUCH);types[POINTER_PEN]=pt===(ev.MSPOINTER_TYPE_PEN||POINTER_PEN);return types[pointerType]},reset:function resetList(){this.pointers={}}};var Detection=Hammer.detection={gestures:[],current:null,previous:null,stopped:false,startDetect:function startDetect(inst,eventData){if(this.current){return}this.stopped=false;this.current={inst:inst,startEvent:Utils.extend({},eventData),lastEvent:false,lastCalcEvent:false,futureCalcEvent:false,lastCalcData:{},name:\"\"};this.detect(eventData)},detect:function detect(eventData){if(!this.current||this.stopped){return}eventData=this.extendEventData(eventData);var inst=this.current.inst,instOptions=inst.options;Utils.each(this.gestures,function triggerGesture(gesture){if(!this.stopped&&inst.enabled&&instOptions[gesture.name]){gesture.handler.call(gesture,eventData,inst)}},this);if(this.current){this.current.lastEvent=eventData}if(eventData.eventType==EVENT_END){this.stopDetect()}return eventData},stopDetect:function stopDetect(){this.previous=Utils.extend({},this.current);this.current=null;this.stopped=true},getCalculatedData:function getCalculatedData(ev,center,deltaTime,deltaX,deltaY){var cur=this.current,recalc=false,calcEv=cur.lastCalcEvent,calcData=cur.lastCalcData;if(calcEv&&ev.timeStamp-calcEv.timeStamp>Hammer.CALCULATE_INTERVAL){center=calcEv.center;deltaTime=ev.timeStamp-calcEv.timeStamp;deltaX=ev.center.clientX-calcEv.center.clientX;deltaY=ev.center.clientY-calcEv.center.clientY;recalc=true}if(ev.eventType==EVENT_TOUCH||ev.eventType==EVENT_RELEASE){cur.futureCalcEvent=ev}if(!cur.lastCalcEvent||recalc){calcData.velocity=Utils.getVelocity(deltaTime,deltaX,deltaY);calcData.angle=Utils.getAngle(center,ev.center);calcData.direction=Utils.getDirection(center,ev.center);cur.lastCalcEvent=cur.futureCalcEvent||ev;cur.futureCalcEvent=ev}ev.velocityX=calcData.velocity.x;ev.velocityY=calcData.velocity.y;ev.interimAngle=calcData.angle;ev.interimDirection=calcData.direction},extendEventData:function extendEventData(ev){var cur=this.current,startEv=cur.startEvent,lastEv=cur.lastEvent||startEv;if(ev.eventType==EVENT_TOUCH||ev.eventType==EVENT_RELEASE){startEv.touches=[];Utils.each(ev.touches,function(touch){startEv.touches.push({clientX:touch.clientX,clientY:touch.clientY})})}var deltaTime=ev.timeStamp-startEv.timeStamp,deltaX=ev.center.clientX-startEv.center.clientX,deltaY=ev.center.clientY-startEv.center.clientY;this.getCalculatedData(ev,lastEv.center,deltaTime,deltaX,deltaY);Utils.extend(ev,{startEvent:startEv,deltaTime:deltaTime,deltaX:deltaX,deltaY:deltaY,distance:Utils.getDistance(startEv.center,ev.center),angle:Utils.getAngle(startEv.center,ev.center),direction:Utils.getDirection(startEv.center,ev.center),scale:Utils.getScale(startEv.touches,ev.touches),rotation:Utils.getRotation(startEv.touches,ev.touches)});return ev},register:function register(gesture){var options=gesture.defaults||{};if(options[gesture.name]===undefined){options[gesture.name]=true}Utils.extend(Hammer.defaults,options,true);gesture.index=gesture.index||1e3;this.gestures.push(gesture);this.gestures.sort(function(a,b){if(a.index<b.index){return-1}if(a.index>b.index){return 1}return 0});return this.gestures}};Hammer.Instance=function(element,options){var self=this;setup();this.element=element;this.enabled=true;Utils.each(options,function(value,name){delete options[name];options[Utils.toCamelCase(name)]=value});this.options=Utils.extend(Utils.extend({},Hammer.defaults),options||{});if(this.options.behavior){Utils.toggleBehavior(this.element,this.options.behavior,true)}this.eventStartHandler=Event.onTouch(element,EVENT_START,function(ev){if(self.enabled&&ev.eventType==EVENT_START){Detection.startDetect(self,ev)\n}else if(ev.eventType==EVENT_TOUCH){Detection.detect(ev)}});this.eventHandlers=[]};Hammer.Instance.prototype={on:function onEvent(gestures,handler){var self=this;Event.on(self.element,gestures,handler,function(type){self.eventHandlers.push({gesture:type,handler:handler})});return self},off:function offEvent(gestures,handler){var self=this;Event.off(self.element,gestures,handler,function(type){var index=Utils.inArray({gesture:type,handler:handler});if(index!==false){self.eventHandlers.splice(index,1)}});return self},trigger:function triggerEvent(gesture,eventData){if(!eventData){eventData={}}var event=Hammer.DOCUMENT.createEvent(\"Event\");event.initEvent(gesture,true,true);event.gesture=eventData;var element=this.element;if(Utils.hasParent(eventData.target,element)){element=eventData.target}element.dispatchEvent(event);return this},enable:function enable(state){this.enabled=state;return this},dispose:function dispose(){var i,eh;Utils.toggleBehavior(this.element,this.options.behavior,false);for(i=-1;eh=this.eventHandlers[++i];){Utils.off(this.element,eh.gesture,eh.handler)}this.eventHandlers=[];Event.off(this.element,EVENT_TYPES[EVENT_START],this.eventStartHandler);return null}};(function(name){var triggered=false;function dragGesture(ev,inst){var cur=Detection.current;if(inst.options.dragMaxTouches>0&&ev.touches.length>inst.options.dragMaxTouches){return}switch(ev.eventType){case EVENT_START:triggered=false;break;case EVENT_MOVE:if(ev.distance<inst.options.dragMinDistance&&cur.name!=name){return}var startCenter=cur.startEvent.center;if(cur.name!=name){cur.name=name;if(inst.options.dragDistanceCorrection&&ev.distance>0){var factor=Math.abs(inst.options.dragMinDistance/ev.distance);startCenter.pageX+=ev.deltaX*factor;startCenter.pageY+=ev.deltaY*factor;startCenter.clientX+=ev.deltaX*factor;startCenter.clientY+=ev.deltaY*factor;ev=Detection.extendEventData(ev)}}if(cur.lastEvent.dragLockToAxis||inst.options.dragLockToAxis&&inst.options.dragLockMinDistance<=ev.distance){ev.dragLockToAxis=true}var lastDirection=cur.lastEvent.direction;if(ev.dragLockToAxis&&lastDirection!==ev.direction){if(Utils.isVertical(lastDirection)){ev.direction=ev.deltaY<0?DIRECTION_UP:DIRECTION_DOWN}else{ev.direction=ev.deltaX<0?DIRECTION_LEFT:DIRECTION_RIGHT}}if(!triggered){inst.trigger(name+\"start\",ev);triggered=true}inst.trigger(name,ev);inst.trigger(name+ev.direction,ev);var isVertical=Utils.isVertical(ev.direction);if(inst.options.dragBlockVertical&&isVertical||inst.options.dragBlockHorizontal&&!isVertical){ev.preventDefault()}break;case EVENT_RELEASE:if(triggered&&ev.changedLength<=inst.options.dragMaxTouches){inst.trigger(name+\"end\",ev);triggered=false}break;case EVENT_END:triggered=false;break}}Hammer.gestures.Drag={name:name,index:50,handler:dragGesture,defaults:{dragMinDistance:10,dragDistanceCorrection:true,dragMaxTouches:1,dragBlockHorizontal:false,dragBlockVertical:false,dragLockToAxis:false,dragLockMinDistance:25}}})(\"drag\");Hammer.gestures.Gesture={name:\"gesture\",index:1337,handler:function releaseGesture(ev,inst){inst.trigger(this.name,ev)}};(function(name){var timer;function holdGesture(ev,inst){var options=inst.options,current=Detection.current;switch(ev.eventType){case EVENT_START:clearTimeout(timer);current.name=name;timer=setTimeout(function(){if(current&¤t.name==name){inst.trigger(name,ev)}},options.holdTimeout);break;case EVENT_MOVE:if(ev.distance>options.holdThreshold){clearTimeout(timer)}break;case EVENT_RELEASE:clearTimeout(timer);break}}Hammer.gestures.Hold={name:name,index:10,defaults:{holdTimeout:500,holdThreshold:2},handler:holdGesture}})(\"hold\");Hammer.gestures.Release={name:\"release\",index:Infinity,handler:function releaseGesture(ev,inst){if(ev.eventType==EVENT_RELEASE){inst.trigger(this.name,ev)}}};Hammer.gestures.Swipe={name:\"swipe\",index:40,defaults:{swipeMinTouches:1,swipeMaxTouches:1,swipeVelocityX:.6,swipeVelocityY:.6},handler:function swipeGesture(ev,inst){if(ev.eventType==EVENT_RELEASE){var touches=ev.touches.length,options=inst.options;if(touches<options.swipeMinTouches||touches>options.swipeMaxTouches){return}if(ev.velocityX>options.swipeVelocityX||ev.velocityY>options.swipeVelocityY){inst.trigger(this.name,ev);inst.trigger(this.name+ev.direction,ev)}}}};(function(name){var hasMoved=false;function tapGesture(ev,inst){var options=inst.options,current=Detection.current,prev=Detection.previous,sincePrev,didDoubleTap;switch(ev.eventType){case EVENT_START:hasMoved=false;break;case EVENT_MOVE:hasMoved=hasMoved||ev.distance>options.tapMaxDistance;break;case EVENT_END:if(!Utils.inStr(ev.srcEvent.type,\"cancel\")&&ev.deltaTime<options.tapMaxTime&&!hasMoved){sincePrev=prev&&prev.lastEvent&&ev.timeStamp-prev.lastEvent.timeStamp;didDoubleTap=false;if(prev&&prev.name==name&&(sincePrev&&sincePrev<options.doubleTapInterval)&&ev.distance<options.doubleTapDistance){inst.trigger(\"doubletap\",ev);didDoubleTap=true}if(!didDoubleTap||options.tapAlways){current.name=name;inst.trigger(current.name,ev)}}break}}Hammer.gestures.Tap={name:name,index:100,handler:tapGesture,defaults:{tapMaxTime:250,tapMaxDistance:10,tapAlways:true,doubleTapDistance:20,doubleTapInterval:300}}})(\"tap\");Hammer.gestures.Touch={name:\"touch\",index:-Infinity,defaults:{preventDefault:false,preventMouse:false},handler:function touchGesture(ev,inst){if(inst.options.preventMouse&&ev.pointerType==POINTER_MOUSE){ev.stopDetect();return}if(inst.options.preventDefault){ev.preventDefault()}if(ev.eventType==EVENT_TOUCH){inst.trigger(\"touch\",ev)}}};(function(name){var triggered=false;function transformGesture(ev,inst){switch(ev.eventType){case EVENT_START:triggered=false;break;case EVENT_MOVE:if(ev.touches.length<2){return}var scaleThreshold=Math.abs(1-ev.scale);var rotationThreshold=Math.abs(ev.rotation);if(scaleThreshold<inst.options.transformMinScale&&rotationThreshold<inst.options.transformMinRotation){return}Detection.current.name=name;if(!triggered){inst.trigger(name+\"start\",ev);triggered=true}inst.trigger(name,ev);if(rotationThreshold>inst.options.transformMinRotation){inst.trigger(\"rotate\",ev)}if(scaleThreshold>inst.options.transformMinScale){inst.trigger(\"pinch\",ev);inst.trigger(\"pinch\"+(ev.scale<1?\"in\":\"out\"),ev)}break;case EVENT_RELEASE:if(triggered&&ev.changedLength<2){inst.trigger(name+\"end\",ev);triggered=false}break}}Hammer.gestures.Transform={name:name,index:45,defaults:{transformMinScale:.01,transformMinRotation:1},handler:transformGesture}})(\"transform\");if(true){!(__WEBPACK_AMD_DEFINE_RESULT__=function(){return Hammer}.call(exports,__webpack_require__,exports,module),__WEBPACK_AMD_DEFINE_RESULT__!==undefined&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}else if(typeof module!==\"undefined\"&&module.exports){module.exports=Hammer}else{window.Hammer=Hammer}})(window)},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_RESULT__;(function(global,module){(function(undefined){var moment,VERSION=\"2.9.0\",globalScope=typeof global!==\"undefined\"&&(typeof window===\"undefined\"||window===global.window)?global:this,oldGlobalMoment,round=Math.round,hasOwnProperty=Object.prototype.hasOwnProperty,i,YEAR=0,MONTH=1,DATE=2,HOUR=3,MINUTE=4,SECOND=5,MILLISECOND=6,locales={},momentProperties=[],hasModule=typeof module!==\"undefined\"&&module&&module.exports,aspNetJsonRegex=/^\\/?Date\\((\\-?\\d+)/i,aspNetTimeSpanJsonRegex=/(\\-)?(?:(\\d*)\\.)?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?)?/,isoDurationRegex=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,formattingTokens=/(\\[[^\\[]*\\])|(\\\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,localFormattingTokens=/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,parseTokenOneOrTwoDigits=/\\d\\d?/,parseTokenOneToThreeDigits=/\\d{1,3}/,parseTokenOneToFourDigits=/\\d{1,4}/,parseTokenOneToSixDigits=/[+\\-]?\\d{1,6}/,parseTokenDigits=/\\d+/,parseTokenWord=/[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i,parseTokenTimezone=/Z|[\\+\\-]\\d\\d:?\\d\\d/gi,parseTokenT=/T/i,parseTokenOffsetMs=/[\\+\\-]?\\d+/,parseTokenTimestampMs=/[\\+\\-]?\\d+(\\.\\d{1,3})?/,parseTokenOneDigit=/\\d/,parseTokenTwoDigits=/\\d\\d/,parseTokenThreeDigits=/\\d{3}/,parseTokenFourDigits=/\\d{4}/,parseTokenSixDigits=/[+-]?\\d{6}/,parseTokenSignedNumber=/[+-]?\\d+/,isoRegex=/^\\s*(?:[+-]\\d{6}|\\d{4})-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,isoFormat=\"YYYY-MM-DDTHH:mm:ssZ\",isoDates=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d{2}-\\d{2}/],[\"YYYY-MM-DD\",/\\d{4}-\\d{2}-\\d{2}/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d{2}-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d{2}/],[\"YYYY-DDD\",/\\d{4}-\\d{3}/]],isoTimes=[[\"HH:mm:ss.SSSS\",/(T| )\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss\",/(T| )\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/(T| )\\d\\d:\\d\\d/],[\"HH\",/(T| )\\d\\d/]],parseTimezoneChunker=/([\\+\\-]|\\d\\d)/gi,proxyGettersAndSetters=\"Date|Hours|Minutes|Seconds|Milliseconds\".split(\"|\"),unitMillisecondFactors={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},unitAliases={ms:\"millisecond\",s:\"second\",m:\"minute\",h:\"hour\",d:\"day\",D:\"date\",w:\"week\",W:\"isoWeek\",M:\"month\",Q:\"quarter\",y:\"year\",DDD:\"dayOfYear\",e:\"weekday\",E:\"isoWeekday\",gg:\"weekYear\",GG:\"isoWeekYear\"},camelFunctions={dayofyear:\"dayOfYear\",isoweekday:\"isoWeekday\",isoweek:\"isoWeek\",weekyear:\"weekYear\",isoweekyear:\"isoWeekYear\"},formatFunctions={},relativeTimeThresholds={s:45,m:45,h:22,d:26,M:11},ordinalizeTokens=\"DDD w W M D d\".split(\" \"),paddedTokens=\"M D H h m s w W\".split(\" \"),formatTokenFunctions={M:function(){return this.month()+1},MMM:function(format){return this.localeData().monthsShort(this,format)},MMMM:function(format){return this.localeData().months(this,format)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(format){return this.localeData().weekdaysMin(this,format)},ddd:function(format){return this.localeData().weekdaysShort(this,format)},dddd:function(format){return this.localeData().weekdays(this,format)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return leftZeroFill(this.year()%100,2)},YYYY:function(){return leftZeroFill(this.year(),4)},YYYYY:function(){return leftZeroFill(this.year(),5)},YYYYYY:function(){var y=this.year(),sign=y>=0?\"+\":\"-\";return sign+leftZeroFill(Math.abs(y),6)},gg:function(){return leftZeroFill(this.weekYear()%100,2)},gggg:function(){return leftZeroFill(this.weekYear(),4)},ggggg:function(){return leftZeroFill(this.weekYear(),5)},GG:function(){return leftZeroFill(this.isoWeekYear()%100,2)},GGGG:function(){return leftZeroFill(this.isoWeekYear(),4)},GGGGG:function(){return leftZeroFill(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),true)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),false)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return toInt(this.milliseconds()/100)},SS:function(){return leftZeroFill(toInt(this.milliseconds()/10),2)},SSS:function(){return leftZeroFill(this.milliseconds(),3)},SSSS:function(){return leftZeroFill(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b=\"+\";if(a<0){a=-a;b=\"-\"}return b+leftZeroFill(toInt(a/60),2)+\":\"+leftZeroFill(toInt(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b=\"+\";if(a<0){a=-a;b=\"-\"}return b+leftZeroFill(toInt(a/60),2)+leftZeroFill(toInt(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},deprecations={},lists=[\"months\",\"monthsShort\",\"weekdays\",\"weekdaysShort\",\"weekdaysMin\"],updateInProgress=false;function dfl(a,b,c){switch(arguments.length){case 2:return a!=null?a:b;case 3:return a!=null?a:b!=null?b:c;default:throw new Error(\"Implement me\")}}function hasOwnProp(a,b){return hasOwnProperty.call(a,b)}function defaultParsingFlags(){return{empty:false,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:false,invalidMonth:null,invalidFormat:false,userInvalidated:false,iso:false}}function printMsg(msg){if(moment.suppressDeprecationWarnings===false&&typeof console!==\"undefined\"&&console.warn){console.warn(\"Deprecation warning: \"+msg)}}function deprecate(msg,fn){var firstTime=true;return extend(function(){if(firstTime){printMsg(msg);firstTime=false}return fn.apply(this,arguments)},fn)}function deprecateSimple(name,msg){if(!deprecations[name]){printMsg(msg);deprecations[name]=true}}function padToken(func,count){return function(a){return leftZeroFill(func.call(this,a),count)}}function ordinalizeToken(func,period){return function(a){return this.localeData().ordinal(func.call(this,a),period)}}function monthDiff(a,b){var wholeMonthDiff=(b.year()-a.year())*12+(b.month()-a.month()),anchor=a.clone().add(wholeMonthDiff,\"months\"),anchor2,adjust;if(b-anchor<0){anchor2=a.clone().add(wholeMonthDiff-1,\"months\");adjust=(b-anchor)/(anchor-anchor2)}else{anchor2=a.clone().add(wholeMonthDiff+1,\"months\");adjust=(b-anchor)/(anchor2-anchor)}return-(wholeMonthDiff+adjust)}while(ordinalizeTokens.length){i=ordinalizeTokens.pop();formatTokenFunctions[i+\"o\"]=ordinalizeToken(formatTokenFunctions[i],i)}while(paddedTokens.length){i=paddedTokens.pop();formatTokenFunctions[i+i]=padToken(formatTokenFunctions[i],2)}formatTokenFunctions.DDDD=padToken(formatTokenFunctions.DDD,3);function meridiemFixWrap(locale,hour,meridiem){var isPm;if(meridiem==null){return hour}if(locale.meridiemHour!=null){return locale.meridiemHour(hour,meridiem)}else if(locale.isPM!=null){isPm=locale.isPM(meridiem);if(isPm&&hour<12){hour+=12}if(!isPm&&hour===12){hour=0}return hour}else{return hour}}function Locale(){}function Moment(config,skipOverflow){if(skipOverflow!==false){checkOverflow(config)}copyConfig(this,config);this._d=new Date(+config._d);if(updateInProgress===false){updateInProgress=true;moment.updateOffset(this);updateInProgress=false}}function Duration(duration){var normalizedInput=normalizeObjectUnits(duration),years=normalizedInput.year||0,quarters=normalizedInput.quarter||0,months=normalizedInput.month||0,weeks=normalizedInput.week||0,days=normalizedInput.day||0,hours=normalizedInput.hour||0,minutes=normalizedInput.minute||0,seconds=normalizedInput.second||0,milliseconds=normalizedInput.millisecond||0;this._milliseconds=+milliseconds+seconds*1e3+minutes*6e4+hours*36e5;this._days=+days+weeks*7;this._months=+months+quarters*3+years*12;this._data={};this._locale=moment.localeData();this._bubble()}function extend(a,b){for(var i in b){if(hasOwnProp(b,i)){a[i]=b[i]}}if(hasOwnProp(b,\"toString\")){a.toString=b.toString}if(hasOwnProp(b,\"valueOf\")){a.valueOf=b.valueOf}return a}function copyConfig(to,from){var i,prop,val;if(typeof from._isAMomentObject!==\"undefined\"){to._isAMomentObject=from._isAMomentObject}if(typeof from._i!==\"undefined\"){to._i=from._i}if(typeof from._f!==\"undefined\"){to._f=from._f}if(typeof from._l!==\"undefined\"){to._l=from._l}if(typeof from._strict!==\"undefined\"){to._strict=from._strict}if(typeof from._tzm!==\"undefined\"){to._tzm=from._tzm}if(typeof from._isUTC!==\"undefined\"){to._isUTC=from._isUTC}if(typeof from._offset!==\"undefined\"){to._offset=from._offset}if(typeof from._pf!==\"undefined\"){to._pf=from._pf}if(typeof from._locale!==\"undefined\"){to._locale=from._locale}if(momentProperties.length>0){for(i in momentProperties){prop=momentProperties[i];val=from[prop];if(typeof val!==\"undefined\"){to[prop]=val}}}return to}function absRound(number){if(number<0){return Math.ceil(number)}else{return Math.floor(number)}}function leftZeroFill(number,targetLength,forceSign){var output=\"\"+Math.abs(number),sign=number>=0;while(output.length<targetLength){output=\"0\"+output}return(sign?forceSign?\"+\":\"\":\"-\")+output}function positiveMomentsDifference(base,other){var res={milliseconds:0,months:0};res.months=other.month()-base.month()+(other.year()-base.year())*12;if(base.clone().add(res.months,\"M\").isAfter(other)){--res.months}res.milliseconds=+other-+base.clone().add(res.months,\"M\");return res}function momentsDifference(base,other){var res;other=makeAs(other,base);if(base.isBefore(other)){res=positiveMomentsDifference(base,other)}else{res=positiveMomentsDifference(other,base);res.milliseconds=-res.milliseconds;res.months=-res.months}return res}function createAdder(direction,name){return function(val,period){var dur,tmp;if(period!==null&&!isNaN(+period)){deprecateSimple(name,\"moment().\"+name+\"(period, number) is deprecated. Please use moment().\"+name+\"(number, period).\");tmp=val;val=period;period=tmp}val=typeof val===\"string\"?+val:val;dur=moment.duration(val,period);addOrSubtractDurationFromMoment(this,dur,direction);return this}}function addOrSubtractDurationFromMoment(mom,duration,isAdding,updateOffset){var milliseconds=duration._milliseconds,days=duration._days,months=duration._months;updateOffset=updateOffset==null?true:updateOffset;if(milliseconds){mom._d.setTime(+mom._d+milliseconds*isAdding)}if(days){rawSetter(mom,\"Date\",rawGetter(mom,\"Date\")+days*isAdding)}if(months){rawMonthSetter(mom,rawGetter(mom,\"Month\")+months*isAdding)}if(updateOffset){moment.updateOffset(mom,days||months)}}function isArray(input){return Object.prototype.toString.call(input)===\"[object Array]\"}function isDate(input){return Object.prototype.toString.call(input)===\"[object Date]\"||input instanceof Date}function compareArrays(array1,array2,dontConvert){var len=Math.min(array1.length,array2.length),lengthDiff=Math.abs(array1.length-array2.length),diffs=0,i;for(i=0;i<len;i++){if(dontConvert&&array1[i]!==array2[i]||!dontConvert&&toInt(array1[i])!==toInt(array2[i])){diffs++}}return diffs+lengthDiff}function normalizeUnits(units){if(units){var lowered=units.toLowerCase().replace(/(.)s$/,\"$1\");units=unitAliases[units]||camelFunctions[lowered]||lowered}return units}function normalizeObjectUnits(inputObject){var normalizedInput={},normalizedProp,prop;for(prop in inputObject){if(hasOwnProp(inputObject,prop)){normalizedProp=normalizeUnits(prop);if(normalizedProp){normalizedInput[normalizedProp]=inputObject[prop]}}}return normalizedInput}function makeList(field){var count,setter;if(field.indexOf(\"week\")===0){count=7;setter=\"day\"}else if(field.indexOf(\"month\")===0){count=12;setter=\"month\"}else{return}moment[field]=function(format,index){var i,getter,method=moment._locale[field],results=[];if(typeof format===\"number\"){index=format;format=undefined}getter=function(i){var m=moment().utc().set(setter,i);return method.call(moment._locale,m,format||\"\")};if(index!=null){return getter(index)}else{for(i=0;i<count;i++){results.push(getter(i))}return results}}}function toInt(argumentForCoercion){var coercedNumber=+argumentForCoercion,value=0;if(coercedNumber!==0&&isFinite(coercedNumber)){if(coercedNumber>=0){value=Math.floor(coercedNumber)}else{value=Math.ceil(coercedNumber)}}return value}function daysInMonth(year,month){return new Date(Date.UTC(year,month+1,0)).getUTCDate()}function weeksInYear(year,dow,doy){return weekOfYear(moment([year,11,31+dow-doy]),dow,doy).week}function daysInYear(year){return isLeapYear(year)?366:365}function isLeapYear(year){return year%4===0&&year%100!==0||year%400===0}function checkOverflow(m){var overflow;if(m._a&&m._pf.overflow===-2){overflow=m._a[MONTH]<0||m._a[MONTH]>11?MONTH:m._a[DATE]<1||m._a[DATE]>daysInMonth(m._a[YEAR],m._a[MONTH])?DATE:m._a[HOUR]<0||m._a[HOUR]>24||m._a[HOUR]===24&&(m._a[MINUTE]!==0||m._a[SECOND]!==0||m._a[MILLISECOND]!==0)?HOUR:m._a[MINUTE]<0||m._a[MINUTE]>59?MINUTE:m._a[SECOND]<0||m._a[SECOND]>59?SECOND:m._a[MILLISECOND]<0||m._a[MILLISECOND]>999?MILLISECOND:-1;if(m._pf._overflowDayOfYear&&(overflow<YEAR||overflow>DATE)){overflow=DATE}m._pf.overflow=overflow}}function isValid(m){if(m._isValid==null){m._isValid=!isNaN(m._d.getTime())&&m._pf.overflow<0&&!m._pf.empty&&!m._pf.invalidMonth&&!m._pf.nullInput&&!m._pf.invalidFormat&&!m._pf.userInvalidated;if(m._strict){m._isValid=m._isValid&&m._pf.charsLeftOver===0&&m._pf.unusedTokens.length===0&&m._pf.bigHour===undefined}}return m._isValid}function normalizeLocale(key){return key?key.toLowerCase().replace(\"_\",\"-\"):key}function chooseLocale(names){var i=0,j,next,locale,split;while(i<names.length){split=normalizeLocale(names[i]).split(\"-\");j=split.length;next=normalizeLocale(names[i+1]);next=next?next.split(\"-\"):null;while(j>0){locale=loadLocale(split.slice(0,j).join(\"-\"));if(locale){return locale}if(next&&next.length>=j&&compareArrays(split,next,true)>=j-1){break}j--}i++}return null}function loadLocale(name){var oldLocale=null;if(!locales[name]&&hasModule){try{oldLocale=moment.locale();!function webpackMissingModule(){var e=new Error('Cannot find module \"./locale\"');e.code=\"MODULE_NOT_FOUND\";throw e}();moment.locale(oldLocale)}catch(e){}}return locales[name]}function makeAs(input,model){var res,diff;if(model._isUTC){res=model.clone();diff=(moment.isMoment(input)||isDate(input)?+input:+moment(input))-+res;res._d.setTime(+res._d+diff);moment.updateOffset(res,false);return res}else{return moment(input).local()}}extend(Locale.prototype,{set:function(config){var prop,i;for(i in config){prop=config[i];if(typeof prop===\"function\"){this[i]=prop}else{this[\"_\"+i]=prop}}this._ordinalParseLenient=new RegExp(this._ordinalParse.source+\"|\"+/\\d{1,2}/.source)},_months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),months:function(m){return this._months[m.month()]},_monthsShort:\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),monthsShort:function(m){return this._monthsShort[m.month()]},monthsParse:function(monthName,format,strict){var i,mom,regex;if(!this._monthsParse){this._monthsParse=[];this._longMonthsParse=[];this._shortMonthsParse=[]}for(i=0;i<12;i++){mom=moment.utc([2e3,i]);if(strict&&!this._longMonthsParse[i]){this._longMonthsParse[i]=new RegExp(\"^\"+this.months(mom,\"\").replace(\".\",\"\")+\"$\",\"i\");this._shortMonthsParse[i]=new RegExp(\"^\"+this.monthsShort(mom,\"\").replace(\".\",\"\")+\"$\",\"i\")}if(!strict&&!this._monthsParse[i]){regex=\"^\"+this.months(mom,\"\")+\"|^\"+this.monthsShort(mom,\"\");this._monthsParse[i]=new RegExp(regex.replace(\".\",\"\"),\"i\")}if(strict&&format===\"MMMM\"&&this._longMonthsParse[i].test(monthName)){return i}else if(strict&&format===\"MMM\"&&this._shortMonthsParse[i].test(monthName)){return i}else if(!strict&&this._monthsParse[i].test(monthName)){return i}}},_weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),weekdays:function(m){return this._weekdays[m.day()]},_weekdaysShort:\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),weekdaysShort:function(m){return this._weekdaysShort[m.day()]},_weekdaysMin:\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),weekdaysMin:function(m){return this._weekdaysMin[m.day()]},weekdaysParse:function(weekdayName){var i,mom,regex;if(!this._weekdaysParse){this._weekdaysParse=[]}for(i=0;i<7;i++){if(!this._weekdaysParse[i]){mom=moment([2e3,1]).day(i);regex=\"^\"+this.weekdays(mom,\"\")+\"|^\"+this.weekdaysShort(mom,\"\")+\"|^\"+this.weekdaysMin(mom,\"\");this._weekdaysParse[i]=new RegExp(regex.replace(\".\",\"\"),\"i\")}if(this._weekdaysParse[i].test(weekdayName)){return i}}},_longDateFormat:{LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY LT\",LLLL:\"dddd, MMMM D, YYYY LT\"},longDateFormat:function(key){var output=this._longDateFormat[key];if(!output&&this._longDateFormat[key.toUpperCase()]){output=this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(val){return val.slice(1)});this._longDateFormat[key]=output}return output},isPM:function(input){return(input+\"\").toLowerCase().charAt(0)===\"p\"},_meridiemParse:/[ap]\\.?m?\\.?/i,meridiem:function(hours,minutes,isLower){if(hours>11){return isLower?\"pm\":\"PM\"}else{return isLower?\"am\":\"AM\"}},_calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},calendar:function(key,mom,now){var output=this._calendar[key];return typeof output===\"function\"?output.apply(mom,[now]):output},_relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},relativeTime:function(number,withoutSuffix,string,isFuture){var output=this._relativeTime[string];return typeof output===\"function\"?output(number,withoutSuffix,string,isFuture):output.replace(/%d/i,number)},pastFuture:function(diff,output){var format=this._relativeTime[diff>0?\"future\":\"past\"];return typeof format===\"function\"?format(output):format.replace(/%s/i,output)},ordinal:function(number){return this._ordinal.replace(\"%d\",number)},_ordinal:\"%d\",_ordinalParse:/\\d{1,2}/,preparse:function(string){return string},postformat:function(string){return string},week:function(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:\"Invalid date\",invalidDate:function(){return this._invalidDate}});function removeFormattingTokens(input){if(input.match(/\\[[\\s\\S]/)){return input.replace(/^\\[|\\]$/g,\"\")}return input.replace(/\\\\/g,\"\")}function makeFormatFunction(format){var array=format.match(formattingTokens),i,length;for(i=0,length=array.length;i<length;i++){if(formatTokenFunctions[array[i]]){array[i]=formatTokenFunctions[array[i]]}else{array[i]=removeFormattingTokens(array[i])}}return function(mom){var output=\"\";for(i=0;i<length;i++){output+=array[i]instanceof Function?array[i].call(mom,format):array[i]}return output}}function formatMoment(m,format){if(!m.isValid()){return m.localeData().invalidDate()}format=expandFormat(format,m.localeData());if(!formatFunctions[format]){formatFunctions[format]=makeFormatFunction(format)}return formatFunctions[format](m)}function expandFormat(format,locale){var i=5;function replaceLongDateFormatTokens(input){return locale.longDateFormat(input)||input}localFormattingTokens.lastIndex=0;while(i>=0&&localFormattingTokens.test(format)){format=format.replace(localFormattingTokens,replaceLongDateFormatTokens);localFormattingTokens.lastIndex=0;i-=1}return format}function getParseRegexForToken(token,config){var a,strict=config._strict;switch(token){case\"Q\":return parseTokenOneDigit;case\"DDDD\":return parseTokenThreeDigits;case\"YYYY\":case\"GGGG\":case\"gggg\":return strict?parseTokenFourDigits:parseTokenOneToFourDigits;case\"Y\":case\"G\":case\"g\":return parseTokenSignedNumber;case\"YYYYYY\":case\"YYYYY\":case\"GGGGG\":case\"ggggg\":return strict?parseTokenSixDigits:parseTokenOneToSixDigits;case\"S\":if(strict){return parseTokenOneDigit}case\"SS\":if(strict){return parseTokenTwoDigits}case\"SSS\":if(strict){return parseTokenThreeDigits}case\"DDD\":return parseTokenOneToThreeDigits;case\"MMM\":case\"MMMM\":case\"dd\":case\"ddd\":case\"dddd\":return parseTokenWord;case\"a\":case\"A\":return config._locale._meridiemParse;case\"x\":return parseTokenOffsetMs;case\"X\":return parseTokenTimestampMs;case\"Z\":case\"ZZ\":return parseTokenTimezone;case\"T\":return parseTokenT;case\"SSSS\":return parseTokenDigits;case\"MM\":case\"DD\":case\"YY\":case\"GG\":case\"gg\":case\"HH\":case\"hh\":case\"mm\":case\"ss\":case\"ww\":case\"WW\":return strict?parseTokenTwoDigits:parseTokenOneOrTwoDigits;case\"M\":case\"D\":case\"d\":case\"H\":case\"h\":case\"m\":case\"s\":case\"w\":case\"W\":case\"e\":case\"E\":return parseTokenOneOrTwoDigits;case\"Do\":return strict?config._locale._ordinalParse:config._locale._ordinalParseLenient;default:a=new RegExp(regexpEscape(unescapeFormat(token.replace(\"\\\\\",\"\")),\"i\"));return a}}function utcOffsetFromString(string){string=string||\"\";var possibleTzMatches=string.match(parseTokenTimezone)||[],tzChunk=possibleTzMatches[possibleTzMatches.length-1]||[],parts=(tzChunk+\"\").match(parseTimezoneChunker)||[\"-\",0,0],minutes=+(parts[1]*60)+toInt(parts[2]);return parts[0]===\"+\"?minutes:-minutes}function addTimeToArrayFromToken(token,input,config){var a,datePartArray=config._a;switch(token){case\"Q\":if(input!=null){datePartArray[MONTH]=(toInt(input)-1)*3}break;case\"M\":case\"MM\":if(input!=null){datePartArray[MONTH]=toInt(input)-1}break;case\"MMM\":case\"MMMM\":a=config._locale.monthsParse(input,token,config._strict);if(a!=null){datePartArray[MONTH]=a}else{config._pf.invalidMonth=input}break;case\"D\":case\"DD\":if(input!=null){datePartArray[DATE]=toInt(input)}break;case\"Do\":if(input!=null){datePartArray[DATE]=toInt(parseInt(input.match(/\\d{1,2}/)[0],10))}break;case\"DDD\":case\"DDDD\":if(input!=null){config._dayOfYear=toInt(input)}break;case\"YY\":datePartArray[YEAR]=moment.parseTwoDigitYear(input);break;case\"YYYY\":case\"YYYYY\":case\"YYYYYY\":datePartArray[YEAR]=toInt(input);break;case\"a\":case\"A\":config._meridiem=input;break;case\"h\":case\"hh\":config._pf.bigHour=true;case\"H\":case\"HH\":datePartArray[HOUR]=toInt(input);break;case\"m\":case\"mm\":datePartArray[MINUTE]=toInt(input);break;case\"s\":case\"ss\":datePartArray[SECOND]=toInt(input);break;case\"S\":case\"SS\":case\"SSS\":case\"SSSS\":datePartArray[MILLISECOND]=toInt((\"0.\"+input)*1e3);break;case\"x\":config._d=new Date(toInt(input));break;case\"X\":config._d=new Date(parseFloat(input)*1e3);break;case\"Z\":case\"ZZ\":config._useUTC=true;config._tzm=utcOffsetFromString(input);break;case\"dd\":case\"ddd\":case\"dddd\":a=config._locale.weekdaysParse(input);if(a!=null){config._w=config._w||{};config._w[\"d\"]=a}else{config._pf.invalidWeekday=input}break;case\"w\":case\"ww\":case\"W\":case\"WW\":case\"d\":case\"e\":case\"E\":token=token.substr(0,1);case\"gggg\":case\"GGGG\":case\"GGGGG\":token=token.substr(0,2);if(input){config._w=config._w||{};config._w[token]=toInt(input)}break;case\"gg\":case\"GG\":config._w=config._w||{};config._w[token]=moment.parseTwoDigitYear(input)}}function dayOfYearFromWeekInfo(config){var w,weekYear,week,weekday,dow,doy,temp;w=config._w;if(w.GG!=null||w.W!=null||w.E!=null){dow=1;doy=4;weekYear=dfl(w.GG,config._a[YEAR],weekOfYear(moment(),1,4).year);week=dfl(w.W,1);weekday=dfl(w.E,1)}else{dow=config._locale._week.dow;doy=config._locale._week.doy;weekYear=dfl(w.gg,config._a[YEAR],weekOfYear(moment(),dow,doy).year);week=dfl(w.w,1);if(w.d!=null){weekday=w.d;if(weekday<dow){++week}}else if(w.e!=null){weekday=w.e+dow}else{weekday=dow}}temp=dayOfYearFromWeeks(weekYear,week,weekday,doy,dow);config._a[YEAR]=temp.year;config._dayOfYear=temp.dayOfYear}function dateFromConfig(config){var i,date,input=[],currentDate,yearToUse;if(config._d){return}currentDate=currentDateArray(config);if(config._w&&config._a[DATE]==null&&config._a[MONTH]==null){dayOfYearFromWeekInfo(config)}if(config._dayOfYear){yearToUse=dfl(config._a[YEAR],currentDate[YEAR]);if(config._dayOfYear>daysInYear(yearToUse)){config._pf._overflowDayOfYear=true}date=makeUTCDate(yearToUse,0,config._dayOfYear);config._a[MONTH]=date.getUTCMonth();config._a[DATE]=date.getUTCDate()}for(i=0;i<3&&config._a[i]==null;++i){config._a[i]=input[i]=currentDate[i]}for(;i<7;i++){config._a[i]=input[i]=config._a[i]==null?i===2?1:0:config._a[i]}if(config._a[HOUR]===24&&config._a[MINUTE]===0&&config._a[SECOND]===0&&config._a[MILLISECOND]===0){config._nextDay=true;config._a[HOUR]=0}config._d=(config._useUTC?makeUTCDate:makeDate).apply(null,input);if(config._tzm!=null){config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm)}if(config._nextDay){config._a[HOUR]=24}}function dateFromObject(config){var normalizedInput;if(config._d){return}normalizedInput=normalizeObjectUnits(config._i);config._a=[normalizedInput.year,normalizedInput.month,normalizedInput.day||normalizedInput.date,normalizedInput.hour,normalizedInput.minute,normalizedInput.second,normalizedInput.millisecond];dateFromConfig(config)}function currentDateArray(config){var now=new Date;if(config._useUTC){return[now.getUTCFullYear(),now.getUTCMonth(),now.getUTCDate()]}else{return[now.getFullYear(),now.getMonth(),now.getDate()]}}function makeDateFromStringAndFormat(config){if(config._f===moment.ISO_8601){parseISO(config);\nreturn}config._a=[];config._pf.empty=true;var string=\"\"+config._i,i,parsedInput,tokens,token,skipped,stringLength=string.length,totalParsedInputLength=0;tokens=expandFormat(config._f,config._locale).match(formattingTokens)||[];for(i=0;i<tokens.length;i++){token=tokens[i];parsedInput=(string.match(getParseRegexForToken(token,config))||[])[0];if(parsedInput){skipped=string.substr(0,string.indexOf(parsedInput));if(skipped.length>0){config._pf.unusedInput.push(skipped)}string=string.slice(string.indexOf(parsedInput)+parsedInput.length);totalParsedInputLength+=parsedInput.length}if(formatTokenFunctions[token]){if(parsedInput){config._pf.empty=false}else{config._pf.unusedTokens.push(token)}addTimeToArrayFromToken(token,parsedInput,config)}else if(config._strict&&!parsedInput){config._pf.unusedTokens.push(token)}}config._pf.charsLeftOver=stringLength-totalParsedInputLength;if(string.length>0){config._pf.unusedInput.push(string)}if(config._pf.bigHour===true&&config._a[HOUR]<=12){config._pf.bigHour=undefined}config._a[HOUR]=meridiemFixWrap(config._locale,config._a[HOUR],config._meridiem);dateFromConfig(config);checkOverflow(config)}function unescapeFormat(s){return s.replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(matched,p1,p2,p3,p4){return p1||p2||p3||p4})}function regexpEscape(s){return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}function makeDateFromStringAndArray(config){var tempConfig,bestMoment,scoreToBeat,i,currentScore;if(config._f.length===0){config._pf.invalidFormat=true;config._d=new Date(NaN);return}for(i=0;i<config._f.length;i++){currentScore=0;tempConfig=copyConfig({},config);if(config._useUTC!=null){tempConfig._useUTC=config._useUTC}tempConfig._pf=defaultParsingFlags();tempConfig._f=config._f[i];makeDateFromStringAndFormat(tempConfig);if(!isValid(tempConfig)){continue}currentScore+=tempConfig._pf.charsLeftOver;currentScore+=tempConfig._pf.unusedTokens.length*10;tempConfig._pf.score=currentScore;if(scoreToBeat==null||currentScore<scoreToBeat){scoreToBeat=currentScore;bestMoment=tempConfig}}extend(config,bestMoment||tempConfig)}function parseISO(config){var i,l,string=config._i,match=isoRegex.exec(string);if(match){config._pf.iso=true;for(i=0,l=isoDates.length;i<l;i++){if(isoDates[i][1].exec(string)){config._f=isoDates[i][0]+(match[6]||\" \");break}}for(i=0,l=isoTimes.length;i<l;i++){if(isoTimes[i][1].exec(string)){config._f+=isoTimes[i][0];break}}if(string.match(parseTokenTimezone)){config._f+=\"Z\"}makeDateFromStringAndFormat(config)}else{config._isValid=false}}function makeDateFromString(config){parseISO(config);if(config._isValid===false){delete config._isValid;moment.createFromInputFallback(config)}}function map(arr,fn){var res=[],i;for(i=0;i<arr.length;++i){res.push(fn(arr[i],i))}return res}function makeDateFromInput(config){var input=config._i,matched;if(input===undefined){config._d=new Date}else if(isDate(input)){config._d=new Date(+input)}else if((matched=aspNetJsonRegex.exec(input))!==null){config._d=new Date(+matched[1])}else if(typeof input===\"string\"){makeDateFromString(config)}else if(isArray(input)){config._a=map(input.slice(0),function(obj){return parseInt(obj,10)});dateFromConfig(config)}else if(typeof input===\"object\"){dateFromObject(config)}else if(typeof input===\"number\"){config._d=new Date(input)}else{moment.createFromInputFallback(config)}}function makeDate(y,m,d,h,M,s,ms){var date=new Date(y,m,d,h,M,s,ms);if(y<1970){date.setFullYear(y)}return date}function makeUTCDate(y){var date=new Date(Date.UTC.apply(null,arguments));if(y<1970){date.setUTCFullYear(y)}return date}function parseWeekday(input,locale){if(typeof input===\"string\"){if(!isNaN(input)){input=parseInt(input,10)}else{input=locale.weekdaysParse(input);if(typeof input!==\"number\"){return null}}}return input}function substituteTimeAgo(string,number,withoutSuffix,isFuture,locale){return locale.relativeTime(number||1,!!withoutSuffix,string,isFuture)}function relativeTime(posNegDuration,withoutSuffix,locale){var duration=moment.duration(posNegDuration).abs(),seconds=round(duration.as(\"s\")),minutes=round(duration.as(\"m\")),hours=round(duration.as(\"h\")),days=round(duration.as(\"d\")),months=round(duration.as(\"M\")),years=round(duration.as(\"y\")),args=seconds<relativeTimeThresholds.s&&[\"s\",seconds]||minutes===1&&[\"m\"]||minutes<relativeTimeThresholds.m&&[\"mm\",minutes]||hours===1&&[\"h\"]||hours<relativeTimeThresholds.h&&[\"hh\",hours]||days===1&&[\"d\"]||days<relativeTimeThresholds.d&&[\"dd\",days]||months===1&&[\"M\"]||months<relativeTimeThresholds.M&&[\"MM\",months]||years===1&&[\"y\"]||[\"yy\",years];args[2]=withoutSuffix;args[3]=+posNegDuration>0;args[4]=locale;return substituteTimeAgo.apply({},args)}function weekOfYear(mom,firstDayOfWeek,firstDayOfWeekOfYear){var end=firstDayOfWeekOfYear-firstDayOfWeek,daysToDayOfWeek=firstDayOfWeekOfYear-mom.day(),adjustedMoment;if(daysToDayOfWeek>end){daysToDayOfWeek-=7}if(daysToDayOfWeek<end-7){daysToDayOfWeek+=7}adjustedMoment=moment(mom).add(daysToDayOfWeek,\"d\");return{week:Math.ceil(adjustedMoment.dayOfYear()/7),year:adjustedMoment.year()}}function dayOfYearFromWeeks(year,week,weekday,firstDayOfWeekOfYear,firstDayOfWeek){var d=makeUTCDate(year,0,1).getUTCDay(),daysToAdd,dayOfYear;d=d===0?7:d;weekday=weekday!=null?weekday:firstDayOfWeek;daysToAdd=firstDayOfWeek-d+(d>firstDayOfWeekOfYear?7:0)-(d<firstDayOfWeek?7:0);dayOfYear=7*(week-1)+(weekday-firstDayOfWeek)+daysToAdd+1;return{year:dayOfYear>0?year:year-1,dayOfYear:dayOfYear>0?dayOfYear:daysInYear(year-1)+dayOfYear}}function makeMoment(config){var input=config._i,format=config._f,res;config._locale=config._locale||moment.localeData(config._l);if(input===null||format===undefined&&input===\"\"){return moment.invalid({nullInput:true})}if(typeof input===\"string\"){config._i=input=config._locale.preparse(input)}if(moment.isMoment(input)){return new Moment(input,true)}else if(format){if(isArray(format)){makeDateFromStringAndArray(config)}else{makeDateFromStringAndFormat(config)}}else{makeDateFromInput(config)}res=new Moment(config);if(res._nextDay){res.add(1,\"d\");res._nextDay=undefined}return res}moment=function(input,format,locale,strict){var c;if(typeof locale===\"boolean\"){strict=locale;locale=undefined}c={};c._isAMomentObject=true;c._i=input;c._f=format;c._l=locale;c._strict=strict;c._isUTC=false;c._pf=defaultParsingFlags();return makeMoment(c)};moment.suppressDeprecationWarnings=false;moment.createFromInputFallback=deprecate(\"moment construction falls back to js Date. This is \"+\"discouraged and will be removed in upcoming major \"+\"release. Please refer to \"+\"https://github.com/moment/moment/issues/1407 for more info.\",function(config){config._d=new Date(config._i+(config._useUTC?\" UTC\":\"\"))});function pickBy(fn,moments){var res,i;if(moments.length===1&&isArray(moments[0])){moments=moments[0]}if(!moments.length){return moment()}res=moments[0];for(i=1;i<moments.length;++i){if(moments[i][fn](res)){res=moments[i]}}return res}moment.min=function(){var args=[].slice.call(arguments,0);return pickBy(\"isBefore\",args)};moment.max=function(){var args=[].slice.call(arguments,0);return pickBy(\"isAfter\",args)};moment.utc=function(input,format,locale,strict){var c;if(typeof locale===\"boolean\"){strict=locale;locale=undefined}c={};c._isAMomentObject=true;c._useUTC=true;c._isUTC=true;c._l=locale;c._i=input;c._f=format;c._strict=strict;c._pf=defaultParsingFlags();return makeMoment(c).utc()};moment.unix=function(input){return moment(input*1e3)};moment.duration=function(input,key){var duration=input,match=null,sign,ret,parseIso,diffRes;if(moment.isDuration(input)){duration={ms:input._milliseconds,d:input._days,M:input._months}}else if(typeof input===\"number\"){duration={};if(key){duration[key]=input}else{duration.milliseconds=input}}else if(!!(match=aspNetTimeSpanJsonRegex.exec(input))){sign=match[1]===\"-\"?-1:1;duration={y:0,d:toInt(match[DATE])*sign,h:toInt(match[HOUR])*sign,m:toInt(match[MINUTE])*sign,s:toInt(match[SECOND])*sign,ms:toInt(match[MILLISECOND])*sign}}else if(!!(match=isoDurationRegex.exec(input))){sign=match[1]===\"-\"?-1:1;parseIso=function(inp){var res=inp&&parseFloat(inp.replace(\",\",\".\"));return(isNaN(res)?0:res)*sign};duration={y:parseIso(match[2]),M:parseIso(match[3]),d:parseIso(match[4]),h:parseIso(match[5]),m:parseIso(match[6]),s:parseIso(match[7]),w:parseIso(match[8])}}else if(duration==null){duration={}}else if(typeof duration===\"object\"&&(\"from\"in duration||\"to\"in duration)){diffRes=momentsDifference(moment(duration.from),moment(duration.to));duration={};duration.ms=diffRes.milliseconds;duration.M=diffRes.months}ret=new Duration(duration);if(moment.isDuration(input)&&hasOwnProp(input,\"_locale\")){ret._locale=input._locale}return ret};moment.version=VERSION;moment.defaultFormat=isoFormat;moment.ISO_8601=function(){};moment.momentProperties=momentProperties;moment.updateOffset=function(){};moment.relativeTimeThreshold=function(threshold,limit){if(relativeTimeThresholds[threshold]===undefined){return false}if(limit===undefined){return relativeTimeThresholds[threshold]}relativeTimeThresholds[threshold]=limit;return true};moment.lang=deprecate(\"moment.lang is deprecated. Use moment.locale instead.\",function(key,value){return moment.locale(key,value)});moment.locale=function(key,values){var data;if(key){if(typeof values!==\"undefined\"){data=moment.defineLocale(key,values)}else{data=moment.localeData(key)}if(data){moment.duration._locale=moment._locale=data}}return moment._locale._abbr};moment.defineLocale=function(name,values){if(values!==null){values.abbr=name;if(!locales[name]){locales[name]=new Locale}locales[name].set(values);moment.locale(name);return locales[name]}else{delete locales[name];return null}};moment.langData=deprecate(\"moment.langData is deprecated. Use moment.localeData instead.\",function(key){return moment.localeData(key)});moment.localeData=function(key){var locale;if(key&&key._locale&&key._locale._abbr){key=key._locale._abbr}if(!key){return moment._locale}if(!isArray(key)){locale=loadLocale(key);if(locale){return locale}key=[key]}return chooseLocale(key)};moment.isMoment=function(obj){return obj instanceof Moment||obj!=null&&hasOwnProp(obj,\"_isAMomentObject\")};moment.isDuration=function(obj){return obj instanceof Duration};for(i=lists.length-1;i>=0;--i){makeList(lists[i])}moment.normalizeUnits=function(units){return normalizeUnits(units)};moment.invalid=function(flags){var m=moment.utc(NaN);if(flags!=null){extend(m._pf,flags)}else{m._pf.userInvalidated=true}return m};moment.parseZone=function(){return moment.apply(null,arguments).parseZone()};moment.parseTwoDigitYear=function(input){return toInt(input)+(toInt(input)>68?1900:2e3)};moment.isDate=isDate;extend(moment.fn=Moment.prototype,{clone:function(){return moment(this)},valueOf:function(){return+this._d-(this._offset||0)*6e4},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var m=moment(this).utc();if(0<m.year()&&m.year()<=9999){if(\"function\"===typeof Date.prototype.toISOString){return this.toDate().toISOString()}else{return formatMoment(m,\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\")}}else{return formatMoment(m,\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\")}},toArray:function(){var m=this;return[m.year(),m.month(),m.date(),m.hours(),m.minutes(),m.seconds(),m.milliseconds()]},isValid:function(){return isValid(this)},isDSTShifted:function(){if(this._a){return this.isValid()&&compareArrays(this._a,(this._isUTC?moment.utc(this._a):moment(this._a)).toArray())>0}return false},parsingFlags:function(){return extend({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(keepLocalTime){return this.utcOffset(0,keepLocalTime)},local:function(keepLocalTime){if(this._isUTC){this.utcOffset(0,keepLocalTime);this._isUTC=false;if(keepLocalTime){this.subtract(this._dateUtcOffset(),\"m\")}}return this},format:function(inputString){var output=formatMoment(this,inputString||moment.defaultFormat);return this.localeData().postformat(output)},add:createAdder(1,\"add\"),subtract:createAdder(-1,\"subtract\"),diff:function(input,units,asFloat){var that=makeAs(input,this),zoneDiff=(that.utcOffset()-this.utcOffset())*6e4,anchor,diff,output,daysAdjust;units=normalizeUnits(units);if(units===\"year\"||units===\"month\"||units===\"quarter\"){output=monthDiff(this,that);if(units===\"quarter\"){output=output/3}else if(units===\"year\"){output=output/12}}else{diff=this-that;output=units===\"second\"?diff/1e3:units===\"minute\"?diff/6e4:units===\"hour\"?diff/36e5:units===\"day\"?(diff-zoneDiff)/864e5:units===\"week\"?(diff-zoneDiff)/6048e5:diff}return asFloat?output:absRound(output)},from:function(time,withoutSuffix){return moment.duration({to:this,from:time}).locale(this.locale()).humanize(!withoutSuffix)},fromNow:function(withoutSuffix){return this.from(moment(),withoutSuffix)},calendar:function(time){var now=time||moment(),sod=makeAs(now,this).startOf(\"day\"),diff=this.diff(sod,\"days\",true),format=diff<-6?\"sameElse\":diff<-1?\"lastWeek\":diff<0?\"lastDay\":diff<1?\"sameDay\":diff<2?\"nextDay\":diff<7?\"nextWeek\":\"sameElse\";return this.format(this.localeData().calendar(format,this,moment(now)))},isLeapYear:function(){return isLeapYear(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(input){var day=this._isUTC?this._d.getUTCDay():this._d.getDay();if(input!=null){input=parseWeekday(input,this.localeData());return this.add(input-day,\"d\")}else{return day}},month:makeAccessor(\"Month\",true),startOf:function(units){units=normalizeUnits(units);switch(units){case\"year\":this.month(0);case\"quarter\":case\"month\":this.date(1);case\"week\":case\"isoWeek\":case\"day\":this.hours(0);case\"hour\":this.minutes(0);case\"minute\":this.seconds(0);case\"second\":this.milliseconds(0)}if(units===\"week\"){this.weekday(0)}else if(units===\"isoWeek\"){this.isoWeekday(1)}if(units===\"quarter\"){this.month(Math.floor(this.month()/3)*3)}return this},endOf:function(units){units=normalizeUnits(units);if(units===undefined||units===\"millisecond\"){return this}return this.startOf(units).add(1,units===\"isoWeek\"?\"week\":units).subtract(1,\"ms\")},isAfter:function(input,units){var inputMs;units=normalizeUnits(typeof units!==\"undefined\"?units:\"millisecond\");if(units===\"millisecond\"){input=moment.isMoment(input)?input:moment(input);return+this>+input}else{inputMs=moment.isMoment(input)?+input:+moment(input);return inputMs<+this.clone().startOf(units)}},isBefore:function(input,units){var inputMs;units=normalizeUnits(typeof units!==\"undefined\"?units:\"millisecond\");if(units===\"millisecond\"){input=moment.isMoment(input)?input:moment(input);return+this<+input}else{inputMs=moment.isMoment(input)?+input:+moment(input);return+this.clone().endOf(units)<inputMs}},isBetween:function(from,to,units){return this.isAfter(from,units)&&this.isBefore(to,units)},isSame:function(input,units){var inputMs;units=normalizeUnits(units||\"millisecond\");if(units===\"millisecond\"){input=moment.isMoment(input)?input:moment(input);return+this===+input}else{inputMs=+moment(input);return+this.clone().startOf(units)<=inputMs&&inputMs<=+this.clone().endOf(units)}},min:deprecate(\"moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548\",function(other){other=moment.apply(null,arguments);return other<this?this:other}),max:deprecate(\"moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548\",function(other){other=moment.apply(null,arguments);return other>this?this:other}),zone:deprecate(\"moment().zone is deprecated, use moment().utcOffset instead. \"+\"https://github.com/moment/moment/issues/1779\",function(input,keepLocalTime){if(input!=null){if(typeof input!==\"string\"){input=-input}this.utcOffset(input,keepLocalTime);return this}else{return-this.utcOffset()}}),utcOffset:function(input,keepLocalTime){var offset=this._offset||0,localAdjust;if(input!=null){if(typeof input===\"string\"){input=utcOffsetFromString(input)}if(Math.abs(input)<16){input=input*60}if(!this._isUTC&&keepLocalTime){localAdjust=this._dateUtcOffset()}this._offset=input;this._isUTC=true;if(localAdjust!=null){this.add(localAdjust,\"m\")}if(offset!==input){if(!keepLocalTime||this._changeInProgress){addOrSubtractDurationFromMoment(this,moment.duration(input-offset,\"m\"),1,false)}else if(!this._changeInProgress){this._changeInProgress=true;moment.updateOffset(this,true);this._changeInProgress=null}}return this}else{return this._isUTC?offset:this._dateUtcOffset()}},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&this._offset===0},zoneAbbr:function(){return this._isUTC?\"UTC\":\"\"},zoneName:function(){return this._isUTC?\"Coordinated Universal Time\":\"\"},parseZone:function(){if(this._tzm){this.utcOffset(this._tzm)}else if(typeof this._i===\"string\"){this.utcOffset(utcOffsetFromString(this._i))}return this},hasAlignedHourOffset:function(input){if(!input){input=0}else{input=moment(input).utcOffset()}return(this.utcOffset()-input)%60===0},daysInMonth:function(){return daysInMonth(this.year(),this.month())},dayOfYear:function(input){var dayOfYear=round((moment(this).startOf(\"day\")-moment(this).startOf(\"year\"))/864e5)+1;return input==null?dayOfYear:this.add(input-dayOfYear,\"d\")},quarter:function(input){return input==null?Math.ceil((this.month()+1)/3):this.month((input-1)*3+this.month()%3)},weekYear:function(input){var year=weekOfYear(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return input==null?year:this.add(input-year,\"y\")},isoWeekYear:function(input){var year=weekOfYear(this,1,4).year;return input==null?year:this.add(input-year,\"y\")},week:function(input){var week=this.localeData().week(this);return input==null?week:this.add((input-week)*7,\"d\")},isoWeek:function(input){var week=weekOfYear(this,1,4).week;return input==null?week:this.add((input-week)*7,\"d\")},weekday:function(input){var weekday=(this.day()+7-this.localeData()._week.dow)%7;return input==null?weekday:this.add(input-weekday,\"d\")},isoWeekday:function(input){return input==null?this.day()||7:this.day(this.day()%7?input:input-7)},isoWeeksInYear:function(){return weeksInYear(this.year(),1,4)},weeksInYear:function(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy)},get:function(units){units=normalizeUnits(units);return this[units]()},set:function(units,value){var unit;if(typeof units===\"object\"){for(unit in units){this.set(unit,units[unit])}}else{units=normalizeUnits(units);if(typeof this[units]===\"function\"){this[units](value)}}return this},locale:function(key){var newLocaleData;if(key===undefined){return this._locale._abbr}else{newLocaleData=moment.localeData(key);if(newLocaleData!=null){this._locale=newLocaleData}return this}},lang:deprecate(\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\",function(key){if(key===undefined){return this.localeData()}else{return this.locale(key)}}),localeData:function(){return this._locale},_dateUtcOffset:function(){return-Math.round(this._d.getTimezoneOffset()/15)*15}});function rawMonthSetter(mom,value){var dayOfMonth;if(typeof value===\"string\"){value=mom.localeData().monthsParse(value);if(typeof value!==\"number\"){return mom}}dayOfMonth=Math.min(mom.date(),daysInMonth(mom.year(),value));mom._d[\"set\"+(mom._isUTC?\"UTC\":\"\")+\"Month\"](value,dayOfMonth);return mom}function rawGetter(mom,unit){return mom._d[\"get\"+(mom._isUTC?\"UTC\":\"\")+unit]()}function rawSetter(mom,unit,value){if(unit===\"Month\"){return rawMonthSetter(mom,value)}else{return mom._d[\"set\"+(mom._isUTC?\"UTC\":\"\")+unit](value)}}function makeAccessor(unit,keepTime){return function(value){if(value!=null){rawSetter(this,unit,value);moment.updateOffset(this,keepTime);return this}else{return rawGetter(this,unit)}}}moment.fn.millisecond=moment.fn.milliseconds=makeAccessor(\"Milliseconds\",false);moment.fn.second=moment.fn.seconds=makeAccessor(\"Seconds\",false);moment.fn.minute=moment.fn.minutes=makeAccessor(\"Minutes\",false);moment.fn.hour=moment.fn.hours=makeAccessor(\"Hours\",true);moment.fn.date=makeAccessor(\"Date\",true);moment.fn.dates=deprecate(\"dates accessor is deprecated. Use date instead.\",makeAccessor(\"Date\",true));moment.fn.year=makeAccessor(\"FullYear\",true);moment.fn.years=deprecate(\"years accessor is deprecated. Use year instead.\",makeAccessor(\"FullYear\",true));moment.fn.days=moment.fn.day;moment.fn.months=moment.fn.month;moment.fn.weeks=moment.fn.week;moment.fn.isoWeeks=moment.fn.isoWeek;moment.fn.quarters=moment.fn.quarter;moment.fn.toJSON=moment.fn.toISOString;moment.fn.isUTC=moment.fn.isUtc;function daysToYears(days){return days*400/146097}function yearsToDays(years){return years*146097/400}extend(moment.duration.fn=Duration.prototype,{_bubble:function(){var milliseconds=this._milliseconds,days=this._days,months=this._months,data=this._data,seconds,minutes,hours,years=0;data.milliseconds=milliseconds%1e3;seconds=absRound(milliseconds/1e3);data.seconds=seconds%60;minutes=absRound(seconds/60);data.minutes=minutes%60;hours=absRound(minutes/60);data.hours=hours%24;days+=absRound(hours/24);years=absRound(daysToYears(days));days-=absRound(yearsToDays(years));months+=absRound(days/30);days%=30;years+=absRound(months/12);months%=12;data.days=days;data.months=months;data.years=years},abs:function(){this._milliseconds=Math.abs(this._milliseconds);this._days=Math.abs(this._days);this._months=Math.abs(this._months);this._data.milliseconds=Math.abs(this._data.milliseconds);this._data.seconds=Math.abs(this._data.seconds);this._data.minutes=Math.abs(this._data.minutes);this._data.hours=Math.abs(this._data.hours);this._data.months=Math.abs(this._data.months);this._data.years=Math.abs(this._data.years);return this},weeks:function(){return absRound(this.days()/7)},valueOf:function(){return this._milliseconds+this._days*864e5+this._months%12*2592e6+toInt(this._months/12)*31536e6},humanize:function(withSuffix){var output=relativeTime(this,!withSuffix,this.localeData());if(withSuffix){output=this.localeData().pastFuture(+this,output)}return this.localeData().postformat(output)},add:function(input,val){var dur=moment.duration(input,val);this._milliseconds+=dur._milliseconds;this._days+=dur._days;this._months+=dur._months;this._bubble();return this},subtract:function(input,val){var dur=moment.duration(input,val);this._milliseconds-=dur._milliseconds;this._days-=dur._days;this._months-=dur._months;this._bubble();return this},get:function(units){units=normalizeUnits(units);return this[units.toLowerCase()+\"s\"]()},as:function(units){var days,months;units=normalizeUnits(units);if(units===\"month\"||units===\"year\"){days=this._days+this._milliseconds/864e5;months=this._months+daysToYears(days)*12;return units===\"month\"?months:months/12}else{days=this._days+Math.round(yearsToDays(this._months/12));switch(units){case\"week\":return days/7+this._milliseconds/6048e5;case\"day\":return days+this._milliseconds/864e5;case\"hour\":return days*24+this._milliseconds/36e5;case\"minute\":return days*24*60+this._milliseconds/6e4;case\"second\":return days*24*60*60+this._milliseconds/1e3;case\"millisecond\":return Math.floor(days*24*60*60*1e3)+this._milliseconds;default:throw new Error(\"Unknown unit \"+units)}}},lang:moment.fn.lang,locale:moment.fn.locale,toIsoString:deprecate(\"toIsoString() is deprecated. Please use toISOString() instead \"+\"(notice the capitals)\",function(){return this.toISOString()}),toISOString:function(){var years=Math.abs(this.years()),months=Math.abs(this.months()),days=Math.abs(this.days()),hours=Math.abs(this.hours()),minutes=Math.abs(this.minutes()),seconds=Math.abs(this.seconds()+this.milliseconds()/1e3);if(!this.asSeconds()){return\"P0D\"}return(this.asSeconds()<0?\"-\":\"\")+\"P\"+(years?years+\"Y\":\"\")+(months?months+\"M\":\"\")+(days?days+\"D\":\"\")+(hours||minutes||seconds?\"T\":\"\")+(hours?hours+\"H\":\"\")+(minutes?minutes+\"M\":\"\")+(seconds?seconds+\"S\":\"\")},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}});moment.duration.fn.toString=moment.duration.fn.toISOString;function makeDurationGetter(name){moment.duration.fn[name]=function(){return this._data[name]}}for(i in unitMillisecondFactors){if(hasOwnProp(unitMillisecondFactors,i)){makeDurationGetter(i.toLowerCase())}}moment.duration.fn.asMilliseconds=function(){return this.as(\"ms\")};moment.duration.fn.asSeconds=function(){return this.as(\"s\")};moment.duration.fn.asMinutes=function(){return this.as(\"m\")};moment.duration.fn.asHours=function(){return this.as(\"h\")};moment.duration.fn.asDays=function(){return this.as(\"d\")};moment.duration.fn.asWeeks=function(){return this.as(\"weeks\")};moment.duration.fn.asMonths=function(){return this.as(\"M\")};moment.duration.fn.asYears=function(){return this.as(\"y\")};moment.locale(\"en\",{ordinalParse:/\\d{1,2}(th|st|nd|rd)/,ordinal:function(number){var b=number%10,output=toInt(number%100/10)===1?\"th\":b===1?\"st\":b===2?\"nd\":b===3?\"rd\":\"th\";return number+output}});function makeGlobal(shouldDeprecate){if(typeof ender!==\"undefined\"){return}oldGlobalMoment=globalScope.moment;if(shouldDeprecate){globalScope.moment=deprecate(\"Accessing Moment through the global scope is \"+\"deprecated, and will be removed in an upcoming \"+\"release.\",moment)}else{globalScope.moment=moment}}if(hasModule){module.exports=moment}else if(true){!(__WEBPACK_AMD_DEFINE_RESULT__=function(require,exports,module){if(module.config&&module.config()&&module.config().noGlobal===true){globalScope.moment=oldGlobalMoment}return moment}.call(exports,__webpack_require__,exports,module),__WEBPACK_AMD_DEFINE_RESULT__!==undefined&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__));makeGlobal(true)}else{makeGlobal()}}).call(this)}).call(exports,function(){return this}(),__webpack_require__(71)(module))},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__;\"use strict\";(function(root,factory){if(true){!(__WEBPACK_AMD_DEFINE_ARRAY__=[],__WEBPACK_AMD_DEFINE_FACTORY__=factory,__WEBPACK_AMD_DEFINE_RESULT__=typeof __WEBPACK_AMD_DEFINE_FACTORY__===\"function\"?__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__):__WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_RESULT__!==undefined&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}else if(typeof exports===\"object\"){module.exports=factory()}else{root.keycharm=factory()}})(this,function(){function keycharm(options){var preventDefault=options&&options.preventDefault||false;var container=options&&options.container||window;var _exportFunctions={};var _bound={keydown:{},keyup:{}};var _keys={};var i;for(i=97;i<=122;i++){_keys[String.fromCharCode(i)]={code:65+(i-97),shift:false}}for(i=65;i<=90;i++){_keys[String.fromCharCode(i)]={code:i,shift:true}}for(i=0;i<=9;i++){_keys[\"\"+i]={code:48+i,shift:false}}for(i=1;i<=12;i++){_keys[\"F\"+i]={code:111+i,shift:false}}for(i=0;i<=9;i++){_keys[\"num\"+i]={code:96+i,shift:false}}_keys[\"num*\"]={code:106,shift:false};_keys[\"num+\"]={code:107,shift:false};_keys[\"num-\"]={code:109,shift:false};_keys[\"num/\"]={code:111,shift:false};_keys[\"num.\"]={code:110,shift:false};_keys[\"left\"]={code:37,shift:false};_keys[\"up\"]={code:38,shift:false};_keys[\"right\"]={code:39,shift:false};_keys[\"down\"]={code:40,shift:false};_keys[\"space\"]={code:32,shift:false};_keys[\"enter\"]={code:13,shift:false};_keys[\"shift\"]={code:16,shift:undefined};_keys[\"esc\"]={code:27,shift:false};_keys[\"backspace\"]={code:8,shift:false};_keys[\"tab\"]={code:9,shift:false};_keys[\"ctrl\"]={code:17,shift:false};_keys[\"alt\"]={code:18,shift:false};_keys[\"delete\"]={code:46,shift:false};_keys[\"pageup\"]={code:33,shift:false};_keys[\"pagedown\"]={code:34,shift:false};_keys[\"=\"]={code:187,shift:false};_keys[\"-\"]={code:189,shift:false};_keys[\"]\"]={code:221,shift:false};_keys[\"[\"]={code:219,shift:false};var down=function(event){handleEvent(event,\"keydown\")};var up=function(event){handleEvent(event,\"keyup\")};var handleEvent=function(event,type){if(_bound[type][event.keyCode]!==undefined){var bound=_bound[type][event.keyCode];for(var i=0;i<bound.length;i++){if(bound[i].shift===undefined){bound[i].fn(event)}else if(bound[i].shift==true&&event.shiftKey==true){bound[i].fn(event)}else if(bound[i].shift==false&&event.shiftKey==false){bound[i].fn(event)}}if(preventDefault==true){event.preventDefault()}}};_exportFunctions.bind=function(key,callback,type){if(type===undefined){type=\"keydown\"}if(_keys[key]===undefined){throw new Error(\"unsupported key: \"+key)}if(_bound[type][_keys[key].code]===undefined){_bound[type][_keys[key].code]=[]}_bound[type][_keys[key].code].push({fn:callback,shift:_keys[key].shift})};_exportFunctions.bindAll=function(callback,type){if(type===undefined){type=\"keydown\"}for(var key in _keys){if(_keys.hasOwnProperty(key)){_exportFunctions.bind(key,callback,type)}}};_exportFunctions.getKey=function(event){for(var key in _keys){if(_keys.hasOwnProperty(key)){if(event.shiftKey==true&&_keys[key].shift==true&&event.keyCode==_keys[key].code){return key}else if(event.shiftKey==false&&_keys[key].shift==false&&event.keyCode==_keys[key].code){return key}else if(event.keyCode==_keys[key].code&&key==\"shift\"){return key}}}return\"unknown key, currently not supported\"};_exportFunctions.unbind=function(key,callback,type){if(type===undefined){type=\"keydown\"}if(_keys[key]===undefined){throw new Error(\"unsupported key: \"+key)}if(callback!==undefined){var newBindings=[];var bound=_bound[type][_keys[key].code];if(bound!==undefined){for(var i=0;i<bound.length;i++){if(!(bound[i].fn==callback&&bound[i].shift==_keys[key].shift)){newBindings.push(_bound[type][_keys[key].code][i])}}}_bound[type][_keys[key].code]=newBindings}else{_bound[type][_keys[key].code]=[]}};_exportFunctions.reset=function(){_bound={keydown:{},keyup:{}}};_exportFunctions.destroy=function(){_bound={keydown:{},keyup:{}};container.removeEventListener(\"keydown\",down,true);container.removeEventListener(\"keyup\",up,true)};container.addEventListener(\"keydown\",down,true);container.addEventListener(\"keyup\",up,true);return _exportFunctions}return keycharm})},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var RepulsionMixin=__webpack_require__(68);var HierarchialRepulsionMixin=__webpack_require__(69);var BarnesHutMixin=__webpack_require__(70);exports._toggleBarnesHut=function(){this.constants.physics.barnesHut.enabled=!this.constants.physics.barnesHut.enabled;this._loadSelectedForceSolver();this.moving=true;this.start()};exports._loadSelectedForceSolver=function(){if(this.constants.physics.barnesHut.enabled==true){this._clearMixin(RepulsionMixin);this._clearMixin(HierarchialRepulsionMixin);this.constants.physics.centralGravity=this.constants.physics.barnesHut.centralGravity;this.constants.physics.springLength=this.constants.physics.barnesHut.springLength;this.constants.physics.springConstant=this.constants.physics.barnesHut.springConstant;this.constants.physics.damping=this.constants.physics.barnesHut.damping;this._loadMixin(BarnesHutMixin)}else if(this.constants.physics.hierarchicalRepulsion.enabled==true){this._clearMixin(BarnesHutMixin);this._clearMixin(RepulsionMixin);this.constants.physics.centralGravity=this.constants.physics.hierarchicalRepulsion.centralGravity;this.constants.physics.springLength=this.constants.physics.hierarchicalRepulsion.springLength;this.constants.physics.springConstant=this.constants.physics.hierarchicalRepulsion.springConstant;this.constants.physics.damping=this.constants.physics.hierarchicalRepulsion.damping;this._loadMixin(HierarchialRepulsionMixin)}else{this._clearMixin(BarnesHutMixin);this._clearMixin(HierarchialRepulsionMixin);this.barnesHutTree=undefined;this.constants.physics.centralGravity=this.constants.physics.repulsion.centralGravity;this.constants.physics.springLength=this.constants.physics.repulsion.springLength;this.constants.physics.springConstant=this.constants.physics.repulsion.springConstant;this.constants.physics.damping=this.constants.physics.repulsion.damping;\nthis._loadMixin(RepulsionMixin)}};exports._initializeForceCalculation=function(){if(this.nodeIndices.length==1){this.nodes[this.nodeIndices[0]]._setForce(0,0)}else{if(this.nodeIndices.length>this.constants.clustering.clusterThreshold&&this.constants.clustering.enabled==true){this.clusterToFit(this.constants.clustering.reduceToNodes,false)}this._calculateForces()}};exports._calculateForces=function(){this._calculateGravitationalForces();this._calculateNodeForces();if(this.constants.physics.springConstant>0){if(this.constants.smoothCurves.enabled==true&&this.constants.smoothCurves.dynamic==true){this._calculateSpringForcesWithSupport()}else{if(this.constants.physics.hierarchicalRepulsion.enabled==true){this._calculateHierarchicalSpringForces()}else{this._calculateSpringForces()}}}};exports._updateCalculationNodes=function(){if(this.constants.smoothCurves.enabled==true&&this.constants.smoothCurves.dynamic==true){this.calculationNodes={};this.calculationNodeIndices=[];for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){this.calculationNodes[nodeId]=this.nodes[nodeId]}}var supportNodes=this.sectors[\"support\"][\"nodes\"];for(var supportNodeId in supportNodes){if(supportNodes.hasOwnProperty(supportNodeId)){if(this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)){this.calculationNodes[supportNodeId]=supportNodes[supportNodeId]}else{supportNodes[supportNodeId]._setForce(0,0)}}}for(var idx in this.calculationNodes){if(this.calculationNodes.hasOwnProperty(idx)){this.calculationNodeIndices.push(idx)}}}else{this.calculationNodes=this.nodes;this.calculationNodeIndices=this.nodeIndices}};exports._calculateGravitationalForces=function(){var dx,dy,distance,node,i;var nodes=this.calculationNodes;var gravity=this.constants.physics.centralGravity;var gravityForce=0;for(i=0;i<this.calculationNodeIndices.length;i++){node=nodes[this.calculationNodeIndices[i]];node.damping=this.constants.physics.damping;if(this._sector()==\"default\"&&gravity!=0){dx=-node.x;dy=-node.y;distance=Math.sqrt(dx*dx+dy*dy);gravityForce=distance==0?0:gravity/distance;node.fx=dx*gravityForce;node.fy=dy*gravityForce}else{node.fx=0;node.fy=0}}};exports._calculateSpringForces=function(){var edgeLength,edge,edgeId;var dx,dy,fx,fy,springForce,distance;var edges=this.edges;for(edgeId in edges){if(edges.hasOwnProperty(edgeId)){edge=edges[edgeId];if(edge.connected){if(this.nodes.hasOwnProperty(edge.toId)&&this.nodes.hasOwnProperty(edge.fromId)){edgeLength=edge.physics.springLength;edgeLength+=(edge.to.clusterSize+edge.from.clusterSize-2)*this.constants.clustering.edgeGrowth;dx=edge.from.x-edge.to.x;dy=edge.from.y-edge.to.y;distance=Math.sqrt(dx*dx+dy*dy);if(distance==0){distance=.01}springForce=this.constants.physics.springConstant*(edgeLength-distance)/distance;fx=dx*springForce;fy=dy*springForce;edge.from.fx+=fx;edge.from.fy+=fy;edge.to.fx-=fx;edge.to.fy-=fy}}}}};exports._calculateSpringForcesWithSupport=function(){var edgeLength,edge,edgeId,combinedClusterSize;var edges=this.edges;for(edgeId in edges){if(edges.hasOwnProperty(edgeId)){edge=edges[edgeId];if(edge.connected){if(this.nodes.hasOwnProperty(edge.toId)&&this.nodes.hasOwnProperty(edge.fromId)){if(edge.via!=null){var node1=edge.to;var node2=edge.via;var node3=edge.from;edgeLength=edge.physics.springLength;combinedClusterSize=node1.clusterSize+node3.clusterSize-2;edgeLength+=combinedClusterSize*this.constants.clustering.edgeGrowth;this._calculateSpringForce(node1,node2,.5*edgeLength);this._calculateSpringForce(node2,node3,.5*edgeLength)}}}}}};exports._calculateSpringForce=function(node1,node2,edgeLength){var dx,dy,fx,fy,springForce,distance;dx=node1.x-node2.x;dy=node1.y-node2.y;distance=Math.sqrt(dx*dx+dy*dy);if(distance==0){distance=.01}springForce=this.constants.physics.springConstant*(edgeLength-distance)/distance;fx=dx*springForce;fy=dy*springForce;node1.fx+=fx;node1.fy+=fy;node2.fx-=fx;node2.fy-=fy};exports._cleanupPhysicsConfiguration=function(){if(this.physicsConfiguration!==undefined){while(this.physicsConfiguration.hasChildNodes()){this.physicsConfiguration.removeChild(this.physicsConfiguration.firstChild)}this.physicsConfiguration.parentNode.removeChild(this.physicsConfiguration);this.physicsConfiguration=undefined}};exports._loadPhysicsConfiguration=function(){if(this.physicsConfiguration===undefined){this.backupConstants={};util.deepExtend(this.backupConstants,this.constants);var maxGravitational=Math.max(2e4,-1*this.constants.physics.barnesHut.gravitationalConstant*10);var maxSpring=Math.min(.05,this.constants.physics.barnesHut.springConstant*10);var hierarchicalLayoutDirections=[\"LR\",\"RL\",\"UD\",\"DU\"];this.physicsConfiguration=document.createElement(\"div\");this.physicsConfiguration.className=\"PhysicsConfiguration\";this.physicsConfiguration.innerHTML=\"\"+\"<table><tr><td><b>Simulation Mode:</b></td></tr>\"+\"<tr>\"+'<td width=\"120px\"><input type=\"radio\" name=\"graph_physicsMethod\" id=\"graph_physicsMethod1\" value=\"BH\" checked=\"checked\">Barnes Hut</td>'+'<td width=\"120px\"><input type=\"radio\" name=\"graph_physicsMethod\" id=\"graph_physicsMethod2\" value=\"R\">Repulsion</td>'+'<td width=\"120px\"><input type=\"radio\" name=\"graph_physicsMethod\" id=\"graph_physicsMethod3\" value=\"H\">Hierarchical</td>'+\"</tr>\"+\"</table>\"+'<table id=\"graph_BH_table\" style=\"display:none\">'+\"<tr><td><b>Barnes Hut</b></td></tr>\"+\"<tr>\"+'<td width=\"150px\">gravitationalConstant</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"'+maxGravitational+'\" value=\"'+-1*this.constants.physics.barnesHut.gravitationalConstant+'\" step=\"25\" style=\"width:300px\" id=\"graph_BH_gc\"></td><td width=\"50px\">-'+maxGravitational+'</td><td><input value=\"'+this.constants.physics.barnesHut.gravitationalConstant+'\" id=\"graph_BH_gc_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">centralGravity</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"6\" value=\"'+this.constants.physics.barnesHut.centralGravity+'\" step=\"0.05\" style=\"width:300px\" id=\"graph_BH_cg\"></td><td>3</td><td><input value=\"'+this.constants.physics.barnesHut.centralGravity+'\" id=\"graph_BH_cg_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">springLength</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"500\" value=\"'+this.constants.physics.barnesHut.springLength+'\" step=\"1\" style=\"width:300px\" id=\"graph_BH_sl\"></td><td>500</td><td><input value=\"'+this.constants.physics.barnesHut.springLength+'\" id=\"graph_BH_sl_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">springConstant</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"'+maxSpring+'\" value=\"'+this.constants.physics.barnesHut.springConstant+'\" step=\"0.0001\" style=\"width:300px\" id=\"graph_BH_sc\"></td><td>'+maxSpring+'</td><td><input value=\"'+this.constants.physics.barnesHut.springConstant+'\" id=\"graph_BH_sc_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">damping</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"0.3\" value=\"'+this.constants.physics.barnesHut.damping+'\" step=\"0.005\" style=\"width:300px\" id=\"graph_BH_damp\"></td><td>0.3</td><td><input value=\"'+this.constants.physics.barnesHut.damping+'\" id=\"graph_BH_damp_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"</table>\"+'<table id=\"graph_R_table\" style=\"display:none\">'+\"<tr><td><b>Repulsion</b></td></tr>\"+\"<tr>\"+'<td width=\"150px\">nodeDistance</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"300\" value=\"'+this.constants.physics.repulsion.nodeDistance+'\" step=\"1\" style=\"width:300px\" id=\"graph_R_nd\"></td><td width=\"50px\">300</td><td><input value=\"'+this.constants.physics.repulsion.nodeDistance+'\" id=\"graph_R_nd_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">centralGravity</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"3\" value=\"'+this.constants.physics.repulsion.centralGravity+'\" step=\"0.05\" style=\"width:300px\" id=\"graph_R_cg\"></td><td>3</td><td><input value=\"'+this.constants.physics.repulsion.centralGravity+'\" id=\"graph_R_cg_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">springLength</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"500\" value=\"'+this.constants.physics.repulsion.springLength+'\" step=\"1\" style=\"width:300px\" id=\"graph_R_sl\"></td><td>500</td><td><input value=\"'+this.constants.physics.repulsion.springLength+'\" id=\"graph_R_sl_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">springConstant</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"0.5\" value=\"'+this.constants.physics.repulsion.springConstant+'\" step=\"0.001\" style=\"width:300px\" id=\"graph_R_sc\"></td><td>0.5</td><td><input value=\"'+this.constants.physics.repulsion.springConstant+'\" id=\"graph_R_sc_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">damping</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"0.3\" value=\"'+this.constants.physics.repulsion.damping+'\" step=\"0.005\" style=\"width:300px\" id=\"graph_R_damp\"></td><td>0.3</td><td><input value=\"'+this.constants.physics.repulsion.damping+'\" id=\"graph_R_damp_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"</table>\"+'<table id=\"graph_H_table\" style=\"display:none\">'+'<tr><td width=\"150\"><b>Hierarchical</b></td></tr>'+\"<tr>\"+'<td width=\"150px\">nodeDistance</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"300\" value=\"'+this.constants.physics.hierarchicalRepulsion.nodeDistance+'\" step=\"1\" style=\"width:300px\" id=\"graph_H_nd\"></td><td width=\"50px\">300</td><td><input value=\"'+this.constants.physics.hierarchicalRepulsion.nodeDistance+'\" id=\"graph_H_nd_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">centralGravity</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"3\" value=\"'+this.constants.physics.hierarchicalRepulsion.centralGravity+'\" step=\"0.05\" style=\"width:300px\" id=\"graph_H_cg\"></td><td>3</td><td><input value=\"'+this.constants.physics.hierarchicalRepulsion.centralGravity+'\" id=\"graph_H_cg_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">springLength</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"500\" value=\"'+this.constants.physics.hierarchicalRepulsion.springLength+'\" step=\"1\" style=\"width:300px\" id=\"graph_H_sl\"></td><td>500</td><td><input value=\"'+this.constants.physics.hierarchicalRepulsion.springLength+'\" id=\"graph_H_sl_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">springConstant</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"0.5\" value=\"'+this.constants.physics.hierarchicalRepulsion.springConstant+'\" step=\"0.001\" style=\"width:300px\" id=\"graph_H_sc\"></td><td>0.5</td><td><input value=\"'+this.constants.physics.hierarchicalRepulsion.springConstant+'\" id=\"graph_H_sc_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">damping</td><td>0</td><td><input type=\"range\" min=\"0\" max=\"0.3\" value=\"'+this.constants.physics.hierarchicalRepulsion.damping+'\" step=\"0.005\" style=\"width:300px\" id=\"graph_H_damp\"></td><td>0.3</td><td><input value=\"'+this.constants.physics.hierarchicalRepulsion.damping+'\" id=\"graph_H_damp_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">direction</td><td>1</td><td><input type=\"range\" min=\"0\" max=\"3\" value=\"'+hierarchicalLayoutDirections.indexOf(this.constants.hierarchicalLayout.direction)+'\" step=\"1\" style=\"width:300px\" id=\"graph_H_direction\"></td><td>4</td><td><input value=\"'+this.constants.hierarchicalLayout.direction+'\" id=\"graph_H_direction_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">levelSeparation</td><td>1</td><td><input type=\"range\" min=\"0\" max=\"500\" value=\"'+this.constants.hierarchicalLayout.levelSeparation+'\" step=\"1\" style=\"width:300px\" id=\"graph_H_levsep\"></td><td>500</td><td><input value=\"'+this.constants.hierarchicalLayout.levelSeparation+'\" id=\"graph_H_levsep_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"<tr>\"+'<td width=\"150px\">nodeSpacing</td><td>1</td><td><input type=\"range\" min=\"0\" max=\"500\" value=\"'+this.constants.hierarchicalLayout.nodeSpacing+'\" step=\"1\" style=\"width:300px\" id=\"graph_H_nspac\"></td><td>500</td><td><input value=\"'+this.constants.hierarchicalLayout.nodeSpacing+'\" id=\"graph_H_nspac_value\" style=\"width:60px\"></td>'+\"</tr>\"+\"</table>\"+\"<table><tr><td><b>Options:</b></td></tr>\"+\"<tr>\"+'<td width=\"180px\"><input type=\"button\" id=\"graph_toggleSmooth\" value=\"Toggle smoothCurves\" style=\"width:150px\"></td>'+'<td width=\"180px\"><input type=\"button\" id=\"graph_repositionNodes\" value=\"Reinitialize\" style=\"width:150px\"></td>'+'<td width=\"180px\"><input type=\"button\" id=\"graph_generateOptions\" value=\"Generate Options\" style=\"width:150px\"></td>'+\"</tr>\"+\"</table>\";this.containerElement.parentElement.insertBefore(this.physicsConfiguration,this.containerElement);this.optionsDiv=document.createElement(\"div\");this.optionsDiv.style.fontSize=\"14px\";this.optionsDiv.style.fontFamily=\"verdana\";this.containerElement.parentElement.insertBefore(this.optionsDiv,this.containerElement);var rangeElement;rangeElement=document.getElementById(\"graph_BH_gc\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_BH_gc\",-1,\"physics_barnesHut_gravitationalConstant\");rangeElement=document.getElementById(\"graph_BH_cg\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_BH_cg\",1,\"physics_centralGravity\");rangeElement=document.getElementById(\"graph_BH_sc\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_BH_sc\",1,\"physics_springConstant\");rangeElement=document.getElementById(\"graph_BH_sl\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_BH_sl\",1,\"physics_springLength\");rangeElement=document.getElementById(\"graph_BH_damp\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_BH_damp\",1,\"physics_damping\");rangeElement=document.getElementById(\"graph_R_nd\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_R_nd\",1,\"physics_repulsion_nodeDistance\");rangeElement=document.getElementById(\"graph_R_cg\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_R_cg\",1,\"physics_centralGravity\");rangeElement=document.getElementById(\"graph_R_sc\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_R_sc\",1,\"physics_springConstant\");rangeElement=document.getElementById(\"graph_R_sl\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_R_sl\",1,\"physics_springLength\");rangeElement=document.getElementById(\"graph_R_damp\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_R_damp\",1,\"physics_damping\");rangeElement=document.getElementById(\"graph_H_nd\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_nd\",1,\"physics_hierarchicalRepulsion_nodeDistance\");rangeElement=document.getElementById(\"graph_H_cg\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_cg\",1,\"physics_centralGravity\");rangeElement=document.getElementById(\"graph_H_sc\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_sc\",1,\"physics_springConstant\");rangeElement=document.getElementById(\"graph_H_sl\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_sl\",1,\"physics_springLength\");rangeElement=document.getElementById(\"graph_H_damp\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_damp\",1,\"physics_damping\");rangeElement=document.getElementById(\"graph_H_direction\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_direction\",hierarchicalLayoutDirections,\"hierarchicalLayout_direction\");rangeElement=document.getElementById(\"graph_H_levsep\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_levsep\",1,\"hierarchicalLayout_levelSeparation\");rangeElement=document.getElementById(\"graph_H_nspac\");rangeElement.onchange=showValueOfRange.bind(this,\"graph_H_nspac\",1,\"hierarchicalLayout_nodeSpacing\");var radioButton1=document.getElementById(\"graph_physicsMethod1\");var radioButton2=document.getElementById(\"graph_physicsMethod2\");var radioButton3=document.getElementById(\"graph_physicsMethod3\");radioButton2.checked=true;if(this.constants.physics.barnesHut.enabled){radioButton1.checked=true}if(this.constants.hierarchicalLayout.enabled){radioButton3.checked=true}var graph_toggleSmooth=document.getElementById(\"graph_toggleSmooth\");var graph_repositionNodes=document.getElementById(\"graph_repositionNodes\");var graph_generateOptions=document.getElementById(\"graph_generateOptions\");graph_toggleSmooth.onclick=graphToggleSmoothCurves.bind(this);graph_repositionNodes.onclick=graphRepositionNodes.bind(this);graph_generateOptions.onclick=graphGenerateOptions.bind(this);if(this.constants.smoothCurves==true&&this.constants.dynamicSmoothCurves==false){graph_toggleSmooth.style.background=\"#A4FF56\"}else{graph_toggleSmooth.style.background=\"#FF8532\"}switchConfigurations.apply(this);radioButton1.onchange=switchConfigurations.bind(this);radioButton2.onchange=switchConfigurations.bind(this);radioButton3.onchange=switchConfigurations.bind(this)}};exports._overWriteGraphConstants=function(constantsVariableName,value){var nameArray=constantsVariableName.split(\"_\");if(nameArray.length==1){this.constants[nameArray[0]]=value}else if(nameArray.length==2){this.constants[nameArray[0]][nameArray[1]]=value}else if(nameArray.length==3){this.constants[nameArray[0]][nameArray[1]][nameArray[2]]=value}};function graphToggleSmoothCurves(){this.constants.smoothCurves.enabled=!this.constants.smoothCurves.enabled;var graph_toggleSmooth=document.getElementById(\"graph_toggleSmooth\");if(this.constants.smoothCurves.enabled==true){graph_toggleSmooth.style.background=\"#A4FF56\"}else{graph_toggleSmooth.style.background=\"#FF8532\"}this._configureSmoothCurves(false)}function graphRepositionNodes(){for(var nodeId in this.calculationNodes){if(this.calculationNodes.hasOwnProperty(nodeId)){this.calculationNodes[nodeId].vx=0;this.calculationNodes[nodeId].vy=0;this.calculationNodes[nodeId].fx=0;this.calculationNodes[nodeId].fy=0}}if(this.constants.hierarchicalLayout.enabled==true){this._setupHierarchicalLayout();showValueOfRange.call(this,\"graph_H_nd\",1,\"physics_hierarchicalRepulsion_nodeDistance\");showValueOfRange.call(this,\"graph_H_cg\",1,\"physics_centralGravity\");showValueOfRange.call(this,\"graph_H_sc\",1,\"physics_springConstant\");showValueOfRange.call(this,\"graph_H_sl\",1,\"physics_springLength\");showValueOfRange.call(this,\"graph_H_damp\",1,\"physics_damping\")}else{this.repositionNodes()}this.moving=true;this.start()}function graphGenerateOptions(){var options=\"No options are required, default values used.\";var optionsSpecific=[];var radioButton1=document.getElementById(\"graph_physicsMethod1\");var radioButton2=document.getElementById(\"graph_physicsMethod2\");if(radioButton1.checked==true){if(this.constants.physics.barnesHut.gravitationalConstant!=this.backupConstants.physics.barnesHut.gravitationalConstant){optionsSpecific.push(\"gravitationalConstant: \"+this.constants.physics.barnesHut.gravitationalConstant)}if(this.constants.physics.centralGravity!=this.backupConstants.physics.barnesHut.centralGravity){optionsSpecific.push(\"centralGravity: \"+this.constants.physics.centralGravity)}if(this.constants.physics.springLength!=this.backupConstants.physics.barnesHut.springLength){optionsSpecific.push(\"springLength: \"+this.constants.physics.springLength)}if(this.constants.physics.springConstant!=this.backupConstants.physics.barnesHut.springConstant){optionsSpecific.push(\"springConstant: \"+this.constants.physics.springConstant)}if(this.constants.physics.damping!=this.backupConstants.physics.barnesHut.damping){optionsSpecific.push(\"damping: \"+this.constants.physics.damping)}if(optionsSpecific.length!=0){options=\"var options = {\";options+=\"physics: {barnesHut: {\";for(var i=0;i<optionsSpecific.length;i++){options+=optionsSpecific[i];if(i<optionsSpecific.length-1){options+=\", \"}}options+=\"}}\"}if(this.constants.smoothCurves.enabled!=this.backupConstants.smoothCurves.enabled){if(optionsSpecific.length==0){options=\"var options = {\"}else{options+=\", \"}options+=\"smoothCurves: \"+this.constants.smoothCurves.enabled}if(options!=\"No options are required, default values used.\"){options+=\"};\"}}else if(radioButton2.checked==true){options=\"var options = {\";options+=\"physics: {barnesHut: {enabled: false}\";if(this.constants.physics.repulsion.nodeDistance!=this.backupConstants.physics.repulsion.nodeDistance){optionsSpecific.push(\"nodeDistance: \"+this.constants.physics.repulsion.nodeDistance)}if(this.constants.physics.centralGravity!=this.backupConstants.physics.repulsion.centralGravity){optionsSpecific.push(\"centralGravity: \"+this.constants.physics.centralGravity)}if(this.constants.physics.springLength!=this.backupConstants.physics.repulsion.springLength){optionsSpecific.push(\"springLength: \"+this.constants.physics.springLength)}if(this.constants.physics.springConstant!=this.backupConstants.physics.repulsion.springConstant){optionsSpecific.push(\"springConstant: \"+this.constants.physics.springConstant)}if(this.constants.physics.damping!=this.backupConstants.physics.repulsion.damping){optionsSpecific.push(\"damping: \"+this.constants.physics.damping)}if(optionsSpecific.length!=0){options+=\", repulsion: {\";for(var i=0;i<optionsSpecific.length;i++){options+=optionsSpecific[i];if(i<optionsSpecific.length-1){options+=\", \"}}options+=\"}}\"}if(optionsSpecific.length==0){options+=\"}\"}if(this.constants.smoothCurves!=this.backupConstants.smoothCurves){options+=\", smoothCurves: \"+this.constants.smoothCurves}options+=\"};\"}else{options=\"var options = {\";if(this.constants.physics.hierarchicalRepulsion.nodeDistance!=this.backupConstants.physics.hierarchicalRepulsion.nodeDistance){optionsSpecific.push(\"nodeDistance: \"+this.constants.physics.hierarchicalRepulsion.nodeDistance)}if(this.constants.physics.centralGravity!=this.backupConstants.physics.hierarchicalRepulsion.centralGravity){optionsSpecific.push(\"centralGravity: \"+this.constants.physics.centralGravity)}if(this.constants.physics.springLength!=this.backupConstants.physics.hierarchicalRepulsion.springLength){optionsSpecific.push(\"springLength: \"+this.constants.physics.springLength)}if(this.constants.physics.springConstant!=this.backupConstants.physics.hierarchicalRepulsion.springConstant){optionsSpecific.push(\"springConstant: \"+this.constants.physics.springConstant)}if(this.constants.physics.damping!=this.backupConstants.physics.hierarchicalRepulsion.damping){optionsSpecific.push(\"damping: \"+this.constants.physics.damping)}if(optionsSpecific.length!=0){options+=\"physics: {hierarchicalRepulsion: {\";for(var i=0;i<optionsSpecific.length;i++){options+=optionsSpecific[i];if(i<optionsSpecific.length-1){options+=\", \"}}options+=\"}},\"}options+=\"hierarchicalLayout: {\";optionsSpecific=[];if(this.constants.hierarchicalLayout.direction!=this.backupConstants.hierarchicalLayout.direction){optionsSpecific.push(\"direction: \"+this.constants.hierarchicalLayout.direction)}if(Math.abs(this.constants.hierarchicalLayout.levelSeparation)!=this.backupConstants.hierarchicalLayout.levelSeparation){optionsSpecific.push(\"levelSeparation: \"+this.constants.hierarchicalLayout.levelSeparation)}if(this.constants.hierarchicalLayout.nodeSpacing!=this.backupConstants.hierarchicalLayout.nodeSpacing){optionsSpecific.push(\"nodeSpacing: \"+this.constants.hierarchicalLayout.nodeSpacing)}if(optionsSpecific.length!=0){for(var i=0;i<optionsSpecific.length;i++){options+=optionsSpecific[i];if(i<optionsSpecific.length-1){options+=\", \"}}options+=\"}\"}else{options+=\"enabled:true}\"}options+=\"};\"}this.optionsDiv.innerHTML=options}function switchConfigurations(){var ids=[\"graph_BH_table\",\"graph_R_table\",\"graph_H_table\"];var radioButton=document.querySelector('input[name=\"graph_physicsMethod\"]:checked').value;var tableId=\"graph_\"+radioButton+\"_table\";var table=document.getElementById(tableId);table.style.display=\"block\";for(var i=0;i<ids.length;i++){if(ids[i]!=tableId){table=document.getElementById(ids[i]);table.style.display=\"none\"}}this._restoreNodes();if(radioButton==\"R\"){this.constants.hierarchicalLayout.enabled=false;this.constants.physics.hierarchicalRepulsion.enabled=false;this.constants.physics.barnesHut.enabled=false}else if(radioButton==\"H\"){if(this.constants.hierarchicalLayout.enabled==false){this.constants.hierarchicalLayout.enabled=true;this.constants.physics.hierarchicalRepulsion.enabled=true;this.constants.physics.barnesHut.enabled=false;this.constants.smoothCurves.enabled=false;this._setupHierarchicalLayout()}}else{this.constants.hierarchicalLayout.enabled=false;this.constants.physics.hierarchicalRepulsion.enabled=false;this.constants.physics.barnesHut.enabled=true}this._loadSelectedForceSolver();var graph_toggleSmooth=document.getElementById(\"graph_toggleSmooth\");if(this.constants.smoothCurves.enabled==true){graph_toggleSmooth.style.background=\"#A4FF56\"}else{graph_toggleSmooth.style.background=\"#FF8532\"}this.moving=true;this.start()}function showValueOfRange(id,map,constantsVariableName){var valueId=id+\"_value\";var rangeValue=document.getElementById(id).value;if(Array.isArray(map)){document.getElementById(valueId).value=map[parseInt(rangeValue)];this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)])}else{document.getElementById(valueId).value=parseInt(map)*parseFloat(rangeValue);this._overWriteGraphConstants(constantsVariableName,parseInt(map)*parseFloat(rangeValue))}if(constantsVariableName==\"hierarchicalLayout_direction\"||constantsVariableName==\"hierarchicalLayout_levelSeparation\"||constantsVariableName==\"hierarchicalLayout_nodeSpacing\"){this._setupHierarchicalLayout()}this.moving=true;this.start()}},function(module,exports,__webpack_require__){exports.startWithClustering=function(){this.clusterToFit(this.constants.clustering.initialMaxNodes,true);this.updateLabels();if(this.constants.stabilize==true){this._stabilize()}this.start()};exports.clusterToFit=function(maxNumberOfNodes,reposition){var numberOfNodes=this.nodeIndices.length;var maxLevels=50;var level=0;while(numberOfNodes>maxNumberOfNodes&&level<maxLevels){if(level%3==0){this.forceAggregateHubs(true);this.normalizeClusterLevels()}else{this.increaseClusterLevel()}this.forceAggregateHubs(true);numberOfNodes=this.nodeIndices.length;level+=1}if(level>0&&reposition==true){this.repositionNodes()}this._updateCalculationNodes()};exports.openCluster=function(node){var isMovingBeforeClustering=this.moving;if(node.clusterSize>this.constants.clustering.sectorThreshold&&this._nodeInActiveArea(node)&&!(this._sector()==\"default\"&&this.nodeIndices.length==1)){this._addSector(node);var level=0;while(this.nodeIndices.length<this.constants.clustering.initialMaxNodes&&level<10){this.decreaseClusterLevel();level+=1}}else{this._expandClusterNode(node,false,true);this._updateNodeIndexList();this._updateCalculationNodes();this.updateLabels()}if(this.moving!=isMovingBeforeClustering){this.start()}};exports.updateClustersDefault=function(){if(this.constants.clustering.enabled==true&&this.constants.clustering.clusterByZoom==true){this.updateClusters(0,false,false)}};exports.increaseClusterLevel=function(){this.updateClusters(-1,false,true)};exports.decreaseClusterLevel=function(){this.updateClusters(1,false,true)};exports.updateClusters=function(zoomDirection,recursive,force,doNotStart){var isMovingBeforeClustering=this.moving;var amountOfNodes=this.nodeIndices.length;var detectedZoomingIn=this.previousScale<this.scale&&zoomDirection==0;var detectedZoomingOut=this.previousScale>this.scale&&zoomDirection==0;if(detectedZoomingOut==true){this._collapseSector()}if(detectedZoomingOut==true||zoomDirection==-1){this._formClusters(force)}else if(detectedZoomingIn==true||zoomDirection==1){if(force==true){this._openClusters(recursive,force)}else{this._openClusters(recursive,false)}}this._updateNodeIndexList();if(this.nodeIndices.length==amountOfNodes&&(detectedZoomingOut==true||zoomDirection==-1)){this._aggregateHubs(force);this._updateNodeIndexList()}if(detectedZoomingOut==true||zoomDirection==-1){this.handleChains();this._updateNodeIndexList()}this.previousScale=this.scale;this.updateLabels();if(this.nodeIndices.length<amountOfNodes){this.clusterSession+=1;this.normalizeClusterLevels()}if(doNotStart==false||doNotStart===undefined){if(this.moving!=isMovingBeforeClustering){this.start()}}this._updateCalculationNodes()};exports.handleChains=function(){var chainPercentage=this._getChainFraction();if(chainPercentage>this.constants.clustering.chainThreshold){this._reduceAmountOfChains(1-this.constants.clustering.chainThreshold/chainPercentage)}};exports._aggregateHubs=function(force){this._getHubSize();this._formClustersByHub(force,false)};exports.forceAggregateHubs=function(doNotStart){var isMovingBeforeClustering=this.moving;var amountOfNodes=this.nodeIndices.length;this._aggregateHubs(true);this._updateNodeIndexList();this.updateLabels();this._updateCalculationNodes();if(this.nodeIndices.length!=amountOfNodes){this.clusterSession+=1}if(doNotStart==false||doNotStart===undefined){if(this.moving!=isMovingBeforeClustering){this.start()}}};exports._openClustersBySize=function(){if(this.constants.clustering.clusterByZoom==true){for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){var node=this.nodes[nodeId];if(node.inView()==true){if(node.width*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||node.height*this.scale>this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight){this.openCluster(node)}}}}}};exports._openClusters=function(recursive,force){for(var i=0;i<this.nodeIndices.length;i++){var node=this.nodes[this.nodeIndices[i]];this._expandClusterNode(node,recursive,force);this._updateCalculationNodes()}};exports._expandClusterNode=function(parentNode,recursive,force,openAll){if(parentNode.clusterSize>1){if(openAll===undefined){openAll=false}recursive=openAll||recursive;if(parentNode.formationScale<this.scale||force==true){for(var containedNodeId in parentNode.containedNodes){if(parentNode.containedNodes.hasOwnProperty(containedNodeId)){var childNode=parentNode.containedNodes[containedNodeId];if(force==true){if(childNode.clusterSession==parentNode.clusterSessions[parentNode.clusterSessions.length-1]||openAll){this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll)}}else{if(this._nodeInActiveArea(parentNode)){this._expelChildFromParent(parentNode,containedNodeId,recursive,force,openAll)}}}}}}};exports._expelChildFromParent=function(parentNode,containedNodeId,recursive,force,openAll){var childNode=parentNode.containedNodes[containedNodeId];if(childNode.formationScale<this.scale||force==true){this._unselectAll();this.nodes[containedNodeId]=childNode;this._releaseContainedEdges(parentNode,childNode);this._connectEdgeBackToChild(parentNode,childNode);this._validateEdges(parentNode);parentNode.options.mass-=childNode.options.mass;parentNode.clusterSize-=childNode.clusterSize;parentNode.options.fontSize=Math.min(this.constants.clustering.maxFontSize,this.constants.nodes.fontSize+this.constants.clustering.fontSizeMultiplier*(parentNode.clusterSize-1));childNode.x=parentNode.x+parentNode.growthIndicator*(.5-Math.random());childNode.y=parentNode.y+parentNode.growthIndicator*(.5-Math.random());delete parentNode.containedNodes[containedNodeId];var othersPresent=false;for(var childNodeId in parentNode.containedNodes){if(parentNode.containedNodes.hasOwnProperty(childNodeId)){if(parentNode.containedNodes[childNodeId].clusterSession==childNode.clusterSession){othersPresent=true;break}}}if(othersPresent==false){parentNode.clusterSessions.pop()}this._repositionBezierNodes(childNode);childNode.clusterSession=0;parentNode.clearSizeCache();this.moving=true}if(recursive==true){this._expandClusterNode(childNode,recursive,force,openAll)}};exports._repositionBezierNodes=function(node){for(var i=0;i<node.dynamicEdges.length;i++){node.dynamicEdges[i].positionBezierNode()}};exports._formClusters=function(force){if(force==false){if(this.constants.clustering.clusterByZoom==true){this._formClustersByZoom()}}else{this._forceClustersByZoom()}};exports._formClustersByZoom=function(){var dx,dy,length;var minLength=this.constants.clustering.clusterEdgeThreshold/this.scale;for(var edgeId in this.edges){if(this.edges.hasOwnProperty(edgeId)){var edge=this.edges[edgeId];if(edge.connected){if(edge.toId!=edge.fromId){dx=edge.to.x-edge.from.x;dy=edge.to.y-edge.from.y;length=Math.sqrt(dx*dx+dy*dy);if(length<minLength){var parentNode=edge.from;var childNode=edge.to;\nif(edge.to.options.mass>edge.from.options.mass){parentNode=edge.to;childNode=edge.from}if(childNode.dynamicEdges.length==1){this._addToCluster(parentNode,childNode,false)}else if(parentNode.dynamicEdges.length==1){this._addToCluster(childNode,parentNode,false)}}}}}}};exports._forceClustersByZoom=function(){for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){var childNode=this.nodes[nodeId];if(childNode.dynamicEdges.length==1){var edge=childNode.dynamicEdges[0];var parentNode=edge.toId==childNode.id?this.nodes[edge.fromId]:this.nodes[edge.toId];if(childNode.id!=parentNode.id){if(parentNode.options.mass>childNode.options.mass){this._addToCluster(parentNode,childNode,true)}else{this._addToCluster(childNode,parentNode,true)}}}}}};exports._clusterToSmallestNeighbour=function(node){var smallestNeighbour=-1;var smallestNeighbourNode=null;for(var i=0;i<node.dynamicEdges.length;i++){if(node.dynamicEdges[i]!==undefined){var neighbour=null;if(node.dynamicEdges[i].fromId!=node.id){neighbour=node.dynamicEdges[i].from}else if(node.dynamicEdges[i].toId!=node.id){neighbour=node.dynamicEdges[i].to}if(neighbour!=null&&smallestNeighbour>neighbour.clusterSessions.length){smallestNeighbour=neighbour.clusterSessions.length;smallestNeighbourNode=neighbour}}}if(neighbour!=null&&this.nodes[neighbour.id]!==undefined){this._addToCluster(neighbour,node,true)}};exports._formClustersByHub=function(force,onlyEqual){for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){this._formClusterFromHub(this.nodes[nodeId],force,onlyEqual)}}};exports._formClusterFromHub=function(hubNode,force,onlyEqual,absorptionSizeOffset){if(absorptionSizeOffset===undefined){absorptionSizeOffset=0}if(hubNode.dynamicEdges.length>=this.hubThreshold&&onlyEqual==false||hubNode.dynamicEdges.length==this.hubThreshold&&onlyEqual==true){var dx,dy,length;var minLength=this.constants.clustering.clusterEdgeThreshold/this.scale;var allowCluster=false;var edgesIdarray=[];var amountOfInitialEdges=hubNode.dynamicEdges.length;for(var j=0;j<amountOfInitialEdges;j++){edgesIdarray.push(hubNode.dynamicEdges[j].id)}if(force==false){allowCluster=false;for(j=0;j<amountOfInitialEdges;j++){var edge=this.edges[edgesIdarray[j]];if(edge!==undefined){if(edge.connected){if(edge.toId!=edge.fromId){dx=edge.to.x-edge.from.x;dy=edge.to.y-edge.from.y;length=Math.sqrt(dx*dx+dy*dy);if(length<minLength){allowCluster=true;break}}}}}}if(!force&&allowCluster||force){var children=[];var childrenIds={};for(j=0;j<amountOfInitialEdges;j++){edge=this.edges[edgesIdarray[j]];var childNode=this.nodes[edge.fromId==hubNode.id?edge.toId:edge.fromId];if(childrenIds[childNode.id]===undefined){childrenIds[childNode.id]=true;children.push(childNode)}}for(j=0;j<children.length;j++){var childNode=children[j];if(childNode.dynamicEdges.length<=this.hubThreshold+absorptionSizeOffset&&childNode.id!=hubNode.id){this._addToCluster(hubNode,childNode,force)}else{}}}}};exports._addToCluster=function(parentNode,childNode,force){parentNode.containedNodes[childNode.id]=childNode;for(var i=0;i<childNode.dynamicEdges.length;i++){var edge=childNode.dynamicEdges[i];if(edge.toId==parentNode.id||edge.fromId==parentNode.id){this._addToContainedEdges(parentNode,childNode,edge)}else{this._connectEdgeToCluster(parentNode,childNode,edge)}}childNode.dynamicEdges=[];this._containCircularEdgesFromNode(parentNode,childNode);delete this.nodes[childNode.id];var massBefore=parentNode.options.mass;childNode.clusterSession=this.clusterSession;parentNode.options.mass+=childNode.options.mass;parentNode.clusterSize+=childNode.clusterSize;parentNode.options.fontSize=Math.min(this.constants.clustering.maxFontSize,this.constants.nodes.fontSize+this.constants.clustering.fontSizeMultiplier*parentNode.clusterSize);if(parentNode.clusterSessions[parentNode.clusterSessions.length-1]!=this.clusterSession){parentNode.clusterSessions.push(this.clusterSession)}if(force==true){parentNode.formationScale=0}else{parentNode.formationScale=this.scale}parentNode.clearSizeCache();parentNode.containedNodes[childNode.id].formationScale=parentNode.formationScale;childNode.clearVelocity();parentNode.updateVelocity(massBefore);this.moving=true};exports._addToContainedEdges=function(parentNode,childNode,edge){if(parentNode.containedEdges[childNode.id]===undefined){parentNode.containedEdges[childNode.id]=[]}parentNode.containedEdges[childNode.id].push(edge);delete this.edges[edge.id];for(var i=0;i<parentNode.dynamicEdges.length;i++){if(parentNode.dynamicEdges[i].id==edge.id){parentNode.dynamicEdges.splice(i,1);break}}};exports._connectEdgeToCluster=function(parentNode,childNode,edge){if(edge.toId==edge.fromId){this._addToContainedEdges(parentNode,childNode,edge)}else{if(edge.toId==childNode.id){edge.originalToId.push(childNode.id);edge.to=parentNode;edge.toId=parentNode.id}else{edge.originalFromId.push(childNode.id);edge.from=parentNode;edge.fromId=parentNode.id}this._addToReroutedEdges(parentNode,childNode,edge)}};exports._containCircularEdgesFromNode=function(parentNode,childNode){for(var i=0;i<parentNode.dynamicEdges.length;i++){var edge=parentNode.dynamicEdges[i];if(edge.toId==edge.fromId){this._addToContainedEdges(parentNode,childNode,edge)}}};exports._addToReroutedEdges=function(parentNode,childNode,edge){if(!parentNode.reroutedEdges.hasOwnProperty(childNode.id)){parentNode.reroutedEdges[childNode.id]=[]}parentNode.reroutedEdges[childNode.id].push(edge);parentNode.dynamicEdges.push(edge)};exports._connectEdgeBackToChild=function(parentNode,childNode){if(parentNode.reroutedEdges.hasOwnProperty(childNode.id)){for(var i=0;i<parentNode.reroutedEdges[childNode.id].length;i++){var edge=parentNode.reroutedEdges[childNode.id][i];if(edge.originalFromId[edge.originalFromId.length-1]==childNode.id){edge.originalFromId.pop();edge.fromId=childNode.id;edge.from=childNode}else{edge.originalToId.pop();edge.toId=childNode.id;edge.to=childNode}childNode.dynamicEdges.push(edge);for(var j=0;j<parentNode.dynamicEdges.length;j++){if(parentNode.dynamicEdges[j].id==edge.id){parentNode.dynamicEdges.splice(j,1);break}}}delete parentNode.reroutedEdges[childNode.id]}};exports._validateEdges=function(parentNode){var dynamicEdges=[];for(var i=0;i<parentNode.dynamicEdges.length;i++){var edge=parentNode.dynamicEdges[i];if(parentNode.id==edge.toId||parentNode.id==edge.fromId){dynamicEdges.push(edge)}}parentNode.dynamicEdges=dynamicEdges};exports._releaseContainedEdges=function(parentNode,childNode){for(var i=0;i<parentNode.containedEdges[childNode.id].length;i++){var edge=parentNode.containedEdges[childNode.id][i];this.edges[edge.id]=edge;childNode.dynamicEdges.push(edge);parentNode.dynamicEdges.push(edge)}delete parentNode.containedEdges[childNode.id]};exports.updateLabels=function(){var nodeId;for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){var node=this.nodes[nodeId];if(node.clusterSize>1){node.label=\"[\".concat(String(node.clusterSize),\"]\")}}}for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];if(node.clusterSize==1){if(node.originalLabel!==undefined){node.label=node.originalLabel}else{node.label=String(node.id)}}}}};exports.normalizeClusterLevels=function(){var maxLevel=0;var minLevel=1e9;var clusterLevel=0;var nodeId;for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){clusterLevel=this.nodes[nodeId].clusterSessions.length;if(maxLevel<clusterLevel){maxLevel=clusterLevel}if(minLevel>clusterLevel){minLevel=clusterLevel}}}if(maxLevel-minLevel>this.constants.clustering.clusterLevelDifference){var amountOfNodes=this.nodeIndices.length;var targetLevel=maxLevel-this.constants.clustering.clusterLevelDifference;for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){if(this.nodes[nodeId].clusterSessions.length<targetLevel){this._clusterToSmallestNeighbour(this.nodes[nodeId])}}}this._updateNodeIndexList();if(this.nodeIndices.length!=amountOfNodes){this.clusterSession+=1}}};exports._nodeInActiveArea=function(node){return Math.abs(node.x-this.areaCenter.x)<=this.constants.clustering.activeAreaBoxSize/this.scale&&Math.abs(node.y-this.areaCenter.y)<=this.constants.clustering.activeAreaBoxSize/this.scale};exports.repositionNodes=function(){for(var i=0;i<this.nodeIndices.length;i++){var node=this.nodes[this.nodeIndices[i]];if(node.xFixed==false||node.yFixed==false){var radius=10*.1*this.nodeIndices.length*Math.min(100,node.options.mass);var angle=2*Math.PI*Math.random();if(node.xFixed==false){node.x=radius*Math.cos(angle)}if(node.yFixed==false){node.y=radius*Math.sin(angle)}this._repositionBezierNodes(node)}}};exports._getHubSize=function(){var average=0;var averageSquared=0;var hubCounter=0;var largestHub=0;for(var i=0;i<this.nodeIndices.length;i++){var node=this.nodes[this.nodeIndices[i]];if(node.dynamicEdges.length>largestHub){largestHub=node.dynamicEdges.length}average+=node.dynamicEdges.length;averageSquared+=Math.pow(node.dynamicEdges.length,2);hubCounter+=1}average=average/hubCounter;averageSquared=averageSquared/hubCounter;var variance=averageSquared-Math.pow(average,2);var standardDeviation=Math.sqrt(variance);this.hubThreshold=Math.floor(average+2*standardDeviation);if(this.hubThreshold>largestHub){this.hubThreshold=largestHub}};exports._reduceAmountOfChains=function(fraction){this.hubThreshold=2;var reduceAmount=Math.floor(this.nodeIndices.length*fraction);for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){if(this.nodes[nodeId].dynamicEdges.length==2){if(reduceAmount>0){this._formClusterFromHub(this.nodes[nodeId],true,true,1);reduceAmount-=1}}}}};exports._getChainFraction=function(){var chains=0;var total=0;for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){if(this.nodes[nodeId].dynamicEdges.length==2){chains+=1}total+=1}}return chains/total}},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Node=__webpack_require__(40);exports._putDataInSector=function(){this.sectors[\"active\"][this._sector()].nodes=this.nodes;this.sectors[\"active\"][this._sector()].edges=this.edges;this.sectors[\"active\"][this._sector()].nodeIndices=this.nodeIndices};exports._switchToSector=function(sectorId,sectorType){if(sectorType===undefined||sectorType==\"active\"){this._switchToActiveSector(sectorId)}else{this._switchToFrozenSector(sectorId)}};exports._switchToActiveSector=function(sectorId){this.nodeIndices=this.sectors[\"active\"][sectorId][\"nodeIndices\"];this.nodes=this.sectors[\"active\"][sectorId][\"nodes\"];this.edges=this.sectors[\"active\"][sectorId][\"edges\"]};exports._switchToSupportSector=function(){this.nodeIndices=this.sectors[\"support\"][\"nodeIndices\"];this.nodes=this.sectors[\"support\"][\"nodes\"];this.edges=this.sectors[\"support\"][\"edges\"]};exports._switchToFrozenSector=function(sectorId){this.nodeIndices=this.sectors[\"frozen\"][sectorId][\"nodeIndices\"];this.nodes=this.sectors[\"frozen\"][sectorId][\"nodes\"];this.edges=this.sectors[\"frozen\"][sectorId][\"edges\"]};exports._loadLatestSector=function(){this._switchToSector(this._sector())};exports._sector=function(){return this.activeSector[this.activeSector.length-1]};exports._previousSector=function(){if(this.activeSector.length>1){return this.activeSector[this.activeSector.length-2]}else{throw new TypeError(\"there are not enough sectors in the this.activeSector array.\")}};exports._setActiveSector=function(newId){this.activeSector.push(newId)};exports._forgetLastSector=function(){this.activeSector.pop()};exports._createNewSector=function(newId){this.sectors[\"active\"][newId]={nodes:{},edges:{},nodeIndices:[],formationScale:this.scale,drawingNode:undefined};this.sectors[\"active\"][newId][\"drawingNode\"]=new Node({id:newId,color:{background:\"#eaefef\",border:\"495c5e\"}},{},{},this.constants);this.sectors[\"active\"][newId][\"drawingNode\"].clusterSize=2};exports._deleteActiveSector=function(sectorId){delete this.sectors[\"active\"][sectorId]};exports._deleteFrozenSector=function(sectorId){delete this.sectors[\"frozen\"][sectorId]};exports._freezeSector=function(sectorId){this.sectors[\"frozen\"][sectorId]=this.sectors[\"active\"][sectorId];this._deleteActiveSector(sectorId)};exports._activateSector=function(sectorId){this.sectors[\"active\"][sectorId]=this.sectors[\"frozen\"][sectorId];this._deleteFrozenSector(sectorId)};exports._mergeThisWithFrozen=function(sectorId){for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){this.sectors[\"frozen\"][sectorId][\"nodes\"][nodeId]=this.nodes[nodeId]}}for(var edgeId in this.edges){if(this.edges.hasOwnProperty(edgeId)){this.sectors[\"frozen\"][sectorId][\"edges\"][edgeId]=this.edges[edgeId]}}for(var i=0;i<this.nodeIndices.length;i++){this.sectors[\"frozen\"][sectorId][\"nodeIndices\"].push(this.nodeIndices[i])}};exports._collapseThisToSingleCluster=function(){this.clusterToFit(1,false)};exports._addSector=function(node){var sector=this._sector();delete this.nodes[node.id];var unqiueIdentifier=util.randomUUID();this._freezeSector(sector);this._createNewSector(unqiueIdentifier);this._setActiveSector(unqiueIdentifier);this._switchToSector(this._sector());this.nodes[node.id]=node};exports._collapseSector=function(){var sector=this._sector();if(sector!=\"default\"){if(this.nodeIndices.length==1||this.sectors[\"active\"][sector][\"drawingNode\"].width*this.scale<this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientWidth||this.sectors[\"active\"][sector][\"drawingNode\"].height*this.scale<this.constants.clustering.screenSizeThreshold*this.frame.canvas.clientHeight){var previousSector=this._previousSector();this._collapseThisToSingleCluster();this._mergeThisWithFrozen(previousSector);this._deleteActiveSector(sector);this._activateSector(previousSector);this._switchToSector(previousSector);this._forgetLastSector();this._updateNodeIndexList();this._updateCalculationNodes()}}};exports._doInAllActiveSectors=function(runFunction,argument){var returnValues=[];if(argument===undefined){for(var sector in this.sectors[\"active\"]){if(this.sectors[\"active\"].hasOwnProperty(sector)){this._switchToActiveSector(sector);returnValues.push(this[runFunction]())}}}else{for(var sector in this.sectors[\"active\"]){if(this.sectors[\"active\"].hasOwnProperty(sector)){this._switchToActiveSector(sector);var args=Array.prototype.splice.call(arguments,1);if(args.length>1){returnValues.push(this[runFunction](args[0],args[1]))}else{returnValues.push(this[runFunction](argument))}}}}this._loadLatestSector();return returnValues};exports._doInSupportSector=function(runFunction,argument){var returnValues=false;if(argument===undefined){this._switchToSupportSector();returnValues=this[runFunction]()}else{this._switchToSupportSector();var args=Array.prototype.splice.call(arguments,1);if(args.length>1){returnValues=this[runFunction](args[0],args[1])}else{returnValues=this[runFunction](argument)}}this._loadLatestSector();return returnValues};exports._doInAllFrozenSectors=function(runFunction,argument){if(argument===undefined){for(var sector in this.sectors[\"frozen\"]){if(this.sectors[\"frozen\"].hasOwnProperty(sector)){this._switchToFrozenSector(sector);this[runFunction]()}}}else{for(var sector in this.sectors[\"frozen\"]){if(this.sectors[\"frozen\"].hasOwnProperty(sector)){this._switchToFrozenSector(sector);var args=Array.prototype.splice.call(arguments,1);if(args.length>1){this[runFunction](args[0],args[1])}else{this[runFunction](argument)}}}}this._loadLatestSector()};exports._doInAllSectors=function(runFunction,argument){var args=Array.prototype.splice.call(arguments,1);if(argument===undefined){this._doInAllActiveSectors(runFunction);this._doInAllFrozenSectors(runFunction)}else{if(args.length>1){this._doInAllActiveSectors(runFunction,args[0],args[1]);this._doInAllFrozenSectors(runFunction,args[0],args[1])}else{this._doInAllActiveSectors(runFunction,argument);this._doInAllFrozenSectors(runFunction,argument)}}};exports._clearNodeIndexList=function(){var sector=this._sector();this.sectors[\"active\"][sector][\"nodeIndices\"]=[];this.nodeIndices=this.sectors[\"active\"][sector][\"nodeIndices\"]};exports._drawSectorNodes=function(ctx,sectorType){var minY=1e9,maxY=-1e9,minX=1e9,maxX=-1e9,node;for(var sector in this.sectors[sectorType]){if(this.sectors[sectorType].hasOwnProperty(sector)){if(this.sectors[sectorType][sector][\"drawingNode\"]!==undefined){this._switchToSector(sector,sectorType);minY=1e9;maxY=-1e9;minX=1e9;maxX=-1e9;for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];node.resize(ctx);if(minX>node.x-.5*node.width){minX=node.x-.5*node.width}if(maxX<node.x+.5*node.width){maxX=node.x+.5*node.width}if(minY>node.y-.5*node.height){minY=node.y-.5*node.height}if(maxY<node.y+.5*node.height){maxY=node.y+.5*node.height}}}node=this.sectors[sectorType][sector][\"drawingNode\"];node.x=.5*(maxX+minX);node.y=.5*(maxY+minY);node.width=2*(node.x-minX);node.height=2*(node.y-minY);node.options.radius=Math.sqrt(Math.pow(.5*node.width,2)+Math.pow(.5*node.height,2));node.setScale(this.scale);node._drawCircle(ctx)}}}};exports._drawAllSectorNodes=function(ctx){this._drawSectorNodes(ctx,\"frozen\");this._drawSectorNodes(ctx,\"active\");this._loadLatestSector()}},function(module,exports,__webpack_require__){var Node=__webpack_require__(40);exports._getNodesOverlappingWith=function(object,overlappingNodes){var nodes=this.nodes;for(var nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){if(nodes[nodeId].isOverlappingWith(object)){overlappingNodes.push(nodeId)}}}};exports._getAllNodesOverlappingWith=function(object){var overlappingNodes=[];this._doInAllActiveSectors(\"_getNodesOverlappingWith\",object,overlappingNodes);return overlappingNodes};exports._pointerToPositionObject=function(pointer){var x=this._XconvertDOMtoCanvas(pointer.x);var y=this._YconvertDOMtoCanvas(pointer.y);return{left:x,top:y,right:x,bottom:y}};exports._getNodeAt=function(pointer){var positionObject=this._pointerToPositionObject(pointer);var overlappingNodes=this._getAllNodesOverlappingWith(positionObject);if(overlappingNodes.length>0){return this.nodes[overlappingNodes[overlappingNodes.length-1]]}else{return null}};exports._getEdgesOverlappingWith=function(object,overlappingEdges){var edges=this.edges;for(var edgeId in edges){if(edges.hasOwnProperty(edgeId)){if(edges[edgeId].isOverlappingWith(object)){overlappingEdges.push(edgeId)}}}};exports._getAllEdgesOverlappingWith=function(object){var overlappingEdges=[];this._doInAllActiveSectors(\"_getEdgesOverlappingWith\",object,overlappingEdges);return overlappingEdges};exports._getEdgeAt=function(pointer){var positionObject=this._pointerToPositionObject(pointer);var overlappingEdges=this._getAllEdgesOverlappingWith(positionObject);if(overlappingEdges.length>0){return this.edges[overlappingEdges[overlappingEdges.length-1]]}else{return null}};exports._addToSelection=function(obj){if(obj instanceof Node){this.selectionObj.nodes[obj.id]=obj}else{this.selectionObj.edges[obj.id]=obj}};exports._addToHover=function(obj){if(obj instanceof Node){this.hoverObj.nodes[obj.id]=obj}else{this.hoverObj.edges[obj.id]=obj}};exports._removeFromSelection=function(obj){if(obj instanceof Node){delete this.selectionObj.nodes[obj.id]}else{delete this.selectionObj.edges[obj.id]}};exports._unselectAll=function(doNotTrigger){if(doNotTrigger===undefined){doNotTrigger=false}for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){this.selectionObj.nodes[nodeId].unselect()}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){this.selectionObj.edges[edgeId].unselect()}}this.selectionObj={nodes:{},edges:{}};if(doNotTrigger==false){this.emit(\"select\",this.getSelection())}};exports._unselectClusters=function(doNotTrigger){if(doNotTrigger===undefined){doNotTrigger=false}for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){if(this.selectionObj.nodes[nodeId].clusterSize>1){this.selectionObj.nodes[nodeId].unselect();this._removeFromSelection(this.selectionObj.nodes[nodeId])}}}if(doNotTrigger==false){this.emit(\"select\",this.getSelection())}};exports._getSelectedNodeCount=function(){var count=0;for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){count+=1}}return count};exports._getSelectedNode=function(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){return this.selectionObj.nodes[nodeId]}}return null};exports._getSelectedEdge=function(){for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){return this.selectionObj.edges[edgeId]}}return null};exports._getSelectedEdgeCount=function(){var count=0;for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){count+=1}}return count};exports._getSelectedObjectCount=function(){var count=0;for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){count+=1}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){count+=1}}return count};exports._selectionIsEmpty=function(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){return false}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){return false}}return true};exports._clusterInSelection=function(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){if(this.selectionObj.nodes[nodeId].clusterSize>1){return true}}}return false};exports._selectConnectedEdges=function(node){for(var i=0;i<node.dynamicEdges.length;i++){var edge=node.dynamicEdges[i];edge.select();this._addToSelection(edge)}};exports._hoverConnectedEdges=function(node){for(var i=0;i<node.dynamicEdges.length;i++){var edge=node.dynamicEdges[i];edge.hover=true;this._addToHover(edge)}};exports._unselectConnectedEdges=function(node){for(var i=0;i<node.dynamicEdges.length;i++){var edge=node.dynamicEdges[i];edge.unselect();this._removeFromSelection(edge)}};exports._selectObject=function(object,append,doNotTrigger,highlightEdges,overrideSelectable){if(doNotTrigger===undefined){doNotTrigger=false}if(highlightEdges===undefined){highlightEdges=true}if(this._selectionIsEmpty()==false&&append==false&&this.forceAppendSelection==false){this._unselectAll(true)}if(object.selected==false&&(this.constants.selectable==true||overrideSelectable)){object.select();this._addToSelection(object);if(object instanceof Node&&this.blockConnectingEdgeSelection==false&&highlightEdges==true){this._selectConnectedEdges(object)}}else if(object.selected==false){this._addToSelection(object);doNotTrigger=true}else{object.unselect();this._removeFromSelection(object)}if(doNotTrigger==false){this.emit(\"select\",this.getSelection())}};exports._blurObject=function(object){if(object.hover==true){object.hover=false;this.emit(\"blurNode\",{node:object.id})}};exports._hoverObject=function(object){if(object.hover==false){object.hover=true;this._addToHover(object);if(object instanceof Node){this.emit(\"hoverNode\",{node:object.id})}}if(object instanceof Node){this._hoverConnectedEdges(object)}};exports._handleTouch=function(pointer){};exports._handleTap=function(pointer){var node=this._getNodeAt(pointer);if(node!=null){this._selectObject(node,false)}else{var edge=this._getEdgeAt(pointer);if(edge!=null){this._selectObject(edge,false)}else{this._unselectAll()}}var properties=this.getSelection();properties[\"pointer\"]={DOM:{x:pointer.x,y:pointer.y},canvas:{x:this._XconvertDOMtoCanvas(pointer.x),y:this._YconvertDOMtoCanvas(pointer.y)}};this.emit(\"click\",properties);this._redraw()};exports._handleDoubleTap=function(pointer){var node=this._getNodeAt(pointer);if(node!=null&&node!==undefined){this.areaCenter={x:this._XconvertDOMtoCanvas(pointer.x),y:this._YconvertDOMtoCanvas(pointer.y)};this.openCluster(node)}var properties=this.getSelection();properties[\"pointer\"]={DOM:{x:pointer.x,y:pointer.y},canvas:{x:this._XconvertDOMtoCanvas(pointer.x),y:this._YconvertDOMtoCanvas(pointer.y)}};this.emit(\"doubleClick\",properties)};exports._handleOnHold=function(pointer){var node=this._getNodeAt(pointer);if(node!=null){this._selectObject(node,true)}else{var edge=this._getEdgeAt(pointer);if(edge!=null){this._selectObject(edge,true)}}this._redraw()};exports._handleOnRelease=function(pointer){this._manipulationReleaseOverload(pointer);this._navigationReleaseOverload(pointer)};exports._manipulationReleaseOverload=function(pointer){};exports._navigationReleaseOverload=function(pointer){};exports.getSelection=function(){var nodeIds=this.getSelectedNodes();var edgeIds=this.getSelectedEdges();return{nodes:nodeIds,edges:edgeIds}};exports.getSelectedNodes=function(){var idArray=[];if(this.constants.selectable==true){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){idArray.push(nodeId)}}}return idArray};exports.getSelectedEdges=function(){var idArray=[];if(this.constants.selectable==true){for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){idArray.push(edgeId)}}}return idArray};exports.setSelection=function(){console.log(\"setSelection is deprecated. Please use selectNodes instead.\")};exports.selectNodes=function(selection,highlightEdges){var i,iMax,id;if(!selection||selection.length==undefined)throw\"Selection must be an array with ids\";this._unselectAll(true);for(i=0,iMax=selection.length;i<iMax;i++){id=selection[i];var node=this.nodes[id];if(!node){throw new RangeError('Node with id \"'+id+'\" not found')}this._selectObject(node,true,true,highlightEdges,true)}this.redraw()};exports.selectEdges=function(selection){var i,iMax,id;if(!selection||selection.length==undefined)throw\"Selection must be an array with ids\";this._unselectAll(true);for(i=0,iMax=selection.length;i<iMax;i++){id=selection[i];var edge=this.edges[id];if(!edge){throw new RangeError('Edge with id \"'+id+'\" not found')}this._selectObject(edge,true,true,false,true)}this.redraw()};exports._updateSelection=function(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){if(!this.nodes.hasOwnProperty(nodeId)){delete this.selectionObj.nodes[nodeId]}}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){if(!this.edges.hasOwnProperty(edgeId)){delete this.selectionObj.edges[edgeId]}}}}},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Node=__webpack_require__(40);var Edge=__webpack_require__(37);exports._clearManipulatorBar=function(){this._recursiveDOMDelete(this.manipulationDiv);this.manipulationDOM={};this._manipulationReleaseOverload=function(){};delete this.sectors[\"support\"][\"nodes\"][\"targetNode\"];delete this.sectors[\"support\"][\"nodes\"][\"targetViaNode\"];this.controlNodesActive=false;this.freezeSimulationEnabled=false};exports._restoreOverloadedFunctions=function(){for(var functionName in this.cachedFunctions){if(this.cachedFunctions.hasOwnProperty(functionName)){this[functionName]=this.cachedFunctions[functionName];delete this.cachedFunctions[functionName]}}};exports._toggleEditMode=function(){this.editMode=!this.editMode;var toolbar=this.manipulationDiv;var closeDiv=this.closeDiv;var editModeDiv=this.editModeDiv;if(this.editMode==true){toolbar.style.display=\"block\";closeDiv.style.display=\"block\";editModeDiv.style.display=\"none\";closeDiv.onclick=this._toggleEditMode.bind(this)}else{toolbar.style.display=\"none\";closeDiv.style.display=\"none\";editModeDiv.style.display=\"block\";closeDiv.onclick=null}this._createManipulatorBar()};exports._createManipulatorBar=function(){if(this.boundFunction){this.off(\"select\",this.boundFunction)}var locale=this.constants.locales[this.constants.locale];if(this.edgeBeingEdited!==undefined){this.edgeBeingEdited._disableControlNodes();this.edgeBeingEdited=undefined;this.selectedControlNode=null;this.controlNodesActive=false;this._redraw()}this._restoreOverloadedFunctions();this.freezeSimulationEnabled=false;this.blockConnectingEdgeSelection=false;this.forceAppendSelection=false;this.manipulationDOM={};if(this.editMode==true){while(this.manipulationDiv.hasChildNodes()){this.manipulationDiv.removeChild(this.manipulationDiv.firstChild)}this.manipulationDOM[\"addNodeSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"addNodeSpan\"].className=\"network-manipulationUI add\";this.manipulationDOM[\"addNodeLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"addNodeLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"addNodeLabelSpan\"].innerHTML=locale[\"addNode\"];this.manipulationDOM[\"addNodeSpan\"].appendChild(this.manipulationDOM[\"addNodeLabelSpan\"]);this.manipulationDOM[\"seperatorLineDiv1\"]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv1\"].className=\"network-seperatorLine\";this.manipulationDOM[\"addEdgeSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"addEdgeSpan\"].className=\"network-manipulationUI connect\";this.manipulationDOM[\"addEdgeLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"addEdgeLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"addEdgeLabelSpan\"].innerHTML=locale[\"addEdge\"];this.manipulationDOM[\"addEdgeSpan\"].appendChild(this.manipulationDOM[\"addEdgeLabelSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"addNodeSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv1\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"addEdgeSpan\"]);if(this._getSelectedNodeCount()==1&&this.triggerFunctions.edit){this.manipulationDOM[\"seperatorLineDiv2\"]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv2\"].className=\"network-seperatorLine\";this.manipulationDOM[\"editNodeSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"editNodeSpan\"].className=\"network-manipulationUI edit\";this.manipulationDOM[\"editNodeLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"editNodeLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"editNodeLabelSpan\"].innerHTML=locale[\"editNode\"];this.manipulationDOM[\"editNodeSpan\"].appendChild(this.manipulationDOM[\"editNodeLabelSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv2\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"editNodeSpan\"])}else if(this._getSelectedEdgeCount()==1&&this._getSelectedNodeCount()==0){this.manipulationDOM[\"seperatorLineDiv3\"]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv3\"].className=\"network-seperatorLine\";this.manipulationDOM[\"editEdgeSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"editEdgeSpan\"].className=\"network-manipulationUI edit\";this.manipulationDOM[\"editEdgeLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"editEdgeLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"editEdgeLabelSpan\"].innerHTML=locale[\"editEdge\"];this.manipulationDOM[\"editEdgeSpan\"].appendChild(this.manipulationDOM[\"editEdgeLabelSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv3\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"editEdgeSpan\"])}if(this._selectionIsEmpty()==false){this.manipulationDOM[\"seperatorLineDiv4\"]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv4\"].className=\"network-seperatorLine\";this.manipulationDOM[\"deleteSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"deleteSpan\"].className=\"network-manipulationUI delete\";this.manipulationDOM[\"deleteLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"deleteLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"deleteLabelSpan\"].innerHTML=locale[\"del\"];this.manipulationDOM[\"deleteSpan\"].appendChild(this.manipulationDOM[\"deleteLabelSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv4\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"deleteSpan\"])}this.manipulationDOM[\"addNodeSpan\"].onclick=this._createAddNodeToolbar.bind(this);this.manipulationDOM[\"addEdgeSpan\"].onclick=this._createAddEdgeToolbar.bind(this);if(this._getSelectedNodeCount()==1&&this.triggerFunctions.edit){this.manipulationDOM[\"editNodeSpan\"].onclick=this._editNode.bind(this)\n}else if(this._getSelectedEdgeCount()==1&&this._getSelectedNodeCount()==0){this.manipulationDOM[\"editEdgeSpan\"].onclick=this._createEditEdgeToolbar.bind(this)}if(this._selectionIsEmpty()==false){this.manipulationDOM[\"deleteSpan\"].onclick=this._deleteSelected.bind(this)}this.closeDiv.onclick=this._toggleEditMode.bind(this);var me=this;this.boundFunction=me._createManipulatorBar;this.on(\"select\",this.boundFunction)}else{while(this.editModeDiv.hasChildNodes()){this.editModeDiv.removeChild(this.editModeDiv.firstChild)}this.manipulationDOM[\"editModeSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"editModeSpan\"].className=\"network-manipulationUI edit editmode\";this.manipulationDOM[\"editModeLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"editModeLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"editModeLabelSpan\"].innerHTML=locale[\"edit\"];this.manipulationDOM[\"editModeSpan\"].appendChild(this.manipulationDOM[\"editModeLabelSpan\"]);this.editModeDiv.appendChild(this.manipulationDOM[\"editModeSpan\"]);this.manipulationDOM[\"editModeSpan\"].onclick=this._toggleEditMode.bind(this)}};exports._createAddNodeToolbar=function(){this._clearManipulatorBar();if(this.boundFunction){this.off(\"select\",this.boundFunction)}var locale=this.constants.locales[this.constants.locale];this.manipulationDOM={};this.manipulationDOM[\"backSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"backSpan\"].className=\"network-manipulationUI back\";this.manipulationDOM[\"backLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"backLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"backLabelSpan\"].innerHTML=locale[\"back\"];this.manipulationDOM[\"backSpan\"].appendChild(this.manipulationDOM[\"backLabelSpan\"]);this.manipulationDOM[\"seperatorLineDiv1\"]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv1\"].className=\"network-seperatorLine\";this.manipulationDOM[\"descriptionSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"descriptionSpan\"].className=\"network-manipulationUI none\";this.manipulationDOM[\"descriptionLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"descriptionLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"descriptionLabelSpan\"].innerHTML=locale[\"addDescription\"];this.manipulationDOM[\"descriptionSpan\"].appendChild(this.manipulationDOM[\"descriptionLabelSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"backSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv1\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"descriptionSpan\"]);this.manipulationDOM[\"backSpan\"].onclick=this._createManipulatorBar.bind(this);var me=this;this.boundFunction=me._addNode;this.on(\"select\",this.boundFunction)};exports._createAddEdgeToolbar=function(){this._clearManipulatorBar();this._unselectAll(true);this.freezeSimulationEnabled=true;if(this.boundFunction){this.off(\"select\",this.boundFunction)}var locale=this.constants.locales[this.constants.locale];this._unselectAll();this.forceAppendSelection=false;this.blockConnectingEdgeSelection=true;this.manipulationDOM={};this.manipulationDOM[\"backSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"backSpan\"].className=\"network-manipulationUI back\";this.manipulationDOM[\"backLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"backLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"backLabelSpan\"].innerHTML=locale[\"back\"];this.manipulationDOM[\"backSpan\"].appendChild(this.manipulationDOM[\"backLabelSpan\"]);this.manipulationDOM[\"seperatorLineDiv1\"]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv1\"].className=\"network-seperatorLine\";this.manipulationDOM[\"descriptionSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"descriptionSpan\"].className=\"network-manipulationUI none\";this.manipulationDOM[\"descriptionLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"descriptionLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"descriptionLabelSpan\"].innerHTML=locale[\"edgeDescription\"];this.manipulationDOM[\"descriptionSpan\"].appendChild(this.manipulationDOM[\"descriptionLabelSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"backSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv1\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"descriptionSpan\"]);this.manipulationDOM[\"backSpan\"].onclick=this._createManipulatorBar.bind(this);var me=this;this.boundFunction=me._handleConnect;this.on(\"select\",this.boundFunction);this.cachedFunctions[\"_handleTouch\"]=this._handleTouch;this.cachedFunctions[\"_manipulationReleaseOverload\"]=this._manipulationReleaseOverload;this.cachedFunctions[\"_handleDragStart\"]=this._handleDragStart;this.cachedFunctions[\"_handleDragEnd\"]=this._handleDragEnd;this.cachedFunctions[\"_handleOnHold\"]=this._handleOnHold;this._handleTouch=this._handleConnect;this._manipulationReleaseOverload=function(){};this._handleOnHold=function(){};this._handleDragStart=function(){};this._handleDragEnd=this._finishConnect;this._redraw()};exports._createEditEdgeToolbar=function(){this._clearManipulatorBar();this.controlNodesActive=true;if(this.boundFunction){this.off(\"select\",this.boundFunction)}this.edgeBeingEdited=this._getSelectedEdge();this.edgeBeingEdited._enableControlNodes();var locale=this.constants.locales[this.constants.locale];this.manipulationDOM={};this.manipulationDOM[\"backSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"backSpan\"].className=\"network-manipulationUI back\";this.manipulationDOM[\"backLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"backLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"backLabelSpan\"].innerHTML=locale[\"back\"];this.manipulationDOM[\"backSpan\"].appendChild(this.manipulationDOM[\"backLabelSpan\"]);this.manipulationDOM[\"seperatorLineDiv1\"]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv1\"].className=\"network-seperatorLine\";this.manipulationDOM[\"descriptionSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"descriptionSpan\"].className=\"network-manipulationUI none\";this.manipulationDOM[\"descriptionLabelSpan\"]=document.createElement(\"span\");this.manipulationDOM[\"descriptionLabelSpan\"].className=\"network-manipulationLabel\";this.manipulationDOM[\"descriptionLabelSpan\"].innerHTML=locale[\"editEdgeDescription\"];this.manipulationDOM[\"descriptionSpan\"].appendChild(this.manipulationDOM[\"descriptionLabelSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"backSpan\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv1\"]);this.manipulationDiv.appendChild(this.manipulationDOM[\"descriptionSpan\"]);this.manipulationDOM[\"backSpan\"].onclick=this._createManipulatorBar.bind(this);this.cachedFunctions[\"_handleTouch\"]=this._handleTouch;this.cachedFunctions[\"_manipulationReleaseOverload\"]=this._manipulationReleaseOverload;this.cachedFunctions[\"_handleTap\"]=this._handleTap;this.cachedFunctions[\"_handleDragStart\"]=this._handleDragStart;this.cachedFunctions[\"_handleOnDrag\"]=this._handleOnDrag;this._handleTouch=this._selectControlNode;this._handleTap=function(){};this._handleOnDrag=this._controlNodeDrag;this._handleDragStart=function(){};this._manipulationReleaseOverload=this._releaseControlNode;this._redraw()};exports._selectControlNode=function(pointer){this.edgeBeingEdited.controlNodes.from.unselect();this.edgeBeingEdited.controlNodes.to.unselect();this.selectedControlNode=this.edgeBeingEdited._getSelectedControlNode(this._XconvertDOMtoCanvas(pointer.x),this._YconvertDOMtoCanvas(pointer.y));if(this.selectedControlNode!==null){this.selectedControlNode.select();this.freezeSimulationEnabled=true}this._redraw()};exports._controlNodeDrag=function(event){var pointer=this._getPointer(event.gesture.center);if(this.selectedControlNode!==null&&this.selectedControlNode!==undefined){this.selectedControlNode.x=this._XconvertDOMtoCanvas(pointer.x);this.selectedControlNode.y=this._YconvertDOMtoCanvas(pointer.y)}this._redraw()};exports._releaseControlNode=function(pointer){var newNode=this._getNodeAt(pointer);if(newNode!==null){if(this.edgeBeingEdited.controlNodes.from.selected==true){this.edgeBeingEdited._restoreControlNodes();this._editEdge(newNode.id,this.edgeBeingEdited.to.id);this.edgeBeingEdited.controlNodes.from.unselect()}if(this.edgeBeingEdited.controlNodes.to.selected==true){this.edgeBeingEdited._restoreControlNodes();this._editEdge(this.edgeBeingEdited.from.id,newNode.id);this.edgeBeingEdited.controlNodes.to.unselect()}}else{this.edgeBeingEdited._restoreControlNodes()}this.freezeSimulationEnabled=false;this._redraw()};exports._handleConnect=function(pointer){if(this._getSelectedNodeCount()==0){var node=this._getNodeAt(pointer);if(node!=null){if(node.clusterSize>1){alert(this.constants.locales[this.constants.locale][\"createEdgeError\"])}else{this._selectObject(node,false);var supportNodes=this.sectors[\"support\"][\"nodes\"];supportNodes[\"targetNode\"]=new Node({id:\"targetNode\"},{},{},this.constants);var targetNode=supportNodes[\"targetNode\"];targetNode.x=node.x;targetNode.y=node.y;this.edges[\"connectionEdge\"]=new Edge({id:\"connectionEdge\",from:node.id,to:targetNode.id},this,this.constants);var connectionEdge=this.edges[\"connectionEdge\"];connectionEdge.from=node;connectionEdge.connected=true;connectionEdge.options.smoothCurves={enabled:true,dynamic:false,type:\"continuous\",roundness:.5};connectionEdge.selected=true;connectionEdge.to=targetNode;this.cachedFunctions[\"_handleOnDrag\"]=this._handleOnDrag;this._handleOnDrag=function(event){var pointer=this._getPointer(event.gesture.center);var connectionEdge=this.edges[\"connectionEdge\"];connectionEdge.to.x=this._XconvertDOMtoCanvas(pointer.x);connectionEdge.to.y=this._YconvertDOMtoCanvas(pointer.y)};this.moving=true;this.start()}}}};exports._finishConnect=function(event){if(this._getSelectedNodeCount()==1){var pointer=this._getPointer(event.gesture.center);this._handleOnDrag=this.cachedFunctions[\"_handleOnDrag\"];delete this.cachedFunctions[\"_handleOnDrag\"];var connectFromId=this.edges[\"connectionEdge\"].fromId;delete this.edges[\"connectionEdge\"];delete this.sectors[\"support\"][\"nodes\"][\"targetNode\"];delete this.sectors[\"support\"][\"nodes\"][\"targetViaNode\"];var node=this._getNodeAt(pointer);if(node!=null){if(node.clusterSize>1){alert(this.constants.locales[this.constants.locale][\"createEdgeError\"])}else{this._createEdge(connectFromId,node.id);this._createManipulatorBar()}}this._unselectAll()}};exports._addNode=function(){if(this._selectionIsEmpty()&&this.editMode==true){var positionObject=this._pointerToPositionObject(this.pointerPosition);var defaultData={id:util.randomUUID(),x:positionObject.left,y:positionObject.top,label:\"new\",allowedToMoveX:true,allowedToMoveY:true};if(this.triggerFunctions.add){if(this.triggerFunctions.add.length==2){var me=this;this.triggerFunctions.add(defaultData,function(finalizedData){me.nodesData.add(finalizedData);me._createManipulatorBar();me.moving=true;me.start()})}else{throw new Error(\"The function for add does not support two arguments (data,callback)\");this._createManipulatorBar();this.moving=true;this.start()}}else{this.nodesData.add(defaultData);this._createManipulatorBar();this.moving=true;this.start()}}};exports._createEdge=function(sourceNodeId,targetNodeId){if(this.editMode==true){var defaultData={from:sourceNodeId,to:targetNodeId};if(this.triggerFunctions.connect){if(this.triggerFunctions.connect.length==2){var me=this;this.triggerFunctions.connect(defaultData,function(finalizedData){me.edgesData.add(finalizedData);me.moving=true;me.start()})}else{throw new Error(\"The function for connect does not support two arguments (data,callback)\");this.moving=true;this.start()}}else{this.edgesData.add(defaultData);this.moving=true;this.start()}}};exports._editEdge=function(sourceNodeId,targetNodeId){if(this.editMode==true){var defaultData={id:this.edgeBeingEdited.id,from:sourceNodeId,to:targetNodeId};if(this.triggerFunctions.editEdge){if(this.triggerFunctions.editEdge.length==2){var me=this;this.triggerFunctions.editEdge(defaultData,function(finalizedData){me.edgesData.update(finalizedData);me.moving=true;me.start()})}else{throw new Error(\"The function for edit does not support two arguments (data, callback)\");this.moving=true;this.start()}}else{this.edgesData.update(defaultData);this.moving=true;this.start()}}};exports._editNode=function(){if(this.triggerFunctions.edit&&this.editMode==true){var node=this._getSelectedNode();var data={id:node.id,label:node.label,group:node.options.group,shape:node.options.shape,color:{background:node.options.color.background,border:node.options.color.border,highlight:{background:node.options.color.highlight.background,border:node.options.color.highlight.border}}};if(this.triggerFunctions.edit.length==2){var me=this;this.triggerFunctions.edit(data,function(finalizedData){me.nodesData.update(finalizedData);me._createManipulatorBar();me.moving=true;me.start()})}else{throw new Error(\"The function for edit does not support two arguments (data, callback)\")}}else{throw new Error(\"No edit function has been bound to this button\")}};exports._deleteSelected=function(){if(!this._selectionIsEmpty()&&this.editMode==true){if(!this._clusterInSelection()){var selectedNodes=this.getSelectedNodes();var selectedEdges=this.getSelectedEdges();if(this.triggerFunctions.del){var me=this;var data={nodes:selectedNodes,edges:selectedEdges};if(this.triggerFunctions.del.length==2){this.triggerFunctions.del(data,function(finalizedData){me.edgesData.remove(finalizedData.edges);me.nodesData.remove(finalizedData.nodes);me._unselectAll();me.moving=true;me.start()})}else{throw new Error(\"The function for delete does not support two arguments (data, callback)\")}}else{this.edgesData.remove(selectedEdges);this.nodesData.remove(selectedNodes);this._unselectAll();this.moving=true;this.start()}}else{alert(this.constants.locales[this.constants.locale][\"deleteClusterError\"])}}}},function(module,exports,__webpack_require__){var util=__webpack_require__(1);var Hammer=__webpack_require__(45);exports._cleanNavigation=function(){if(this.navigationHammers.existing.length!=0){for(var i=0;i<this.navigationHammers.existing.length;i++){this.navigationHammers.existing[i].dispose()}this.navigationHammers.existing=[]}this._navigationReleaseOverload=function(){};if(this.navigationDivs&&this.navigationDivs[\"wrapper\"]&&this.navigationDivs[\"wrapper\"].parentNode){this.navigationDivs[\"wrapper\"].parentNode.removeChild(this.navigationDivs[\"wrapper\"])}};exports._loadNavigationElements=function(){this._cleanNavigation();this.navigationDivs={};var navigationDivs=[\"up\",\"down\",\"left\",\"right\",\"zoomIn\",\"zoomOut\",\"zoomExtends\"];var navigationDivActions=[\"_moveUp\",\"_moveDown\",\"_moveLeft\",\"_moveRight\",\"_zoomIn\",\"_zoomOut\",\"_zoomExtent\"];this.navigationDivs[\"wrapper\"]=document.createElement(\"div\");this.frame.appendChild(this.navigationDivs[\"wrapper\"]);for(var i=0;i<navigationDivs.length;i++){this.navigationDivs[navigationDivs[i]]=document.createElement(\"div\");this.navigationDivs[navigationDivs[i]].className=\"network-navigation \"+navigationDivs[i];this.navigationDivs[\"wrapper\"].appendChild(this.navigationDivs[navigationDivs[i]]);var hammer=Hammer(this.navigationDivs[navigationDivs[i]],{prevent_default:true});hammer.on(\"touch\",this[navigationDivActions[i]].bind(this));this.navigationHammers._new.push(hammer)}this._navigationReleaseOverload=this._stopMovement;this.navigationHammers.existing=this.navigationHammers._new};exports._zoomExtent=function(event){this.zoomExtent({duration:700});event.stopPropagation()};exports._stopMovement=function(){this._xStopMoving();this._yStopMoving();this._stopZoom()};exports._moveUp=function(event){this.yIncrement=this.constants.keyboard.speed.y;this.start();event.preventDefault()};exports._moveDown=function(event){this.yIncrement=-this.constants.keyboard.speed.y;this.start();event.preventDefault()};exports._moveLeft=function(event){this.xIncrement=this.constants.keyboard.speed.x;this.start();event.preventDefault()};exports._moveRight=function(event){this.xIncrement=-this.constants.keyboard.speed.y;this.start();event.preventDefault()};exports._zoomIn=function(event){this.zoomIncrement=this.constants.keyboard.speed.zoom;this.start();event.preventDefault()};exports._zoomOut=function(event){this.zoomIncrement=-this.constants.keyboard.speed.zoom;this.start();event.preventDefault()};exports._stopZoom=function(event){this.zoomIncrement=0;event&&event.preventDefault()};exports._yStopMoving=function(event){this.yIncrement=0;event&&event.preventDefault()};exports._xStopMoving=function(event){this.xIncrement=0;event&&event.preventDefault()}},function(module,exports,__webpack_require__){exports._resetLevels=function(){for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){var node=this.nodes[nodeId];if(node.preassignedLevel==false){node.level=-1;node.hierarchyEnumerated=false}}}};exports._setupHierarchicalLayout=function(){if(this.constants.hierarchicalLayout.enabled==true&&this.nodeIndices.length>0){var hubsize=0;var node,nodeId;var definedLevel=false;var undefinedLevel=false;for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];if(node.level!=-1){definedLevel=true}else{undefinedLevel=true}if(hubsize<node.edges.length){hubsize=node.edges.length}}}if(undefinedLevel==true&&definedLevel==true){throw new Error(\"To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.\");this.zoomExtent({duration:0},true,this.constants.clustering.enabled);if(!this.constants.clustering.enabled){this.start()}}else{this._changeConstants();if(undefinedLevel==true){if(this.constants.hierarchicalLayout.layout==\"hubsize\"){this._determineLevels(hubsize)}else{this._determineLevelsDirected(false)}}var distribution=this._getDistribution();this._placeNodesByHierarchy(distribution);this.start()}}};exports._placeNodesByHierarchy=function(distribution){var nodeId,node;for(var level in distribution){if(distribution.hasOwnProperty(level)){for(nodeId in distribution[level].nodes){if(distribution[level].nodes.hasOwnProperty(nodeId)){node=distribution[level].nodes[nodeId];if(this.constants.hierarchicalLayout.direction==\"UD\"||this.constants.hierarchicalLayout.direction==\"DU\"){if(node.xFixed){node.x=distribution[level].minPos;node.xFixed=false;distribution[level].minPos+=distribution[level].nodeSpacing}}else{if(node.yFixed){node.y=distribution[level].minPos;node.yFixed=false;distribution[level].minPos+=distribution[level].nodeSpacing}}this._placeBranchNodes(node.edges,node.id,distribution,node.level)}}}}this._stabilize()};exports._getDistribution=function(){var distribution={};var nodeId,node,level;for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];node.xFixed=true;node.yFixed=true;if(this.constants.hierarchicalLayout.direction==\"UD\"||this.constants.hierarchicalLayout.direction==\"DU\"){node.y=this.constants.hierarchicalLayout.levelSeparation*node.level}else{node.x=this.constants.hierarchicalLayout.levelSeparation*node.level}if(distribution[node.level]===undefined){distribution[node.level]={amount:0,nodes:{},minPos:0,nodeSpacing:0}}distribution[node.level].amount+=1;distribution[node.level].nodes[nodeId]=node}}var maxCount=0;for(level in distribution){if(distribution.hasOwnProperty(level)){if(maxCount<distribution[level].amount){maxCount=distribution[level].amount}}}for(level in distribution){if(distribution.hasOwnProperty(level)){distribution[level].nodeSpacing=(maxCount+1)*this.constants.hierarchicalLayout.nodeSpacing;distribution[level].nodeSpacing/=distribution[level].amount+1;distribution[level].minPos=distribution[level].nodeSpacing-.5*(distribution[level].amount+1)*distribution[level].nodeSpacing}}return distribution};exports._determineLevels=function(hubsize){var nodeId,node;for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];if(node.edges.length==hubsize){node.level=0}}}for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];if(node.level==0){this._setLevel(1,node.edges,node.id)}}}};exports._determineLevelsDirected=function(){var nodeId,node,firstNode;var minLevel=1e4;firstNode=this.nodes[this.nodeIndices[0]];firstNode.level=minLevel;this._setLevelDirected(minLevel,firstNode.edges,firstNode.id);for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];minLevel=node.level<minLevel?node.level:minLevel}}for(nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){node=this.nodes[nodeId];node.level-=minLevel}}};exports._changeConstants=function(){this.constants.clustering.enabled=false;this.constants.physics.barnesHut.enabled=false;this.constants.physics.hierarchicalRepulsion.enabled=true;this._loadSelectedForceSolver();if(this.constants.smoothCurves.enabled==true){this.constants.smoothCurves.dynamic=false}this._configureSmoothCurves();var config=this.constants.hierarchicalLayout;config.levelSeparation=Math.abs(config.levelSeparation);if(config.direction==\"RL\"||config.direction==\"DU\"){config.levelSeparation*=-1}if(config.direction==\"RL\"||config.direction==\"LR\"){if(this.constants.smoothCurves.enabled==true){this.constants.smoothCurves.type=\"vertical\"}}else{if(this.constants.smoothCurves.enabled==true){this.constants.smoothCurves.type=\"horizontal\"}}};exports._placeBranchNodes=function(edges,parentId,distribution,parentLevel){for(var i=0;i<edges.length;i++){var childNode=null;if(edges[i].toId==parentId){childNode=edges[i].from}else{childNode=edges[i].to}var nodeMoved=false;if(this.constants.hierarchicalLayout.direction==\"UD\"||this.constants.hierarchicalLayout.direction==\"DU\"){if(childNode.xFixed&&childNode.level>parentLevel){childNode.xFixed=false;childNode.x=distribution[childNode.level].minPos;nodeMoved=true}}else{if(childNode.yFixed&&childNode.level>parentLevel){childNode.yFixed=false;childNode.y=distribution[childNode.level].minPos;nodeMoved=true}}if(nodeMoved==true){distribution[childNode.level].minPos+=distribution[childNode.level].nodeSpacing;if(childNode.edges.length>1){this._placeBranchNodes(childNode.edges,childNode.id,distribution,childNode.level)}}}};exports._setLevel=function(level,edges,parentId){for(var i=0;i<edges.length;i++){var childNode=null;if(edges[i].toId==parentId){childNode=edges[i].from}else{childNode=edges[i].to}if(childNode.level==-1||childNode.level>level){childNode.level=level;if(childNode.edges.length>1){this._setLevel(level+1,childNode.edges,childNode.id)}}}};exports._setLevelDirected=function(level,edges,parentId){this.nodes[parentId].hierarchyEnumerated=true;var childNode,direction;for(var i=0;i<edges.length;i++){direction=1;if(edges[i].toId==parentId){childNode=edges[i].from;direction=-1}else{childNode=edges[i].to}if(childNode.level==-1){childNode.level=level+direction}}for(var i=0;i<edges.length;i++){if(edges[i].toId==parentId){childNode=edges[i].from}else{childNode=edges[i].to}if(childNode.edges.length>1&&childNode.hierarchyEnumerated===false){this._setLevelDirected(childNode.level,childNode.edges,childNode.id)}}};exports._restoreNodes=function(){for(var nodeId in this.nodes){if(this.nodes.hasOwnProperty(nodeId)){this.nodes[nodeId].xFixed=false;this.nodes[nodeId].yFixed=false}}}},function(module,exports,__webpack_require__){function webpackContext(req){throw new Error(\"Cannot find module '\"+req+\"'.\")}webpackContext.keys=function(){return[]};webpackContext.resolve=webpackContext;module.exports=webpackContext;webpackContext.id=67},function(module,exports,__webpack_require__){exports._calculateNodeForces=function(){var dx,dy,angle,distance,fx,fy,combinedClusterSize,repulsingForce,node1,node2,i,j;var nodes=this.calculationNodes;var nodeIndices=this.calculationNodeIndices;var a_base=-2/3;var b=4/3;var nodeDistance=this.constants.physics.repulsion.nodeDistance;var minimumDistance=nodeDistance;for(i=0;i<nodeIndices.length-1;i++){node1=nodes[nodeIndices[i]];for(j=i+1;j<nodeIndices.length;j++){node2=nodes[nodeIndices[j]];combinedClusterSize=node1.clusterSize+node2.clusterSize-2;dx=node2.x-node1.x;dy=node2.y-node1.y;distance=Math.sqrt(dx*dx+dy*dy);if(distance==0){distance=.1*Math.random();dx=distance}minimumDistance=combinedClusterSize==0?nodeDistance:nodeDistance*(1+combinedClusterSize*this.constants.clustering.distanceAmplification);var a=a_base/minimumDistance;if(distance<2*minimumDistance){if(distance<.5*minimumDistance){repulsingForce=1}else{repulsingForce=a*distance+b}repulsingForce*=combinedClusterSize==0?1:1+combinedClusterSize*this.constants.clustering.forceAmplification;repulsingForce=repulsingForce/Math.max(distance,.01*minimumDistance);fx=dx*repulsingForce;fy=dy*repulsingForce;node1.fx-=fx;node1.fy-=fy;node2.fx+=fx;node2.fy+=fy}}}}},function(module,exports,__webpack_require__){exports._calculateNodeForces=function(){var dx,dy,distance,fx,fy,repulsingForce,node1,node2,i,j;var nodes=this.calculationNodes;var nodeIndices=this.calculationNodeIndices;var nodeDistance=this.constants.physics.hierarchicalRepulsion.nodeDistance;for(i=0;i<nodeIndices.length-1;i++){node1=nodes[nodeIndices[i]];for(j=i+1;j<nodeIndices.length;j++){node2=nodes[nodeIndices[j]];if(node1.level==node2.level){dx=node2.x-node1.x;dy=node2.y-node1.y;distance=Math.sqrt(dx*dx+dy*dy);var steepness=.05;if(distance<nodeDistance){repulsingForce=-Math.pow(steepness*distance,2)+Math.pow(steepness*nodeDistance,2)}else{repulsingForce=0}if(distance==0){distance=.01}else{repulsingForce=repulsingForce/distance}fx=dx*repulsingForce;fy=dy*repulsingForce;node1.fx-=fx;node1.fy-=fy;node2.fx+=fx;node2.fy+=fy}}}};exports._calculateHierarchicalSpringForces=function(){var edgeLength,edge,edgeId;var dx,dy,fx,fy,springForce,distance;var edges=this.edges;var nodes=this.calculationNodes;var nodeIndices=this.calculationNodeIndices;for(var i=0;i<nodeIndices.length;i++){var node1=nodes[nodeIndices[i]];node1.springFx=0;node1.springFy=0}for(edgeId in edges){if(edges.hasOwnProperty(edgeId)){edge=edges[edgeId];if(edge.connected){if(this.nodes.hasOwnProperty(edge.toId)&&this.nodes.hasOwnProperty(edge.fromId)){edgeLength=edge.physics.springLength;edgeLength+=(edge.to.clusterSize+edge.from.clusterSize-2)*this.constants.clustering.edgeGrowth;dx=edge.from.x-edge.to.x;dy=edge.from.y-edge.to.y;distance=Math.sqrt(dx*dx+dy*dy);if(distance==0){distance=.01}springForce=this.constants.physics.springConstant*(edgeLength-distance)/distance;fx=dx*springForce;fy=dy*springForce;if(edge.to.level!=edge.from.level){edge.to.springFx-=fx;edge.to.springFy-=fy;edge.from.springFx+=fx;edge.from.springFy+=fy}else{var factor=.5;edge.to.fx-=factor*fx;edge.to.fy-=factor*fy;edge.from.fx+=factor*fx;edge.from.fy+=factor*fy}}}}}var springForce=1;var springFx,springFy;for(i=0;i<nodeIndices.length;i++){var node=nodes[nodeIndices[i]];springFx=Math.min(springForce,Math.max(-springForce,node.springFx));springFy=Math.min(springForce,Math.max(-springForce,node.springFy));node.fx+=springFx;node.fy+=springFy}var totalFx=0;var totalFy=0;for(i=0;i<nodeIndices.length;i++){var node=nodes[nodeIndices[i]];totalFx+=node.fx;totalFy+=node.fy}var correctionFx=totalFx/nodeIndices.length;var correctionFy=totalFy/nodeIndices.length;for(i=0;i<nodeIndices.length;i++){var node=nodes[nodeIndices[i]];node.fx-=correctionFx;node.fy-=correctionFy}}},function(module,exports,__webpack_require__){exports._calculateNodeForces=function(){if(this.constants.physics.barnesHut.gravitationalConstant!=0){var node;var nodes=this.calculationNodes;var nodeIndices=this.calculationNodeIndices;var nodeCount=nodeIndices.length;this._formBarnesHutTree(nodes,nodeIndices);var barnesHutTree=this.barnesHutTree;for(var i=0;i<nodeCount;i++){node=nodes[nodeIndices[i]];if(node.options.mass>0){this._getForceContribution(barnesHutTree.root.children.NW,node);this._getForceContribution(barnesHutTree.root.children.NE,node);this._getForceContribution(barnesHutTree.root.children.SW,node);this._getForceContribution(barnesHutTree.root.children.SE,node)}}}};exports._getForceContribution=function(parentBranch,node){if(parentBranch.childrenCount>0){var dx,dy,distance;dx=parentBranch.centerOfMass.x-node.x;dy=parentBranch.centerOfMass.y-node.y;distance=Math.sqrt(dx*dx+dy*dy);if(distance*parentBranch.calcSize>this.constants.physics.barnesHut.thetaInverted){if(distance==0){distance=.1*Math.random();dx=distance}var gravityForce=this.constants.physics.barnesHut.gravitationalConstant*parentBranch.mass*node.options.mass/(distance*distance*distance);var fx=dx*gravityForce;var fy=dy*gravityForce;node.fx+=fx;node.fy+=fy}else{if(parentBranch.childrenCount==4){this._getForceContribution(parentBranch.children.NW,node);this._getForceContribution(parentBranch.children.NE,node);this._getForceContribution(parentBranch.children.SW,node);this._getForceContribution(parentBranch.children.SE,node)}else{if(parentBranch.children.data.id!=node.id){if(distance==0){distance=.5*Math.random();dx=distance}var gravityForce=this.constants.physics.barnesHut.gravitationalConstant*parentBranch.mass*node.options.mass/(distance*distance*distance);var fx=dx*gravityForce;var fy=dy*gravityForce;node.fx+=fx;node.fy+=fy}}}}};exports._formBarnesHutTree=function(nodes,nodeIndices){var node;var nodeCount=nodeIndices.length;var minX=Number.MAX_VALUE,minY=Number.MAX_VALUE,maxX=-Number.MAX_VALUE,maxY=-Number.MAX_VALUE;for(var i=0;i<nodeCount;i++){var x=nodes[nodeIndices[i]].x;var y=nodes[nodeIndices[i]].y;if(nodes[nodeIndices[i]].options.mass>0){if(x<minX){minX=x}if(x>maxX){maxX=x}if(y<minY){minY=y}if(y>maxY){maxY=y}}}var sizeDiff=Math.abs(maxX-minX)-Math.abs(maxY-minY);if(sizeDiff>0){minY-=.5*sizeDiff;maxY+=.5*sizeDiff}else{minX+=.5*sizeDiff;maxX-=.5*sizeDiff}var minimumTreeSize=1e-5;var rootSize=Math.max(minimumTreeSize,Math.abs(maxX-minX));var halfRootSize=.5*rootSize;var centerX=.5*(minX+maxX),centerY=.5*(minY+maxY);var barnesHutTree={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:centerX-halfRootSize,maxX:centerX+halfRootSize,minY:centerY-halfRootSize,maxY:centerY+halfRootSize},size:rootSize,calcSize:1/rootSize,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(barnesHutTree.root);for(i=0;i<nodeCount;i++){node=nodes[nodeIndices[i]];if(node.options.mass>0){this._placeInTree(barnesHutTree.root,node)}}this.barnesHutTree=barnesHutTree};exports._updateBranchMass=function(parentBranch,node){var totalMass=parentBranch.mass+node.options.mass;var totalMassInv=1/totalMass;parentBranch.centerOfMass.x=parentBranch.centerOfMass.x*parentBranch.mass+node.x*node.options.mass;parentBranch.centerOfMass.x*=totalMassInv;parentBranch.centerOfMass.y=parentBranch.centerOfMass.y*parentBranch.mass+node.y*node.options.mass;parentBranch.centerOfMass.y*=totalMassInv;parentBranch.mass=totalMass;var biggestSize=Math.max(Math.max(node.height,node.radius),node.width);parentBranch.maxWidth=parentBranch.maxWidth<biggestSize?biggestSize:parentBranch.maxWidth};exports._placeInTree=function(parentBranch,node,skipMassUpdate){if(skipMassUpdate!=true||skipMassUpdate===undefined){this._updateBranchMass(parentBranch,node)}if(parentBranch.children.NW.range.maxX>node.x){if(parentBranch.children.NW.range.maxY>node.y){this._placeInRegion(parentBranch,node,\"NW\")}else{this._placeInRegion(parentBranch,node,\"SW\")}}else{if(parentBranch.children.NW.range.maxY>node.y){this._placeInRegion(parentBranch,node,\"NE\")}else{this._placeInRegion(parentBranch,node,\"SE\")}}};exports._placeInRegion=function(parentBranch,node,region){switch(parentBranch.children[region].childrenCount){case 0:parentBranch.children[region].children.data=node;parentBranch.children[region].childrenCount=1;this._updateBranchMass(parentBranch.children[region],node);break;case 1:if(parentBranch.children[region].children.data.x==node.x&&parentBranch.children[region].children.data.y==node.y){node.x+=Math.random();node.y+=Math.random()}else{this._splitBranch(parentBranch.children[region]);this._placeInTree(parentBranch.children[region],node)}break;case 4:this._placeInTree(parentBranch.children[region],node);\nbreak}};exports._splitBranch=function(parentBranch){var containedNode=null;if(parentBranch.childrenCount==1){containedNode=parentBranch.children.data;parentBranch.mass=0;parentBranch.centerOfMass.x=0;parentBranch.centerOfMass.y=0}parentBranch.childrenCount=4;parentBranch.children.data=null;this._insertRegion(parentBranch,\"NW\");this._insertRegion(parentBranch,\"NE\");this._insertRegion(parentBranch,\"SW\");this._insertRegion(parentBranch,\"SE\");if(containedNode!=null){this._placeInTree(parentBranch,containedNode)}};exports._insertRegion=function(parentBranch,region){var minX,maxX,minY,maxY;var childSize=.5*parentBranch.size;switch(region){case\"NW\":minX=parentBranch.range.minX;maxX=parentBranch.range.minX+childSize;minY=parentBranch.range.minY;maxY=parentBranch.range.minY+childSize;break;case\"NE\":minX=parentBranch.range.minX+childSize;maxX=parentBranch.range.maxX;minY=parentBranch.range.minY;maxY=parentBranch.range.minY+childSize;break;case\"SW\":minX=parentBranch.range.minX;maxX=parentBranch.range.minX+childSize;minY=parentBranch.range.minY+childSize;maxY=parentBranch.range.maxY;break;case\"SE\":minX=parentBranch.range.minX+childSize;maxX=parentBranch.range.maxX;minY=parentBranch.range.minY+childSize;maxY=parentBranch.range.maxY;break}parentBranch.children[region]={centerOfMass:{x:0,y:0},mass:0,range:{minX:minX,maxX:maxX,minY:minY,maxY:maxY},size:.5*parentBranch.size,calcSize:2*parentBranch.calcSize,children:{data:null},maxWidth:0,level:parentBranch.level+1,childrenCount:0}};exports._drawTree=function(ctx,color){if(this.barnesHutTree!==undefined){ctx.lineWidth=1;this._drawBranch(this.barnesHutTree.root,ctx,color)}};exports._drawBranch=function(branch,ctx,color){if(color===undefined){color=\"#FF0000\"}if(branch.childrenCount==4){this._drawBranch(branch.children.NW,ctx);this._drawBranch(branch.children.NE,ctx);this._drawBranch(branch.children.SE,ctx);this._drawBranch(branch.children.SW,ctx)}ctx.strokeStyle=color;ctx.beginPath();ctx.moveTo(branch.range.minX,branch.range.minY);ctx.lineTo(branch.range.maxX,branch.range.minY);ctx.stroke();ctx.beginPath();ctx.moveTo(branch.range.maxX,branch.range.minY);ctx.lineTo(branch.range.maxX,branch.range.maxY);ctx.stroke();ctx.beginPath();ctx.moveTo(branch.range.maxX,branch.range.maxY);ctx.lineTo(branch.range.minX,branch.range.maxY);ctx.stroke();ctx.beginPath();ctx.moveTo(branch.range.minX,branch.range.maxY);ctx.lineTo(branch.range.minX,branch.range.minY);ctx.stroke()}},function(module,exports,__webpack_require__){module.exports=function(module){if(!module.webpackPolyfill){module.deprecate=function(){};module.paths=[];module.children=[];module.webpackPolyfill=1}return module}}])});\n",
"title": "$:/plugins/felixhayashi/vis/vis.js",
"type": "application/javascript",
"module-type": "library"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/highlight/highlight.js": {
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/highlight/highlight.js",
"module-type": "library",
"text": "var hljs;if($tw.browser){\nvar hljs=new function(){function k(v){return v.replace(/&/gm,\"&\").replace(/</gm,\"<\").replace(/>/gm,\">\")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\\n/g,\"\"):w.nodeValue}if(t(w)==\"br\"){return\"\\n\"}return d(w)}).join(\"\")}function r(w){var v=(w.className+\" \"+(w.parentNode?w.parentNode.className:\"\")).split(/\\s+/);v=v.map(function(x){return x.replace(/^language-/,\"\")});return v.filter(function(x){return j(x)||x==\"no-highlight\"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)==\"br\"){z+=1}else{if(A.nodeType==1){v.push({event:\"start\",offset:z,node:A});z=w(A,z);v.push({event:\"stop\",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F=\"\";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset<y[0].offset)?w:y}return y[0].event==\"start\"?w:y}function A(H){function G(I){return\" \"+I.nodeName+'=\"'+k(I.value)+'\"'}F+=\"<\"+t(H)+Array.prototype.map.call(H.attributes,G).join(\"\")+\">\"}function E(G){F+=\"</\"+t(G)+\">\"}function v(G){(G.event==\"start\"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event==\"start\"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),\"m\"+(y.cI?\"i\":\"\")+(z?\"g\":\"\"))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(\" \").forEach(function(H){var I=H.split(\"|\");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k==\"string\"){E(\"keyword\",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\\b[A-Za-z0-9_]+\\b/,true);if(C){if(D.bK){D.b=D.bK.split(\" \").join(\"|\")}if(!D.b){D.b=/\\B|\\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\\B|\\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||\"\";if(D.eW&&C.tE){D.tE+=(D.e?\"|\":\"\")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F==\"self\"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?\"\\\\.?\\\\b(\"+F.b+\")\\\\b\\\\.?\":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join(\"|\"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V.c[T].bR,U)){return V.c[T]}}}function z(U,T){if(i(U.eR,T)){return U}if(U.eW){return z(U.parent,T)}}function A(T,U){return !J&&i(U.iR,T)}function E(V,T){var U=M.cI?T[0].toLowerCase():T[0];return V.k.hasOwnProperty(U)&&V.k[U]}function w(Z,X,W,V){var T=V?\"\":b.classPrefix,U='<span class=\"'+T,Y=W?\"\":\"</span>\";U+=Z+'\">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T=\"\";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode==\"continuous\"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,\"\",true):\"\";if(V.rB){D+=T;C=\"\"}else{if(V.eB){D+=k(U)+T;C=\"\"}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=\"</span>\"}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C=\"\";if(W.starts){P(W.starts,\"\")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme \"'+X+'\" for mode \"'+(I.cN||\"<unnamed>\")+'\"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: \"'+S+'\"')}m(M);var I=R||M;var D=\"\";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C=\"\";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=\"</span>\"}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf(\"Illegal\")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\\t)+)/gm,function(w,z,y,x){return z.replace(/\\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\\n/g,\"<br>\")}return v}function p(z){var y=d(z);var A=r(z);if(A==\"no-highlight\"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"pre\");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=\" hljs \"+(!A&&v.language||\"\");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:\"hljs-\",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(v,p)}function a(){addEventListener(\"DOMContentLoaded\",l,false);addEventListener(\"load\",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE]};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE]};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gim]*/,i:/\\n/,c:[this.BE,{b:/\\[/,e:/\\]/,r:0,c:[this.BE]}]};this.TM={cN:\"title\",b:this.IR,r:0};this.UTM={cN:\"title\",b:this.UIR,r:0}}();hljs.registerLanguage(\"bash\",function(b){var a={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)\\}/}]};var d={cN:\"string\",b:/\"/,e:/\"/,c:[b.BE,a,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[b.BE]}]};var c={cN:\"string\",b:/'/,e:/'/};return{l:/-?[a-z\\.]+/,k:{keyword:\"if then else elif fi for break continue while in do done exit return set declare case esac export exec\",literal:\"true false\",built_in:\"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo\",operator:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"shebang\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:true,c:[b.inherit(b.TM,{b:/\\w[\\w\\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage(\"cs\",function(b){var a=\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield\";return{k:a,c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},b.CLCM,b.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line region endregion pragma checksum\"},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},b.ASM,b.QSM,b.CNM,{bK:\"protected public private internal\",e:/[{;=]/,k:a,c:[{bK:\"class namespace interface\",starts:{c:[b.TM]}},{b:b.IR+\"\\\\s*\\\\(\",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage(\"ruby\",function(e){var h=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var g=\"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\";var a={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var i={cN:\"comment\",v:[{b:\"#\",e:\"$\",c:[a]},{b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[a],r:10},{b:\"^__END__\",e:\"\\\\n$\"}]};var c={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:g};var d={cN:\"string\",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:\"%[qw]?\\\\(\",e:\"\\\\)\"},{b:\"%[qw]?\\\\[\",e:\"\\\\]\"},{b:\"%[qw]?{\",e:\"}\"},{b:\"%[qw]?<\",e:\">\",r:10},{b:\"%[qw]?/\",e:\"/\",r:10},{b:\"%[qw]?%\",e:\"%\",r:10},{b:\"%[qw]?-\",e:\"-\",r:10},{b:\"%[qw]?\\\\|\",e:\"\\\\|\",r:10},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/}]};var b={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:g};var f=[d,i,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+e.IR+\"::)?\"+e.IR}]},i]},{cN:\"function\",bK:\"def\",e:\" |$|;\",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:\"constant\",b:\"(::)?(\\\\b[A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:[d,{b:h}],r:0},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[i,{cN:\"regexp\",c:[e.BE,c],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage(\"diff\",function(a){return{c:[{cN:\"chunk\",r:10,v:[{b:/^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"header\",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\\-\\-\\-/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+\\+\\+/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"javascript\",function(a){return{aliases:[\"js\"],k:{keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require\"},c:[{cN:\"pi\",b:/^\\s*('|\")use strict('|\")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:\"(\"+a.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,c:[a.CLCM,a.CBLCLM],i:/[\"'\\(]/}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+a.IR,r:0}]}});hljs.registerLanguage(\"xml\",function(a){var c=\"[A-Za-z0-9\\\\._:-]+\";var d={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\",subLanguageMode:\"continuous\"};var b={eW:true,i:/</,r:0,c:[d,{cN:\"attribute\",b:c,r:0},{b:\"=\",r:0,c:[{cN:\"value\",v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\"],cI:true,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[b],starts:{e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[b],starts:{e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{b:\"<%\",e:\"%>\",sL:\"vbscript\"},d,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ /><]+\",r:0},b]}]}});hljs.registerLanguage(\"markdown\",function(a){return{c:[{cN:\"header\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"`.+?`\"},{b:\"^( {4}|\\t)\",e:\"$\",r:0}]},{cN:\"horizontal_rule\",b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,rE:true,r:0},{cN:\"link_url\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:true,eE:true},{cN:\"link_reference\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:true,eE:true,}],r:10},{b:\"^\\\\[.+\\\\]:\",e:\"$\",rB:true,c:[{cN:\"link_reference\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true},{cN:\"link_url\",b:\"\\\\s\",e:\"$\"}]}]}});hljs.registerLanguage(\"css\",function(a){var b=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var c={cN:\"function\",b:b+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]};return{cI:true,i:\"[=/|']\",c:[a.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:\"tag\",b:b,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[a.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}});hljs.registerLanguage(\"http\",function(a){return{i:\"\\\\S\",c:[{cN:\"status\",b:\"^HTTP/[0-9\\\\.]+\",e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{cN:\"request\",b:\"^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$\",rB:true,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:true,eE:true}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:true,i:\"\\\\n|\\\\s|=\",starts:{cN:\"string\",e:\"$\"}},{b:\"\\\\n\\\\n\",starts:{sL:\"\",eW:true}}]}});hljs.registerLanguage(\"java\",function(b){var a=\"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws\";return{k:a,i:/<\\//,c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"(^|\\\\s)@[A-Za-z]+\"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:\"protected public private\",e:/[{;=]/,k:a,c:[{cN:\"class\",bK:\"class interface\",eW:true,i:/[:\"<>]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{b:b.UIR+\"\\\\s*\\\\(\",rB:true,c:[b.UTM]}]},b.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"php\",function(b){var e={cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"};var a={cN:\"preprocessor\",b:/<\\?(php)?|\\?>/};var c={cN:\"string\",c:[b.BE,a],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[b.CLCM,b.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"},a]},{cN:\"comment\",b:\"__halt_compiler.+?;\",eW:true,k:\"__halt_compiler\",l:b.UIR},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[b.BE]},a,e,{cN:\"function\",bK:\"function\",e:/[;{]/,i:\"\\\\$|\\\\[|%\",c:[b.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",e,b.CBLCLM,c,d]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[b.UTM]},{bK:\"use\",e:\";\",c:[b.UTM]},{b:\"=>\"},c,d]}});hljs.registerLanguage(\"python\",function(a){var f={cN:\"prompt\",b:/^(>>>|\\.\\.\\.) /};var b={cN:\"string\",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)\"/,e:/\"/,},a.ASM,a.QSM]};var d={cN:\"number\",r:0,v:[{b:a.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:a.CNR+\"[lLjJ]?\"}]};var e={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",f,d,b]};var c={e:/:/,i:/[${=;\\n]/,c:[a.UTM,e]};return{k:{keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:\"function\",bK:\"def\",r:10}),a.inherit(c,{cN:\"class\",bK:\"class\"}),{cN:\"decorator\",b:/@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"sql\",function(a){return{cI:true,i:/[<>]/,c:[{cN:\"operator\",b:\"\\\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\\\b(?!:)\",e:\";\",eW:true,k:{keyword:\"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database\",aggregate:\"count sum min max avg\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[a.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[a.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}});hljs.registerLanguage(\"ini\",function(a){return{cI:true,i:/\\S/,c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:\"on off true false yes no\",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage(\"perl\",function(c){var d=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\";var f={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:d};var g={b:\"->{\",e:\"}\"};var a={cN:\"variable\",v:[{b:/\\$\\d/},{b:/[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},{b:/[\\$\\%\\@\\*][^\\s\\w{]/,r:0}]};var e={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:\"comment\",b:\"^\\\\=\\\\w\",e:\"\\\\=cut\",eW:true},g,{cN:\"string\",c:h,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[c.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[c.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+c.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[c.HCM,e,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[c.BE],r:0}]},{cN:\"sub\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage(\"objectivec\",function(a){var d={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b=\"@interface @class @protocol @implementation\";return{k:d,l:c,i:\"</\",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(\"+b.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",k:b,l:c,c:[a.UTM]},{cN:\"variable\",b:\"\\\\.\"+a.UIR,r:0}]}});hljs.registerLanguage(\"coffeescript\",function(c){var b={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",reserved:\"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf\",built_in:\"npm require console print module exports global window document\"};var a=\"[A-Za-z$_][0-9A-Za-z$_]*\";var f=c.inherit(c.TM,{b:a});var e={cN:\"subst\",b:/#\\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[c.BE,e]},{b:/\"/,e:/\"/,c:[c.BE,e]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[e,c.HCM]},{b:\"//[gim]*\",r:0},{b:\"/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)\"}]},{cN:\"property\",b:\"@\"+a},{b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"}];e.c=d;return{k:b,c:d.concat([{cN:\"comment\",b:\"###\",e:\"###\"},c.HCM,{cN:\"function\",b:\"(\"+a+\"\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",e:\"[-=]>\",rB:true,c:[f,{cN:\"params\",b:\"\\\\(\",rB:true,c:[{b:/\\(/,e:/\\)/,k:b,c:[\"self\"].concat(d)}]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:true,i:/[:=\"\\[\\]]/,c:[f]},f]},{cN:\"attribute\",b:a+\":\",e:\":\",rB:true,eE:true,r:0}])}});hljs.registerLanguage(\"nginx\",function(c){var b={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+c.UIR}]};var a={eW:true,l:\"[a-z/_]+\",k:{built_in:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[c.HCM,{cN:\"string\",c:[c.BE,b],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{cN:\"url\",b:\"([a-z]+):/\",e:\"\\\\s\",eW:true,eE:true},{cN:\"regexp\",c:[c.BE,b],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},b]};return{c:[c.HCM,{b:c.UIR+\"\\\\s\",e:\";|{\",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"json\",function(a){var e={literal:\"true false null\"};var d=[a.QSM,a.CNM];var c={cN:\"value\",e:\",\",eW:true,eE:true,c:d,k:e};var b={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:true,eE:true,c:[a.BE],i:\"\\\\n\",starts:c}],i:\"\\\\S\"};var f={b:\"\\\\[\",e:\"\\\\]\",c:[a.inherit(c,{cN:null})],i:\"\\\\S\"};d.splice(d.length,0,b,f);return{c:d,k:e,i:\"\\\\S\"}});hljs.registerLanguage(\"apache\",function(a){var b={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,c:[a.HCM,{cN:\"tag\",b:\"</?\",e:\">\"},{cN:\"keyword\",b:/\\w+/,r:0,k:{common:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",b]},b,a.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"cpp\",function(a){var b={keyword:\"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary\",built_in:\"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf\"};return{aliases:[\"c\"],k:b,i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{b:\"include\\\\s*<\",e:\">\",i:\"\\\\n\"},a.CLCM]},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:b,r:10,c:[\"self\"]}]}});hljs.registerLanguage(\"makefile\",function(a){var b={cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\\w+\\s*\\W*=/,rB:true,r:0,starts:{cN:\"constant\",e:/\\s*\\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:\"title\",b:/^[\\w]+:\\s*$/},{cN:\"phony\",b:/^\\.PHONY:/,e:/$/,k:\".PHONY\",l:/[\\.\\w]+/},{b:/^\\t+/,e:/$/,c:[a.QSM,b]}]}});}\nexports.hljs = hljs;\n"
},
"$:/plugins/tiddlywiki/highlight/highlight.css": {
"type": "text/css",
"title": "$:/plugins/tiddlywiki/highlight/highlight.css",
"tags": "[[$:/tags/Stylesheet]]",
"text": ".hljs{display:block;padding:.5em;background:#f0f0f0}.hljs,.hljs-subst,.hljs-tag .hljs-title,.lisp .hljs-title,.clojure .hljs-built_in,.nginx .hljs-title{color:black}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-rules .hljs-value .hljs-number,.hljs-preprocessor,.hljs-pragma,.haml .hljs-symbol,.ruby .hljs-symbol,.ruby .hljs-symbol .hljs-string,.hljs-aggregate,.hljs-template_tag,.django .hljs-variable,.smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.bash .hljs-variable,.apache .hljs-tag,.apache .hljs-cbracket,.tex .hljs-command,.tex .hljs-special,.erlang_repl .hljs-function_or_atom,.asciidoc .hljs-header,.markdown .hljs-header,.coffeescript .hljs-attribute{color:#800}.smartquote,.hljs-comment,.hljs-annotation,.hljs-template_comment,.diff .hljs-header,.hljs-chunk,.asciidoc .hljs-blockquote,.markdown .hljs-blockquote{color:#888}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-hexcolor,.smalltalk .hljs-symbol,.smalltalk .hljs-char,.go .hljs-constant,.hljs-change,.lasso .hljs-variable,.makefile .hljs-variable,.asciidoc .hljs-bullet,.markdown .hljs-bullet,.asciidoc .hljs-link_url,.markdown .hljs-link_url{color:#080}.hljs-label,.hljs-javadoc,.ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.haml .hljs-bullet,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.apache .hljs-sqbracket,.nginx .hljs-built_in,.tex .hljs-formula,.erlang_repl .hljs-reserved,.hljs-prompt,.asciidoc .hljs-link_label,.markdown .hljs-link_label,.vhdl .hljs-attribute,.clojure .hljs-attribute,.asciidoc .hljs-attribute,.lasso .hljs-attribute,.coffeescript .hljs-property,.hljs-phony{color:#88F}.hljs-keyword,.hljs-id,.hljs-title,.hljs-built_in,.hljs-aggregate,.css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.smalltalk .hljs-class,.hljs-winutils,.bash .hljs-variable,.apache .hljs-tag,.go .hljs-typename,.tex .hljs-command,.asciidoc .hljs-strong,.markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:bold}.asciidoc .hljs-emphasis,.markdown .hljs-emphasis{font-style:italic}.nginx .hljs-built_in{font-weight:normal}.coffeescript .javascript,.javascript .xml,.lasso .markup,.tex .hljs-formula,.xml .javascript,.xml .vbscript,.xml .css,.xml .hljs-cdata{opacity:.5}"
},
"$:/plugins/tiddlywiki/highlight/highlightblock.js": {
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n\nif($tw.browser) {\n\tvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\").hljs;\n\thljs.configure({tabReplace: \" \"});\t\n}\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0];\n\tif($tw.browser && this.document !== $tw.fakeDocument && this.language) {\n\t\tdomNode.className = this.language.toLowerCase();\n\t\thljs.highlightBlock(domNode);\n\t}\n};\n\n})();\n",
"title": "$:/plugins/tiddlywiki/highlight/highlightblock.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/highlight/license": {
"title": "$:/plugins/tiddlywiki/highlight/license",
"type": "text/plain",
"text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of highlight.js nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
"$:/plugins/tiddlywiki/highlight/styles": {
"title": "$:/plugins/tiddlywiki/highlight/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\n/* Tomorrow Night Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n.tomorrow-comment, pre .comment, pre .title {\n color: #969896;\n}\n\n.tomorrow-red, pre .variable, pre .attribute, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {\n color: #cc6666;\n}\n\n.tomorrow-orange, pre .number, pre .preprocessor, pre .pragma, pre .built_in, pre .literal, pre .params, pre .constant {\n color: #de935f;\n}\n\n.tomorrow-yellow, pre .ruby .class .title, pre .css .rules .attribute {\n color: #f0c674;\n}\n\n.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {\n color: #b5bd68;\n}\n\n.tomorrow-aqua, pre .css .hexcolor {\n color: #8abeb7;\n}\n\n.tomorrow-blue, pre .function, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {\n color: #81a2be;\n}\n\n.tomorrow-purple, pre .keyword, pre .javascript .function {\n color: #b294bb;\n}\n\npre code {\n display: block;\n background: #1d1f21;\n color: #c5c8c6;\n padding: 0.5em;\n}\n\npre .coffeescript .javascript,\npre .javascript .xml,\npre .tex .formula,\npre .xml .javascript,\npre .xml .vbscript,\npre .xml .css,\npre .xml .cdata {\n opacity: 0.5;\n}\n"
}
}
}
Deadlands: Tartarus on Equestria
$:/core/ui/AdvancedSearch/Filter
$:/core/ui/ControlPanel/Palette
$:/core/ui/DefaultSearchResultList
$:/core/ui/ControlPanel/Basics
$:/core/ui/ControlPanel/Plugins/Installed
$:/core/ui/ControlPanel/Saving
$:/core/ui/MoreSideBar/Missing
$:/core/ui/ControlPanel/Toolbars/PageControls
[tag[Edge:Signature Spell]]
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
}
}
}
Novice, Agility d8+, Grace d6+
$:/themes/tiddlywiki/vanilla
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-title {\n/********************************\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n********************************/\n\ttop: 0px;\n\tbackground: <<colour tiddler-background>>;\n\tz-index: 500;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal-displayed {\n\t<<filter \"blur(4px)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\t<<background-linear-gradient \"left, rgb(216,216,216) 0%, rgb(236,236,236) 250px\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(224,224,224) 100%\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(248,248,248) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"2px 2px 4px rgba(0,0,0,0.2)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "Theme Tweaks",
"text": "You can tweak certain aspects of the ''Vanilla'' theme.\n\n! Settings\n\n* [[Font family|$:/themes/tiddlywiki/vanilla/settings/fontfamily]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/>\n\n! Sizes\n\n* [[Font size|$:/themes/tiddlywiki/vanilla/metrics/fontsize]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/>\n* [[Line height|$:/themes/tiddlywiki/vanilla/metrics/lineheight]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/>\n* [[Font size for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/>\n* [[Line height for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodylineheight]]: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/>\n* [[Story left position|$:/themes/tiddlywiki/vanilla/metrics/storyleft]] //(the distance between the left of the screen and the left margin of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/>\n* [[Story top position|$:/themes/tiddlywiki/vanilla/metrics/storytop]] //(the distance between the top of the screen and the top margin of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/>\n* [[Story right|$:/themes/tiddlywiki/vanilla/metrics/storyright]] //(the distance between the left side of the screen and the left margin of the sidebar area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/>\n* [[Story width|$:/themes/tiddlywiki/vanilla/metrics/storywidth]] //(the width of the story river or tiddler area)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/>\n* [[Tiddler width|$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth]] //(the width of individual tiddlers -- used for zoomin storyview)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/>\n* [[Sidebar breakpoint|$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint]] //(the minimum width for the sidebar to be displayed alongside the story river)//: <$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/>\n"
},
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tword-wrap: break-word;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n white-space: pre-wrap;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: normal;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-btn-big-green {\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 300;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour tag-foreground>>;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-search-results {\n\tpadding-top: 14px;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg,\n.tc-search svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: auto;\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 28px;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor, .tc-tiddler-frame textarea.tc-edit-texteditor {\n\twidth: 100%;\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 48%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 3px 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n.tc-tiddler-preview-edit {\n\twidth: 48%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n\twidth: calc(100% - 84px);\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down-language-chooser img {\n\twidth: 2em;\n\tvertical-align: baseline;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: relative;\n\t\twidth: 50%;\n\t\tmargin: 30px auto;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tmax-width: 500px;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 28px;\n\tpadding: 14px 14px 14px 14px;\n\tborder: 2px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 14px;\n\tright: 14px;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\t\n}\n\n.tc-static-alert {\n\tposition: relative;\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n\tposition: absolute;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: block;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground-colour: <<colour background>>;\n\tmargin: 1em 0 1em 0;\n\tpadding: 8px;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n\tdisplay: inline-block;\n\tvertical-align: middle;\t\n}\n\na.tc-plugin-info img, a.tc-plugin-info svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 1em 1em 1em 1em;\n\tmargin-top: -1em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder: 1px solid <<colour table-border>>;\n}\n\n.tc-chooser-item {\n\tborder: 8px;\n}\n\n.tc-chooser-item a.tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-foreground>>;\n\tbackground-color: <<colour tiddler-link-background>>;\n\tmargin: 4px;\n}\n\n.tc-chooser-item a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 4px;\n\tborder: 1px solid #000;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9.\n * Hide the `template` element in IE, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari 5, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8+, and Opera\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "\"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif"
}
}
}
\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline
/*
** Start with the normalize CSS reset, and then belay some of its effects
*/
{{$:/themes/tiddlywiki/vanilla/reset}}
*, input[type="search"] {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
html button {
line-height: 1.2;
}
/*
** Basic element styles
*/
html {
font-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};
text-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */
}
html:-webkit-full-screen {
background-color: <<colour page-background>>;
}
body.tc-body {
font-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};
line-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};
color: <<colour foreground>>;
background-color: <<colour page-background>>;
word-wrap: break-word;
}
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
font-weight: 700;
}
pre {
display: block;
padding: 14px;
margin-top: 1em;
margin-bottom: 1em;
word-break: normal;
word-wrap: break-word;
white-space: pre;
white-space: pre-wrap;
background-color: <<colour pre-background>>;
border: 1px solid <<colour pre-border>>;
padding: 0 3px 2px;
border-radius: 3px;
}
code {
color: <<colour code-foreground>>;
background-color: <<colour code-background>>;
border: 1px solid <<colour code-border>>;
white-space: pre-wrap;
padding: 0 3px 2px;
border-radius: 3px;
}
blockquote {
border-left: 5px solid <<colour blockquote-bar>>;
margin-left: 25px;
padding-left: 10px;
}
dl dt {
font-weight: bold;
margin-top: 6px;
}
.tc-muted {
color: <<colour muted-foreground>>;
}
/*
Markdown likes putting code elements inside pre elements
*/
pre > code {
padding: 0;
border: none;
background-color: inherit;
color: inherit;
}
table {
border: 1px solid <<colour table-border>>;
width: auto;
max-width: 100%;
caption-side: bottom;
margin-top: 1em;
margin-bottom: 1em;
}
table th, table td {
padding: 0 7px 0 7px;
border-top: 1px solid <<colour table-border>>;
border-left: 1px solid <<colour table-border>>;
}
table thead tr td, table th {
background-color: <<colour table-header-background>>;
font-weight: bold;
}
table tfoot tr td {
background-color: <<colour table-footer-background>>;
}
.tc-csv-table {
white-space: nowrap;
}
.tc-tiddler-frame img,
.tc-tiddler-frame svg,
.tc-tiddler-frame canvas,
.tc-tiddler-frame embed,
.tc-tiddler-frame iframe {
max-width: 100%;
}
.tc-tiddler-body > embed,
.tc-tiddler-body > iframe {
width: 100%;
height: 600px;
}
/*
** Links
*/
button.tc-tiddlylink,
a.tc-tiddlylink {
text-decoration: none;
font-weight: normal;
color: <<colour tiddler-link-foreground>>;
-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */
}
.tc-sidebar-lists a.tc-tiddlylink {
color: <<colour sidebar-tiddler-link-foreground>>;
}
.tc-sidebar-lists a.tc-tiddlylink:hover {
color: <<colour sidebar-tiddler-link-foreground-hover>>;
}
button.tc-tiddlylink:hover,
a.tc-tiddlylink:hover {
text-decoration: underline;
}
a.tc-tiddlylink-resolves {
}
a.tc-tiddlylink-shadow {
font-weight: bold;
}
a.tc-tiddlylink-shadow.tc-tiddlylink-resolves {
font-weight: normal;
}
a.tc-tiddlylink-missing {
font-style: italic;
}
a.tc-tiddlylink-external {
text-decoration: underline;
color: <<colour external-link-foreground>>;
background-color: <<colour external-link-background>>;
}
a.tc-tiddlylink-external:visited {
color: <<colour external-link-foreground-visited>>;
background-color: <<colour external-link-background-visited>>;
}
a.tc-tiddlylink-external:hover {
color: <<colour external-link-foreground-hover>>;
background-color: <<colour external-link-background-hover>>;
}
/*
** Drag and drop styles
*/
.tc-tiddler-dragger {
position: relative;
z-index: -10000;
}
.tc-tiddler-dragger-inner {
position: absolute;
display: inline-block;
padding: 8px 20px;
font-size: 16.9px;
font-weight: bold;
line-height: 20px;
color: <<colour dragger-foreground>>;
text-shadow: 0 1px 0 rgba(0, 0, 0, 1);
white-space: nowrap;
vertical-align: baseline;
background-color: <<colour dragger-background>>;
border-radius: 20px;
}
.tc-tiddler-dragger-cover {
position: absolute;
background-color: <<colour page-background>>;
}
.tc-dropzone {
position: relative;
}
.tc-dropzone.tc-dragover:before {
z-index: 10000;
display: block;
position: absolute;
position: -webkit-sticky;
position: -moz-sticky;
position: -o-sticky;
position: -ms-sticky;
position: sticky;
top: 0;
left: 0;
right: 0;
background: <<colour dropzone-background>>;
text-align: center;
content: "<<lingo DropMessage>>";
}
/*
** Buttons
*/
button svg, button img {
vertical-align: middle;
}
.tc-btn-invisible {
padding: 0;
margin: 0;
background: none;
border: none;
}
.tc-btn-icon svg {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
}
.tc-btn-text {
padding: 0;
margin: 0;
}
.tc-btn-big-green {
padding: 8px;
margin: 4px 8px 4px 8px;
background: <<colour download-background>>;
color: <<colour download-foreground>>;
fill: <<colour download-foreground>>;
border: none;
font-size: 1.2em;
line-height: 1.4em;
}
.tc-sidebar-lists input {
color: <<colour foreground>>;
}
.tc-sidebar-lists button {
color: <<colour sidebar-button-foreground>>;
fill: <<colour sidebar-button-foreground>>;
}
.tc-sidebar-lists button.tc-btn-mini {
color: <<colour sidebar-muted-foreground>>;
}
.tc-sidebar-lists button.tc-btn-mini:hover {
color: <<colour sidebar-muted-foreground-hover>>;
}
button svg.tc-image-button, button .tc-image-button img {
height: 1em;
width: 1em;
}
/*
** Tags and missing tiddlers
*/
.tc-tag-list-item {
position: relative;
display: inline-block;
margin-right: 7px;
}
.tc-tags-wrapper {
margin: 4px 0 14px 0;
}
.tc-missing-tiddler-label {
font-style: italic;
font-weight: normal;
display: inline-block;
font-size: 11.844px;
line-height: 14px;
white-space: nowrap;
vertical-align: baseline;
}
button.tc-tag-label, span.tc-tag-label {
display: inline-block;
padding: 0.16em 0.7em;
font-size: 0.9em;
font-weight: 300;
line-height: 1.2em;
color: <<colour tag-foreground>>;
white-space: nowrap;
vertical-align: baseline;
background-color: <<colour tag-background>>;
border-radius: 1em;
}
.tc-untagged-separator {
width: 10em;
left: 0;
margin-left: 0;
border: 0;
height: 1px;
background: <<colour tab-divider>>;
}
button.tc-untagged-label {
background-color: <<colour untagged-background>>;
}
.tc-tag-label svg, .tc-tag-label img {
height: 1em;
width: 1em;
fill: <<colour tag-foreground>>;
}
.tc-tag-manager-table .tc-tag-label {
white-space: normal;
}
.tc-tag-manager-tag {
width: 100%;
}
/*
** Page layout
*/
.tc-topbar {
position: fixed;
z-index: 1200;
}
.tc-topbar-left {
left: 29px;
top: 5px;
}
.tc-topbar-right {
top: 5px;
right: 29px;
}
.tc-topbar button {
padding: 8px;
}
.tc-topbar svg {
fill: <<colour muted-foreground>>;
}
.tc-topbar button:hover svg {
fill: <<colour foreground>>;
}
.tc-sidebar-header {
color: <<colour sidebar-foreground>>;
fill: <<colour sidebar-foreground>>;
}
.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {
font-weight: 300;
}
.tc-sidebar-header .tc-sidebar-lists p {
margin-top: 3px;
margin-bottom: 3px;
}
.tc-sidebar-header .tc-missing-tiddler-label {
color: <<colour sidebar-foreground>>;
}
.tc-advanced-search input {
width: 60%;
}
.tc-search a svg {
width: 1.2em;
height: 1.2em;
vertical-align: middle;
}
.tc-search-results {
padding-top: 14px;
}
.tc-page-controls {
margin-top: 14px;
font-size: 1.5em;
}
.tc-page-controls button {
margin-right: 0.5em;
}
.tc-page-controls a.tc-tiddlylink:hover {
text-decoration: none;
}
.tc-page-controls img {
width: 1em;
}
.tc-page-controls svg,
.tc-search svg {
fill: <<colour sidebar-controls-foreground>>;
}
.tc-page-controls button:hover svg, .tc-page-controls a:hover svg,
.tc-search button:hover svg, .tc-search a:hover svg {
fill: <<colour sidebar-controls-foreground-hover>>;
}
.tc-menu-list-item {
white-space: nowrap;
}
.tc-menu-list-count {
font-weight: bold;
}
.tc-menu-list-subitem {
padding-left: 7px;
}
.tc-story-river {
position: relative;
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-sidebar-header {
padding: 14px;
min-height: 32px;
margin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
}
.tc-story-river {
position: relative;
padding: 0;
}
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-message-box {
margin: 21px -21px 21px -21px;
}
.tc-sidebar-scrollable {
position: fixed;
top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
left: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};
bottom: 0;
right: 0;
overflow-y: auto;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
margin: 0 0 0 -42px;
padding: 71px 0 28px 42px;
}
.tc-story-river {
position: relative;
left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};
top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};
width: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};
padding: 42px 42px 42px 42px;
}
<<if-no-sidebar "
.tc-story-river {
width: auto;
}
">>
}
@media print {
body.tc-body {
background-color: transparent;
}
.tc-sidebar-header, .tc-topbar {
display: none;
}
.tc-story-river {
margin: 0;
padding: 0;
}
.tc-story-river .tc-tiddler-frame {
margin: 0;
border: none;
padding: 28px;
}
}
/*
** Tiddler styles
*/
.tc-tiddler-frame {
margin-bottom: 28px;
background-color: <<colour tiddler-background>>;
border: 1px solid <<colour tiddler-border>>;
}
.tc-tiddler-info {
padding: 14px 42px 14px 42px;
background-color: <<colour tiddler-info-background>>;
border-top: 1px solid <<colour tiddler-info-border>>;
border-bottom: 1px solid <<colour tiddler-info-border>>;
}
.tc-tiddler-info p {
margin-top: 3px;
margin-bottom: 3px;
}
.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour tiddler-info-tab-background>>;
border-bottom: 1px solid <<colour tiddler-info-tab-background>>;
}
.tc-view-field-table {
width: 100%;
}
.tc-view-field-name {
width: 1%; /* Makes this column be as narrow as possible */
text-align: right;
font-style: italic;
font-weight: 200;
}
.tc-view-field-value {
}
@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-tiddler-frame {
padding: 14px 14px 14px 14px;
}
.tc-tiddler-info {
margin: 0 -14px 0 -14px;
}
}
@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {
.tc-tiddler-frame {
padding: 28px 42px 42px 42px;
width: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};
border-radius: 2px;
}
<<if-no-sidebar "
.tc-tiddler-frame {
width: 100%;
}
">>
.tc-tiddler-info {
margin: 0 -42px 0 -42px;
}
}
.tc-site-title,
.tc-titlebar {
font-weight: 300;
font-size: 2.35em;
line-height: 1.2em;
color: <<colour tiddler-title-foreground>>;
margin: 0;
}
.tc-tiddler-title-icon {
vertical-align: middle;
}
.tc-system-title-prefix {
color: <<colour muted-foreground>>;
}
.tc-titlebar h2 {
font-size: 1em;
display: inline;
}
.tc-titlebar img {
height: 1em;
}
.tc-subtitle {
font-size: 0.9em;
color: <<colour tiddler-subtitle-foreground>>;
font-weight: 300;
}
.tc-tiddler-missing .tc-title {
font-style: italic;
font-weight: normal;
}
.tc-tiddler-frame .tc-tiddler-controls {
float: right;
}
.tc-tiddler-controls .tc-drop-down {
font-size: 0.6em;
}
.tc-tiddler-controls .tc-drop-down .tc-drop-down {
font-size: 1em;
}
.tc-tiddler-controls > span > button {
vertical-align: baseline;
margin-left:5px;
}
.tc-tiddler-controls button svg, .tc-tiddler-controls button img {
height: 0.75em;
fill: <<colour tiddler-controls-foreground>>;
}
.tc-tiddler-controls button.tc-selected svg {
fill: <<colour tiddler-controls-foreground-selected>>;
}
.tc-tiddler-controls button.tc-btn-invisible:hover svg {
fill: <<colour tiddler-controls-foreground-hover>>;
}
@media print {
.tc-tiddler-controls {
display: none;
}
}
.tc-tiddler-help { /* Help prompts within tiddler template */
color: <<colour muted-foreground>>;
margin-top: 14px;
}
.tc-tiddler-help a.tc-tiddlylink {
color: <<colour very-muted-foreground>>;
}
.tc-tiddler-frame input.tc-edit-texteditor, .tc-tiddler-frame textarea.tc-edit-texteditor {
width: 100%;
padding: 3px 3px 3px 3px;
border: 1px solid <<colour tiddler-editor-border>>;
line-height: 1.3em;
-webkit-appearance: none;
margin: 4px 0 4px 0;
}
.tc-tiddler-frame .tc-binary-warning {
width: 100%;
height: 5em;
text-align: center;
padding: 3em 3em 6em 3em;
background: <<colour alert-background>>;
border: 1px solid <<colour alert-border>>;
}
.tc-tiddler-frame input.tc-edit-texteditor {
background-color: <<colour tiddler-editor-background>>;
}
canvas.tc-edit-bitmapeditor {
border: 6px solid <<colour tiddler-editor-border-image>>;
cursor: crosshair;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
margin-top: 6px;
margin-bottom: 6px;
}
.tc-edit-bitmapeditor-width {
display: block;
}
.tc-edit-bitmapeditor-height {
display: block;
}
.tc-tiddler-frame .tc-tiddler-body {
font-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};
line-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};
}
.tc-titlebar, .tc-tiddler-edit-title {
overflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */
}
/*
** Toolbar buttons
*/
.tc-page-controls svg.tc-image-new-button {
fill: <<colour toolbar-new-button>>;
}
.tc-page-controls svg.tc-image-options-button {
fill: <<colour toolbar-options-button>>;
}
.tc-page-controls svg.tc-image-save-button {
fill: <<colour toolbar-save-button>>;
}
.tc-tiddler-controls button svg.tc-image-info-button {
fill: <<colour toolbar-info-button>>;
}
.tc-tiddler-controls button svg.tc-image-edit-button {
fill: <<colour toolbar-edit-button>>;
}
.tc-tiddler-controls button svg.tc-image-close-button {
fill: <<colour toolbar-close-button>>;
}
.tc-tiddler-controls button svg.tc-image-delete-button {
fill: <<colour toolbar-delete-button>>;
}
.tc-tiddler-controls button svg.tc-image-cancel-button {
fill: <<colour toolbar-cancel-button>>;
}
.tc-tiddler-controls button svg.tc-image-done-button {
fill: <<colour toolbar-done-button>>;
}
/*
** Tiddler edit mode
*/
.tc-tiddler-edit-frame em.tc-edit {
color: <<colour muted-foreground>>;
font-style: normal;
}
.tc-edit-type-dropdown a.tc-tiddlylink-missing {
font-style: normal;
}
.tc-edit-tags {
border: 1px solid <<colour tiddler-editor-border>>;
padding: 4px 8px 4px 8px;
}
.tc-edit-add-tag {
display: inline-block;
}
.tc-edit-add-tag .tc-add-tag-name input {
width: 50%;
}
.tc-edit-tags .tc-tag-label {
display: inline-block;
}
.tc-edit-tags-list {
margin: 14px 0 14px 0;
}
.tc-remove-tag-button {
padding-left: 4px;
}
.tc-tiddler-preview {
overflow: auto;
}
.tc-tiddler-preview-preview {
float: right;
width: 48%;
border: 1px solid <<colour tiddler-editor-border>>;
margin: 4px 3px 3px 3px;
padding: 3px 3px 3px 3px;
}
.tc-tiddler-preview-edit {
width: 48%;
}
.tc-edit-fields {
width: 100%;
}
.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {
border: none;
padding: 4px;
}
.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {
background-color: <<colour tiddler-editor-fields-odd>>;
}
.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {
background-color: <<colour tiddler-editor-fields-even>>;
}
.tc-edit-field-name {
text-align: right;
}
.tc-edit-field-value input {
width: 100%;
}
.tc-edit-field-remove {
}
.tc-edit-field-remove svg {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
vertical-align: middle;
}
.tc-edit-field-add-name {
display: inline-block;
width: 15%;
}
.tc-edit-field-add-value {
display: inline-block;
width: 40%;
}
.tc-edit-field-add-button {
display: inline-block;
width: 10%;
}
/*
** Storyview Classes
*/
.tc-storyview-zoomin-tiddler {
position: absolute;
display: block;
width: 100%;
width: calc(100% - 84px);
}
/*
** Dropdowns
*/
.tc-btn-dropdown {
text-align: left;
}
.tc-btn-dropdown svg, .tc-btn-dropdown img {
height: 1em;
width: 1em;
fill: <<colour muted-foreground>>;
}
.tc-drop-down-wrapper {
position: relative;
}
.tc-drop-down {
min-width: 380px;
border: 1px solid <<colour dropdown-border>>;
background-color: <<colour dropdown-background>>;
padding: 7px 0 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
text-shadow: none;
line-height: 1.4;
}
.tc-drop-down .tc-drop-down {
margin-left: 14px;
}
.tc-drop-down button svg, .tc-drop-down a svg {
fill: <<colour foreground>>;
}
.tc-drop-down button.tc-btn-invisible:hover svg {
fill: <<colour foreground>>;
}
.tc-drop-down p {
padding: 0 14px 0 14px;
}
.tc-drop-down svg {
width: 1em;
height: 1em;
}
.tc-drop-down img {
width: 1em;
}
.tc-drop-down-language-chooser img {
width: 2em;
vertical-align: baseline;
}
.tc-drop-down a, .tc-drop-down button {
display: block;
padding: 0 14px 0 14px;
width: 100%;
text-align: left;
color: <<colour foreground>>;
line-height: 1.4;
}
.tc-drop-down .tc-file-input-wrapper {
width: 100%;
}
.tc-drop-down .tc-file-input-wrapper button {
color: <<colour foreground>>;
}
.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
text-decoration: none;
}
.tc-drop-down .tc-tab-buttons button {
background-color: <<colour dropdown-tab-background>>;
}
.tc-drop-down .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour dropdown-tab-background-selected>>;
border-bottom: 1px solid <<colour dropdown-tab-background-selected>>;
}
.tc-drop-down-bullet {
display: inline-block;
width: 0.5em;
}
.tc-drop-down .tc-tab-contents a {
padding: 0 0.5em 0 0.5em;
}
.tc-block-dropdown-wrapper {
position: relative;
}
.tc-block-dropdown {
position: absolute;
min-width: 220px;
border: 1px solid <<colour dropdown-border>>;
background-color: <<colour dropdown-background>>;
padding: 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
z-index: 1000;
}
.tc-block-dropdown a {
display: block;
padding: 4px 14px 4px 14px;
}
.tc-drop-down .tc-dropdown-item,
.tc-block-dropdown .tc-dropdown-item {
padding: 4px 14px 4px 7px;
color: <<colour muted-foreground>>;
}
.tc-block-dropdown a:hover {
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
text-decoration: none;
}
/*
** Modals
*/
.tc-modal-wrapper {
position: fixed;
overflow: auto;
overflow-y: scroll;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.tc-modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1000;
background-color: <<colour modal-backdrop>>;
}
.tc-modal {
z-index: 1100;
background-color: <<colour modal-background>>;
border: 1px solid <<colour modal-border>>;
}
@media (max-width: 55em) {
.tc-modal {
position: fixed;
top: 1em;
left: 1em;
right: 1em;
}
.tc-modal-body {
overflow-y: auto;
max-height: 400px;
}
}
@media (min-width: 55em) {
.tc-modal {
position: relative;
width: 50%;
margin: 30px auto;
}
}
.tc-modal-header {
padding: 9px 15px;
border-bottom: 1px solid <<colour modal-header-border>>;
}
.tc-modal-header h3 {
margin: 0;
line-height: 30px;
}
.tc-modal-body {
padding: 15px;
}
.tc-modal-footer {
padding: 14px 15px 15px;
margin-bottom: 0;
text-align: right;
background-color: <<colour modal-footer-background>>;
border-top: 1px solid <<colour modal-footer-border>>;
}
/*
** Notifications
*/
.tc-notification {
position: fixed;
top: 14px;
right: 42px;
z-index: 1300;
max-width: 280px;
padding: 0 14px 0 14px;
background-color: <<colour notification-background>>;
border: 1px solid <<colour notification-border>>;
}
/*
** Tabs
*/
.tc-tab-set.tc-vertical {
display: -webkit-flex;
display: flex;
}
.tc-tab-buttons {
font-size: 0.85em;
padding-top: 1em;
margin-bottom: -2px;
}
.tc-tab-buttons.tc-vertical {
z-index: 100;
display: block;
padding-top: 14px;
vertical-align: top;
text-align: right;
margin-bottom: inherit;
margin-right: -1px;
max-width: 33%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
}
.tc-tab-buttons button.tc-tab-selected {
color: <<colour tab-foreground-selected>>;
background-color: <<colour tab-background-selected>>;
border-left: 1px solid <<colour tab-border-selected>>;
border-top: 1px solid <<colour tab-border-selected>>;
border-right: 1px solid <<colour tab-border-selected>>;
}
.tc-tab-buttons button {
color: <<colour tab-foreground>>;
padding: 3px 5px 3px 5px;
font-weight: 300;
border: none;
background: inherit;
background-color: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-top: 1px solid <<colour tab-border>>;
border-right: 1px solid <<colour tab-border>>;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.tc-tab-buttons.tc-vertical button {
display: block;
width: 100%;
margin-top: 3px;
text-align: right;
background-color: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
border-right: none;
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
}
.tc-tab-buttons.tc-vertical button.tc-tab-selected {
background-color: <<colour tab-background-selected>>;
border-right: 1px solid <<colour tab-background-selected>>;
}
.tc-tab-divider {
border-top: 1px solid <<colour tab-divider>>;
}
.tc-tab-divider.tc-vertical {
display: none;
}
.tc-tab-content {
margin-top: 14px;
}
.tc-tab-content.tc-vertical {
display: inline-block;
vertical-align: top;
padding-top: 0;
padding-left: 14px;
border-left: 1px solid <<colour tab-border>>;
-webkit-flex: 1 0 70%;
flex: 1 0 70%;
}
.tc-sidebar-lists .tc-tab-buttons {
margin-bottom: -1px;
}
.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour sidebar-tab-background-selected>>;
color: <<colour sidebar-tab-foreground-selected>>;
border-left: 1px solid <<colour sidebar-tab-border-selected>>;
border-top: 1px solid <<colour sidebar-tab-border-selected>>;
border-right: 1px solid <<colour sidebar-tab-border-selected>>;
}
.tc-sidebar-lists .tc-tab-buttons button {
background-color: <<colour sidebar-tab-background>>;
color: <<colour sidebar-tab-foreground>>;
border-left: 1px solid <<colour sidebar-tab-border>>;
border-top: 1px solid <<colour sidebar-tab-border>>;
border-right: 1px solid <<colour sidebar-tab-border>>;
}
.tc-sidebar-lists .tc-tab-divider {
border-top: 1px solid <<colour sidebar-tab-divider>>;
}
.tc-more-sidebar .tc-tab-buttons button {
background-color: <<colour sidebar-tab-background>>;
border-top: none;
border-left: none;
border-bottom: none;
border-right: 1px solid #ccc;
margin-bottom: inherit;
}
.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {
background-color: <<colour sidebar-tab-background-selected>>;
border: none;
}
/*
** Alerts
*/
.tc-alerts {
position: fixed;
top: 0;
left: 0;
max-width: 500px;
z-index: 20000;
}
.tc-alert {
position: relative;
margin: 28px;
padding: 14px 14px 14px 14px;
border: 2px solid <<colour alert-border>>;
background-color: <<colour alert-background>>;
}
.tc-alert-toolbar {
position: absolute;
top: 14px;
right: 14px;
}
.tc-alert-toolbar svg {
fill: <<colour alert-muted-foreground>>;
}
.tc-alert-subtitle {
color: <<colour alert-muted-foreground>>;
font-weight: bold;
}
.tc-alert-highlight {
color: <<colour alert-highlight>>;
}
.tc-static-alert {
position: relative;
}
.tc-static-alert-inner {
padding: 0 2px 2px 42px;
color: <<colour static-alert-foreground>>;
position: absolute;
}
/*
** Control panel
*/
.tc-control-panel td {
padding: 4px;
}
.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {
width: 100%;
}
.tc-plugin-info {
display: block;
border: 1px solid <<colour muted-foreground>>;
background-colour: <<colour background>>;
margin: 1em 0 1em 0;
padding: 8px;
}
.tc-plugin-info-disabled {
background: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
background: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
}
.tc-plugin-info-disabled:hover {
background: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
background: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
}
a.tc-tiddlylink.tc-plugin-info:hover {
text-decoration: none;
background-color: <<colour primary>>;
color: <<colour background>>;
fill: <<colour foreground>>;
}
a.tc-tiddlylink.tc-plugin-info:hover svg {
fill: <<colour foreground>>;
}
.tc-plugin-info-chunk {
display: inline-block;
vertical-align: middle;
}
a.tc-plugin-info img, a.tc-plugin-info svg {
width: 2em;
height: 2em;
fill: <<colour muted-foreground>>;
}
.tc-plugin-info-dropdown {
border: 1px solid <<colour muted-foreground>>;
padding: 1em 1em 1em 1em;
margin-top: -1em;
}
/*
** Message boxes
*/
.tc-message-box {
border: 1px solid <<colour message-border>>;
background: <<colour message-background>>;
padding: 0px 21px 0px 21px;
font-size: 12px;
line-height: 18px;
color: <<colour message-foreground>>;
}
/*
** Pictures
*/
.tc-bordered-image {
border: 1px solid <<colour muted-foreground>>;
padding: 5px;
margin: 5px;
}
/*
** Floats
*/
.tc-float-right {
float: right;
}
/*
** Chooser
*/
.tc-chooser {
border: 1px solid <<colour table-border>>;
}
.tc-chooser-item {
border: 8px;
}
.tc-chooser-item a.tc-tiddlylink {
display: block;
text-decoration: none;
color: <<colour tiddler-link-foreground>>;
background-color: <<colour tiddler-link-background>>;
margin: 4px;
}
.tc-chooser-item a.tc-tiddlylink:hover {
text-decoration: none;
color: <<colour tiddler-link-background>>;
background-color: <<colour tiddler-link-foreground>>;
}
/*
** Palette swatches
*/
.tc-swatches-horiz {
}
.tc-swatches-horiz .tc-swatch {
display: inline-block;
}
.tc-swatch {
width: 2em;
height: 2em;
margin: 4px;
border: 1px solid #000;
}
/*
** Table of contents
*/
.tc-sidebar-lists .tc-table-of-contents {
white-space: nowrap;
}
.tc-table-of-contents button {
color: <<colour sidebar-foreground>>;
}
.tc-table-of-contents svg {
width: 0.7em;
height: 0.7em;
vertical-align: middle;
fill: <<colour sidebar-foreground>>;
}
.tc-table-of-contents ol {
list-style-type: none;
padding-left: 0;
}
.tc-table-of-contents ol ol {
padding-left: 1em;
}
.tc-table-of-contents li {
font-size: 1.0em;
font-weight: bold;
}
.tc-table-of-contents li a {
font-weight: bold;
}
.tc-table-of-contents li li {
font-size: 0.95em;
font-weight: normal;
line-height: 1.4;
}
.tc-table-of-contents li li a {
font-weight: normal;
}
.tc-table-of-contents li li li {
font-size: 0.95em;
font-weight: 200;
line-height: 1.5;
}
.tc-table-of-contents li li li a {
font-weight: bold;
}
.tc-table-of-contents li li li li {
font-size: 0.95em;
font-weight: 200;
}
.tc-tabbed-table-of-contents {
display: -webkit-flex;
display: flex;
}
.tc-tabbed-table-of-contents .tc-table-of-contents {
z-index: 100;
display: inline-block;
padding-left: 1em;
max-width: 50%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
background: <<colour tab-background>>;
border-left: 1px solid <<colour tab-border>>;
border-top: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
display: block;
padding: 0.12em 1em 0.12em 0.25em;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {
border-top: 1px solid <<colour tab-background>>;
border-left: 1px solid <<colour tab-background>>;
border-bottom: 1px solid <<colour tab-background>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {
text-decoration: none;
border-top: 1px solid <<colour tab-border>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
background: <<colour tab-border>>;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
border-top: 1px solid <<colour tab-border>>;
border-left: 1px solid <<colour tab-border>>;
border-bottom: 1px solid <<colour tab-border>>;
background: <<colour background>>;
margin-right: -1px;
}
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {
text-decoration: none;
}
.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {
display: inline-block;
vertical-align: top;
padding-left: 1.5em;
padding-right: 1.5em;
border: 1px solid <<colour tab-border>>;
-webkit-flex: 1 0 50%;
flex: 1 0 50%;
}
/*
** Dirty indicator
*/
body.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {
fill: <<colour dirty-indicator>>;
color: <<colour dirty-indicator>>;
}
/*
** File inputs
*/
.tc-file-input-wrapper {
position: relative;
overflow: hidden;
display: inline-block;
vertical-align: middle;
}
.tc-file-input-wrapper input[type=file] {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
font-size: 999px;
max-width: 100%;
max-height: 100%;
filter: alpha(opacity=0);
opacity: 0;
outline: none;
background: white;
cursor: pointer;
display: inline-block;
}
/*
** Errors
*/
.tc-error {
background: #f00;
color: #fff;
}
Courier New, Courier, Lucida Sans Typewriter, Lucida Typewriter, monospace
deadlands-tartarus-on-equestria
''Faraway Wars and Judgment day''
//1045 - 1081 CM (Celestial Monarchy)//
It came as no Surprise when the Anouks fought back against the invading race of ponykind and tried to drive the quadrupedal aliens from their home planet. While they were much less technologically advanced than Pony kind they possessed the home field advantage as well as powerful psychic abilities that made them quite deadly combatants. A combined effort of Nations across Equas formed a United army of Soldiers as well as a large force of Skyers dubbed the Legion to be sent to Banshee to stop the rebellion. This Ill fated Conflict became known as the Faraway Wars. Shortly after their deployment Hill Storms Tunnel collapsed and did not open again till after Judgment day.
In the year 1078 a terrifying and eye opening report was published stating that the world would completely deplete its stores of Ghost rock within 20 years. Smaller nations began to war over remaining stockpiles and claims dragging other nations into their bickering as matters spiraled out of control. Seeing little choice the NLR and SE reached out to their closest allies and formed the Lunar Alliance and the Solar Alliance respectively, these two massive Alliances included nearly every superpower on the Planet.
The fighting began in earnest as new terrors were visited upon modern Equestrian battlefields such as blood stained automatons without mercy, Cyborgs, and all manner of weapons of mass destruction. The greatest of these weapons, mercifully kept in reserve, were the Ghost rock bombs. As things grew darker the NLR President May Treemane called for a cease fire and on Hearths warming Eve of 1080 met with the SE leader princess Southernbell. Following their conference they both released that the LA and SA would soon be meeting again to further talk of peace.
It seemed for a short while that the war would end but hopes of peace were dashed when Princess Southern Bell disappeared over the Unicorn range on her journey home from the peace conference. Southern Bells Successor to the Celestial throne Prince Blueblood would hear nothing of accidents and after extensive searches of the Unicorn range offered no clues proclaimed the incident a plot by the LA. Blue Blood called for retaliation and for the first time a world leader was legitimately threatening to deploy nuclear weapons.
The Genie was finally released from its bottle when Alpakastan launched a tactical nuke against Saddle Arabia, days later Great Bitain Dropped bombs on Prance to clear way for a join evasion with Germaney. Nuclear weapons were now fair game. The LA quickly pushed a hard offensive in hopes of Ending the war in equestria before all Tartarus could be unleashed but were sadly too late as Prince “A-Bomb” Blue Blood unleashed the entire SE arsenal.
The worlds nations responded in kind as everything Burned.
''Requirements'': Novice, Agility d8+
Aces are special pilots and drivers who feel more comfortable behind the wheel, throttle, or flight stick than on their own four hooves.
Aces add +2 to Boating, Driving, and Piloting rolls. In addition, they may also spend Bennies to make Soak rolls for any vehicle or vessel they control. This is a Boating, Driving, or Piloting roll at –2 (cancelling their usual +2). Each success and raise negates a wound and any critical hit that would have resulted from it.
''Requirements'': Novice, Agility d8+, Strength d6+
Those who have formal training in the acrobatic arts or are naturally agile may take this Edge. It adds +2 to all Agility and Grace rolls made to perform acrobatic maneuvers (including Trick maneuvers), and also adds +1 to a character’s Parry as long as he has no encumbrance penalty.
Characters perform “actions” when their card comes up each round. A character can move (see Movement) and perform one regular action—attacking, running, casting a spell, and so on—without penalty.
Characters can perform a multitude of actions when their card comes up in combat. The most common actions are making Tests of Will, using a power, or attacking with the Fighting or Shooting skill. These are all covered on the following pages.
Simpler actions such as readying an item, drawing a sword, or other quick tasks usually take one action. More complex actions, such as lighting a torch, digging through a backpack to find a small item, and so on, might require a random amount of time (such as 1d6 rounds). The Game Master has the final say.
► ''Readying Weapons'': Drawing a weapon usually takes an entire round, but a character can do it faster if she wants. This is an action, however, and so inflicts the standard multi-action penalty of –2 to the character’s attack roll.
Drawing two weapons at once, drawing a weapon from a difficult location (such as an ankle holster or inside a coat), or drawing a large or unwieldy weapon (a rifle, a shotgun, etc.), still inflicts a single –2 penalty, but requires an Agility roll. If the roll is failed, the weapons are drawn but the character may not attack that round.
!!!Multiple Actions
Characters may perform multiple actions such as Intimidating someone while blasting away with a shotgun, running and Fighting, attacking with a weapon in each hand, and so on.
Two important rules apply:
* A character can’t fire more than his weapon’s Rate of Fire in one round
* A character may not make more than one Fighting attack with the same weapon in one round
In essence, a hero may not perform the same action twice in a round—he can’t make two simultaneous Intimidation rolls or cast two different spells. He could make a Fighting and a Shooting attack if he had a gun in one hand and a knife in the other, however, and could even issue a Taunt at the same time. He could only make two Fighting attacks if he had a knife in each hand, however (or had the Frenzy Edge).
Each additional action attempted in a round subtracts 2 from all the hero’s rolls. If an adventurer wants to fire a gun with one hand and slice at an adjacent foe with a sword in the other, for instance, he subtracts 2 from both rolls. If he also wanted to make a Test of Wills against someone at the same time, he subtracts 4 from all his rolls.
Wild Cards get their Wild Die on each action as usual.
A moving character may perform these actions at different points in his movement, but still suffers the multi-action penalty. This might seem a little odd in practice—a character might shoot a pistol, move a few inches, then issue a Taunt— suffering a –2 penalty to both even though the Taunt roll has yet to be resolved—so make sure the player is committed to both actions before resolving either.
► ''Free Actions'': Some minor actions are “free” and don’t inflict multi-action penalties. Speaking a short sentence or two, moving up to the character’s Pace, falling prone, resisting opposed rolls, or dropping an item are all examples of free actions.
► ''One Wild Die Per Action'': When Wild Cards roll multiple dice for a single action, such as when firing a machine gun, they roll only one Wild Die. A warrior with the Frenzy Edge,for example, rolls two Fighting dice and one Wild Die. He can use the Wild Die’s total to replace either of his Fighting dice if he chooses. The Wild Die must either replace one of the regular dice or be ignored—it never adds another action or attack to the roll.
''Requirements'': Novice, Vigor d6+
In stressful and potentially dangerous situations, you become more decisive and able to ignore fear.
The first time you roll a Fear check in any game session, you gain a bonus to the roll equal to half of your Vigor. If you are successful, you gain a +1 bonus to all subsequent Fear rolls made for the rest of the session.
!!Ranks
As a character gains more Experience Points, he goes up in “Rank.” This is a rough measure of how powerful the hero is. As characters progress in experience, new Ranks allow access to more powerful Edges.
!!Rank Table
| !Experience Points |!Rank |
| 0-19 |Novice |
| 20-39 |Seasoned |
| 40-59 |Veteran |
| 60-79 |Heroic |
| 80+ |Legendary |
Every 5 points accumulated grants a hero an Advance. An Advance lets a character do one of the following:
* Gain a new Edge.
* Increase a skill that is equal to or greater than its linked attribute by one die type.
* Increase two skills that are lower than their linked attributes by one die type each.
* Buy a new skill at d4.
* Increase one attribute by a die type. //You may only choose this option once per Rank. No Trait may be raised above a d12 (but see
the [[Professional]] and [[Expert]] Legendary [[Edges]]). Legendary characters may raise an attribute every other Advance. //
!!Starting With Experienced Characters
If the GM lets you make a character who has already earned some experience, simply make a character as usual and then grant her that many Advances. A Veteran character, for example, has 40 Experience Points, so you would make a normal character and grant her eight Advances.
Additional goods, equipment, or other assets must be determined by the Game Master and the particular setting. As a quick rule of thumb, a character’s starting funds double with each Rank after Novice.
► ''Replacement Characters'': When a character dies, his new hero begins play with one less Advance than his last.
!!Legendary Characters
Legendary characters are major forces in their worlds, and often have political power and influence as well as a host of Edges to defeat those who oppose them.
Once a hero reaches Legendary status, the rules for Advances change a bit. The character now Advances every time he accumulates 10 Experience Points instead of 5, but a world of new Edges opens up to him as well. “Legendary Edges” allow heroes to accumulate followers, build castles, start massive corporations, and otherwise become major players in their campaign world.
Legendary characters may also choose to improve an attribute every other Advance. A few Legendary Edges are included in this book. Many more are quite specific to their particular campaign worlds, and so are covered in other Savage Settings.
This computer was developed specifically for aerial combat. It includes a HUD system which displays a targeting reticle showing the projected impact point of the aircraft’s weapons. Pilots using a targeting computer ignore the firing from moving platform penalty, gain a +2 on their opposed checks for locking on a missile, and half any penalties for bombing.
Brainers with this Hindrance likely have a cold grave in the near future An ailin’ character suffers a –1 penalty to all Fatigue checks, such as resisting radiation and disease (see Hazards in Savage Worlds) As a Major Hindrance, the penalty is -2 and is often radiation poisoning called “the glows”
A character who spends a full round aiming (no movement allowed) may add +2 to his Shooting or Throwing roll in the following round versus whatever he aimed at (a person, vehicle, etc.). Aiming for multiple rounds has no extra effect.
Passengers with air bags roll half the normal damage dice in a collision (round down), minus one.
An air dam is a funnel-shaped accessory installed beneath a vehicle Its shape accelerates the air passing beneath the vehicle, lowering air pressure, and causing the vehicle to ride lower to the ground This gives vehicles extra stability, adding +1 to Driving rolls at speeds of 20 and higher Air dams may not be installed on two-wheeled vehicles.
|!Mod/Extra|!Value|!Avail|
|[[Aerial Targeting Computer]]|$5,000|R|
|[[Decoy System]]|$1,500|R|
|[[Jammer]]|$2,000|VR|
|[[Parachute]] Round|$100|R|
|[[Parachute]] Wing|$150|VR|
Many aircraft are equipped with an autopilot system. These systems have a limited ability to control the vehicle. For our purposes there are three types of autopilot: basic, advanced, and military. It takes one action to engage or disengage a vehicle’s autopilot. The Skill dice used for the aircraft is dependent on its grade.
|!Auto-Pilot Chart|<|<|
|!Civilian|!Advanced|!Military|
| D6 | D8 | D10 |
|!Fixed Wing Craft|<|<|<|<|<|<|
|!Vehicle|!ACC/TS|!Climb|!Toughness|!Crew|!Value|!Avail|
| Biplane | 10/38 | 1 | 11(1) | 1+1 | $5,000 | S |
||//''Notes:'' Fuel Hog//|<|<|<|<|<|
| ''Cargo Hauler'' | 20/83 | 0 | 16(2) | 1+19 |$15,000 | VR |
||//''Notes:'' Fuel Hog, Fuel tank is 100, Advanced autopilot //|<|<|<|<|<|
| ''Executive Jet'' | 30/112 | 0 | 14(2) | 1+7 | $10,000 | VR |
||//''Notes:'' Gas Guzzler, Fuel tank is 200, Civilian autopilot, Wet-bar //|<|<|<|<|<|
| ''Jet Fighter'' | 300/1,125 | 3 | 16(4) | 1+1 | $500,000 | VR |
||//''Notes:'' MPG is 1, Fuel tank is 1,000, Afterburner, Military grade autopilot, Decoy launcher, Ejection seat, Jammer//|<|<|<|<|<|
| ''Single Engine Prop'' | 15/45 | 1 | 12(2) | 1+3 | $6,000 | S |
||//''Notes:'' Fuel Hog, Fuel tank is 50, Civilian autopilot//|<|<|<|<|<|
| ''Multi-Engine Prop'' | 20/83 | 1 | 12(2) | 1+5 | $8,000 | R |
||//''Notes:'' Fuel Hog, Fuel tank is 50//|<|<|<|<|<|
| ''Ultralight'' | 10/30 | 1 | 7(1) | 1 | $3,000 | S |
||//''Notes:'' //|<|<|<|<|<|
|!Lighter-than-Air|<|<|<|<|<|<|
|!Vehicle|!ACC/TS|!Climb|!Toughness|!Crew|!Value|!Avail|
| ''Blimp'' | 5/22 | -2 | 11(1) | 1+7 | $20,000 | VR |
||//''Notes:'' Fuel Hog, Fuel tank is 100, Electronic Billboard//|<|<|<|<|<|
| ''Hot Air Balloon'' | Wind | -2 | 9(1) | 1+3 | $2,000 | R |
||//''Notes:'' No MPG//|<|<|<|<|<|
|!Rotary wing|<|<|<|<|<|<|
|!Vehicle|!ACC/TS|!Climb|!Toughness|!Crew|!Value|!Avail|
| ''Civilian Helicopter'' | 20/55 | -1 | 11(2) | 1+3 | $8,000 | S |
||//''Notes:'' Fuel Hog, Fuel tank is 50//|<|<|<|<|<|
| ''Military Helicopter'' | 20/112 | -1 | 14(3) | 1+9 | $20,000 | R |
||//''Notes:'' Gas Guzzler, Fuel tank is 120, Decoy Launcher, Jammer //|<|<|<|<|<|
|!VTOL|<|<|<|<|<|<|
|!Vehicle|!ACC/TS|!Climb|!Toughness|!Crew|!Value|!Avail|
| ''Civilian VTOL'' | 15/65 | 1 | 13(1) | 1+3 | $15,000 | R |
||//''Notes:'' Gas Guzzler, Advanced autopilot//|<|<|<|<|<|
| ''Military VTOL'' | 40/170 | 2 | 14(2) | 1+1 | $100,000 | VR |
||//''Notes:'' MPG is 2, Ejection seat, Military Grade autopilot, Jammer, Military grade autopilot //|<|<|<|<|<|
''Requirements'': Novice
Not much gets by your hero. He’s very observant and perceptive, and adds +2 to his Notice rolls to hear, see, or otherwise sense the world around him.
There were only two and both of them are gone. Good luck finding one.
!!Race Features
* ''Solid as the Earth'' - Aditional attribute point at character creation.
* //''Earthly Wisdom'' - Start with an additional skill point.//
* //''Graceful Flight'' - Can fly at Pace and swoop. Starts off with a free d4 at Grace.//
* //''Great Wings'' - Gets +2 to basic flight Pace. //
* //''Derped Third Eye'' - Starts with a free d4 in Spellcraft. May attune to use as Smarts-based Arcane Skills other than Weird Science, also getting +2 to sense it, but -2 to sense any other non-cantrip power.//
* //''Fading Magic'' - May use [[Cantrips]].//
* //''Cutie Mark'' - Start with a free Novice Edge reflecting their true talent.//
* //''Ascended Avatar'' - Start with a free Seasoned Edge reflecting their role towards the ponykind.//
* //''Nope, No Balance Here.''//
!!“Limbs”
* ''Mouth''
* ''Forehooves'' x2
* ''Wings'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
* ''Horn'' (See the [[Magic Trick]] Cantrip)
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Limbs'': One of your hero's limbs was damaged. Roll 1d6: <ul><li>1-3 //Torn Wing//: Gain the Lame Wing Hindrance (or the Clipped Wings Hindrance if already Lame).</li><li>4-6 //Crippled Leg//: Gain the Lame Leg Hindrance (or the Missing Leg Hindrance if already Lame).</li></ul> |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li><li>6 //Cracked Horn//: Your hero now has the Shattered Magic Hindrance.</li></ul> |
There is some common substance that your pony reacts poorly to, typically things such as pollen, insect venom, nuts, cat hair, etc.
As a Minor Hindrance, being in physical contact with the substance causes a -2 to all trait rolls, while a Major Allergy incurs a -4 penalty. Depending on the substance, simply being near it may be enough to trigger your Allergy.
Allies play a big part in many Savage Worlds games. They serve as troops under your hero’s command in Weird War games, loyal retainers in fantasy settings, or fellow fighters in glorious rebellions against oppression.
<<<
''comments'': We might need to make an Ally Sheet
<<<
!!Allied Personalities
You can add a little flavor to your allies by rolling on the Personality Table. Jot down the keyword on the Ally Sheet so that you and your Game Master can have a little insight into each particular ally’s character.
For the most part, you should consider these general impressions with no particular game effect. What they can do is help both the players and the GM decide just how an ally might react in a given situation. In a Weird War Two game, for instance, a player with a young lieutenant character could look over his list and choose the “Observant” character to pull guard duty. If he has to go with the “Lazy” soldier for some reason, there’s a good chance the GM will rule he falls asleep sometime during his watch.
!!!Personality Table
| !d20 |!Personality |
| 1 |Young |
| 2 |Cruel |
| 3 |Old |
| 4 |Happy |
| 5 |Experienced |
| 6 |Gung Ho |
| 7 |Lazy |
| 8 |Sneaky |
| 9 |Bright |
| 10 |Dumb |
| 11 |Crude |
| 12 |Agile |
| 13 |Observant |
| 14 |Clueless |
| 15 |Mysterious |
| 16 |Creative |
| 17 |Artistic |
| 18 |Fearless |
| 19 |Cowardly |
| 20 |Heroic |
!!!Allies & Experience
Allies who take part in battle with their more heroic employers gain experience as well—but not as quickly as player characters. Don’t keep track of their experience points—just roll randomly to see if they’ve “leveled.”
At the end of a game session in which the allies had a significant role (usually by participating in combat), roll a d6 for each group of identical troops. On a roll of 5-6, the survivors level up just like player characters and get one Advance. On a failure, they don’t.
!!!Ammo
Keeping track of ammo for all your firearm-bearing allies can be a real pain. Here’s an easy and dramatic way to handle this problem.
The ammo level of each group of allied Extras starts at Very High, High (the usual level), Low, or Out, as determined by the GM. A dot for each of these ammunition states can be found on the Ally Sheet.
After each fight, the ammo drops a level (unless the GM feels the allies didn’t really use much in that scene). In combat, if the allies are dealt a Two, their ammo level drops a level after that round. This makes for dramatic situations and realistic logistical problems while eliminating a major bookkeeping chore.
!!Typical Allies
Here are a few typical soldier archetypes you might use for your own Savage Worlds games. Fill in any additional skills or Edges as you see fit. A group of rangers, for example, should have the Tracking skill, while cavalrymen should have the Riding skill, and so on.
!!!Soldier
''Attributes'': Agility d6, Smarts d4, Spirit d6, Strength d6, Vigor d6
''Skills'': Fighting d6, Notice d6, Shooting d6, Stealth d4
''Charisma'': —; ''Pace'': 6; ''Parry'': 5; ''Toughness'': 5
!!!Experienced Soldier
''Attributes'': Agility d6, Smarts d6, Spirit d6, Strength d8, Vigor d8
''Skills'': Fighting d8, Notice d8, Shooting d8, Stealth d6
''Charisma'': —; ''Pace'': 6; ''Parry'': 6; ''Toughness'': 6
''Edges'': Any two combat Edges.
''School'': Illusion
''Range'': Self
''Duration'': 1 minute per rank
''Trappings'': A momentary flash of green light
You may alter a single minor physical feature of yours, such as eye or coat color, shape of the jaw, or to conceal a scar or other unusual feature. You cannot alter your height, weight, or size with this cantrip; it is a purely cosmetic change that cannot change your overall outline. The Game Master might provide a bonus to Stealth rolls if the altered feature is part of a disguise as well, depending on the situation.
''Cast Option'' (-1): You may alter up to 3 physical features at once.
|!Caliber/Type|!Cost per Bullet|!Avail|!Wgt|
|Arrow|$.50| C |.2|
|.22, .38|$.50| U |.06|
|9mm, 10mm, .30, .30-06, .45, 5.56, 7.62|$1| U |.1|
|.50 pistol/SMG, shotgun slug, unusual calibers|$2| R |.16|
|.50 rifle/MG, shotgun shell|$5| R |.16|
|Caseless and military calibers|$10| S |.1|
|Spare magazines for most weapons|$20| U |.5|
An anemic character is particularly susceptible to sickness, disease, environmental effects, and fatigue. He subtracts 2 from all Fatigue checks such as those made to resist poison and disease. (See [[Hazards]] for more information on Fatigue and the various hazards that lead to it.)
''Requirements'': Novice, //Survival// d6+
You have a stalwart animal companion; more than just a pet, it is a good friend and partner in all of your day-to-day activities.
When you choose this Edge, select an animal to be your companion. It can be any mundane (non-magical) animal that has a Size modifier of no more than -2, and will follow you and treat you as its master from then on. Your companion can follow simple orders, grab objects, look out for danger, or any other activities deemed appropriate (at the Game Master’s discretion), and can usually get simple messages across to you through vocalizations, body language, or other cues.
Apostates are Banshee sykers who refused to take the Oath of Unity as it returned to Earth. All of the Apostates had a black “A” singed onto their forehead by a group of sykers called the Voodoo Gurus. This is permanent and cannot be removed.
Most Apostates are villains, but some refused for reasons of loyalty to their nation or because they didn’t trust the other members of the “bald-headed brotherhood.” Whatever the reason, if your character is an Apostate, other sykers who aren’t are enemies. Most are likely to look for a reason to fight (to the death).
If your character swore the oath and later broke it, she’s an Oathbreaker instead. She didn’t get the black A on her forehead, but if a rival Oathtaker discovers the treachery, he is honor-bound by the oath to kill her
''Requirements'': Novice, Special
This is the Edge your character must purchase to have any sort of magical, psionic, or other supernatural ability (unless you are an [[Unicorn Pony]], see [[Cantrips]] for their unique form of powers).
See [[Trappings]] to flesh out the look and feel of your arcane skill powers. See [[Powers]] for the mechanical effects of the arcane skill uses.
!!Arcane Skill
Each type of power has a particular arcane skill: Faith for miracles, Psionics for psionics, Spellcasting for magic, and Weird Science for weird science. Super powers take a skill for each power. You need to take the listed skill for your character’s particular Arcane Background and put points into it as usual. You’ll find the attribute the skill is linked to in parentheses beside the skill itself.
!!Power Points
Arcane characters energize their powers with “Power Points.” As soon as you buy an Arcane Background Edge, your hero gets the listed number of Power Points. Using a power requires that you spend a number of these points. Some powers allow you to pay additional points for better effects, and some allow you to maintain the effect by spending Power Points each round.
Heroes recover 1 Power Point per hour.
!!Starting Powers
Arcane characters start with a number of powers dictated by their particular Arcane Background. See the Arcane Background list for specifics.
!!Learning New Powers
An arcane character can learn a new power by selecting the New Power Edge. As soon as he levels up and chooses this Edge, he can instantly begin using whichever power he chooses.
!!Setting Details
Characters may only take the Arcane Background Edge once (regardless of the type chosen), and he may only choose from those detailed below.
Listed below is what most people know about each type of Arcane Background and enough information to decide if you’re interested in reading more.
!!List of Deadlands: Tartarus on Equestria Arcane Backgrounds
* __[[Bookworms|Arcane Background(Bookworm)]]__: Some Librarians have learned to tap into the powers of book spirits.
* __[[Doomsayers|Arcane Background(Doomsayer)]]__: These mutant radiation priests channel supernatural energy from the after-effects of ghost rock and nuclear bombs.
* __[[Junkers|Arcane Background(Junker)]]__: Mad scientists who scavenge old technology to make magical and infernal devices.
* __[[Syker|Arcane Background(Syker)]]__: Psionicists trained in mastering mental energy and transforming it into incredible power.
* __[[Templars|Arcane Background(Templar)]]__: Some see these adepts as heroes, others as selfish and distant. Templars are strong and noble souls, but help only those they find deserving.
* __[[Toxic Shamans|Arcane Background(Toxic Shaman)]]__: Spiritualists who have learned to communicate with new and mutated spirits that have arisen in the ruined world.
* __[[Witches|Arcane Background(Witch)]]__: These students of the mystical arts deciphered the secrets of a book called How to Serve Your Man. They can sling spells with the best of them and often use mundane items to spice up their magic. While the vast majority are women, a few warlocks exist as well.
''Requirements'': Wild Card, Novice, Smarts d6+, Spirit d6+
''Arcane Skill'': Bibliopathy (Smarts)
''Power Points'': 10
''Starting Powers'': 2
''Available Powers'':
* [[Armor]]
* [[Banish]]
* [[Beast Friend]]
* [[Blind]]
* [[Boost/Lower Trait]]
* [[Confusion]]
* [[Deflection]]
* [[Dispel]]
* [[Divination]]
* [[Fear|Fear(Power)]]
* [[Greater Healing]]
* [[Healing|Healing(Power)]]
* [[Light/Obscure]]
* [[Quickness]]
* [[Slow]]
* [[Slumber]]
* [[Smite]]
* [[Speak Language]]
* [[Stun]]
* [[Succor]]
* [[Warrior’s Gift]]
!!!Trappings
Visual effects vary enormously based on the book. //Armor// derived from a book about Joan of Arc may resemble a shining suit of chain mail or plate, for example.
!!!Special Rules:
* ''Book Spirits'': Bookworms tap into the power of book spirits, which reside in books and other physical texts. If the text isn’t on the bookworm’s person, he suffers a –1 to his Bibliopathy roll. The text must be within 50 feet to connect with the spirit. If the book is destroyed, the bookworm loses the power until it is replaced (see Real Books).
* ''Disconnection'': When a bookworm rolls a 1 on his Bibliopathy die (regardless of the Wild Die), his Bibliopathy is reduced by a die type until he spends an hour reading and reconnecting with the book that granted the failed power. A bookworm’s skill can never be reduced below d4 by Disconnection.
* ''Book Types'': When a bookworm chooses his initial powers, and any time he takes the New Power Edge, he must draw a card on the Book Type Table to see what kind of book he’s found, how much it weighs, and any special effects it confers.
!!!Bookworm Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Bookworm]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!Book Type
Roll on the table below whenever the New Power Edge is taken to see what kind of book the spirit dwells in.
| !Card |!Book Type |
| 2* |''Damaged'': The book is damaged in some way and the power costs 1 additional Power Point to activate. |
| 3–6 |Hardback (1 lb) |
| 7–8 |Large paperback (.5 lb) |
| 9–10 |Small paperback (.25 lb) |
| Jack |Magazine (.2 lb) |
| Queen |Comic book (.1 lb) |
| King* |''Special Edition'': The bookworm adds +1 to Biblipathy rolls to use this power. |
| Ace* |''Signed Edition'': The Power Point cost to activate the power is reduced by 1 (to a minimum of 1). |
| Joker* |''Signed Special Edition'': The book has both effects listed above. |
∗Draw again for the type of book, ignoring results of 2 or King or higher.
!!History
All Librarians understand the importance of preserving humanity’s knowledge. A rare few, however, called bibliopaths or more commonly these days, “bookworms,” have an even deeper understanding of the power of literature.
Bookworms have learned that lesser spirits can come to reside within certain inspirational and important texts. If properly dealt with, the book spirits can even impart power and energy—just like manitous, nature, or tech spirits.
Book spirits inhabit a single, physical book that has brought great emotional inspirational to another. An old bookstore might have five used copies of Ray Bradbury’s //Fahrenheit 451//, for example, but only one might house a book spirit. Maybe that copy got a young man through a tough time in his life, inspired him to fight against censorship, or was simply a foundational stepping stone in his own budding career as a great novelist. That inspiration—that hope—gave rise to the spirit, which is forever after contained within that specific volume.
!!!Librarians & Bookworms
The vast majority of bookworms are Librarians—the two go hand-in-hand like pen and ink, and all bookworms were at least once Librarians. But they don’t have to be that way currently. Some bookworms have drifted from their Librarian responsibilities for personal reasons, and some may have fallen out with the Grand Library and decided to go it alone.
A rare few bookworms have even turned into something more vile called “page eaters.” They actually devour the book spirit and gain its power permanently. This is an irredeemably evil act, however, so such characters are villains under the Marshal’s control.
<<<
''comment'': We burn the souls of the damned as fuel, some even drink that for power, but eating spirit paper is evil?
<<<
!!Real Books
Book spirits can only reside in some sort of organic material. That means physical books—not data readers, palmcorders, or slugs. A typical paperback printed on pulp paper is a fine housing for a book spirit. A parchment book with organic ink and a leather cover grants the inhabitant an even stronger channel to the physical world, and thus grants any bookworm attached to it more power (see the Book Type table).
The book must be special in some way. It doesn’t have to be Shakespeare or Plato, but it must show true artistry and understanding of the human condition. A well-written issue of The Incredible Hulk comic works just as well as Machiavelli’s The Prince—assuming both inspired someone somewhere along the line since
their printing.
If a bibliopath’s book is destroyed, the power goes with it until a replacement can be found. This should usually be the subject of a minor adventure or at least a hunt for a Very Rare text. It doesn’t have to be the same book–in fact, it’s probably not. It just has to be one with a similar theme that has inspired someone before and given rise to a book spirit.
''Requirements'': Wild Card, Novice, Faith d4+, Spirit d8+
''Arcane Skill'': Faith (Spirit)
''Power Points'': 10
''Starting Powers'': 2 plus //environmental protection//
''Backlash'': Should a Doomsayer roll a 1 on her Faith roll, she is Shaken. On a critical failure, she gains a random mutation and does not get her extra card draw (see below)
''Available Powers'':
* [[Armor]]
* [[Barrier]]
* [[Blast]]
* [[Blind]]
* [[Bolt]]
* [[Boost/Lower Trait]]
* [[Burst]]
* [[Confusion]]
* [[Damage Field]]
* [[Darksight]]
* [[Deflection]]
* [[Detect/Conceal Arcana]]
* [[Drain Power Points]]
* [[Elemental Manipulation]]
* [[Eletromagnetic Pulse]]*
* [[Entangle]]
* [[Environmental Protection]]
* [[Farsight]]
* [[Fear]]
* [[Havoc]]
* [[Healing]]
* [[Intangibility]]
* [[Light/Obscure]]
* [[Mutate!]]*
* [[Slow]]
* [[Summon Ally]]
!!!Trappings
Doomsayer powers are bright, flashy, and often explosive. They glow with pure green radiation that can sometimes leave after-effects such as redness or skin pustules on those affected by them.
A Doomsayer about to cast a power glows green with sizzling energy before unleashing it—a tell-tale sign to others that doom is nigh.
The “children of the atom” tend to call their powers names associated with radiation, nuclear war, or famous scientists who worked in the field of atomic energy. //Blast//, for example is //nuke//, while multiple //bolts// are called MIRVs (a type of warhead that stands for Multiple Independently-targeted Reentry Vehicle), and //lower trait// is the Curse of Mary Carefree (A famed Ponlish Chemist and Physicists who conducted pioneering research on radioactivity) .
!!!Special Rules:
* ''Any Sufficiently Advanced Science'': Doomsayers may not use Edges that require Arcane Background (Miracles), but they can take the [[Wizard]] Edge, substituting their Faith for the Spellcasting requirement.
* ''Mutations'': Doomsayers begin the game with one random mutation (see [[Mutations]]). Whenever a Doomsayer draws a mutation in play, she picks an extra card and takes the best result.
* ''Recharge'': A Doomsayer who steps through a ghost storm (page [[Ghost Storms]]) regains 1d6 Power Points or 2d6 if they get a raise on the Vigor roll.
!!!Doomsayer Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Doomsayer]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!Doomsayer-exclusive Powers
<ul>
<$list filter="[tag[Powers]tag[Background:Doomsayer]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!History
The Cult of Doom is a mutant-led group of individuals who believe pony kind is doomed, and that mutants are the next branch of the evolutionary tree.
Some priests of the Cult believe “norms” should be wiped out to make way for mutant-kind. Spireas Hedgerow and his green-robed priests—Doomsayers and the more powerful Doombringers—are intent on making non-mutants exit as bloody as possible.
One Doomsayer, a mare named Bleached Bone, rebelled against the “Mutant King” and splintered from the cult. She and her “heretics” donned purple Doomsayer robes and are attempting to bring about a peaceful transition to the masses. Bleached Bone has genuine compassion for her non-mutated brothers and sisters, but is also smart enough to realize Pony kind is very well-armed and fearful of their impending doom. Those circumstances often lead people to do terrible things that will certainly cause more pain and suffering, and could even result in the extinction of mutants—or even all life.
Bleached Bone wants to foster good relations between the “Chosen” and the “Doomed,“ and the heretics’ purple robes are the key. If enough purple-robed Doomsayers do enough good, she hopes norms will begin to see mutants in a better light. She doesn’t expect the Doomed to suddenly come around and believe all mutants are good, because that’s certainly not the case. In fact, mutants are more likely than norms to be a bit off kilter, or even downright crazy. Bleached Bone chalks this up to the Glow’s failed experiments. She does, however, hope that the good works of her followers will eventually convince the Doomed to give the Chosen a fair shake.
As such, Bleached Bone’s followers prove themselves by doing good deeds for mutants and norms alike. They protect villages, cure rad sickness, heal the wounded, and—most important—lead resistance against mutant attacks. Yep, you read that right The Chosen might be Pony kinds next branch on the evolutionary tree, but they haven’t been “Chosen” to kill, ravage, pillage, and plunder. Doomsayers are the first to wade into a den of these deviant mutants and start blasting (reasonable mutants allied with Spireas are given the chance to convert to a more peaceable way of life before they’re nuked).
Spireas followers greatly outnumber Bleached Bone’s, and their mutations cause many to be a bit unstable to boot. To make matters worse, a lot of norms don’t understand the schism and think all Doomsayers are out to kill them. This makes life pretty difficult for these deserter do-gooders.
Heretical Doomsayers are ordained by Bleached Bone or a select few of her original heretics and given a purple robe emblazoned with the symbol of the Cult of Doom: a combination of the Greek letters Alpha and Omega, superimposed over the flames of the Apocalypse. The symbol looks to many like that of a three-legged mutant.
''Requirements'': Wild Card, Novice, Repair d4+, Weird Science d4+
''Arcane Skill'': Weird Science (Smarts)
''Power Points'': 10
''Starting Powers'': 1
''Backlash'': As [[Weird Scientists|Arcane Background(Weird Science)]]
''Available Powers'':
All in //Savage Worlds// except //disguise, divination, greater healing, shape change, and summon ally//.
<ul>
<$list filter="[tag[Powers]tag[Source:Savage Worlds Deluxe]] -[[Disguise]] -[[Divination]] -[[Greater Healing]] -[[Shape Change]] -[[Summon Ally]] +[sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!New Powers
*[[Ghost Rock Battery (Power)]]
*Computer
*Comms
*Generator
*Vehicle
*Reactor
*Spirit Trap
*Targeting
!!!Trappings
Junker powers take the form of devices assembled from pre-Last War technology. Weapons tend to be firearms of some sort, while defensive powers take the form of armor, force fields, or gizmos that obscure the caster. Utility powers might be alchemical creations like pills or balms, or energy beams that enhance a target’s natural potential.
!!!Special Rules:
* ''Gadgeteer'': A junker automatically gets the Gadgeteer Edge for free, but it functions slightly differently (and he cannot take the normal version of the Edge). He can bind a tech spirit into his gathered components and create a device that replicates any power available to junkers a number of times per session equal to half his Spirit. The catch for this flexibility is that each device has a number of Power Points equal to the Components consumed in its creation (up to half the junker’s maximum Power Points). Since the gadget binds a tech spirit into its construction, this takes place very quickly—one action instead of the usual 1d20 minutes required by the regular Gadgeteer Edge. The junker has to make a Weird Science roll to bind the tech spirit, and suffers a –2 penalty for each Rank the power is higher than his own. If the junker gets a raise on the roll, he only uses half the Components required.
* ''Junkponies'': Junkers collect “Components” as they travel about the Wastes—bits and pieces of electronics, chemicals, mechanical devices, and stranger stuff they use to augment and create their weird devices. Components are gathered anytime the party is allowed to make a scavenging roll (see [[Scavenging]]).The junkpony's gather the scavenged items as usual, but also find 1d6 Components with a success, 2d6 with a raise. Every five Components weighs one pound but are otherwise non-specific odds and ends with no other use.
* ''Repairs'': Any time a junker’s gizmo is damaged or needs to be repaired (such as from a Malfunction), he needs Components to fix it. Minor repairs, equivalent to a Minor Malfunction, require 1d6 Components. Major repairs, as a Major Malfunction, require 2d6 Components. Total destruction, like a Catastrophic Malfunction, require a number of Components equal to the maximum Power Points in the device.
* ''Spook Juice'': Junkers can make spook juice without a refinery. A successful Weird Science roll produces one gallon of spook juice from one ounce of ghost rock in an hour. On a raise, the junker gets two gallons. Critical failure results in a spectacular explosion, causing 3d6 damage in a Medium Burst Template.
* ''Weird Science'': Junkers use all the rules for Weird Scientists in Savage Worlds, including the Malfunction Table. They may also take any Edges that require Arcane Background (Weird Science).
!!!Junker Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Junker]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!History
Junkers are the techno-wizards of Equestria. With the help of the spirit world, they can build devices of incredible power out of the ruins of technology scattered about the wastelands. They depend on tech spirits to hold their devices together, ghost rock to power them, and salvage for the physical components of their inventions.
Junkers tend to keep to themselves. Some choose solitary lives but most are ostracized by survivors who want nothing to do with folks who willingly deal with spirits and ghost rock—it did destroy the world, after all. Of course, these misgivings often vanish when a junker shows up with some incredible device folks just can’t live without—like a ghost rock-powered generator or alchemical healing salve.
A junkers’ typically bizarre appearance only adds to most folks’ distrust. Most wear techno-talismans made from discarded bits of machine innards and have arcane schematics stitched into their clothing—or even tattooed into their skin!
!!!The Origins of Science!
In the years following the Disappearance of the Crystal Empire, a new form of science appeared in the world. Its practitioners liked to call it “new science,” but most non-eggheads referred to it as “mad science”.
The gizmos born of this science often seemed to defy reality to a point where they appeared almost magical. Their effects—when they worked—were spectacular; when they didn’t, the explosions were even more so. Of course, the main reason folks called it mad science was that those who dabbled with it often became stark raving lunatics.
What these scientists didn’t understand was that their technological insight was not a product of their own genius, but inspired by the manitous. The Reckoners sent their underlings to whisper in the scientists’ ears as they slept, and their dreams were filled with bizarre and destructive devices. When they awoke, they turned their dreams into reality. These ghostly visions loosened the inventors’ grips on reality and eventually drove them mad.
It turns out the Reckoners got what they wanted from the mad scientists when the first city buster ghost rock bomb was unveiled The Reckoners now had the tools they needed to destroy civilization and terrorform the entire world into a Deadland. Having attained their goal, the number of manitous whispering in the ears of mad scientists declined dramatically. Inventors the world over found their muses suddenly silent. Most eventually gave up their inventors’ workshops and entered more ordinary technical professions. A few took their own lives.
!!!When the Whispering Stopped
Not all the mad scientists who were abandoned by the manitous gave up their work. Some looked for answers, The Sons of Moon Grave was a movement that traced its roots back to the the Ghost Rock Rush and Moon Grave, the first mad scientist to discover the awful truth about his “genius”. Since most mad scientists refused to believe their inventions came from anywhere except their own gray matter, Moon Grave and his followers were outcasts in the scientific community.
But after Moon Graves revelation, a few of the Sons began studying other forms of magic in an effort to better understand the manitous and their goals. The demons would no longer willingly help an inventor, and in fact had nothing new to contribute.
The spiteful things could be coerced into sharing past knowledge, such as how to create goggles that can see spirits or belts that project fields of energy, but their knowledge was shady and they certainly wouldn’t power these devices. But tech spirits would. These new creatures rose as Ponies put a little of themselves into there inventions, and were typically tethered to the device which spawned them. The spiritual boom of Judgment Day freed the spirits, however, and now the Hunting Grounds are full of them. They don’t get along well with nature spirits, who are frequent and savage enemies.
The junkponies of Equestria discovered these tech spirits willingly inhabited their infernal devices to hold them together and provide the magical “pilot light” to kickstart their various powers, but to really fuel the fire, they needed “ghost rays”.
!!!Ghost Rays
The energy given off as ghost rock burns—souls, basically—is similar to the energy of the Hunting Grounds itself. When first discovered by the Sons of Moon Graves, the energy was called “ghost rays,” or “g-rays” for short. From this they developed the g-ray collector. It collects spiritual energy from ghost rock as it burns and stores it for later use in “spirit batteries”.
The full limits of this new technology had yet to be explored before the Last War began. A few junkers were drafted into government service—a junker was responsible for the first true cyborgs, for example—but their contributions to the war effort came too little, too late.
!!!After the Bomb
Once the bombs stopped falling, junkers really came into their own. The world needed folks who could get machines running without a few vital components, and junkers fit the bill. But the inventors need a manitou’s guidance, a tech spirit’s soul, and g-rays to do the job—all wild chicanery that makes junkers pretty suspect.
Nonetheless, junkers are vital to keeping many survivor settlements running, and are therefore grudgingly tolerated. Only junkers have the arcane knowledge required to distill ghost rock into spook juice without the aid of a major refinery, a skill in high demand in the Wasted West.
//This Arcane Background won't be available, but it may be referred to as a template for those who are.//
''Arcane Skill'': Spellcasting(Smarts)
''Starting Power Points'': 10
''Starting Powers'': 3
Magicians range from powerful wizards to vile cultists. They draw on raw supernatural energy to fuel their eldritch fires. This energy often infuses the worlds in which they live, and is drawn forth with elaborate rituals, words of power, runes, or perhaps even dark sacrifices.
Wizards are often quite weak early in their careers, but are forces to be reckoned with as they become powerful sorcerers.
► ''Backlash'': When a wizard rolls a 1 on his Spellcasting die (regardless of his Wild Die), he is automatically Shaken. This can cause a wound.
//This Arcane Background won't be available, but it may be referred to as a template for those who are.//
''Arcane Skill'': Faith (Spirit)
''Starting Power Points'': 10
''Starting Powers'': 2
Those who draw on miracles are priestly types or holy champions. Their power comes from a divine presence of some sort, including gods, nature, or spirits. Their powers are usually invoked with a few words of prayer or by performing established rituals.
► ''Protector'': Those who cast miracles are champions of their particular religions. Good priests vow to protect the innocent, fight evil, and obey all other tenets of their particular religion. Evil priests typically vow to defeat those who oppose their
religion, or simply to cause as much misery and strife as possible. The player and Game Master should come up with a simple list of what is important to the character’s religion and use this as a guide.
Champions who violate their beliefs are temporarily or permanently forsaken by their chosen deity. Minor sins give the character a –2 to his Faith rolls for one week. Major sins rob him of all arcane powers for one week. Mortal sins cause the character to be forsaken until the penitent hero completes some great quest or task of atonement to regain his lost powers.
//This Arcane Background won't be available, but it may be referred to as a template for those who are.//
''Arcane Skill'': Psionics (Smarts)
''Starting Power Points'': 10
''Starting Powers'': 3
Psionicists have discovered how to tap into their own psychic powers. They can manipulate matter, create fire, or control their own bodies with but a thought.
► ''Brainburn'': When a psionic character rolls a 1 on his Psionics die (regardless of his Wild Die), he is automatically Shaken. On a critical failure, the psi lets out a psychic scream that causes him to be Shaken along with all allies in a Large Burst Template who fail a Spirit roll. This can cause a wound.
//This Arcane Background won't be available, but it may be referred to as a template for those who are.//
''Arcane Skill'': Special (None)
''Starting Power Points'': 20
''Starting Powers'': 1
Characters with super powers gain their abilities through strange circumstances, such as being bitten by irradiated creatures, exposure to strange chemicals, or perhaps by finding alien artifacts. This particular evel of power is intended for relatively low-level “pulp” heroes. More powerful super types are dealt with in specific Savage Settings, and you’ll find an alternate and far more detailed system in our Super Powers Companion.
Super powers work a little differently from most other Arcane Backgrounds—each power is its own skill and has no linked attribute (and thus counts as “lower” than its linked Attribute for purposes of Advancement). A hero with the armor and bolt powers, for example, also has an Armor and a Bolt skill he uses to enable it. It’s more expensive for a character to improve his powers, but he starts with more Power Points than other arcane types so he can use his abilities more often. Best of all, there are no drawbacks for super powers as there are with other types of arcane powers—the power either works or it doesn’t.
''Requirements'': Wild Card, Novice, Psionics d4+, Smarts d8+
''Arcane Skill'': Psionics (Smarts)
''Power Points'': 10
''Starting Powers'': 3
''Backlash'': When a syker rolls a 1 on his Psionics die, he suffers severe brainburn that causes 2d6 damage plus half the Power Points he was about to spend. If the ability required 4 Power Points, for example, brainburn would cause 2d6+2 damage.
''Available Powers'':
* [[Armor]]
* [[Barrier]]
* [[Beast Friend]]
* [[Backwash]]*
* [[Blind]]
* [[Bolt]]
* [[Boost/Lower Trait]]
* [[Confusion]]
* [[Deflection]]
* [[Detect/Conceal Arcana]]
* [[Disguise]]
* [[Drain Power Points]]
* [[Farsight]]
* [[Fear|Fear(Power)]]
* [[Fly]]
* [[Havoc]]
* [[Healing|Healing(Power)]] (self only)
* [[Invisibility]]
* [[Mind Reading]]
* [[Mindlink]]*
* [[Mindwipe]]*
* [[Puppet]]
* [[Quickness]]
* [[Slow]]
* [[Slow Burn]]*
* [[Slumber]]
* [[Smite]]
* [[Speak Language]]
* [[Speed]]
* [[Stun]]
* [[Succor]]
* [[Telekinesis]]
* [[Telekinetic Squeeze]]*
* [[Wall Walker]]
!!!Trappings
Syker attacks are usually invisible unless they make use of pyrokinetic energy. Defenses are similarly difficult to detect— the //deflection// power is a vague, shimmering aura of energy, for example.
Other psychic tricks, such as mind reading or mind wipe, have no actual visual effects, but the syker must concentrate quite heavily to do so. The saying goes that if a syker ever looks you in the eye, he’s probably in your mind.
!!!Special Rules:
* ''Baldness'': Syker powers burn out the user’s hair follicles. It can be regrown if the syker ceases to use his powers, but begins to fall out quickly the moment he resumes.
* ''Psionics'': Sykers may use Edges that require [[Arcane Background(Psionics)]] (see Savage Worlds).
!!!Syker Hindrances
<ul>
<$list filter="[tag[Hindrances]tag[Background:Syker]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!Syker Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Syker]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!Syker-exclusive Powers
<ul>
<$list filter="[tag[Powers]tag[Background:Syker]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!Syker Gear
!!!Drugs
* [[Amanitrol]]
* [[Axor]]
* [[Green Bird of Heaven]]
* [[Red]]
!!!Equipment
* [[Banshee Stones]]
* [[Sykoactive Helmet]]
!!!Weapons
* [[TSAR]]
!!!Other
* Sykolite
!!History
The governments of the world learned much in their long and deadly struggle against the Reckoning. In Equestria, the Agency and the Rangers captured numerous creatures, studied countless spellslingers, and eventually even learned of the Hunting Grounds and the dark secret behind ghost rock and mad science. These governments—along with others around the world—looked for ways to tap directly into this power and create a new breed of “super soldiers.”
The answer came in the form of Zebrica priests and martial artists. These individuals had managed to tap into the power of the Hunting Grounds directly, without dealing with manitous, nature spirits, or higher beings for their powers. Their power was channeled directly through their psyches and shaped by mental training.
After several world wars, it was clear sykers were powerful battlefield agents, but their real strength lay in intelligence, misdirection and obfuscation. By World War II, every major government employed these mind warriors as spies and commandos.
!!!The Faraway War
In 2044, Hillstorm Industries opened the Tunnel, a gateway in space that allowed ships to fly through and come out in a distant corner of the galaxy called the “Faraway System.” Faraway had seven planets orbiting the local star, most of which were useless hunks of rock, but the fourth planet, Banshee, was inhabited by a primitive race called the anouks, or “grapes” for their purple color. More importantly, Banshee had ghost rock.
Mining operations started almost immediately despite frequent conflict with the anouks. But despite their prowess, the anouks didn’t have a chance against the high-tech weapons of Hillstorm Industries and later the United Nations marines.
Not until the appearance of the Skinnies. These grotesque creatures appeared to be abnormally emaciated anouks, but it soon became clear they possessed supreme mental abilities. Embraced by the battered anouks, these terrible creatures wiped out colonial settlements and isolated military outposts at an alarming rate.
UN General Pauldron “Overkill” Warfield was tasked with stopping the growing “revolt.” Warfield realized the skinnies were extremely powerful psionics and called on the UN member nations to send sykers to Banshee. They were organized into the United Nations Syker Legion—or the Legion, for short.
Once the Legion arrived, the UN forces went on the offensive. Warfield’s sykers were at the forefront of countless battles to exterminate the “grapes” and their skinny overlords. Sykers also infiltrated human sympathizer groups and used their mental manipulation to turn their rebellious followers on each other.
Near the end, sykers wound up fighting alongside UN troops as they assaulted the anouk villages and eventually the skinnies’ fortresses. The Legion had almost won when the Last War broke out and the nations of Earth recalled their conventional forces.
The Psychic Legion was left behind in a vain attempt to organize the colonists against the rebels and anouks, a force the leaders back on Equus rationalized as nearly defeated. Sykers and a handful of Colonial Rangers organized defenses all over Banshee, but the numbers were too great.
Then the sykers were recalled as well. Some went gladly, happy to escape the lost cause. Others resisted but were compelled to return by force or coercion and leave the colonists behind. In 2081, the last remaining sykers boarded a Hillstorm Industries ship called the Unity and returned home through the Tunnel. Shortly after, the Tunnel collapsed and the colonists on Banshee were left to their fate (a tale told in //Deadlands Lost Colony//).
The battered sykers became close in these final days. While in transit, they swore the “Oath of Unity,” after the ship they traveled on. They vowed never to harm each other, no matter who gave them the order. Those who break this oath are called Oathbreakers, and those who declined to take it are called “Apostates.” One very powerful syker, a member of the Voodoo Guru platoon, even managed to somehow burn a permanent “A” on these individuals’ heads. There is no love lost between Oathtakers, Oathbreakers, and Apostates in the Wasted West. Most of them blast on sight.
The bombs fell while the Faraway sykers were in transit. They arrived in our solar system to find the Equus in ruins. Most eventually boarded drop pods and landed in Hoofston, Texmoor, then wandered on their own or in small groups from there.
!!!Equus Sykers
While the Legion was battling anouks and skinnies on Faraway, desperate generals back on Equus threw their remaining sykers into traditional attacks and defenses. But their powers of infiltration and subversion were no match for machine guns, laser guided bombs, and hovertanks. Even their ability to cloud minds meant little when faced with mindless warbots crawling across blasted battlefields.
The most talented sykers quickly developed new powers better suited to this style of war. Many became killing machines whose only purpose was to destroy everything in their path. It’s been said that if a Faraway syker is a knife, an Equus syker is a tire iron.
''Requirements'': Wild Card, Novice, Faith d4+, Fighting d6+ Spirit d8+
''Arcane Skill'': Faith (Spirit)
''Power Points'': 10
''Starting Powers'': 1 plus //healing//
''Backlash'': When a Templar rolls a 1 on his Faith die, he suffers a level of Fatigue. Fatigue lost in this way may be recovered with four hours of rest per level.
''Available Powers'':
* [[Armor]]
* [[Beast Friend]]
* [[Boost/Lower Trait]]
* [[Darksight]]
* [[Deflection]]
* [[Disguise]]
* [[Environmental Protection]]
* [[Farsight]]
* [[Greater Healing]]
* [[Healing]]
* [[Quickness]]
* [[Smite]]
* [[Speed]]
* [[Succor]]
* [[Warrior’s Gift]]
!!!Trappings
Templar's fancy themselves as Holy warriors manifesting their powers through meditation, prayer, or even combative poses. It is also not uncommon for a Templar to call upon the name of a saint when the need is great and the hour dark.
!!!Special Rules:
* ''Gear'': Templars begin play with a white tabard proclaiming their station, and a sword chosen from the equipment list as usual (Short word or standard). This blade now has the Improved Trademark Weapon Edge for free. He cannot take the Edge again for this weapon, but could take it normally for others. When wielded by its owner, the blade can hurt creatures typically immune to normal weapons (except servitors).
* ''Miracles'': Templars may use Edges that require Arcane Background (Miracles) except for Adept (see Savage Worlds).
* ''Templar Powers'': Sunset Shimmers knights may only use their powers on themselves, with the exception of //healing// and //greater healing//.
!!!Templar Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Templar]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!History
Sunset Shimmer was an accountant in Baise living the Equestrian dream. She had a successful career, a nice family, and was active in his local community as a member of the Harmony Bearers (A pre-war private society that supposedly traces its roots back to a sect of knights who guarded the Tree of Harmony) and a Filly Scout Troop Leader.
She was on a business trip on Judgment Day when everything she lived for vanished in a skull-shaped mushroom cloud. Sunset returned to Baise and confirmed what she already knew: her family was dead. From there she traveled Equestria for over a year, wandering from place to place, working for food while wrestling with severe depression.
One day, Sunset was passing through a nameless ‘ville when General Frock's thugs showed up and demanded their tithes. The town paid up and Sunset watched as the people went hungry. Then a tough Donkey Law Dog named Jenny showed up, and the town begged her for help. She agreed and set off after the Black Hats.
A few days later, she came riding in from the wastes on a motorcycle. She screamed for the townsfolk to open the gates and help fight the Black Hats, but to Sunsets horror, they refused, saying that if they let her in, the Black Hats would destroy them all. The Ranger cursed and screamed but stood her ground anyway, trying to protect the ungrateful town. She never had a chance. Sunset thought it appropriate when the Combine troops overran the town after they were done with the stubborn Law Dog.
Sunset managed to escape the carnage and returned again to Baise. During the trip her depression slowly turned to anger. Jenny had been a heroine, but she had thrown her life away for those who wouldn’t even fight beside her to protect their own homes.
When Sunset reached Baise, she crossed into the maelstrom, wandered through the ruins, and went to her old Harmony Barer Temple. A deep fever took hold as she lay in the dark, stone building. Days went by as she stared at the pictures of the old Knights Templar that had given birth to the Barers. Her delirious mind dreamed of the knights of old and watched the pictures of their battles come to life.
When Sunset finally awoke, she knew what she must do. She would become the first of the new Templars, a heroic figure who would protect the weak. She would draft others worthy of the title to join her, and they would bring order and compassion to this dark world. But these new Templars would not make the same mistakes as the noble but foolish Law Dogs. The Templars would not throw their lives away on lost causes. Nor would they die for those who did not deserve their efforts. Thus he would cull the guilty and preserve the righteous.
Sunset took an ancient, ceremonial sword from its display case and made a tabard from an old sheet. Upon the tabard he painted the red Maltese cross—symbol of the Knights Templar.
!!!The Last Crusaders
Sunset cut quite a figure in her new uniform, and recruited a score of followers in the first year. A few were simply after the power he promised, but they were quickly rooted out by the crusader and his loyal inner circle.
Gradually, the supernatural energies of Equestria embraced the new Templars and they began to develop powers. Some developed preternatural speed, others could withstand incredible trauma and carry on fighting. All learned to heal with a touch. Some Templars believe their benefactors are the spirits of the original Knights Templar, others say it is Celestia Herself. A few believe their holy rewards are granted by the spirits of all the heroes who have fought evil and wickedness in the past.
It didn’t seem to matter much where the power came from, because Sunset and her followers quickly set out across Equestria to tussle with evil. They scored many incredible victories and soon attracted even more would-be warriors.
!!!Trouble in Baise
Sunset quickly realized that the fledgling order would need a central headquarters for communication and support. She returned to the Harmony Barers Temple inside the Baise maelstrom, decorated the plain building with a single, large white flag marked with the red cross, and declared herself Grand Master of the Templars. A trio of other Templars formed her permanent council.
Then two events struck at the order that threatened its very existence. A splinter group broke off under a charismatic Templar named Brass Morter. Calling themselves the Anti-Templars, these dark knights felt the Wastes were to be ruled and quickly began to resemble the raiders and despots they had fought. Sunset declared them exiles and Templars throughout the West were ordered to attack them on sight.
While the Anti-Templars threatened the Order outside Baise, within the maelstrom something began attacking Templars and their followers in their very headquarters. The Baise Horror, as this entity was known, thwarted the best efforts of those who attempted to hunt it down.
Nearly a year ago, Sunset fought and killed the monster when it attempted to disrupt the founding of the Iron Alliance at Junkyard. The Grand Master was mortally wounded in the struggle and a Templar named Rose Blossom was named her successor.
!!!Becoming a Templar
Would-be Templars must spend a year of their life in the service of another Templar. These “squires” serve until they die, leave the side of their mentor, or are brought before the Grand Master to become Templars themselves. Squires wear no special uniform, nor are they issued any gear. Many carry swords they’ve scrounged up themselves for they must learn the art of swordplay before they are vested in the Templar order. Each Templar may only have one squire at a time.
Once the year is up, provided a Templar believes his squire is ready, the squire is presented to the Grand Master in Baise. After an extensive interview and testing phase, she decides if the squire is worthy of the Templar tabard. If the Grand Master is satisfied, the new Templar is issued his sword and tabard; if not, the squire may return to serve his master for another year, or go his own way.
After initiation, Templars are expected to visit the temple once per year or so. There, they meet with the Grand Master and inform her of their deeds and the state of the world. Those civilian petitioners who brave the maelstrom to reach the Temple are heard daily, and if they seem worthy, the Grand Master may assign a single visiting Templar to accompany them to their home. Once he arrives, the visiting Templar may deal with the situation as he wishes, or—if the petitioner or his people prove unworthy—not at all.
Templars consider melee combat a sign of bravery, but they don’t hurl themselves into a fray when a gun serves them better. They generally use their swords to save precious bullets, when they want their foe to taste the fear of retribution before they perish, or when they face overwhelming odds and want to go down swinging.
Templars don’t like to lose their swords. If one is ever taken, they vow to get it back. They also revere their brothers’ and sisters’ swords. When one falls, other Templars eventually come to claim his sword. These are then taken to the Temple in Baise and hung in a place of honor.
!!!The Test of Worth
Templars are a strange lot. A Templar might turn his back on an entire village one day, and give his life for a single child the next. Their philosophy is centered on worth, piety, and the greater good.
They protect those who they feel benefit the world with their lives. Those who do nothing to help civilization, who might even harm it, are not to be defended. Templars don’t help the wicked, and they have no compunctions about “blackmailing” a settlement or individual into changing their ethics in return for the knight’s aid. Some call them selfish, and there is a certain truth to that belief. Templars believe their own lives are valuable to the future of humanity, and they don’t risk them without good reason.
A Templar’s primary tool in deciding whether or not a person, family, or village is worthy of their efforts is to visit them disguised as a mutant, an outcast, a diseased soul, or some other pitiful wretch.
If those in need treat him poorly, he usually leaves before they even know they were on the brink of salvation. If, instead, they are sympathetic and compassionate to the disguised Templar, he may choose to reveal himself and pledge his sword to their cause.
!!!The Pledge
Templars are sworn to protect the worthy souls of the Equestria from evil, whether Pony evil or the more supernatural variety. This is not, however, the only tenet of the Templar creed. Templars and their squires also observe the Oaths of Poverty and Blood.
The Oath of Poverty requires a Templar to gather only those goods and provisions necessary to carry out his duties and survive (including vehicles).
The Oath of Blood has been the subject of some debate over the years. Once the Grand Master grants a Templar his tabard and sword, he gains all the powers of the order immediately.
It also seems it is impossible to rescind this blessing. Once granted, it seems, their rewards are permanent. For those who seriously abuse their power, through theft, murder, or cowardice, the Grand Master’s only recourse to protect the honor and integrity of his order is to send other Templars out to hunt down the errant knights and kill them.
!!!Keeping the Faith
Though Teachings of the the Elements and the Tree of Harmony was integral to the original Knights Templar (and the Harmony Barers as well) the Templars do not consider Belief in the old legends a requirement in an individual Templar, nor is it the official creed of the organization. While both Sunset and her successor, Rose Blossom, were believers in Harmony, they knew that in this day and age there are many faiths.
What the Templars do require is faith, the belief that some “good” presence still watches over the world. There are many theories among the ranks, but the most common is that Templars are empowered by the spirits of fallen heroes of the past, called the Saints.
''Requirements'': Wild Card, Novice, Faith d4+, Spirit d8+
''Arcane Skill'': Faith (Spirit)
''Power Points'': 10
''Starting Powers'': 2
''Backlash'': When a Toxic Shaman rolls a 1 on his Faith die, he suffers a level of Fatigue. Fatigue lost in this way may be recovered with four hours of rest per level.
''Available Powers'':
* [[Armor]]
* [[Banish]]
* [[Barrier]]
* [[Blast]]
* [[Bolt]]
* [[Burrow]]
* [[Burst]]
* [[Damage Field]]
* [[Detect/Conceal Arcana]]
* [[Dispel]]
* [[Drain Power Points]]
* [[Elemental Manipulation]]
* [[Entangle]]
* [[Environmental Protection]]
* [[Farsight]]
* [[Fear|Fear(Power)]]
* [[Fly]]
* [[Growth/Shrink]]
* [[Havoc]]
* [[Healing|Healing(Power)]]
* [[Light/Obscure]]
* [[Pummel]]
* [[Shape Change]]
* [[Smite]]
* [[Stun]]
* [[Succor]]
* [[Summon Ally]]
* [[Wall Walker]]
!!!Trappings
!!!Special Rules:
* ''Choose Your Poison'': The shaman must choose to be a caretaker or a corruptor, as discussed below. The two sides are typically violently hostile toward one another.
* ''Miracles'': Toxic shamans may not use Edges that require Arcane Background (Miracles) (see Savage Worlds). They may take a version of Gadgeteer they call Fetish Creator with a requirement of d8+ in Smarts, Spirit, and Faith.
* ''Spook Juice'': Toxic shamans can regain Power Points quickly by drinking spook juice. Each pint restores 1d6 Power Points (up to their normal maximum), but causes a level of Fatigue as the shaman gets drunk. It takes 4 hours to recover each level of Fatigue, which no magic or tech can aid (including powers such as //succor//). During this time, the Shaman cannot recover Power Points normally.
!!!Toxic Shaman Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Toxic Shaman]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!History
Nature spirits are a reflection of the physical world, With the coming of the industrial age, some nature spirits began to be corrupted into “toxic spirits.” Judgment Day accelerated this “evolution” a thousand-fold. Mushroom clouds burning with fire and damned souls littered the globe. Burning fuel dumps and bombed-out factories poured tons of pollution into the air, ground, and water. Depleted uranium shells, ionized by the incredible velocities with which they struck, spread radioactive dust, and the ruptured containment chambers of vehicle reactors leaked radioactive water and steam.
Toxic spirits bred like wildfire in the aftermath, and each one wanted what all creatures want—to create more of themselves and the environment that gives them the most energy.
!!!Corrupters & Caretakers
Some Buffalo shamans latched onto toxic spirits early, but for the most part they’re a recent phenomenon. Some embrace the spirits and give them what they want in exchange for power, while others attempt to use the spirits to draw the toxins //out// of the world.
The latter breed of toxic shaman are called caretakers. When they cast a favor, they feed the corrupted spirits by channeling pollution from the world into the Hunting Grounds for them to feed on. This is the nature of their bargain. Caretakers hope that one day they will clean the environment and restore the balance. The distant spirits don’t realize they’re contributing to their own eventual destruction—they just know that irradiated goo sure tastes good.
The flip-side of the caretakers are the corruptors. These shamans are usually evil (or at least destructive), and war with caretakers on sight. There are also well-meaning shamans who believe that by siphoning off the toxic spirits’ power in the spirit world they weaken them and give the nature spirits a better chance of victory in the Hunting Grounds, but these are few and far between.
!!!The Power of the Wastes
Toxic shamans in a particularly deadly area may draw additional power into their bodies. If in an area that normally causes Fatigue or long-term effects due to pollution (see Savage Worlds, [[Hazards]]), they recover Power Points at twice their normal rate (2 PPs per hour barring Edges). If they are in an area that causes immediate damage, they also reduce the cost of their spells by 1 Power Point for each Raise on their Faith roll. This cannot reduce the cost below zero, and the toxic shaman must have the points available to cast the spell in the first place before rolling.
<<<
''comment'':
<<<
//This Arcane Background won't be available, but it may be referred to as a template for those who are.//
''Arcane Skill'': Weird Science (Smarts—see below)
''Starting Power Points'': 10 (but see below)
''Starting Powers'': 1
Weird Science is the creation of strange and powerful devices. It differs from regular science in that some element of the arcane is involved. Maybe it’s just generic “super-science,” or perhaps it’s divinely (or demonically) inspired. Maybe the science itself is relatively sound, but it derives power from an arcane source, such as ghost rock in Deadlands, or some other magical mineral or essence in a steampunk fantasy game.
Weird Science is different in that each new power is actually a new “gizmo.” The player must write down exactly what the device is when he gains the power. An inventor with the invisibility power, for instance, actually has an invisibility belt, cloak, etc. Players are encouraged to give their devices pseudo-scientific names as well (“Dr. Zee’s Chromatic Disfibulating Device!”).
Weird Science is the skill an inventor uses when activating most devices, and raises increase the effects of the power as usual. If a device uses a different skill, such as Driving, Fighting, or Shooting, the inventor uses that instead. A ray gun, for example, uses the Shooting skill, while a “vibroknife” (a knife with the smite power) uses Fighting.
Powers that require an opposed roll, such as //puppet//, also use the scientist’s Weird Science skill.
Each device comes with its own Power Points equal to the inventor’s Power Points. An inventor with the //bolt// power and 10 Power Points, for example, could make a ray gun that fires electrical beams. The gun has 10 Power Points it can use to fire the beams just like a wizard would cast the //bolt// spell.
► ''Malfunction'': Weird science devices are never perfect technology. They often suffer from spectacular and deadly malfunctions. If a gadgeteer uses a device and rolls a 1 on the skill die used to activate the gizmo, it has malfunctioned in some way and does not work. Draw a card and consult the Malfunction Table below:
!!!Weird Science Malfunction Table
|!__Clubs__: //Catastrophic Malfunction// |The device explodes for 2d6 damage in a Large Burst Template. |
|!__Hearts__: //Major Malfunction// |The device breaks down. The gadgeteer may not use it again until it’s repaired, which requires a Repair roll and 2d6 hours of work. |
|!__Diamonds__: //Minor Malfunction// |The device suffers a minor hang-up. It can be fixed with a Repair roll at –2. |
|!__Spades__: //Glitch// |The gizmo activates but does the reverse of its intent. An invisibility belt makes the caster glow brightly, a weapon fires at a random target, and so on. If a reverse effect makes no sense, treat it as a Major Malfunction instead. |
► ''New Powers'': Each time a Weird Scientist takes the New Power Edge, he has invented a new gadget. He simply chooses a power and decides what kind of gizmo it’s contained in as usual. He can also repeat a power he’s already taken. A mad scientist might want to create two ray-guns, for example, so that he can use one and give one to a companion.
► ''Maintaining Powers'': Because weird scientists use inventions rather than cast spells, they don’t suffer any penalties for maintaining powers, but their devices still pay the maintenance costs in Power Points as usual.
► ''Recharging'': Devices regain Power Points just like a character, at the rate of one point per hour. Recharging may represent the device being plugged into an outlet, gathering solar rays, or even fritzing out for a while until it miraculously just starts working again. Regardless of the description, however, it regains Power Points at the rate of one per hour just like other power types.
The Power Edges Rapid Recharge and Improved Rapid Recharge apply to all of the inventor’s devices rather than the inventor himself.
!!More on Weird Science
Weird Science is a little more complicated than other Arcane Backgrounds and requires a bit more explanation. First off, it’s important to understand Weird Science isn’t used to make mundane devices, even if they are extraordinary. As long
as they’re possible and aren’t too far above the given tech level of the world, they’re just “high-tech.” Only actual weird science, inspired by, created by, or powered by some sort of supernatural force qualifies.
It’s also important to remember that Weird Science doesn’t allow a character to make anything he wants. He can only make a device that utilizes one of the powers in this book (or an appropriate Savage Setting).
► ''Sharing'': An inventor can give his device over to a companion to use. The device works the same for the companion as it does for the owner. If the Weird Science skill is required, the companion must make a default roll as usual. That means gizmos are typically more effective when used by weird scientists than when wielded by others.
► ''Soul Drain'': Weird Scientists cannot take the Soul Drain Edge.
► ''More Power Points'': When an inventor gains more Power Points, he’s assumed to tinker with his existing devices and upgrade them as well. This means all of his devices gain the additional Power Points. In effect, if an inventor has 20 Power
Points, each of his devices have 20 Power Points as well.
► ''Losing Devices'': If an inventor’s gizmo is taken away, lost, or destroyed, he can make another in 2d6 hours as long as he has access to a workshop and some basic components. This requires a Repair roll. A raise halves the time needed to
create the device. If the original should somehow be returned, it no longer
functions (the character doesn’t get a “free” duplicate in this way).
''Example'': Doctor Gold starts play with a vibroknife (a knife with the smite power) and 10 Power Points. Later on, he levels up and chooses the New Power
Edge. With that he invents a ray-gun with the bolt power. Both devices have 10 Power Points. In a fight, Doctor Gold first “turns on” his vibroknife by making a Weird Science roll. He gets a raise so the knife does +4 damage for its duration. The ray-gun doesn’t have to be activated. The Doc simply makes a Shooting roll whenever he fires it (just like a mage would make a Spellcasting roll).
''Requirements'': Wild Card, Novice, Smarts d6+, Witchcraft d6+
''Arcane Skill'': Witchcraft (Smarts)
''Power Points'': 10
''Starting Powers'': 2
''Backlash'': A witch who rolls a 1 on her Witchcraft die (regardless of her Wild Die) is automatically Shaken.
''Available Powers'':
* [[Beast Friend]]
* [[Blast]]
* [[Bolt]]
* [[Boost/Lower Trait]]
* [[Charm|Charm(Witchcraft)]]*
* [[Deflection]]
* [[Detect/Conceal Arcana]]
* [[Disguise]]
* [[Dispel]]
* [[Divination]]
* [[Elemental Manipulation]]
* [[Entangle]]
* [[Fear|Fear(Power)]]
* [[Fly]]
* [[Healing]]
* [[Invisibility]]
* [[Light/Obscure]]
* [[Puppet]]
* [[Slumber]]
* [[Succor]]
* [[Zombie]]
!!!Trappings
Witch spells often involve incantations of some sort and sometimes hoof gestures. However, it’s usually easy for a witch to hide her casting from a casual observer by making a simple Stealth roll. Only if someone has a reason to watch for monkey business of the magical sort does he get to make a Notice roll to oppose the witch’s Stealth.
Spells with subtle effects, like //charm// or //boost/lower Trait//, have no visual effects beyond the witch’s casting chant or gestures. Combat spells, on the other side, are usually quite flashy. //Blast//, called “ball o’ doom” by most witches, creates an explosion of glowing, green energy. A witch casting a //bolt// energizes small objects, ranging from marbles and ball bearings all the way to skulls, with arcane power. //Flight// may produce powerful winds that lift the witch aloft or it may even empower a broomstick for her to ride.
!!!Special Rules:
* ''Horn Haters'': An attuned Unicorn who rolls a critical failure on a Spellcraft(Witchcraft) skill suffers a Wound instead.
* ''Ingredients'': A witch can use certain items, called Ingredients, to assist her in casting her spells. See Ingredients below. She begins play with a number of Ingredients equal to half her Smarts die.
!!!Witch Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Witch]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!Witch-exclusive Powers
<ul>
<$list filter="[tag[Powers]tag[Background:Witch]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!Playing a Witch
To play a witch, your gal pal needs to take the Arcane Background (Witch) Edge, as well as putting points into Witchcraft. For her trouble, she also gets a ratty copy of //Simply Magical Cuisine//, which she’ll need if she plans to learn more spells. If she ever loses her grimoire, it’s considered Rare, but only runs $1 unless she buys it from someone who knows its real worth.
And for those of you wondering, some Unicorns do take up the mantel of the witch or Warlock. Be warned, though, that the powers that be seem to favor all but the horned race when channeling these magics.
!!!Ingredients
A witch can use items and components known as “Ingredients” to help cast her spells. A wide range of items can be used as Ingredients. Since //Simply Magical Cuisine// was disguised as a cookbook, many, but not all, of these are food items. They run the gamut from common baking mixes to exotic spices and herbs to more esoteric things like the eye of a newt or a cat’s whisker.
Anytime she casts a spell, she can opt to expend Ingredients. Each Ingredient she uses reduces the cost of the Power by one power point. A witch can completely pay for the Power’s cost assuming she has enough Ingredients available.
Once a witch uses an Ingredient in a spell, it is consumed completely. At the time Maybell wrote //Simply Magical Cuisine//, most of these were fairly easy to come by. Now things are a little tougher. A witch can make a Notice roll to search an area the Marshal decides is suitable for Ingredients. On a success, she finds one, while with a raise she scares up two.
Only a witch can scrounge for Ingredients. An attempt generally takes about an hour, and while she’s doing that, she can’t scavenge for other items. Any bonuses she has to Notice or to scavenge salvageable items apply to this roll, however.
There’s a limit to how many Ingredients a witch can manage at any one time. She cannot have more Ingredients than her Smarts die type. If she tries to hoard more than that, the magical nature of the items gets stewed together and spoils the entire batch of Ingredients, making them unusable. Otherwise, Ingredients have a virtually unlimited shelf life.
A witch starts play with a number of Ingredients equal to half her Smarts die.
!!!Horn Haters
A witch who rolls a 1 on her Witchcraft skill die, regardless of Wild Die, is Shaken. It is possible to suffer backlash and still succeed at casting because of the Wild Die. If your witch is Unicorn there’s a little extra spice in the recipe for him, though.
While witches in the wastelands as a whole don’t particularly love or hate Unicorns, Maybell Devilin herself would’ve been happy if the whole lot of them shriveled up and died. In fact, she made sure that more than a few did just that! Being the horn-hater she was, Maybell encoded quite a few traps for any Unicorns that might try to make use of her magic.
If your witch is a Unicorn, she suffers a Wound anytime she is unlucky enough to get a 1 on both his Witchcraft and Wild dice.
!!!Learning New Spells
Your witch’s lifeblood, so to speak, is her “cookbook,” //Simply Magical Cuisine//. If she wants any new powers, she must decode them from the text. In other words, if she doesn’t have the book in her possession, she can’t take the New Power Edge. She still knows her favorite recipes, however. If her copy is destroyed, she has to find a replacement, which should be the subject of an adventure in and of itself.
!!History
Way back when Discord had only just started his career as a lawn ornament there was a gal named Gem Devilin whose family had long lead there small town of Wichita during the Mad Lord’s rule. Like so many other communities Wichita had been isolated during the Discordian Era, completely cut off from the outside world or other ponies. The Community that emerged was something from history, a mono-species pony settlement made completely of Earth Ponies. Seen as weak and backwards, Wichita was soon the target of nearby communities who sought to take advantage of the Earth Ponies, The Devilin family mares soon saw to correcting these assumptions of there people.
!!Wichita gos to War
By the time Sombra’s Forces were marching South, and Celestia and Luna were making there rounds to form a posse to put the Crystal Empire in its place, Gem Devilin had inherited the position of Leadership of Wichita from her mother who had fallen in the line of duty defending there home. One of the strongest factions in there area at the time the Sisters were keen to get Devilin and her Wichita ponies to fall in rank with there growing army but Gem was by large and far against the notion. Already distrusting of non-Earth Ponies like all but the most open minded of Wichita inhabitants Gem held a special hatred for anything with a Horn.
In the end the sisters resorted to threats as they offered an ultimatum to Wichita and the Devilin family, service to the Sisters or death. Not even Gem could refuse the offer, so she agreed to dedicate Wichita to there cause even as her hatred grew. Falling in line, Devilin and her ponies served well during the Crystal wars, all the way to its completion. Gem herself was even present for the Final Assault when the ground shook, the dead rose, and a city disappeared. It was at this battle that Gem first heard whispers from the shadows, whispers that promised to show a way to level the playing field with her horned enemies.
Returning to Wichita Gem began to compile what she learned. As she delved into new and ever darker teachings from her shadowy patrons, Gem formed a cabal of practitioners and passed the secrets of her teachings down her family line, those who practiced the craft became known as Witches and Warlocks. In time Celestia and Luna followed up on their promises as they gathered their Royal Family. The Devilins were all to happy to accept and take a step closer to the throats of those who had forced them into service during the Crystal Wars.
!!The Great Witch-Hunt
Though Gem never lived long enough to see the Everfree Marches, you can bet your last bit that she made sure it instill in her lineage a long lasting hatred of Unicorns and the Royal Sisters. More than likely would be laughing from her grave as one noble after another turned against them. When talk began of dethroning the Princesses the Devilin family were in there in the thick of it openly supporting the cause. Following Nightmare Moon’s escape and Celestia’s crack down and culling of dissenters, it was no surprise that the Devilin family were right in the cross-hairs of the alicorn’s fury.
Fleeing home to Wichita the Devilins and their cabal were pursued and raided by what remained of the Night Guard, who were dismissed after this last deployment. While most were captured or even killed during the raid, a few minor Devilin family members managed to make there escape along with a tomb of their family’s work. Sending in the newly created Celestial Solar Service to finish the job, Celestia struck the name of Devilin forever from the royal line and forbade the practice of “Witchcraft” within her lands. Within a generation Wichita had been cleaned out of all practitioners of the art.
!!Simply Magical Cuisine
The name of Devilin faded from mosts memories for a long while, until it once again re-emerged during the Ghost Rock Rush, as one Maybell Devilin married one of Equestria’s wealthiest business ponies, Coal BlackRiver. Coal was the owner of the Black-River rail company, and following his mysterious death, the control of said company shifted to Maybell. Finding herself the first Devilin back in power since the witch-hunts, Maybell made the practical decision to use her influence to help Earth Ponies everywhere to climb up above their station and fight back against there horned oppressors.
A Witch herself, Maybell consulted Gems original grimoire as she worked on a new volume, a cookbook which she titled “Simply Magical Cuisine” in which she hid instructions for those smart enough to decipher them. Releasing them through an associated publisher, Maybell’s book was a instant success, and before long the Wild Frontier saw an explosion of the forbidden art of Witchcraft. It took years, but eventually between the efforts of the Celestial Solar Service and the Lunar Rangers, every known copy of the book was recalled and destroyed. Maybell herself was brought before court on charges for the offense, but thanks to her deep pockets she was able to throw enough bits at the charges to make them disappear.
While Maybell had bought her way out of trouble, the Devilin name was back under scrutiny, particularly by the Lunar Rangers who made it their job to keep an eye on the family. Setting aside her plotting, Maybell turned to running her new business as the heat cooled down. In time the Devilin family expanded the Black-River Rail Company into a massive corporation that was only rivalled by HillStorm Industries in size, known as PentaCorp.
!!Last of the Devilin Line
The years were kind to the Devilin family, as the influence of natural unicorn magic slowly weakened over the centuries, while their own secretly practiced art of Witchcraft remained as strong as the day Gem first penned the family’s book of spells. What none of them realized until it was nearly to late was that there line was thinning out. By the time it became apparent the last full blooded Devilin, Rose Devilin, was beginning to feel the effects of age. Generations of secrecy and careful selection of “Pure” Earth pony lines to marry into had taken its toll. To make matters worse, Rose was such a fanatic that she simply could not trust any line to be pure enough for herself.
Resolving instead to seek out an alternate method of securing a successor to Pentacorp and the family name, Rose began to research cloning techniques, yet another outlawed practice. Never one to be dissuaded by the law, Rose Devilin continued her work in secret, diverting company funds and resources into the project as her teams of scientist attempted to re-create an old magic from what few samples they had collected, what remained of the fabled “Mirror Pond”, which was destroyed along with most of the Everfree after the Second Spark. The project made leaps and bounds in the field of cloning, but unfortunately Rose Devilin never lived long enough to see its completion.
Following the long standing company policy of passing leadership of Pentacorp to the closest living descendant, Pentacorp began searching and eventually found somepony with just enough Devilin Blood in her veins to qualify. This, obviously, came as quite a shock to the mare in question, Trixie Lulamoon.
!!Great and Powerful CEO
While many were shocked to see a Unicorn take the reins of Pentacorp, Trixie soon proved herself a worthy successor to the position, as the mare possessed a spectacularly affinity with branding and salesponyship. In truth, between embezzlement of funds and time spent focusing on her own project, Rose Devilin had been running Pentacorp into the ground quite spectacularly. But thanks to a through and blinding fast re-branding, Trixie managed to pull Pentacorp from the ashes within only a few short years. Trixie’s was the, literal, new face of Pentacorp, with her image and flare adorning its many products and services.
Fast, brutal, and efficient the long lost black sheep of the Devilin line became known as the “Trixie Devil” of the business world, despite never taking the Devilin name. After returning Pentacorp to its former glory and beginning to expand further still her power, Trixie started to look into the glaring holes in the company’s books. Following the money, Trixie eventually found old Rose Devilins hidden project and the Witchy Secrets of the Devilin line.
Trixie was intrigued.
!!Reprint of a Classic
Proving again to be a much better task leader, Trixie resumed Rose’s work and had new teams working to solve the issues of the cloning process. Standing on the work or her predecessor, and steeping herself in the family craft, Trixie plotted to prove that a brilliant unicorn could succeed where the last of the pure blooded Devilins could not, she would have a line of perfect successors to follower her. An endless line of beautiful and brilliant mares to carry on the Lulamoon name.
When the process was perfected Trixie encountered a new problem: ensuring that no outside intervention could ruin her plans. With the Lunar Rangers always breathing down her neck and no love from the Celestial Solar Service either, it was clear she could not trust all her eggs in one basket. Trixie resolved to secretly construct hidden facilities and bunkers all across Equestria. To accomplish this she however would need a distraction, for this she looked to an old Devilin trick as she pulled the “Simply Magical Cuisine” manuscript from the family vault.
Running a private printing through a shell corporation, Trixie deployed agents to seed the new printing of the banned book throughout the land via used book stores, yard sales, and flea markets. Before long an brand new batch of Witches was around for the Rangers to chase, leaving enough breathing room for Trixie to move on her plans. The facilities were all completed and the cauldrons put to boil, so to speak, as Trixie’s daughters grew in secret. Luckily for Trixie the Lunar Rangers never caught up to her and her schemes, unluckily for her this was due to an Apocalypse.
To this day no one is sure what became of the Great and Powerful but her clones can occasionally be seen trotting about the wasteland.
''Requirements'': Novice, Spirit d8+
This individual is particularly resistant to magic (including psionics, weird science, etc.), whether by nature or by heritage. He acts as if he had 2 points of Armor when hit by damage-causing arcane powers, and adds +2 to his Trait rolls when resisting opposed powers. Even friendly arcane powers must subtract this modifier to affect the resistant hero.
Grenades, spell effects, and other attacks that cover a large area are “area effect attacks.” The three most common size attacks have been made into Small, Medium, and Large Burst Templates.
To attack with an area effect weapon, the character places the template on the table (or picks where he wants the center of the blast to be) and makes a Shooting or Throwing roll. If the attack is successful, the blast is centered where desired. Everything under (or partially under) the template is affected, rolling damage separately for each Wild Card or group of Extras.
Failure means the blast deviates. Just how far depends on whether it was thrown or launched, and what range bracket the target was in (Short, Medium, or Long). Roll 1d6” for thrown weapons (such as grenades) and 1d10” for fired projectiles. Multiply by 1 for Short range, 2 for Medium, and 3 for Long.
Next roll a d12 and read it like a clock facing to determine the direction the missile deviates. A weapon can never deviate more than half the distance to the original target. That keeps things from going behind the thrower.
Targets use their lowest armor value against area effect damage—armor must cover the entire body without gaps to provide any protection at all.
► ''Cover'': Targets who are prone or behind cover still get some protection from area effect attacks. In these cases, the modifier they would normally receive against ranged attacks acts as that many points of Armor instead. A character in major cover, like a foxhole, negates four points of damage from a blast if he’s caught within it.
► ''Diving for Cover'': Thrown weapons with a blast effect (such as grenades) and artillery allow potential targets a chance to move out of the area of effect. Give targets who saw the danger coming an Agility roll at –2 to jump out of the way and avoid the damage. If successful, move the character just outside the template (his choice exactly where). Grenades can be thrown back as well.
''Rank'': Novice
''Power Points'': 2
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': A mystical glow, hardened skin, ethereal armor, a mass of insects or worms.
//Armor// creates a field of magical protection around a character or an actual shell of some sort, effectively giving the target Armor. Success grants the recipient 2 points of Armor. A raise grants 4 points of Armor.
Whether the //armor// is visible or not depends largely on the trapping.
|!Type|!Armor Value|!Wgt|!Cost|!Avail|
|''Boiled Leather Shirt''|+1| 3 |$100| C |
| Notes: Covers torso, forlegs |<|<|<|<|
|''Boiled Leather Pants''|+1| 3 |$75| C |
| Notes: Covers back legs|<|<|<|<|
|''C. E. P. Armor''|+1| 2 |$500| R |
| Notes: Covers torso, legs; –4 to Notice |<|<|<|<|
|''Cold Weather Gear''|+1| 15 |$200| C |
| Nootes: Covers entire body; +1 to Fatigue rolls vs cold |<|<|<|<|
|''Improvised Armor''|+2| 5 |$50| C |
| Notes: Applied Per location |<|<|<|<|
|''Infantry Battle Suit''|+6| 35 |$1100| S |
| Notes: Covers entire body |<|<|<|<|
|''Infantry Helmet''|+4| 5 |$500| U |
| Notes: 50% chance to protect against Headshots |<|<|<|<|
|''Kevlar Vest''|+2/+4 (bullets)| 8 |$750| R |
| Notes: Torso; Negates 4 AP from ranged weapons|<|<|<|<|
|''Motorcycle Helmet''|+2| 3 |$250| U |
| Notes: 50% chance to protect against Headshots |<|<|<|<|
Your hero doesn’t think he’s the best—he knows he is. Whatever it is—swordsmanship, kung fu, running—few compare to his skills and he flaunts it every chance he gets.
Winning just isn’t enough for your hero. He must completely dominate his opponent. Anytime there is even a shadow of a doubt as to who is better, he must humiliate his opponent and prove he can snatch victory any time he wishes. He is the kind of man who disarms an opponent in a duel just so he can pick the sword up and give it back with a smirk.
Arrogant heroes always look for the “boss” in battle, attacking lesser minions only if they get in the way.
''Requirements'': Novice, Smarts d6+, Knowledge d6+ concerning to one type of art or craft
You are devoted to a single craft or art form that you have practiced tirelessly for years, and your experience has paid off. Choose a single form of artistic expression (can be anything from painting or dressmaking to singing, dancing, or playing an instrument) with which you have at least a d6 in its related nowledge skill. You gain a +2 bonus to all Trait rolls concerning your art, both when trying to test your knowledge or actually apply it and create something.
<<<
''comments'': This one involves crafting, but also knowledge and artistic expression. Do we keep it?
<<<
''Requirements'': Legendary
You have achieved a level of power and inner harmony and that few ever reach, making you a veritable demigod among ponies. Any Attributes currently below d8 are now a d8.
''Requirements'': Novice, Agility d8+, Athletics d6+, Fighting d6+, Stealth d8+
Assassins are trained killers who know how to kill with deadly precision — if they can properly approach their prey. Assassins add +2 to any damage roll where they strike a foe unawares (even with ranged attacks)
Athletics reflects a character’s overall physical ability, from galloping and vaulting to swimming, endurance running, and sports.
Typically, Athletics is rolled when a character is trying to scale a cliff, ford a river, or participating in some kind of sport or athletic contest. Athletics replaces the Climbing and Swimming skills from the Savage Worlds Deluxe Edition; use the special situational rules for each of those skills as normal but substitute in the Athletics skill instead.
!!Climbing
Characters may sometimes have to climb tall objects under duress, perhaps to scale a cliff to attack archers stationed above, or to evade a terrifying creature on the ground below!
No roll is usually needed to ascend ladders, ropes, or trees with lots of limbs unless the GM feels there’s a good reason (being chased, wounded, etc.). In more stressful situations, a character makes a Athletics roll and checks the results below. Remember that these measurements are listed in table-top inches, with each inch representing two yards in the real world.
* ''Fail'': The character makes no progress. If the Athletics roll is a total of 1 or less, he falls to the next level below — whatever that may be. See [[Falling|Hazards]] damage. If the hero was secured by a rope or other restraint, he falls half the length of the restraint and suffers a Fatigue level instead.
* ''Success'': The hero ascends a number of vertical inches on the table-top equal to half his Strength. A hero with a d6 Strength, for example, can climb 3” in a round if he makes his Athletics roll.
* ''Raise'': As Success, above, but the character moves an additional 2”.
!!Climbing Modifiers
| !Modifier | !Situation |
| +2 |Antique or medieval climbing equipment|
| +4 |Modern climbing equipment|
| –2 |Scarce or thin handholds|
| –2 |Wet or slippery surface|
► ''Falling Damage'': See [[Hazards]].
► ''Prepared Climbs'': Break lengthy ascents into three roughly even sections. Failing a Athletics roll after a break point typically means the hero falls that distance if free climbing.
► ''Ropes'': Those secured with a rope typically only suffer a level of Fatigue from [[Bumps and Bruises|Hazards]]. Of course the Game Master might decide the rope has a chance of breaking under a sudden strain. This is rare in reality, but for dramatic effect, roll a d6. On a 1, the rope breaks and the character falls the entire length of the last section climbed.
!!Swimming
Swimming determines if a character floats or sinks in water, as well as how fast he can move within it. A character’s Pace is half his Athletics skill in inches per turn in normal water (round up). Choppy water counts as rough terrain and halves this rate. Characters may not “run” while swimming for extra movement.
► ''Holding Your Breath'': Characters can hold their breath for a number of rounds equal to 2 plus their Vigor die, or half that if they weren’t prepared for being submerged and didn’t have time to get a good breath.
► ''Drowning'': The rules for drowning are found on [[Hazards]].
The heart of Savage Worlds is its fast, furious combat. Here’s everything you need to know to decimate your foes and keep your hero alive.
!!!Melee Attacks
The Target Number to hit an opponent is equal to the opponent’s Parry score (2 plus half his Fighting ability; that’s a 2 if he has no Fighting skill).
► ''Bonus Damage'': If your attack hits with a raise, add +1d6 to your damage total as well! The d6 may Ace just like any other damage roll.
!!!Ranged Attacks
The Shooting skill covers everything from pistols to rocket launchers. The base TN to hit something at Short range is 4 as usual. Shots at Medium range subtract 2 from the Shooting roll, and shots at Long range subtract 4 from the roll.
► ''Bonus Damage'': If you hit your target with a raise, add +1d6 to the damage total. This roll may Ace just like any other damage roll.
!!!Range Modifiers
|!Range | !Modifier |
|Short | — |
|Medium | –2 |
|Long | –4 |
► ''Rate of Fire'': The Rate of Fire is how many Shooting dice the character rolls when firing the weapon. These additional shots must be taken at the same time, and each point of RoF grants the hero another Shooting die. A pistol with a RoF of 2, for example, gives a character two Shooting dice, which may be aimed at two different targets.
A submachine gun with a RoF of 3, for example, allows the player to roll up to three Shooting dice at once at up to three different targets. These shots can be split among all possible targets as the player desires, but must all be taken at the same time. A shooter with an Uzi can’t fire one shot, then move and fire two more, for instance.
Wild Cards roll one Wild Die with the Shooting roll, and can use it in place of one of the Shooting dice if they choose.
<<<
''Example'': A special agent fires a submachine gun (RoF 3) at two terrorists. The agent is a Wild Card with a Shooting of d8, so he rolls 3d8 plus a Wild Die (d6). The player decides to put two shots into the closest terrorist and one at the further target. He rolls the two at the closest terrorist first, then rolls a third d8 for the second. He also rolls his Wild Die.
He scores a hit on each with his Shooting dice and misses with the third, but his Wild Die hit so he replaces one of the failed Shooting dice with it and gets his maximum three hits (since that was his RoF).
<<<
► ''Firing Blind'': Sometimes a character may want to fire at targets they have no fix on whatsoever. In these cases, allow the attacker to make a Shooting roll at –4 as above. Should he hit, the target may make a simple Stealth roll to ignore the attack (it misses).The Stealth roll is made at –2 if the attack was made with a RoF of 3 or more.
!!!Attack Modifiers
► ''Cover'': Attackers suffer a penalty when attempting to hit
a target behind cover:
* ''Light Cover'': Characters subtract 1 from their attack rolls if half or less of their target is obscured.
* ''Medium Cover'': The penalty is increased to –2 if more than half of the target is hidden from view. This is the usual penalty for attacking a prone character (see Prone).
* ''Heavy Cover'': The penalty is –4 if only a small part of the target is visible (prone beside a tree, behind a high wall, peeking around the corner of a building, etc.).
* ''Near Total Cover'': Attacking through a very tight opening that provides near total cover, such as an arrow slit, subtracts 6 from enemy attack rolls.
► ''Illumination'': Attacking a poorly-illuminated target is more
difficult than a similar attack with good lighting, and incurs the
following penalties:
* ''Dim'': Twilight, light fog, night with a full moon, and so on subtract 1 from combatants’ attack rolls.
* ''Dark'': Normal darkness with some ambient light (starlight, partial moon) inflicts a –2 penalty, and targets aren’t visible outside of 10”.
* ''Pitch Darkness'': Targets aren’t visible at all in pitch blackness, but if a character knows roughly where a victim is (he can hear him, target is in a confined space, a glint of light shines off his blade, etc.), he may be attacked at –4.
''Requirements'': Novice, Vigor d6+
It’s no secret that beautiful people have an easier time getting their way in life. This Edge grants your beautiful or handsome character +2 to Charisma.
* ''Agility'' is your hero’s nimbleness, quickness, and dexterity.
* ''Smarts'' is a measure of how well your character knows his world and culture, how well he thinks on his feet, and mental agility.
* ''Spirit'' reflects inner wisdom and willpower. Spirit is very important as it helps your character recover from being [[Shaken]].
* ''Strength'' is raw physical power and general fitness. Strength is also used to generate your warrior’s damage in hand-to-hand combat.
* ''Vigor'' represents endurance, resistance to disease, poison, or toxins, and how much pain and physical damage a hero can shake off.
!!!List of Agility-related traits
<ul>
<$list filter="[tag[Attribute:Agility]tag[Skills]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!List of Smarts-related traits
<ul>
<$list filter="[tag[Attribute:Smarts]tag[Skills]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!List of Strength-related traits
* Load Limit
<ul>
<$list filter="[tag[Attribute:Strength]tag[Skills]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!List of Spirit-related traits
<ul>
<$list filter="[tag[Attribute:Spirit]tag[Skills]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!List of Vigor-related traits
* Toughness
<ul>
<$list filter="[tag[Attribute:Vigor]tag[Skills]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
Automatic weapons (those with an RoF of 2 or higher) fire much faster—and inherently differently—than regular firearms.
To attack with a full-auto weapon, roll a number of Shooting dice equal to the weapon’s Rate of Fire. Compare each die separately to the Target Number to see if it hit. If the weapon has a RoF of 3, for example, a Wild Card rolls three Shooting dice plus a Wild Die and uses the best three results.
Note that Wild Cards roll their Shooting dice plus a Wild Die. They still can’t hit with more shots than the weapon’s Rate of Fire, however.
► ''Recoil'': Fully automatic fire is typically inaccurate because of the recoil between each shot. Subtract 2 from the Shooting roll when firing full-auto (ignore the penalty when firing a single shot with such a weapon).
► ''Full-Auto and Ammo'': This system is somewhat abstract so that we don’t have to roll dice for every single bullet (though we treat them as such for game purposes). This means that each die rolled on full-auto represents a number of bullets equal to the weapon’s Rate of Fire when counting ammo, even though only one “bullet” can hit and cause damage from that die. Firing all three dice with a Thompson gun (Rate of Fire 3), for example, consumes 9 bullets.
Most automatic weapons can be set to fire full-auto or single shot. If a weapon has selectable automatic use (Auto), you can fire a single shot (and also ignore the full-auto penalty of –2).
► ''Suppressive Fire'': Instead of attacking specific targets, characters with fully automatic weapons can “spray” an area with lead in hopes of killing or suppressing a larger number of victims. To suppress an area, the attacker places the Medium Burst Template on the battlefield and makes a single Shooting roll (regardless of the weapon’s Rate of Fire). Include the standard modifiers for range, the full-auto penalty, and any other miscellaneous factors, but ignore the target’s modifiers if any (such as being prone or in cover—these come into play in another way as you’ll see below). If the attack misses, the spray is off-target and has no effect.
If the attack is successful, all possible targets within the area make Spirit rolls, adding any cover modifiers they would normally have against ranged attacks to this roll. Those who fail are Shaken. Those who roll a 1 on their Spirit die (regardless of any Wild Dice) are actually hit by the attack and suffer damage normally.
Suppressive fire uses five times the weapon’s Rate of Fire in bullets. A weapon with a Rate of Fire of 3, for example, uses 15 bullets for suppressive fire.
<<<
''Example'': Buck and Virginia, two pulp-era adventurers, are escaping from ancient ruins in a stolen biplane. Suddenly, they’re swarmed by an evil alligator shaman and his brainwashed minions. Virginia spins the plane’s Maxim gun around and fires. She uses suppressive fire to slow them down.
She places a Medium Burst Template 16” away— that’s Medium Range for the Maxim—and rolls her Shooting. She gets a 13, –2 for full-auto, –2 for an unstable platform (the plane), and –2 for Medium range, for a total of 7. Success! The tribesmen in the template must roll their Spirit or be Shaken. Those who make it charge on through, but those who roll a 1 are hit!
<<<
Rolls to determine the effects of a fire suffer a –2 penalty each round (non-stacking) until the fire is extinguished. These systems are usually good for one use, then must be recharged. Double Price for Trailers.
''Rank'': Seasoned
''Power Points'': 3
''Range'': Smarts * miles
''Duration'': Instant
This dangerous and highly-specialized power allows a syker to send a powerful and dangerous surge along a psychic link from a target to its source. If an ally is the subject of puppet, for example, a syker could use //backwash// to send a mental blast back along the psionic link and attack the puppeteer.
The syker nominates a character currently affected by another characters’ power. The syker and original caster then make opposed arcane skill rolls. If the enemy is anything other than another syker, the attacker suffers a –2 penalty.
If the target loses, he suffers 3d6 damage. If the attacker loses, he suffers a level of Fatigue instead. It may be regained by four hours of solid rest or sleep.
Your hero’s eyes just aren’t what they used to be. With glasses, there’s no penalty and the Hindrance is only Minor. Should he lose his glasses (generally a 50% chance when he’s wounded, or no chance with a “nerd-strap”), he suffers a –2 penalty to any Trait roll made to shoot or Notice something more than 5” (10 yards) distant.
In low-tech settings where the hero cannot wear glasses, Bad Eyes is a Major Hindrance. He must subtract 2 from Trait rolls made to attack or notice things 5” or more away.
Your hero is a little less lucky than most. He gets one less Benny per game session than normal. A character cannot have both Bad Luck and the Luck Edge.
''Rank'': Veteran
''Power Points'': 3
''Range'': Smarts
''Duration'': Instant
''Trappings'': Holy items, arcane symbols, handful of salt. Whether ghosts, elementals, or demons, //banish// removes them all. This power can affect any creature that is not native to the current plane of existence (GM’s determination).
This spell is an opposed roll of the caster’s arcane skill versus the target’s Spirit. On a success, the target is Shaken. On a raise, it is sent to its proper plane of existence.
If the target is a Wild Card, each casting of //banish// causes a wound instead. If the target already has three wounds, it is then banished to its native plane—but it is not slain.
''Rank'': Seasoned
''Power Points'': 1/section
''Range'': Smarts
''Duration'': 3 (1 per section, per round)
''Trappings'': Fire, ice, thorns, force, bones.
//Barrier// creates a solid, immobile wall to protect the user against attack or to entrap an opponent.
Regardless of what the //barrier// is made of (ice, thorns, stone, energy, etc.), it has a Toughness of 10. Every Power Point spent creates a 1” wide section of wall. The barrier ranges in thickness from a few “real world” inches for stone or other hard materials up to a foot for things like bones or ice. (If you’re using a gridded mat to play, draw the barrier between the squares directly along the grid-lines.) The exact placement of each section is defined by the caster, but each section must be connected to at least one other section after the first.
When the spell expires or a section is broken, it crumbles to dust or dissipates. Trappings are never left behind.
Each section of the //barrier// may be destroyed by an attack that equals its Toughness of 10. Physical walls are treated exactly like inanimate objects; they are considered to have a Parry of 2 (ranged attacks work as normal), but raises on the attack roll do not grant bonus damage nor do damage dice Ace. Opponents may climb the barrier at –2 to their Climbing roll if it is made of something solid. Fiery versions of the barrier cause 2d4 damage to anyone who wishes to leap through instead.
!!Currency
There’s no standard currency in the Wasted West. Assume “dollars” are trinkets, small food items, bullets, bits of jewelry, a squirt or two of toothpaste, matches, and the like.
In general, think of these as currency and nothing else. In a pinch, the Marshal might let a waster roll to find something important in his “cash,” like a match or one more bullet for his gun. This is based on what the character was smart enough to pick up, so he makes a Smarts roll at –2 applying the item’s scarcity Streetwise modifier (see Rarity Table below). On a success, he has the item and deducts the cost from his “money.”
!!Scrounging
Scrounging is the ability to find these little baubles and more in the ruins of the wasted world. This is such an important part of life in Hell on Earth that we’ve included special Setting Rules for it on [[Scavenging]].
!!!Selling Goods
Posses occasionally wind up with spare gear. A Streetwise roll in a settlement of fair size or larger allows the seller to dump the goods at a quarter the normal value. A raise nets half the list price. This roll may be attempted once a week per settlement.
Bartering of larger goods is trickier but tends to pay a little better. A working computer, for example, is useless to most wastelanders, even with a generator. A scientist with power and a lab, however, might pay dearly. Special cases like this usually require a little roleplaying to sell properly.
!!Availability
The fall of civilization means your hero can’t simply waltz into the local S-Mart and buy whatever he wants.
As such, goods are rated for scarcity, being Common, Uncommon, Scarce, Rare,
or Very Rare. This represents how hard it is to find the item, as well as how many of a particular item can be bought or sold by the characters in a particular day. This includes all transactions within a 24-hour period, not just those conducted at a single shop or market—though if the shoppers travel to an entirely different settlement, they may try again. This limit does not apply during character creation. Some items listed here do not have a rarity, which means they are not generally available for trade.
To find a particular item, a character makes a Streetwise roll. This roll is modified by the scarcity of the item as well as the size of the settlement in which the player finds himself. Small but well-equipped stores (such as a traveling salesman) are simply treated as larger settlements.
!!!Rarity Table
|!Scarcity | !Streetwise | !Number Available |
|Common (C) | +2 | 1d8 |
|Uncommon (U) | 0 | 1d6 |
|Scarce (S) | –1 | 1d4 |
|Rare (R) | –2 | 1d3 |
|Very Rare (VR) | –4 | 1d2 |
!!!Population Modifiers
|!Population | !Streetwise Modifier |
|Less than 500 | –6 |
|500–1,000 | –4 |
|1,001–2,000 | –2 |
|2000+ | +0 |
|Junkyard | +2 |
!!Damaged Goods
Most anything except services can be bartered for cheaper than the listed price—if a waster is willing to settle for a little less quality. Common items such as clothes are ratty and torn, hats are crumpled, and dinged up playing cards can’t be used anywhere except by the campfire. The effects of these items are usually situational, though many items can cause bigger problems... or become them!
Damaged vehicles go for 75% of the list price. Cheap guns, tools, and so forth—anything a brainer has to roll to use—malfunction when the player rolls a 1 on the skill die. Your warrior’s dinged-up golf club, for example, might fall apart while whacking on some no good mutie.
Items that don’t come into play for skill rolls might affect others’ perception. A ratty leather jacket, for example, has blood stains, tears, and other signs that it might be fresh off a corpse. These items inflict a –1 Charisma modifier on your waster. Even after the Apocalypse a blood-stained wanderer gives others the creeps.
''Requirements'': Pegasus Pony, Novice
Your hero is rare breed of Pegasus, the nightly Bat Pony. To them, navigating in the dark is hardly a challenge. They get Low Light Vision, nullifying penalties for Dim and Dark lighting, and they also get Keen Sense, providing +2 to hearing-related Notice rolls.
However they may be confused with sinister things that lurk in the shadows, and others may be wary of them. As such, they receive a -2 Charisma penalty. They also have a bite Natural Attack of Str+d4 and can Drink Blood of Incapacitated enemies to sate their hunger and thirst, so maybe their fame is not undeserved after all.
The United States??? and the Confederacy??? existed in a state of near-perpetual cold war for the better part of two centuries before the Last War brought it all to a burning, irradiated climax. Both sides fortified the border with their belligerent neighbor, often heavily, and sections of the Mason-Dixon Wall??? made the Berlin Wall??? look like a pleasant white picket fence by comparison.
Posses traveling near the former border are almost certain to run across remnants of the former defensive constructions, but avoiding the Wall??? isn’t a guarantee a waster won’t find himself smack dab in the middle of a minefield. Once hostilities heated up and battle lines shifted back and forth across the continent, impromptu battlefield fortifications sprang up quicker than weeds in an untended garden. And like weeds, minefields and razorwire tend to stick around a long time once they’ve taken root.
Here’s a quick rundown on the most troublesome hazards a band of heroes is likely to encounter in the Wasted West.
!!!List of Battlefield Hazards
*[[Minefields]]
*[[Wire]]
*[[Booby Traps]]
''Requirements'': Novice
Some individuals can exert incredible will over their animal companions. These characters may spend their own Bennies for any animals under their control, including mounts, pet dogs, familiars, and so on.
''Rank'': Novice
''Power Points'': Special
''Range'': Smarts x 100 yards
''Duration'': 10 minutes
''Trappings'': The mage concentrates and gestures with his hands.
This spell allows mages to speak with and guide the actions of nature’s beasts. It works only on creatures with animal intelligence, not humanoids. Nor does it work on conjured, magical, or otherwise “unnatural” animals.
The target must be within the sorcerer’s range — it is not conjured.
The cost to control a creature depends on its Size. The base cost is 3, plus twice its Size for creatures with a Size greater than 0. A great white shark (Size +4) costs 3 plus 8 (2x4), or 11 points. A roc (Size +8) costs 19 Power Points to control.
Swarms may also be controlled. Small swarms cost 3, Mediums 5, and Large 8. Thus a single rat costs 3 to control, as does a small swarm of the creatures.
''Requirements'': Novice, Spirit d8+
Animals like your hero, and won’t attack him unless he attacks them first or they are enraged for some reason. His “animal magnetism” is so great he’s attracted a loyal animal of some sort as well. This is typically a dog, wolf, or raptor, though the GM may allow other companions if it fits the setting.
The beast is an Extra (not a Wild Card). If it should be killed, the hero finds a replacement in 2d6 days.
''Requirements'': Novice, Strength d8+
With a laugh and a quick flex, you could help pony Atlas himself keep up the earth if he was in need of a break.
You gain a +4 bonus to all Strength rolls made to push, lift, bend, or otherwise move inanimate objects.
<<<
Hey brainers, the marshal wants to remind you that we are using new rules that replace bennies with [[Fate Chips]]. This page will remain as these new rules simply modify the old adding new and interesting options.
<<<
Every now and then the dice may not work for you. That’s why Savage Worlds gives you, the player, a little control over your hero’s fate.
Every player starts each game session with three “Bennies” (American slang for “benefits”), represented by gaming stones or other tokens that signify a little bit of good luck or fate. The Game Master may also give you more Bennies for great roleplaying, overcoming major obstacles, or even entertaining everyone with an outlandish action, side-splitting comment, or other memorable act.
You can use Bennies to reroll any Trait test. Make the entire roll from scratch. If you’re firing three shots on full-auto and don’t like the results, pick up all three dice and your Wild Die and roll again. You can keep spending Bennies and rerolling as long as you like, and take the best of your attempts. If you roll a 5, for example, and a Benny gets you a 4, keep the original 5 instead.
Bennies cannot be spent on tables, damage rolls (unless a character has the No Mercy Edge), or any other roll that isn’t a Trait roll.
► ''Soak Rolls'': Bennies can also be used to save your bacon from deadly attacks. Choose carefully where you spend them! See [[Damage]] for complete information on how to make Soak rolls.
!!Game Master Bennies
Game Masters get Bennies too. At the start of each session, the GM gets one Benny for each player character. He may use these for any of his villains throughout the course of the game.
Each of the GM’s Wild Cards also gets two Bennies per game session. They can use these or any of the Bennies in the common pool to save their evil skins, but they can’t share their own Bennies with other nonplayer characters.
As with heroes, Bennies are not saved between sessions.
''Requirements'': Novice
Immediately after suffering a wound (including a Shaken result from physical damage), your hero must make a Smarts roll or go Berserk.
While Berserk, his Parry is reduced by 2 but he adds +2 to all Fighting, Strength, melee damage rolls, and Toughness. The warrior ignores all wound modifiers while Berserk, but cannot use any skills, Edges, or maneuvers that require concentration, including Shooting and Taunt, but not Intimidation.
Berserkers attack with reckless abandon. Anytime his Fighting die is a 1 (regardless of his Wild Die), he hits a random adjacent target (not the original target). The attack may hit friend as well as foe. If there are no other adjacent targets, the blow simply misses.
The Berserker may end his rage by doing nothing (not even moving) for one full action and making a Smarts roll at –2.
Arcane Skill for the Power of [[Bibliopathy]].
Loose lips sink ships, the saying goes. Your hero’s mouth could drown an armada.
Your character can’t keep a secret very well. He reveals plans and gives away things best kept among friends, usually at the worst possible times.
You must be a pony to take this Hindrance. For some reason, you have not yet received a Cutie Mark, and your true calling has not revealed itself to you.
You don't get the free starting Edge other ponies do and you receive one less Benny per game session than normal. Characters with the Young Filly/Colt Hindrance are the ones who most commonly take this Hindrance, and it provides 2 points (instead of 1 as with other Minor Hindrances).
At a certain point (determined by the Game Master) you may discover your Cutie Mark and lose this Hindrance for free. When it happens, you instantly also get a free Edge relating to your true talent.
''Rank'': Seasoned
''Power Points'': 2–6
''Range'': 24/48/96
''Duration'': Instant
''Trappings'': Balls of fire, ice, light, darkness, colored bolts, swarm of insects.
//Blast// is an area effect power that can put down many
opponents at once. The caster first picks where he wants to center the //blast//, then makes the appropriate skill roll. Normal ranged attack modifiers apply.
The area of effect is a Medium Burst Template. If the roll is failed, the //blast// deviates as a launched projectile.
Targets within the blast suffer 2d6 damage. //Blast// counts as a Heavy Weapon.
► ''Additional Effects'': For double the Power Points, the blast does 3d6 damage, //or// the size is increased to a Large Burst Template. For triple the points, it does both.
''Requirements'': Seasoned, Arcane Background (Templar)
When the Templar spends a Benny to reroll a trait roll, he uses a d10 for his Wild Die. If he has the Master Edge, he uses a d12.
''Rank'': Novice
''Power Points'': 2–6
''Range'': 12/24/48
''Duration'': Instant
''Trappings'': Bright flash of light, sand in eyes, sticky shadows.
This power temporarily blinds a target or targets. Those affected must make an Agility roll at –2 to avert their gaze and avoid the effect (at –4 if the caster got a raise on the attack roll). On a failure, victims are Shaken and –2 to Parry until their next action. If the target rolls a 1 on his Agility die (regardless of the Wild Die), he’s Shaken and fully blind until he recovers from being Shaken. Blinded victims suffer a –6 penalty to all Trait rolls that require vision and have their Parry reduced to 2.
► ''Additional Effects'': For 2 Power Points, the power affects a single target. For 4 Power Points, the power affects everyone in a Medium Burst Template. For 6 points, it affects everyone in a Large Burst Template.
The individual is completely without sight. He suffers a –6 to all physical tasks that require vision (which is most everything) and –2 to most social tasks as he can’t “read” those he’s interacting with as well as others.
On the plus side, Blind characters gain their choice of a free Edge to compensate for this particularly difficult Hindrance.
''Requirements'': Seasoned, Fighting d8+
Warriors who engage in frequent melee combat are far more skilled in personal defense than most others. They’ve learned not only how to attack, but how to block their opponent’s blows as well. A fighter with this Edge adds +1 to his Parry.
''Requirements'': Novice, Pony (Any Breed), Special
Somewhere in your past lineage, you had one or more non-pony ancestors whose bloodline has plainly manifested in you in some noticeable way. It used to be that these ponies would be feared and ostracized, but ponykind have worse things to fear now. Each Bloodline has its own requirements, and you may not take more than one Bloodline Edge.
* ''Donkey''
Requirements: Vigor d6+
Mules are benefitted with great strength and a hardy nature. You gain a +1 bonus to Toughness.
* ''Zebra''
Requirements: Spirit d6+
As a zony, you have also inherited the sharp senses of your ancestors. You gain a +1 bonus to Notice rolls.
<<<
''comments'': Should we add more?
<<<
Your hero never takes prisoners unless under the direct supervision of a superior. This can cause major problems in a military campaign unless his superiors condone that sort of thing. Your killer suffers –4 to his Charisma, but only if his cruel habits are known.
''School'': Abjuration
''Range'': Smarts
''Duration'': Instant
''Trappings'': Light breeze and pleasant floral scent
//Bloom//: Designate a 1” square area within range; any plants there instantly perk up and are watered and provided with nutrients, with any dried out or dying plants restored to health. This cannot restore already dead plants to life.
//Wither//: Same as above, but all plants in the area instantly wither and die instead.
''Cast Option'' (+0): With either Bloom or Wither, the area of effect increases to a 5” square.
Characters with this skill can handle most any boat or ship common to their setting and character background. They generally know how to handle common tasks associated with their vessels as well (tying knots, rigging sails, etc.).
Bolas consist of three or more weights tied together by strings that are thrown at a target in order to bind up their legs. A bolas must be thrown at a target’s legs to have any effect (a Called Shot to the legs). If you hit, the target is knocked Prone and cannot move until they make a successful Strength roll as an action to break the bolas binding them.
''Rank'': Novice
''Power Points'': 1 per missile
''Range'': 12/24/48
''Duration'': Instant
''Trappings'': Fire, ice, light, darkness, colored bolts, insects.
//Bolt// is a standard attack power of wizards, and can also be used for ray guns, bursts of energy, streaks of holy light, and other ranged attacks. The damage of the //bolt// is 2d6.
► ''Additional Bolts'': The character may cast up to 3 //bolts// by spending a like amount of Power Points. The //bolts// maybe spread among targets as the character chooses. This is rolled just like fully-automatic weapons fire but without the full auto penalty—the character rolls a spellcasting die for each //bolt// and compares each to the Target Number separately. If the caster is a Wild Card, he also rolls a Wild Die, which may replace any of the casting dice.
► ''Additional Damage'': The caster may instead cast a single 3d6 //bolt// for 2 Power Points. He may not cast multiple //bolts// when using this ability.
Flying machines hadn’t been around very long when someone realized that
you could drop things on people from up above. Of course, things got out of hand, as they tend to do, and the dropped items quickly escalated from
lugeys and eggs to rocks to 2000 lb.,delayed fuse, laser-guided bombs.
There are many variables that go into computing a bombs release point and
trying to model this realistically would require a lot of math (not to mention a much larger playing area), so we’ve opted for a simplified system.
To bomb a target, the attacking aircraft must fly directly over it. The attack is made as the aircraft passes over the target, so the pilot or bombardier must have a card held to drop the bombs. The skill roll to bomb a target is either piloting or a knowledge: Bombardier check. There are quite a few factors that
can adiust this roll, these are listed on the Bombing Table below.
|!Situation|!Modifier|
|Every 100 of altitude| -1 |
|Each full 150 of speed| -1 |
|Aircraft turned last turn| -2 |
|Aircraft turned this turn| -4 |
|Each turn spent flying straight at target| +1(Max +4) |
|Diving at target| +2 |
|!Bomb|!Damage|!AP|!Blast Radius|!Value|!Avail|
|50lb. Bomb| 4D10 | 5 | LBT | $750 | R |
|100lb. Bomb| 6D10 | 10 | 8 | $1,000 | R |
|250lb. Bomb| 8D10 | 20 | 10 | $2,000 | VR |
|500lb. Bomb| 10D10 | 30 | 15 | $3,000 | VR |
Guerrilla fighters and special ops soldiers alike employed booby traps to hinder enemy troops. Since Judgment Day, they’ve also become popular with bandits and unscrupulous scavengers lurking in the ruins of the Wasted West.
They include everything from simple foot spikes intended to cripple all the way to artillery shells rigged to pressure plates. They’re limited only by the materials available and the imagination (and skill) of the trap builder. Not all booby traps are damaging. A flare gun or smoke grenade may be used as a warning device, for example.
Unlike mine fields, booby traps are usually employed as solitary obstacles, but carefully placed in spots where some poor victim is likely to trigger them. When passing through an area that’s been booby-trapped, each waster must make a Notice roll to detect and avoid the trap. The same modifiers for detecting in a minefield apply to this Notice roll, with the exception that a mine detector only helps if the booby trap involves at least as much metal as a conventional mine in its design.
Obviously, once one character in a group has spotted the devilish device, she can point it out to her comrades, or if she’s feeling lucky, try to disarm it. A really simple trap, like a pit or foot spikes, can be disabled or at least effectively permanently bypassed with a Smarts roll. Disabling an explosive booby trap requires a Knowledge (Demolitions) roll. Rolling 1 on the skill die means the unlucky sapper triggered the device instead.
Setting a simple trap, like a foot spike or pit, requires only the requisite materials and a Stealth roll to camouflage it.
Emplacing an explosive trap requires the explosives, a Knowledge (Demolitions) roll, and a Stealth roll to hide it. In either case, the waster hiding the trap likely believes it to be camouflaged regardless of the roll. Another character must make a Notice roll to determine if it was actually successfully hidden or not.
* ''Deadfall'': A haphazard collection of logs, stones, or debris can be stacked to fall on those who trigger a tripwire or “keystone”. A small trap causes 2d4 damage in a Small Burst Template, a medium deadfall causes 2d6 in a Medium Burst Template, and a large deadfall causes 3d6 damage in a Large Burst Template. Characters should usually be given an Agility roll at –2 to leap out of the way unless they’re otherwise hindered—such as walking thorugh thick mud or foliage.
* ''Foot Spike'': Damage for a foot spike is 2d4–1. If the victim is Shaken, he suffers –2 Pace for the next 24 hours. If wounded, he suffers the penalty until healed.
* ''Pit'': Victims who fall into the pit suffer damage based on its depth. Add d6 to falling damage if the pit was lined with spikes, broken glass, or other hazards.
* ''Ranged Weapon'': A ranged weapon can be placed in front of a doorway, window, or other narrow portal and triggered via tripwire or simply opening the door. Anyone who opens the portal without precaution (such as standing to the side or using a stick or other tool) is hit for the weapon’s normal damage. No Shooting roll is made, though the damage roll can Ace as usual.
''Rank'': Novice
''Power Points'': 2
''Range'': Smarts
''Duration'': 3 (1/round)
''Trappings'': Physical change, glowing aura, potions.
This power allows a character to increase any of a target’s Traits by one die type for a standard success, or by two with a raise. The affected Trait can exceed d12. Each step over d12 adds +1 to his Trait total. For example, a raise on someone who already has a d12 in the affected Trait grants him d12+2 for the duration of the power.
The power can also be used to lower an opponent’s Trait. This is an opposed roll against the victim’s Spirit. Success lowers any Trait of the caster’s choice one step, a raise lowers it two steps. A Trait cannot be lowered below a d4. Multiple castings stack, though the caster must keep track of when each casting expires as usual.
► ''Additional Targets'': The power may affect an additional target for every additional Power Point spent, up to a maximum of five targets. All targets share the same effect and Trait affected.
|!Weapon|!Range|!Dmg|!RoF|!Cost|!Avail|!Wgt|!Min Str|!Notes|
|''Bow''|12/24/48|2D6|1|$25| C |4|D6| Griffin Only |
|''Bow, Compound''|15/30/60|2D6+1|1|$50| U |10| | AP 2; Griffin Only |
|''Crossbow''|15/30/60|2D6|1|$50| R |7|D6| AP 2; Reload 1 |
|''Crossbow, Advanced''|15/30/60|2D6|1|$100| R |7|D6| AP 2 |
|''[[Crossbow, hoof/wrist]]''|4/8/16|2D6-1|1|$50| C |2| | |
Originally designed as a commercial pick-me-up, users quickly found high
doses stimulated creative and cognitive thought. Of course, these high doses led to even longer mental short circuits, and the drug was carefully regulated before the Apocalypse. Brainburst is the ultimate
synaptic superjuice. The drug can be ingested (1d6 rounds to kick in) or injected for immediate results. The user undergoes a jolting brainstorm of logical and intuitive thought. One dose of Brainburst raises a
hero’s Smarts die type by 2 for 2d6 minutes, along with giving all Smarts-based skills a +2 modifier. Now for the bad news. When the drug wears off, the survivor’s Smarts and Smarts-based skill rolls are made at –4 for the next 2d6 hours.
''Requirements'': Novice, Spirit d6+
Those with this Edge have learned to master their fear. Or perhaps are so jaded or emotionally distant they’ve just lost their normal “fight or flight” responses. Either way, your hero adds +2 to Fear tests. If the character is in a setting that uses Guts as a Setting Rule, it adds to that as well.
''Requirements'': Novice, Str d8+
Frequent fights with his bare hooves have given this thug a powerful kick. When he hits a foe with a successful bare-hoofed Fighting roll, he adds +2 to his damage.
''Requirements'': Novice, Strength and Vigor d6+
Your bruiser is very large or perhaps just very fit. His bulk resists damage better than most and adds +1 to his Toughness. In addition, the character can carry more than most proportional to his Strength. He can carry 8 times his Strength in pounds without penalty instead of the usual 5 times his Strength
The breacher is a shortbarreled shotgun designed to be
mounted on the rail system found on many modern assault rifles. It must
be mounted under the main weapon’s barrel and has no stock or pistol grip,
so it cannot be fired when unmounted. The listed weight is added to that of the assault rifle. A weapon cannot mount both a breacher and a grenade launcher the same time.
Occasionally a character may want to break something, such as a weapon, a lock, or a door. Use the Toughness values below for these kinds of objects. Use these rules for solid objects. Larger objects with many components (such as vehicles) take multiple hits as per the vehicle rules.
Most anything can be broken given enough time and effort, so use this system only when attempting to break things in a hurry (such as during combat rounds).
The Parry of an inanimate object is 2. The catch is that damage rolls against them don’t count bonuses from raises on the attack roll, nor Aces. Unlike a person or even a vehicle, an attack cannot hit a “vital” area on a lock or a door and thus do more damage. If an attack can’t do enough damage to destroy an object, it can’t destroy it (at least not quickly). This keeps characters from shattering swords with a feather and a lucky Strength roll.
If the damage roll equals or exceeds the object’s Toughness, it’s broken, bent, shattered, or otherwise ruined. The GM decides the exact effects—such as whether a good strike opens a hole in a door or knocks it off its hinges.
See ''Obstacles'' to attack //through// objects.
► ''Damage Types'': After the type of Object and its Toughness is the type of damage that can affect it. Swords do cutting or piercing damage, spears are piercing weapons, and so on. Bullets are considered piercing weapons, though shotguns do blunt damage at close range for the purpose of this table. The type of damage is important for objects because shooting a single bullet through a door, for instance, may penetrate it, but won’t destroy it. Only a blunt or cutting attack is likely to destroy a door in one shot.
!!!Object Toughness
|!Object | !Toughness |!Damage Type |
|Light Door | 8 |Blunt, Cutting |
|Heavy Door | 10 |Blunt, Cutting |
|Lock | 8 |Blunt, Piercing |
|Handcuffs | 12 |Blunt, Piercing, Cutting |
|Knife, Sword | 10 |Blunt, Cutting |
|Rope | 4 |Cutting, Piercing |
|Small Shield | 8 |Blunt, Cutting |
|Medium Shield | 10 |Blunt, Cutting |
|Large Shield | 12 |Blunt, Cutting |
''Requirements'': Seasoned, Brawler
When the bruiser gets a raise on his bare-handed Fighting attack, he rolls a d8 instead of a d6.
???
!!Race Features
* //''Towering Stature'' - The most obvious physical trait of a Buffalo is its large size as they tower over most other races. Buffalo are Size +2, which also gives +2 to Toughness as well.//
* //''Goering Horn'' - A Buffalo's hard skull and horns are a natural weapon that deals Str+d6//
* //''Wisdom of the Elders'' - Buffalo have a strong oral history and pass their ancestral knowledge of spirits and the hunting grounds down with each generation. Even a Buffalo who has forgone the old ways has a rudimentary knowledge of such things and starts the game with a free D4 in Knowledge: Spirits.//
* //''Lumbering'' - To represent being a large target Buffalo subtract 1 from their parry score.//
!!“Limbs”
* ''Mouth''
* ''Forehooves'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Leg'': Gain the Lame Hindrance (or the Missing Leg Hindrance if already Lame). |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5-6 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li></ul> |
Characters who suffer minor but troubling injuries, such as stumbling down a slope or running through a cavern in the dark, can suffer from Fatigue rather than suffering actual wounds. This is the hazard to use when characters should be beat up a bit but not truly wounded.
When a character suffers injuries like these he must make a Vigor roll. Those who fail gain a Fatigue level from bumps, bruises, cuts, and scrapes. The Game Master may occasionally allow sure-footed characters to make Agility rolls to avoid this damage instead. Fatigue gained in this way can lead to Exhaustion, but not to being Incapacitated.
* ''Recovery'': Fatigue levels from Bumps and Bruises automatically improve one step 24 hours after the original injuries were suffered.
* ''Incapacitation Effects'': None. A victim cannot be Incapacitated from Bumps and Bruises.
<<<
''Example'': Two heroes race down a steep slope to escape the clutches of some angry crocodile cultists. The Game Master decides they trip and suffer Bumps and Bruises if they don’t make Agility rolls. The first succeeds but the second fails and suffers Fatigue for the next 24 hours.
<<<
''Rank'': Novice
''Power Points'': 3
''Range'': Smarts x 2
''Duration'': 3 (2/round)
''Trappings'': Dissolving into the earth and appearing elsewhere.
//Burrow// allows a mage standing on raw earth to meld into it. He can remain underground if he wants in a sort of “limbo” or //burrow// to anywhere with a Pace equal to the power’s Range. A mage with a Smarts of d8 could therefore move up to 16” (32 yards) on the first round, then maintain the spell and stay submerged for the second and move another 16”.
A //burrowing// earth mage can attempt to surprise a foe (even one who saw him burrow) by making an opposed Stealth versus Notice roll. If the mage wins, he gains +2 to attack and damage that round, or +4 with a raise. Targets on Hold may attempt to interrupt the attack as usual.
► Additional Targets: The power may affect an additional target for every additional Power Point spent, up to a maximum of five targets.
''Rank'': Novice
''Power Points'': 2
''Range'': Cone Template
''Duration'': Instant
''Trappings'': A shower of flames, light, or other energy.
//Burst// produces a large fan of energy that bathes its targets in red-hot fire or other damaging energy.
When cast, place the thin end of the Cone Template at the character’s front. Targets within the template may make Agility rolls versus the caster’s arcane skill roll to avoid the blaze. Those who fail suffer 2d10 damage. This counts as a Heavy Weapon.
Use the following modifiers and effects when characters wish to target specific locations:
* ''Limb'' (–2): An attack to a limb causes no additional damage but may ignore armor or have some other special effect (see the Disarm maneuver).
* ''Head or Vitals'' (–4): The attacker gains +4 damage from a successful attack to these critical areas. The target must actually have vital areas, and the attacker must know where they are to gain this advantage.
* ''Small Target'' (–4): Attacks against small targets such as the heart of a vampire or a missing scale on a large dragon’s chest are made at –4. The effect of success depends on the situation—the vampire might die instantly, the missing scale may mean the dragon gets no armor, etc. If the GM has no particular effect in mind, it adds +4 damage just like a shot to the head or vitals.
* ''Tiny Target'' (–6): Particularly small or narrow targets, such as the eye-slit of a knight’s helmet, carry a –6 modifier. The effects of a hit depend on the target. In the case of the knight, the blow ignores armor and inflicts +4 damage because it’s a head shot (as above).
''Arcane Skill'': Spellcraft (Smarts)
''Starting Powers'': Magic Trick + 1 other cantrip for each rank of Spellcraft you possess (you gain a new cantrip each time your Spellcraft is increased in rank)
!!!Special Rules
* ''No Power Points'': Casting cantrips requires no expenditure of Power Points.
* ''Intuitive Casting'': A failure on your Spellcraft roll to cast a cantrip has no effect other than that the cantrip does not activate.
* ''No Backlash'': There is no backlash effect if a Unicorn rolls a ‘1’ on their Spellcraft die while casting cantrips.
* ''Maintaining Powers'': You may choose to cancel any number of maintained cantrips as a free action.
* ''Cast Option'': Cantrips do not normally require a Spellcraft roll to cast successfully, but some can have Cast Options if you choose to roll as part of using the cantrip. However, any cantrips that you maintain inflict penalties as normal.
!!!No Power Points
Instead of using Power Points, characters with Fading Magic simply choose the cantrip they want to activate.
If the cantrips use their Cast Option, check the results below:
|!Success |The power activates as usual. |
|!Raise |A raise on the roll grants any additional bonuses to the power stated in its description. Armor, for example, grants a +4 bonus to Toughness with a raise. |
|!Failure |Unlike the Savage Worlds standard rules for No Power Points, the power just does not activate. |
► ''Maintaining Powers'': Characters can maintain cantrips as long as desired, but each cantrip maintained inflicts a –1 to cast any new powers.
► ''Interrupting Powers'': If a character with an activated power is Shaken or suffers a wound or Fatigue level, he must make a Smarts roll to maintain all his powers. If the roll is failed, all powers are instantly dropped.
► ''Power Preparation'': A caster may prepare a cantrip by concentrating for a round (no movement or other actions and avoid interruption, as described above). If successful, he ignores 2 points of penalties on all powers cast with his next action. If he does not enact any powers on his next action, the preparation is lost.
!!!Discreet Casting
Sometimes, you may wish to hide the fact that you are casting a cantrip from others around you. When you declare the cantrip you are casting, make a Stealth roll (the Game Master determines if those around you are Active or Inactive). If you are successful, you may then attempt to cast the spell with no one the wiser, even if you fail the Spellcraft roll. If you are unsuccessful, you may proceed with the Spellcraft roll but it will be obvious that you are casting a spell.
!!List of Cantrips
Below are all the cantrips available. These are treated the same as all other Powers in all regards, other than they do not require a Spellcraft roll to cast successfully unless you choose the Cast Option effect.
<ul>
<$list filter="[tag[Cantrips]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
Named for their Orange color and rounded cylindrical shape, these diet pills simulate the consumption of food, making a person feel fully fed after the ingestion of just one tablet. One dose allows a character to ignore all Fatigue penalties due to lack of food for 24 hours. After one week of continual use the drug’s beneficial effects are neglible for a week (when the drugs are finally out of the user’s system).
''Requirements'': Novice, Harrowed
The character gains +2 to his Notice rolls to spot visual clues, and ignores penalties for Dim and Dark lighting conditions.
''Requirements'': Novice, Agility d8+
You can walk silently when you want to, and almost always land on your hooves.
You gain a +1 to Stealth rolls when attempting to move silently, and you also gain a +2 bonus to Agility when trying to land safely and avoid damage after falling.
Some folks gather too much intelligence. This character personifies over-cautiousness. He never makes rash decisions and likes to plot things out in detail long before any action is taken.
''Requirements'': Novice, Arcane Background (Miracles), Spirit d8+, Strength d6+, Vigor d8+, Faith d6+, Fighting d8+
Champions are holy (or unholy) men and women chosen to fight for a particular deity or religion. Most are pious souls ready and willing to lay down their lives for a greater cause, but some may have been born into the role and follow their path with some reluctance.
Champions fight the forces of darkness (or good). They add +2 damage when attacking supernaturally evil (or good) creatures, and have +2 Toughness when suffering damage from supernaturally evil (or good) sources, including arcane powers and the weapons, claws, teeth, etc., of such creatures.
[[Character Sheet Template (Google Docs)|https://docs.google.com/spreadsheets/d/1ou--QUVKAmWwxk8eGIktIuUdNu_8pOM09D5sRZ_SxOY/edit?usp=sharing]]
The Attributes and Skills of a character, referred to as Traits, are defined by a die number. Every Attribute starts off as a d4, and every skill starts without any die, and the first point spent earns a d4. From there they progress to d6, d8, d10 and d12, only surpassing d12 through modifiers in special cases.
For the sake of reference, most rolls normal have the Target Number of 4. Player Characters and other important NPCs refered to as Wild Cards roll the requested Trait die, as well as a d6 referred to as Wild Die whenever an Attribute or Skill test is required, and pick the best of both. Rolling 1 in one or both of them can have negative consequences.
!!Creating a Character
# ''Pick a [[Race|Races]]'': You get all the benefits listed for that race.
# ''Assign your [[Attributes]]'': Normally each character gets 5 Attribute points to distribute. Each point increases the die to the next larger die. No attribute may be raised above d12.
# ''Select your [[Skills]]'': You are given 15 points to get and increase your Skills. Each Skill is linked to an Attribute. It costs 1 point per die to increase a skill up to the linked Attribute, and 2 points to increase it over that Attribute.
#* ''Example'': Fighting is linked to Agility. A character with a d8 Agility can buy Fighting for one point per die type to d8. Buying a d10 costs 2 points, and a d12 costs another 2 points.
# ''Pick [[Hindrances]] and [[Edges]]'':
#* ''Hindrances'' are negative or unhelpful characteristics your character might possess. A hindrance can be Minor, worth 1 point, or Major, worth two points. A character can only receive points from 1 Major and two Minor Hindrances. These points can be used to:
#** For 2 points:
#*** Increase an attribute.
#*** Buy an Edge.
#** For 1 point:
#*** Buy a skill point.
#*** Increase the starting money by 250$.
#* ''Edges'' are positive characteristics that add effects and new gameplay. Background Edges, including Arcane Backgrounds, typically can only be acquired on Character Creation, but the Marshall (GM) may allow it afterwards with a good enough justification.
# ''Calculate your [[Derived Statistics]]'': Charisma and Pace only tend to be modified by Edges, but Parry is based on the greater of the Fighting and Grace skills, and Toughness is based on Vigor plus any armor.
# ''Get your starting [[Gear]]'': Each hero normally starts with common clothes and 250$ worth of equipment.
List of Player Characters
<ul>
<$list filter="[tag[Player Character]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
<$list filter="[tag[Faction]]">List of {{!!title}} NPCs
<ul>
<$list filter="[tag{!!title}tag[Non-Player Character]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
</$list>
List of Independent NPCs
<ul>
<$list filter="[tag[Faction Independent]tag[Non-Player Character]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
Full List of Non-Player Characters
<ul>
<$list filter="[tag[Non-Player Character]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
''Requirements'': Novice, Spirit d8+
Your hero has learned how to work with others, even those who might be somewhat opposed to him or his efforts. This adds +2 to his Charisma.
''School'': Illusion
''Range'': Spirit
''Duration'': 1 minute per rank
''Trappings'': No obvious effect
You suddenly sound very reasonable and agreeable to the target. Choose a single creature that can see, hear, and understand you; gain a +1 bonus to your next Persuasion rolls to improve their attitude towards you.
''Cast Option'' (-1): After successfully casting this spell, make an opposed Spirit roll against the target. Instead of the Persuasion bonus, you gain a +1 bonus to Charisma when dealing with the target for the duration of the spell or +2 with a raise.
''Rank'': Novice
''Power Points'': 4
''Range'': Self
''Duration'': 1 minute (1/minute)
//Charm// makes the caster more appealing and attractive to others. It grants a witch a bonus of +1 Charisma. The power also allows her to use Persuasion to initiate a Test of Will opposed by her target’s Smarts.
With a raise, the Charisma bonus is increased to +2. Additionally, the witch can use her Persuasion to initiate a Test of Will against either a single target or everyone within a Large Burst Template. This is a double-edged sword though, as it applies to friend and foe alike.
The Vehicle Rules handle fast-paced action on the table-top. This is impractical for chases that take place over longer distances such as city streets or the open ocean, so use the Chase rules instead. It’s built for situations when the heroes must catch someone or something—or escape from it!
!!!Chase Length
First determine the length of the Chase:
* ''Standard'': Five rounds, used for most chases and usually simulates less than a minute of action per turn.
* ''Extended'': 10 rounds, used for long pursuits such as those that take place between ships, and may be measured in minutes, hours, or even days.
* ''Dogfight'': The “chase” is actually a battle with highly mobile participants. It ends only when one side or the other withdraws or accomplishes its objectives.
At the end of the last round, any prey who haven’t been otherwise stopped or captured escape and the pursuit ends.
!!!Chase Cards
Rather than dealing Action Card as usual, have everyone roll the appropriate “maneuvering Trait” as listed below:
*'' Agility'': Foot chase
* ''Boating'': Watercraft
* ''Driving'': Vehicular chase
* ''Piloting'': Air or spacecraft
* ''Riding'': Mounted animals
Participants draw a card for each success and raise on the maneuvering Trait roll, and keep one (usually the highest) as their Action Card. This determines not only their initiative but how well they managed to “maneuver” that particular round.
Characters who don’t score at least a single success remain in the chase but get no Action Card that round.
Making a maneuvering Trait roll does not count as an action.
► ''Advantage'': A character with a higher card than a foe is said to have “advantage” over him. This is abstract so it may mean the character is ahead, behind, or even parallel to his foe. The important thing is that he has somehow maneuvered in such a way as to gain a superior position, and can bring his weapons to bear (if he has any and is inclined to use them). See Attacks for further information on using the Advantage.
► ''Speed'': A character may add +2 to his roll if he or his vehicle has a higher top speed than the fastest opponent; or +4 if his top speed is twice as fast as his opponent’s. (Use Pace plus the character’s maximum possible running value if on foot or mounted.)
► ''Edges'': Level Headed and the Quick Edge don’t apply to maneuvering Trait rolls in Chases.
► ''Terrain'': If the Chase takes place primarily over difficult terrain, the GM should inflict a –2 penalty to all participants’ Trait rolls.
► ''Climb'': If an aircraft has a better Climb than his foe, he may also add +2 to the roll.
► ''Passengers'': Those riding in a vehicle have a choice. If they want to help the pilot or driver maneuver, and it makes sense in the context of the situation, they may make a cooperative maneuvering Trait roll. They draw no cards themselves but may add to the driver’s total as usual.
The GM must decide what makes sense here. A passenger in a car might help navigate and make a cooperative roll—but a second passenger probably could not. On a sailing ship, the crew could make a group cooperative Boating roll to help the captain’s total.
A passenger who makes a cooperative roll and wants to act would suffer the usual multi-action penalty. Passengers act on the driver’s Action Card.
!!!Attacks
Characters act on their Action Card as usual. Since distance is abstract, the value of their Action Card determines any penalties to the roll due to Range and whether or not a melee attack is possible (in chases where it’s even a possibility).
A character must have Advantage (an equal or higher Action Card) than his target to attack it. A character with an Action Card of 7, for example, can only attack targets with Action Cards of 7 or lower. A target with a higher card has outmaneuvered the attacker this round and cannot be targeted.
► ''Groups'': Extras roll as distinct groups and act on the same Action Card as usual. Divide each group’s attacks up proportionately among the opposition, losing attacks against heroes who have Advantage over them. For example, nine wolves act on Seven and there are five player characters, so each hero is assigned two wolves. Any heroes who have higher cards than the wolves aren’t attacked that round. (This keeps characters with low cards from getting attacked by every enemy in the chase.)
<<<
''comment'': Overwhelming evil is not always this nice
<<<
The opposite is not true. The player characters may always attack any foe or group of foes they have Advantage over.
► ''Force'': A driver with advantage may attempt to distract or even ram another vehicle in the chase as a normal action. The “trappings” may vary, but it is treated as an opposed maneuvering Trait roll modified by range. (Cooperative rolls may be allowed as usual.) On a success, the target suffers a –2 to his next maneuvering Trait roll. On a raise, the target is affected as if they hit an obstacle (see Complications).
► ''Shaken Characters'': If a character driving or piloting a vehicle is Shaken, he must make an Out of Control roll (see [[Vehicle Rules]] ). If the vehicle suffers damage, calculate it at half the vehicle’s Top Speed.
Characters who are Shaken at the start of a turn make their maneuvering Trait roll at –2. They attempt to become un-Shaken on their Action Card as usual.
!!!Complications
If a character’s Action Card is a Club, he faces some sort of Complication on his action. Check the Complications Table. Players who rolled high enough to get multiple cards may choose to take a lower card to avoid a Complication.
After the Complication is dealt with, the character may continue his action as usual—assuming he survived.
!!!Attack Range & Complications Tables
| !Card | !Range |!Complication Table |
| Two | Out of Range. The enemy is out of range or blocked and no attack is possible this round |''Disaster'': Make a Trait roll at –4. If the roll is failed, the character suffers a disaster of some sort—a car hits a solid obstacle at its top speed, a runner falls off a ledge, etc. Where this isn’t possible, the runner gives out, the vehicle stops, etc. In any event, this participant is out of the chase. |
| 3-10 | Long Range (–4) |''Major Obstacle'': Objects of some sort get in the way. Make a Trait roll at –2 to avoid them or suffer damage appropriate to half top speed if in a vehicle, or a Fatigue level (See [[Bumps and Bruises]]) if on foot. |
| Jack—Queen | Medium Range (–2) |''Minor Obstacle'': Objects of some sort get in the way. Make a Trait roll to avoid them or suffer damage appropriate to half top speed if in a vehicle, or a Fatigue level (Bumps and Bruises) if on foot. |
| King—Joker | Short (no penalty), and melee attacks are possible |''Distraction'': Something obscures the character’s vision or path. He cannot attack this round. |
''Requirements'': Heroic, Harrowed
They say the grave is damp and cold, and this Harrowed has mastered the ability to radiate that chill from the Hunting Grounds through his body, lowering the temperature around him noticeably.
The deader makes a Spirit roll to use this power, dropping the temperature 10°F within a Large Burst Template centered on the Harrowed. Anyone inside the template must make a Spirit check or become unnerved, essentially suffering Fatigue. A 1 on the Spirit roll means the victim panics.
The chill lasts a number of rounds equal to half the Harrowed’s Spirit die type. This causes the Harrowed a level of Fatigue that is naturally recovered in one hour. He cannot use this ability if Exhausted.
''Requirements'': Heroic, Arcane Background (Templar), Blessing of the Saints
When the Templar spends a Benny to reroll, he adds +1d6 to the result. This die can ace.
|!Bikes|<|<|<|<|<|<|
|!Vehicle|!Acc/TS|!Engine|!Toughness|!Crew|!Cost|!Avail|
|''Dirt Bike''| 15/22 | 250cc | 8(2) | 1+1 | $1,000 | U |
| | //''Notes:'' Light Weight, 2 wheels, +4 tough. vs Jump// |<|<|<|<|<|
|''Hover Bike''| 25/53 | Turbine | 8(2) | 1+1 | $4,000 | S |
| | //''Notes:'' Fuel Efficient, Hover, No wheels// |<|<|<|<|<|
|''Street Bike''| 20/45 | 750cc | 8(2) | 1+1 | $2,000 | U |
| | //''Notes:'' Fuel Efficient, 2 Wheels// |<|<|<|<|<|
|!Cars/Trucks/Vans|<|<|<|<|<|<|
|!Vehicle|!Acc/TS|!Engine|!Toughness|!Crew|!Cost|!Avail|
|''Economy Car''| 10/34 | V-4 | 9(2) | 1+3 | $2,000 | U |
| | //''Notes:'' Light Weight// |<|<|<|<|<|
|''Jeep''| 12/34 | V-6 | 12(2) | 1+3 | $4,000 | U |
| | //''Notes:'' Four Wheel Drive// |<|<|<|<|<|
|''Luxury Car''| 12/45 | V-8 | 11(3) | 1+4 | $5,000 | R |
| | //''Notes:'' // |<|<|<|<|<|
|''Muscle Car''| 20/45 | V-6 | 11(3) | 1+3 | $3,000 | R |
| | //''Notes:'' // |<|<|<|<|<|
|''Pickup, mid sized''| 12/34 | V-6 | 11(2) | 1+2(8) | $5,000 | S |
| | //''Notes:'' // |<|<|<|<|<|
|''Pickup, full sized''| 12/34 | V-6 | 12(2) | 1+2(10) | $7,500 | R |
| | //''Notes:'' Fuel Hog// |<|<|<|<|<|
|''Sedan''| 12/34 | V-4 | 11(3) | 1+4 | $3,000 | U |
| | //''Notes:'' // |<|<|<|<|<|
|''Sports Car''| 30/68 | V-8 | 10(2) | 1+1 | $5,000 | VR |
| | //''Notes:'' Fuel Hog, Includes supercharger// |<|<|<|<|<|
|''SUV''| 15/34 | V-6 | 14(3) | 1+4 | $5,000 | R |
| | //''Notes:'' Fuel Hog, Four Wheel Drive// |<|<|<|<|<|
|''Station Wagon''| 12/34 | V-4 | 11(3) | 1+4 | $3,500 | U |
| | //''Notes:'' // |<|<|<|<|<|
|''Van''| 12/34 | V-6 | 12(3) | 1+7 | $5,000 | S |
| | //''Notes:'' Fuel Hog// |<|<|<|<|<|
|!Large Vehicles|<|<|<|<|<|<|
|!Vehicle|!Acc/TS|!Engine|!Toughness|!Crew|!Cost|!Avail|
|''Bus''| 10/34 | V-6 | 14(3) | 1+29 | VR | $12,500 |
| | //''Notes:'' Gas Guzzler, 4-8 wheels// |<|<|<|<|<|
|''Tractor Trailer''| 8/34 | V-6 | 16(3) | 1+2 | R | $15,000 |
| | //''Notes:'' Gas Guzzler, 8 wheels, Trailer// |<|<|<|<|<|
|!Trailers|!Toughness|!Passengers|!Cost|!Avail|
|''Box Trailer''| 14(2) | 40(+20) | $3,000 | S |
|''Tanker''| 14(2) | 0(+8) | $10,000 | R |
''Requirements'': Novice, Harrowed
The hero gains sharp claws that cause Str+d6 damage in combat. The claws may be extended or retracted at will.
You must have wings to take this Hindrance. Either through some accident or since birth you have been unable to fly.
Your wings may be crippled or atrophied, and while they can move and flap, you are incapable of sustained flight. You cannot fly but you may still use your wings to steady yourself when falling.
|!Cloths|!Cost|!Wgt|!Avail|
|''Boots''|$100| 3 | U |
|''Cowboy Hat''|$50| | U |
|''Duster''|$100| 5 | R |
|''Goggles''|$10| | C |
|''Jacket''|$50| 2 | C |
|''Jacket'' (Leather)|$200| 3 | U |
|''Horse Shoes''|$25| | C |
|''Shirt''|$25| | U |
|''Shirt'' (handmade)|$10| | C |
|''Sun Glasses''|$10| | U |
Your hero isn’t as aware of his world as most others. He suffers –2 to Common Knowledge rolls.
Honor is very important to your character. He keeps his word, won’t abuse or kill prisoners, and generally tries to operate within his world’s particular notion of proper gentlemanly or ladylike behavior.
Trudging through deep snow for hours on end, or facing biting, bitter winds, can dehydrate and fatigue a character as quickly as blazing deserts. Every four hours spent in weather below freezing (32° F), a character must make a Vigor roll. Failure means the victim gains a Fatigue level. Subtract 1 from the victim’s Vigor roll for every 20 degrees below freezing to a maximum of –3.
The roll assumes the character is wearing warm clothing. If not, subtract 2 from the total. Modern winter gear adds +2, and advanced gear (arctic suits) add at least +4 or more depending on the setting.
* ''Recovery'': Warmth and shelter from the elements allows a hero to recover a Fatigue level every 30 minutes.
* ''Incapacitation Effects'': Make a Vigor roll every hour or perish.
Collisions are very deadly in Savage Worlds. The damage to the vehicle and its passengers is 1d6 for every 5” of its current speed (round normally). If a motorcycle moving at 16” per turn hits a tree, for instance, it suffers 3d6 damage, as does its rider and anything it rams into.
► ''Relative Speeds'': Increase the damage if a vehicle hits another object moving toward it. This is called “relative speed.” If two tanks ram into each other at a speed of 12, for instance, their relative speed is actually 24 and each tank suffers 4d6 damage. Similarly, a vehicle moving away from an attacker subtracts its speed from the ramming vehicle’s.
► ''Vehicular Armor'': Vehicles with Heavy Armor add their Armor rating as an AP value to their damage.
► ''Safety Harnesses'': A seat belt protects anyone wearing it. Roll half the normal damage dice (round down) for these characters. Do the same for air bags, but subtract one additional die of damage as well.
► ''Soft Obstacles'': The collision rules assume the vehicle has hit something hard, like another vehicle, rock, wall, and so on. If the obstacle was soft, like a person, the damage is halved for the vehicle. The person takes damage normally, of course.
► ''Falling or Jumping From Vehicles'': Characters who fall from a moving vehicle suffer damage just as if they were in a collision. Characters who jump and make an Agility roll suffer half the usual damage dice (round down). If a character jumps out of a boat, treat this as nonlethal damage.
!!!Losing Control
Failing a Driving roll causes a vehicle to go “out of control.” When this happens, roll 2d6 on the Out of Control Table. Resolve any additional movement (such as slips or flips) immediately. Anything in the way gets smashed—check out the collision rules above if that happens.
!!!Out of Control Table
| !2d6 |!Effect |
| 2 |''Roll Over'': The vehicle performs a Slip and rolls over 1d6 times in that direction. Roll collision damage for the vehicle and everyone inside. Any exterior-mounted weapons or accessories are ruined. |
| 3–4 |''Spin'': Move the vehicle 1d6” in the direction of the maneuver, or 1d6” away from a damaging blow. Roll a d12, read it like a clock facing, and point the vehicle in that direction. |
| 5-9 |''Skid'': Move the vehicle 1d4” left or right (in the direction of a failed maneuver, or away from a damaging attack). |
| 10–11 |''Slip'': Move the vehicle 1d6” left or right (in the direction of a failed maneuver, or away from a damaging attack). |
| 12 |''Flip'': The vehicle flips end over end 1d4 times. Move it forward that many increments of its own length. Roll collision damage for the vehicle, its passengers, and anything it hits. Slow and heavy vehicles such as tanks (GM’s discretion) don’t flip but suffer a Slip or Skid instead. |
The very name says it all—whether they are the bloodsoaked plains of Mars or the corpse-strewn battlefields of the far future—these are Savage Worlds and there will be violence.
► ''Distance'': Because the game assumes you are using terrain or a battle-mat and standard 28mm miniatures //(because who cares about everyone else)//, movement and weapon ranges are listed in inches. If you need to translate that to regular distance, each inch is equal to 2 yards.
If the GM needs a different scale to accommodate a larger battle, such as a long-range firefight between tank platoons, simply divide weapon and movement ranges as needed.
► ''Time'': When a fight breaks out, game time breaks down into rounds of six seconds each. Ten rounds, then, is one minute.
!!Using Allies
Allied Extras are divided up among all the players to control. This is a very important part of Savage Worlds because our settings often feature allied bands of skilled hirelings, fellow grunts, or loyal retainers, and the game is designed to handle them quickly and easily. It’s also designed for the players to control them—not the Game Master.
It doesn’t matter whether or not the characters control the allies, only that the players do. This keeps everyone involved in the action even if his hero is out of the fight, and makes running large combats much easier and fun for everyone. Of course the GM can always take charge of Extras when the need arises, but with good roleplayers, this should rarely be necessary. Just don't treat allies as suicidal meat shields.
!!List of Combat Rules
*[[Initiative]]
*[[Movement]]
*[[Actions]]
*[[Attacks]]
*[[Damage]]
*[[Damage Effects]]
*[[Situational Combat Rules]]
**[[Aim]]
**[[Area Effect Attacks]]
**[[Automatic Fire]]
**[[Breaking Things]]
**[[Called Shots]]
**[[Defend]]
**[[Disarm]]
**[[Double Taps and Three Round Bursts]]
**[[The Drop]]
**[[Finishing Move]]
**[[Firing into Melee]]
**[[Full Defense]]
**[[Ganging Up]]
**[[Grappling]]
**[[Improvised Weapons]]
**[[Innocent Bystanders]]
**[[Mounted Combat]]
**[[Nonlethal Damage]]
**[[Obstacles]]
**[[Off-Hand Attacks]]
**[[Prone]]
**[[Push]]
**[[Ranged Weapons in Close Combat]]
**[[Rapid Attack]]
**[[Tests of Will]]
**[[Touch Attack]]
**[[Tricks]]
**[[Two Weapons]]
**[[Unarmed Defender]]
**[[Unstable Platform]]
**[[Wild Attack]]
**[[Withdrawing from Close Combat]]
''Requirements'': Seasoned
Your adventurer recovers quickly from shock and trauma. He adds +2 to his Spirit roll when attempting to recover from being Shaken.
Combat shocks are designed to stabilize moving vehicles, allowing passengers to fire weapons with better accuracy The vehicle’s axles are cut in half and reconnected through a joint, which allows the individual wheels to compensate more easily for uneven terrain While this doesn’t do much for the chassis—the underside of the vehicle still gets beaten up during off-road driving—it reduces the unstable platform penalty by one when passengers fire weapons from a moving vehicle
For whatever reason, your hero turned his back on General Flock’s private army and ran. Lucky for him, that nasty chip they put in his head for exactly that reason didn’t explode. Even luckier, it still seems to work well enough to let him use Combine weapons and equipment (if he can get his hands on them).
So far, this doesn’t seem so bad, right? Well, it’s not all roses being a former Black Hat. Carting a Combine weapon around a survivor settlement is likely to spark some uncomfortable questions. Most folks know Denmare booby-traps its toys and are likely to wonder how your former cretin is able to use them without triggering the explosives.
Flock's goons aren’t particularly thrilled to see other wasters with their equipment either. Since they tend to shoot or at least enslave everyone they meet anyway, this doesn’t really change things all that much.
Finally, your hero’s chip is on the fritz, but there’s always a chance it reactivates. Anytime your character faces the Combine (including automatons) and the Denver forces are dealt a Joker, your scav’s chip might trigger. She must make a Smarts roll, or a Smarts roll at –2 if the opposing side has a Red Hat. If you fail the roll, pop goes the chip! Not only does the targeted explosive kill your reformed scav, it makes sure he’s not coming back Harrowed.
Hasta la never, pal.
''Requirements'': Novice, Smarts d6+
Command is the ability to give clear instructions to surrounding allies and enforce your hero’s will upon them. This makes your character’s compatriots more willing to fight on despite their wounds, and so adds +1 to their Spirit rolls to recover from being Shaken.
''Requirements'': Novice, Command
A booming voice, effective commands, natural charisma, or simple training results in a much more effective combat element. At the center of that element is the officer in command. A hero with this Edge has a “command radius” of 10” instead of the usual 5”.
''Requirements'': Wild Card, Novice, Spirit d8+
This Edge signifies a special link between close companions—such as a typical party. It doesn’t matter whether or not the characters get along perfectly or not, they’ve just formed a close and common bond during their epic adventures.
A character with this Edge may freely give his Bennies to any other Wild Card he can communicate with. This represents the character giving his verbal or spiritual support to the ally. The player should say what his character is doing to give the support. The gesture could be as complex as a rousing speech, or as simple as a knowing nod.
''Rank'': Novice
''Power Points'': 1
''Range'': Smarts x 2
''Duration'': Instant
''Trappings'': Hypnotic lights, brief illusions, loud noises. Instilling confusion in enemies is a powerful aid in combat, and this power provides that ability. On a success, a target must make a Smarts roll at –2 or be Shaken, and on a raise, the roll is made at –4.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
''Requirements'': Novice
Whether it’s to the Feds, the cops, the Mob, or some big corporation, your heroine knows someone on the inside—someone who is willing to lend her a hand on occasion (usually once per game session).
This Edge may be taken more than once, but each time must be applied to a different organization. The GM should also ensure the organization is limited to a single, unique organization. A hero may, for instance, have Connections (US Army), but he shouldn’t have a blanket Connections (Military).
To use a character’s Connections requires that she first get in touch with one of her contacts. This requires a Streetwise roll. Failure means the particular contact wasn’t available, their cell phone wasn’t on, or they were otherwise tied up.
Once in contact, the hero must make a Persuasion roll. The GM should feel free to modify both the Persuasion roll and any results based on the circumstances. A failure indicates the heroine’s contacts just couldn’t come through this time, or perhaps just weren’t persuaded that their help was really necessary.
On a success, the contact might share information, but won’t do anything too risky to help. On a raise, the contact is willing to leak sensitive information, but stops short of outright betrayal.
Two or more raises means the heroine has pushed the right buttons and can count on serious help. The Connection will risk serious consequences for the heroine, and if she needs financial assistance, may provide more than he’s comfortable with. If the heroine asks for muscle, the contact delivers either one expert (a safe-cracker, wheel-man, security expert, etc.) or five average fighter-types for the contact’s particular organization (a mob boss sends five thugs, the Army sends five infantrymen, etc.).
''Requirements'': Seasoned, Unicorn, Spellcraft d8+
At the beginning of each game session, you may choose one cantrip or Novice-rank spell to be your ‘Contingency spell’.
Until the end of the game session, you may spend a Benny in order to immediately try to cast the spell as a Free Action on your turn or as an immediate response to any action (resolve the spell before the action takes place). You can only use the Contingency ability once per game session, whether or not you are successful in casting it.
<<<
''comments:'' Does this include attuned powers or is it just cantrips? Does that mean the Power Points must be spent beforehand or hanged until the pony decides to use it or forfeit it?
<<<
''Requirements'': Novice, Agility d8+, Grace d6+
Your hero is skillful when using multiple limbs. Characters normally suffer a –2 penalty when performing physical tasks with off-limbs. With this Edge, your warrior ignores up to a –2 penalty for using an off-limb (see [[Combat]]).
<<<
''comment'': Increased requirement because of Improved Coordination. Made it a Combat Edge instead of Background.
<<<
''Requirements'': Seasoned, Fighting d8+
Fighters with this Edge know how to respond instantly to an enemy’s mistakes. Once per round (if not Shaken), the character receives one free Fighting attack against one adjacent foe who failed a Fighting attack against him. This attack is made at –2, and the Counterattack must be a normal attack (no Disarm, Wild Attack, or other maneuvers), and may not be combined with Frenzy or Sweep. It may be used with the Defend maneuver, but not Full Defense.
The wastelands have a whole lot of nasties lurking around—Hell, your caballo might even be one of them! Most of these creatures have at least a spark of supernatural energy in them, and the most powerful have a whole lot. A hero who’s been around a while might discover how to absorb the essences of the more powerful creatures when they expire.
This is called “counting coup” and results in your character gaining some strange new ability. Before the Apocalypse, only Harrowed could count coup, but now anyone near the fiend as its essence “bleeds” off can do so.
The Marshal has full details on how this is done. Just make sure your waster isn’t too far away when a really wicked beast goes down. He might just walk away from the event with a little extra juice he can use when he runs into the //next// horror.
A hoof/wrist crossbow is a small metal crossbow mounted on a leather or metal bracer. Its short range limits its effectiveness, but it is popular with some wasters—particularly raiders—because it does not require an action to ready it. Like a pistol, it can be fired while in melee combat, and the TN for the Shooting roll is the target’s Parry. It can be fired with a single hand (the one wearing it), but takes an action and both hands to reload it.
''Requirements'': Novice, Harrowed
Your deader is faster, stronger, or just all around better than other zombies. That’s because at some point before the Last War began, some government or agency decided to slap cybernetic limbs, metal plates, or computer parts onto or into the soldier’s rotting hide.
!!Playing a Cyborg
The first thing about being a cyborg is that your hero has to be dead—or more accurately undead. Nearly all cyborgs were created by a government agency or military unit. The two largest groups of these deaders were the US Army’s Cy-SOG??? (Cybernetic Special Operations Group) and the Confederate CEAL??? Teams (Cybernetically Enhanced Arcane Lifeform), but many other nations had their own equivalents. The Texas Rangers and Agency had cans on staff for the toughest missions.
''All cyborg characters must be Harrowed in addition to taking the Cyborg Edge. However, the Cyborg Edge does count as the free Edge a character receives when choosing to make a Harrowed.'' In fact, we recommend that’s what you spend that free Edge on for reasons you’ll see very shortly!
Also, the technology required to create cans is largely lost to the sands of time, or more accurately, the blasts of nuclear and ghost rock bombs, so if you want to take the Cyborg Edge after character creation, you need to talk to your Marshal to work out an explanation for exactly how that transformation comes about.
All cyborgs have certain abilities in common. In addition, the normal rules that apply to Harrowed also apply to tin cans, with a few modifications which we’ll go into below.
!!!Flesh and Bone... and Metal
Cyborgs are complicated creations, and keeping them functional is a challenge all in itself. Fortunately, by the time cans were in fairly common usage, their creators had figured this out as well. All cyborgs come equipped with a Self Repair Unit (or SRU) that allows them to make natural healing rolls normally... well, sort of.
A cyborg, like a Harrowed, must consume roughly a pound of meat, but a can also needs access to manufactured materials as well. ''For each natural healing roll, a cyborg must also have a number of Components (see [[Junkers|Arcane Background(Junker)]] in Hell on Earth Reloaded) equal to its wound level to attempt the roll''. For example, a tin can with two wounds needs two Components to attempt a healing roll. The Components are expended regardless of whether the cyborg succeeds on the healing roll.
Even administering medical care to a can is more complicated. ''Each type of cyborg lists a skill used to remove damage (either Healing or Repair), but if the character using the skill does not have the other skill at the same die type or higher, they suffer a –2 penalty to their roll.'' If they do not have the skill at all, they suffer a –4 penalty. Use of the healing power also suffers a –2 penalty on cyborgs; the greater healing power suffers no additional penalty when used on a cyborg.
!!!Spirit Fetter
The spirit fetter maintains all of the cyborg’s systems by pulling power from its manitou. The amount of energy the manitou provides is based on its Spirit die type. ''A deader can never take more Cyborg Edges than his manitou’s Spirit die (ten Edges for a d10 Spirit manitou). A manitou always has a Spirit die type one greater than the Harrowed it inhabits.''
''One of the downsides of the spirit fetter is that it prevents the manitou from manifesting other Harrowed Edges''. Since most cyborgs were created on the operating table, the tin can never even gets the chance to learn any Harrowed Edges. A deader who somehow later becomes one may have the Edges, but with his manitou shackled by the spirit fetter, he loses access to them.
!!!Artificial Intelligence
Each cyborg has an integral AI embedded in it. Pretty quickly, The Powers That Be (or more accurately, The Powers That Were) figured out that putting a bunch of things that go boom on a walking corpse animated by a demon driven to wreak havoc was in the same category as putting lasers on sharks’ heads. The potential for disaster was quite a bit better than the chances of winning the lottery, is what we’re saying.
A cyborg’s AI has the primary job of monitoring the spirit fetter and keeping the manitou from gaining control of the deader. ''A cyborg with a functional AI gains a +4 bonus to Dominion rolls.''
Governments and militaries being governments and militaries, they also installed primary mission directives in each cyborg. After all, there’s really not much difference between a manitou-controlled undead killing machine armed with a rocket launcher and a regular undead killing machine armed with a rocket launcher that really just doesn’t like you when you get down to end results.
AIs are installed with a number of primary mission directives depending on their type. Unfortunately, since it’s been nearly two decades since any can has had a system overhaul, the AIs aren’t as effective as they once were, and each deader has figured out bugs in its computerized backseat driver. As a result, a cyborg can resist its directives by bypassing the AI. ''However, a cyborg who bypasses his AI is open to an immediate Dominion roll by their manitou—without the bonus provided by their AI.''
!!!Rest
Like other Harrowed, cyborgs don’t need much sleep, but the complicated programs running their various gadgetry do require time for periodic defragmenting and self-diagnostics. ''Every 24 hours, a can must power down for 1d6 hours to allow the AI to accomplish these tasks.'' During this time, the AI is monitoring the environment, meaning the cyborg is just as capable of “waking up” as non-metal heads.
If a cyborg opts to not power down, she accumulates a Fatigue level for each day she goes without this maintenance period. This represents her motor control getting sloppy, response times dropping, and so on. These Fatigue levels are recovered at a rate of one per extra hour of downtime. Although she can reach Incapacitation from this type of Fatigue, it actually represents the AI triggering an override and shutting her down for the necessary housekeeping.
!!Building Your Tin Can
The first step in creating your cyborg is to choose a model. Cans come in two models: light or heavy. The type of model you choose determines your cyborg’s base abilities and how many Cyborg Edges he begins play with, but also the number of Directives that have been placed on him. All metal heads can purchase additional Cyborg Edges either with Hindrance Points at creation or through Advances.
Regardless of the frame you pick, all cyborgs come with the abilities noted above, an encrypted radio transceiver, and linked camera. Tin cans also come equipped with GPS systems, but the satellite transmitters have long since been destroyed, worn out, or gone out of synchronization, making the device worse than useless.
The details of each can are explained below.
!!!Light Cans
Light cans were used as scouts and occasionally infiltrators. Some even saw duty with secret civilian services, like the Agency or Texas Rangers???. They don’t pack near the armor or weaponry that the heavier models do, but they can move faster and more stealthily, making them ideal for work behind enemy lines. Depending on their enhancements and clothing, a light cyborg can even pass for a human, at least at a glance.
''The internal structural enhancement grants a light model cyborg +1 Toughness. It also receives +1 die type to Strength. Finally, a light cyborg can choose two Cyborg Edges at character creation.''
Since light cans were usually given missions that required more flexibility and decision-making, their AIs did not have as heavy restrictions placed on them. ''Choose one Directive, in addition to the core Directive, that applies to your cyborg.''
!!!Heavy Cans
These bruisers were assigned to the toughest knock-down, drag-out missions: front-line duty, assaulting fortifications, fighting enemy armored vehicles, and the like. They’re obviously unholy hybrids of man and machine, put together for the sole purposes of making other things blow up and/or die... badly.
There is simply no mistaking one of these cans for a normal human. ''In fact, their appearance is so unsettling, they receive a –4 penalty to Charisma instead of the usual –2, However, this penalty does not apply to Intimidation checks.'' In that case, it is instead a bonus. Big, scary, and undead sometimes works in your favor!
''All heavy cans have +1 Toughness and +2 Strength die types. A heavy cyborg receives Size +1 and Armor 2. However, all that bulk comes at a penalty to movement. Heavy models have a Pace of 4 and a d4 running die.'' It costs two Advances to raise Agility during play, although there is no penalty to purchasing it during character creation.
''Heavy cans choose a whopping four Cyborg Edges at creation, but must also choose three Directives in addition to the core Directive.'' No commanding officer was comfortable with one of these monsters around without a pretty tight leash on it!
!!Directives
All AIs are programmed to obey the orders of a superior officer in their military’s command structure. Likewise, those cans attached to civilian organizations, like the Rangers or Agency, are hard-wired to obey superiors in their own institutions. Now, word of mouth isn’t enough to invoke this Directive. The individual claiming that authority must either be known to the cyborg or possess the proper uniform or credentials.
On top of the core Directive, each can has one or more additional Directives depending on the type of model. These were usually tied to the last mission (or missions) the cyborg was assigned when everything fell apart. When you build your metal head, choose one or more of the following as detailed in the description of your character’s model.
!!!List of Directives
* ''Confirmation'': Your deader must be able to clearly see his target and confirm it is hostile before engaging. The Marshal has final say, but this may require a Notice roll modified for light, cover, and so on.
* ''Danger Close'': To protect the…softer members of your unit, you can’t fire a ranged weapon at a target within 2” (twelve feet) of a friendly character.
* ''Expendable'': Your cyborg was part of a decoy force meant to distract the enemy and draw fire. Once combat starts, your can tries to draw as much attention to itself as possible and never uses cover.
* ''Hearts & Minds'': Your can was involved in humanitarian and civilian affairs missions to win over a local population. You can’t ignore a request for aid from a civilian unless it conflicts with another Directive.
* ''Martial Law'': Your brainer was performing police duties. You must uphold the law, and all offenders must be turned over to the nearest peace officer— who is usually not anywhere nearby. Criminals guilty of capital crimes, including murder, rape, and looting, are to be executed on the spot.
* ''No Prisoners'': Your metal head was part of an advance or deep recon unit. You never accept surrender of an enemy and can never take prisoners. Others in your group may, but you do not assist either in capture or guarding duties.
* ''Raider'': Your cyborg was involved in extended raids behind enemy lines and to be constantly on the move to avoid capture. You can’t possess more than you can carry and never stay in any one place more than two nights in a row.
* ''Search and Destroy'': Your can was tasked with interrupting the enemy supply chain. You must destroy, disable, or render unusable any vehicles and heavy weapons in use by or belonging to opposing forces. This includes equipment either marked accordingly or in use by enemy personnel.
* ''Security'': Your deader was assigned to a security detail. You cannot allow anyone to loot, damage, steal, or destroy any equipment belonging to your former organization. If the Marshal agrees, your AI can extend this to include your posse as well.
* ''Still at War'': Your can never got word that hostilities had effectively ended. You must engage any members of the opposing alliance, although you’re not required to blindly charge them. This includes anyone wearing the uniform or using armored vehicles of that alliance as well. Supply channels got a little spotty there toward the end, so hand??? weapons do not trigger this Directive.
!!Cyborg Edges
Taking these after character creation requires an explanation as to how they were gained (and may require monetary or equipment expenditures).
!!!List of Cyborg Edges
<ul>
<$list filter="[tag[Edges]tag[Background:Cyborg]!tag[Arcane Background]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!History
We’re not talking about any waster who has an artificial arm or leg grafted on by the sawbones in Junkyard. Those cheap hackwork limbs are really just fancy stand-ins for what some unlucky sap’s parents gave him for his inaugural birthday presents.
When we say cyborg, we mean specifically a military-grade combination of man and machine created for the sole purpose of waging war more effectively, whether that be by subterfuge or just shooting more and/or bigger bullets than the poor, original-manufacturer’s equipment human on the other side of no man’s land.
The term cyborg is a little misleading. It derives from the words cybernetic organism, but calling the meat part of a cyborg an organism is stretching its definition to the breaking point. You see, for a couple of reasons, all cyborgs in the Wasted West are undead.
First, the more powerful the cybernetic device, the more sheer power it requires. Even with all the fancy power systems that mad and patent science cranked out over the last two centuries, no one
managed to come up with a basically self-renewing source of energy that generated enough output to run military-grade cybernetics indefinitely. And believe us, the last thing you want to have to worry about when you’re operating behind enemy lines is if you brought the right kind of power adapter for whatever weird outlets that country uses.
Second, popular television shows from the last century aside, the human body on its own just isn’t capable of withstanding the stresses a powerful cybernetic device can put on it. Early attempts to enhance soldiers with cybernetic attachments met with disastrous results. Sure, a cybernetic arm might be constructed to be far stronger than a normal human’s, but the shoulder it’s attached to is still flesh and bone. Try to lift a car engine with one and you’re more likely to install a bloody aftermarket cybernetic arm on
the engine than you are to raise it off the ground.
Attempts to reinforce the skeletal system to the point it could handle the burden imposed by high-end cybernetics likewise met with failure. It turns out there’s a limit to how much you can cut and paste into a human body before it finally says, “I’m done.” And, yes, various militaries found this out the hard way, too.
Ironically in the end, one problem led to the solution of the other.
!!!Pimp My Corpse
Researchers for a secret branch of the US??? government known simply as “the Agency” built on work Hellstromme Industries??? had done with ghost rock reactors to create a device that could convert spiritual energy into a more usable form. While there are some similarities to the spirit batteries used by junkers, the Agency’s method instead tapped into manitous to draw power directly from the Hunting Grounds.
Of course, the rub to this plan was getting hold of a manitou in the first place.
In an event that was as ironic as it was synchronistic, one of the original volunteers for cybernetic enhancement died during surgery. He didn’t stay dead long though, as a manitou latched onto his corpse, making him a Harrowed. No doubt, it was planning the usual mischief those deaders get up to, but it was in for a big surprise.
The scientists performing the operation realized they had just been given the solution to both their problems. Working quickly, they slapped one of the new experimental devices—called a spirit fetter—onto their subject. The manitou, already bound to the Harrowed by its own choice, could do nothing but rage and watch.
Even better, at least from the researchers’ position, the volunteer’s newly undead body was now able to survive virtually any amount of invasive surgery. There was no worry about infection or rejection of the implants either. They could modify and enhance the walking corpse to their hearts’ content.
Between politics, loose lips, and old-fashioned espionage, it wasn’t too long before the technology spread to other countries. The fact that Harrowed, by virtue of being dead, often had no legal rights made the prospect especially appealing to many governments. In effect, they were expensive but completely expendable pieces of equipment as far as the law was concerned.
By the beginning of the Last War, every major military on the planet fielded at least some cyborgs, which were known in the ranks as tin cans, or more concisely, just “cans.” Many had battalions of them. And since cyborgs are undead and enhanced with advanced military technology powered by an effectively eternal energy source, it’s really no shocker there are still quite a few roaming the Wasted West.
After a successful close combat or ranged hit, the attacker rolls damage. Ranged weapons do fixed damage as listed in the Gear section. Most pistols, for example, cause 2d6 damage.
Hand weapons cause damage equal to the attacker’s Strength die plus a second die, which depends on the weapon. A barbarian with a d12 Strength and a long sword (d8 damage) rolls d12+d8 damage. Even though Strength is used to determine melee damage, this isn’t a Trait roll. Wild Cards don’t add a Wild Die to the roll and they can’t spend Bennies if they’re unhappy with the results.
All damage rolls can Ace.
► ''Unarmed Combat Damage'': An unarmed combatant rolls only his Strength die.
► ''Bonus Damage'': Well-placed attacks are more likely to hit vital areas, and so do more damage. If your hero gets a raise on his attack roll (regardless of how many raises), he adds +1d6 to the final total. This roll may also Ace!
!!!Applying Damage
The damage of an attack is compared to the victim’s Toughness just like a Trait roll (though it isn’t one so you can’t spend a Benny on it). With a success, the victim is Shaken.
For each raise over his Toughness he suffers a wound as well, as shown below:
* ''Success'': The character is Shaken. If he was already Shaken, he suffers a wound and remains Shaken. To cause a wound, the latter Shaken result must come from a physical attack of some kind—not a Test of Wills or other maneuver.
* ''Raise'': The character suffers a wound for every raise on the damage roll, and is Shaken. (When wounds are caused, it doesn’t matter if the victim was already Shaken beforehand.)
<<<
''Example'': A barbarian hits an ogre with a Toughness of 11. The barbarian’s friend, a rogue, has already taunted the beast (a Test of Wills) and Shaken it.
If the barbarian’s damage is 11-14, that’s a success and would normally Shake the ogre. Since it’s already Shaken, he suffers a wound and remains Shaken.
If the barbarian’s damage is 15+—a raise or more— he’d simply cause wounds. The ogre is already Shaken, and since a wound was caused, there’s no further effect.
!!Damage Effects
Damage can result in three effects: Shaken, wounds, and Incapacitation.
!!!Shaken
If the damage of an attack is a simple success (0-3 points over Toughness), the target is Shaken. Shaken characters are rattled, distracted, or momentarily shocked. They aren’t stunned but are temporarily suppressed enough that they must make a Spirit roll to be effective.
On their action, a Shaken character must attempt to recover from being Shaken by making a Spirit roll:
* ''Failure'': The character remains Shaken. He can only perform free actions (see page 66).
* ''Success'': The character is no longer Shaken, but can still only perform free actions.
* ''Raise'': The character is no longer Shaken and may act normally.
► ''Spending Bennies'': A player may spend a Benny at any time to remove his Shaken status. If it’s currently his action, he may act as if he gained a raise on the Spirit roll.
!!!Wounds
Every raise on the damage roll inflicts a wound. Wounded Extras are removed from play. They’re dead, injured, or otherwise out of the fight.
Wild Cards can take three wounds and still function. If another wound would be caused after that, they’re Incapacitated (see below). Wild Cards never have more than three wounds—anything beyond that is just considered three wounds and Incapacitated (see below).
► ''Wound Penalties'': Each wound a Wild Card suffers causes a –1 cumulative penalty to his Pace (minimum of 1) and to all further Trait tests—up to the maximum of a hero’s 3 wounds.
A hero with 2 wounds, for example, suffers a –2 penalty to his Pace and any Trait tests.
► ''Timing'': Characters sometimes take multiple hits on the same Action Card. Resolve each damage roll separately and completely before moving on to the next (including any Soak rolls).
!!Incapacitation
Incapacitated characters aren’t necessarily dead, but are generally too beaten, battered, or bruised to do anything useful. They may not perform actions and are not dealt Action Cards in combat. Incapacitated Extras are removed from play.
Wild Cards are Incapacitated if they suffer more than three wounds (cumulatively or all at once). When a Wild Card becomes Incapacitated, make an immediate Vigor roll:
* ''Total of 1 or Less'': The character dies. See [[Death]].
* ''Failure'': Roll on the Injury Table. The Injury is permanent and the victim is Bleeding Out (see below).
* ''Success'': Roll on the Injury Table. The Injury goes away when all wounds are healed.
* ''Raise'': Roll on the Injury Table. The Injury goes away in 24 hours, or when all wounds are healed.
!!!Injury Table
See the Injury Tables in [[Races]]
► ''Bleeding Out'': The injured character must make a Vigor roll at the start of each round after the one in which he was injured and before Action Cards are dealt:
* ''Success'': The victim must roll again next round, or every minute thereafter if not in combat.
* ''Raise'': The victim stabilizes and no further rolls are required.
* ''Failure'': The character dies from blood loss.
Other characters may stop a victim’s bleeding by making a Healing roll. If successful, the victim stabilizes immediately and no further rolls are required. This use of the Healing skill just stops the bleeding. See [[Healing]] for the use of the Healing skill to recover actual wounds.
!!Soak Rolls
A character may spend a Benny to make a “Soak” roll, which is a Vigor check. A success and each raise reduces the number of wounds suffered from that attack by one. If the character Soaks all of the wounds from an attack, he removes his Shaken condition too (even from a previous source). Don’t count the wound modifiers you’re about to suffer when making this roll.
► ''Timing'': A character may only make one Soak roll per attack. If a Soak roll eliminates 2 of 3 wounds, for instance, a hero can’t make another Soak roll to eliminate the third wound. (The hero could spend a second Benny to reroll the Vigor roll as usual, however.)
► ''Shaken'': A character can also spend a Benny to immediately eliminate a Shaken condition (and act if it’s his action). This can be done at any time—even just after a failed Spirit roll to recover.
''Rank'': Seasoned
''Power Points'': 4
''Range'': Touch
''Duration'': 3 (2/round)
''Trappings'': Fiery aura, spikes, electrical field.
//Damage field// creates an effect around a character that deals damage to anyone who contacts them in close combat. The damage affects any adjacent character who makes a successful attack roll against the subject. It has no effect on non-adjacent attackers (for example, Reach or ranged attacks).
If a character with a //damage field// strikes someone in unarmed combat, the target takes the field’s damage plus the character’s Strength die (Str+2d6). The character may also simply touch the opponent (+2 to Fighting) and do the field’s damage only. A target who is grappled suffers the field’s damage each round on the attacker’s action; if the attacker chooses on following rounds to actively damage the target, he adds his Strength die to the damage roll as above and may get a bonus die for a raise.
With a success, the power does 2d6 damage. With a raise, //damage field// causes 2d8 damage.
''Requirements'': Novice
Your hero can sense when something bad is about to happen. Anytime he’s about to be the victim of a surprise attack, ambush, or other nasty surprise, he gets a Notice roll at –2 just before the attack or event occurs. If successful, the character knows something is about to happen and may take appropriate action against it. This means the hero is on Hold for the first round of a combat. Should the hero fail his roll, he still follows the normal Surprise rules, if applicable (see [[Combat]]).
''Rank'': Novice
''Power Points'': 1
''Range'': Touch
''Duration'': 1 hour (1/hour)
''Trappings'': Glowing eyes, dilated pupils, sonic sight.
Whereas light creates a source of illumination usable by others, darksight affects only a single person and can be much more clandestine.
On a success, this spell halves any darkness penalty for the subject (round down). For example, a character in Dim (–1) lighting would suffer no penalty, and one in Pitch Darkness (–4) would only suffer a –2. On a raise, the spell negates all darkness penalties up to the maximum of –6.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
This is ground zero for where Famine was struck down by that massive bolt of light when she laid hoof inside Lost Pegasus. What was left behind was a massive crater which has since flooded, worse still the salt water here has turned into Blood! The thick red mess swirls with clots and has become known as the Dead Pool by the locals. The dead pool takes up several city blocks which were leveled after the attack which included one of the cities landmarks, a grand temple to Harmony.
Locals mostly refuse to go near the place but some scavengers are just desperate or crazy enough to try. Many horrors await in that pool of blood but then again the area is mostly unspoiled past the destruction thanks to the lack of scavengers. But the dangers here are not limited to the abominations below, Lost Pegasus largest gang the Lakers preys on any-pony they find at the Dead Pool.
''Requirements'': Wild Card, Seasoned, Shooting/Throwing d10+
When dealt a Joker, the character doubles his total damage when making a successful Shooting or Throwing attack this round.
''Dead Towns''
There is a lot of empty territory in the Badlands between settlements, with the inerrant difficulties with long range communications its plenty hard to stay in touch with your neighbor. Used to be a large group called the Convoy would act as a lifeline for such places trading goods and even delivering mail, a trading caravan miles long with enough numbers and guns to put the fear into even the largest road gangs. When it came time for the Harvest the Convoy sided with the Iron Alliance, unfortunately enough of the convoy met there untimely ends during the war against Denmare that the Convoy dissolved.
Without the Convoy around to disseminate gossip or news between settlements smaller caravans, traders, and wanderers have really had to step up to fill the gap. These days ponies willing to bust a hump across the wasteland can make a decent bit of pay just checking on the more quiet settlements. Course sometimes towns have a good reason for going quiet, be it from outside attack, sickness, or even internal strive, these towns are just dead.
Every now and then, however, dead towns have much less obvious symptoms. Recently folks claim to have come across towns full of withered, dry corpses with massive wounds and strange holes all over them. The walls of the town show no signs of damage and there are never any survivors.
The lands near the blast site where a ghost rock bomb has struck become Deadlands, usually the worst of these zones are confined by the maelstrom but even the area around them is corrupted. Plants die, creatures mutate into monsters, and horrors plucked right out of Pony kinds worst nightmares come to life. Few believed in the existence of such monsters before the war, but there was certainly no denying it afterward.
All together, the detonations occurring within the space of a week created thousands of Dead-lands. Those closest linked together, turning Equestria into one great big pit of fear. Today new deadlands appear as fear spreads unchecked, lands slowly dying from corruption and evil.
The dead don’t always stay that way in Deadlands. If your character goes on to that big paradise in the sky, draw one card for each of his Ranks from a fresh Action Deck. If he has the Guts Edge, add one draw, and if he has the Grit Edge, add another.
If any of your cards are a Joker, your hero is coming back as a Harrowed. See [[Harrowed]] for more information—but only after your waster kicks the bucket.
Having a death wish doesn’t mean your adventurer is suicidal—but he does want to die after completing some important goal. Maybe he wants revenge for the murder of his family, or maybe he’s dying from disease and wants to go out in a blaze of glory. He won’t throw his life away for no reason, but when there’s a chance to complete his goal, he’ll do anything—and take any risk—to achieve it.
This Hindrance is usually Minor unless the goal is relatively easily fulfilled (very rare).
A decoy system is used to spoof incoming missiles. When activated, it
launches a steady stream of chaff or flares behind the aircraft. It takes a single action to activate the launcher. Once engaged, it launches a flare or chaff bundle at the start of each movement phase. This gives a pilot a +4 bonus to rolls when avoiding locked on missiles. Decoy Systems can hold 30 bundles and replacements coast $50 each (Rare).
If a character’s only regular action is to defend, his Parry is increased by +2 until his next action. The defender may move normally while performing this maneuver, but no running or other actions are allowed.
''Rank'': Novice
''Power Points'': 2
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': Mystical shield, gust of wind, phantom servant that intercepts the missiles.
//Deflection// powers work in a variety of ways. Some actually deflect incoming attacks, others blur the target’s form or produce other illusionary effects. The end result is always the same however — to misdirect incoming melee and missile attacks from the user.
With a standard success, attackers must subtract 2 from any Fighting, Shooting, or other attack rolls directed at the user. A raise increases the penalty to –4. This also acts as Armor against area effect weapons.
Your deader is, well deader than most others. For whatever reason, his manitou just didn’t invest as much effort in keeping his host’s body well-pickled. As a result, the fact that he’s gone AWOL from his own grave is pretty obvious to anyone who catches a glimpse—or whiff—of him.
Back in the pre-war days, he’d have been picked out and put down by the Agency, the Rangers, or even just a
civic-minded soul with a shotgun. Folks might be inclined to save their ammo for something worse that might come crawling out of the wastes these days, but he’s still treated as an unnatural abomination by most.
At the Minor level, your deader’s flesh is a noticeable gray, his eyes are dull or even milky, and the odor of decay is stronger, giving +2 to another waster’s Notice rolls to catch wind of his roadkillesque aroma. Domesticated animals prefer to have nothing to do with him and only interact with him at all when forced by another handler (at a –2 on the appropriate roll). Wild critters either flee or attack. He receives a –2 Charisma penalty but adds +2 to Intimidation tests.
As a Major Hindrance, the Harrowed is losing flesh. Stringy muscle or even bone might show through in some places. His eyes are sunken in dark pits in his skull
and his lips may be pulled back from his teeth in a rictus grin. In short, he’s a complete wreck. The smell of decay is the same as that for the Minor level (+2 to Notice), but honestly, body odor is the least of his worries.
Should it ever matter, a Harrowed with Major Degeneration also gets a –4 Charisma penalty. Like the Minor level, this becomes a bonus when using Intimidation. However, no outpost is likely to let a deader with the Major version of this Hindrance inside—folks these days know exactly what fuels this undead trouble-making machine.
Your hero believes something that is considered quite strange by everyone else. Minor Delusions a re harmless or the character generally keeps it to himself (the government puts sedatives in soft drinks, dogs can talk, we’re all just characters in some bizarre game, etc.).
With a Major Delusion, he expresses his view on the situation frequently and it can occasionally lead to danger ( the government is run by aliens,
hospitals are deadly, I’m allergic to armor, zombies are my friends).
''Rank'': Novice
''Power Points'': 2
''Range'': Sight
''Duration'': 3 (1/round) or 1 hour (1/hour)
''Trappings'': Waving hands, whispered words.
//Detect/conceal arcana// allows a character to sense supernatural persons, objects, or effects within sight. This includes invisible foes, enchantments on people or items, mad science devices, and so on.
The power can also be reversed to conceal a single supernatural item, being, or effect. This has the same cost, but the duration is much longer — 1 hour with a maintenance cost of 1 per hour. When used in this way, those who wish to see through the ruse with //detect arcana// use their arcane skill roll as an opposed roll against the concealer’s skill (rolled anew each time //detect arcana// is cast). The detecting character may only attempt to see through concealed powers once per fresh casting.
???
!!Race Features
* //''Natural Predator'' - Diamond dogs have clawed paws and a sharp-toothed mouth. They are considered to be armed, as with other creatures with natural weapons, and may use their maws/claws as weapons that deal Str+d6 damage.//
* //''Burrowing'' - A diamond dog can burrow, tunneling underground at the pace of 4”. A Burrowing dog strikes by erupting from beneath their opponents and taking them by surprise. When this occurs, the Burrowing dog makes an opposed Stealth roll versus the target’s Notice. If the dog wins, it gains +2 to attack and damage that round, or +4 if it gets a raise. If the victim wins and was on Hold, he may try to interrupt the burrower’s attack as usual.//
* //''Large Stature'' - Diamond Dogs are typically at least a head taller than most ponies and start out with +1 to size and toughness.//
* //''Tunnel Sight'' - Diamond Dogs have exceptional low light vision and ignore penalties for dim and dark lighting.//
* //''Nightmares from Below'' - Since their first appearance wormlings have been enemies of the subterranean Diamond Dogs but their is a much more feared beast, the Rattler. In the early days Rattlers were responsible for devouring whole Dens of Diamond Dogs and to this day are still an ongoing threat. All Diamond dogs intellectually fear Rattlers and start the game with the minor phobia: Rattler. //
* //''Outsider'' - Diamond Dogs are often misunderstood or even feared by other races who are slow to accept their typically gruff ways. When dealing with other races receive a -2 to your charisma.//
!!“Limbs”
* ''Paws'' x2: Can hold any kind of non-limb specific weapon as long they are strong enough. Flank weapons must be wielded by two talons.???
* ''Mouth''
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3-4 |''Arm'': Roll left or right paw randomly; it’s unusable like the One Arm Hindrance. |
| 5-9 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 10 |''Leg'': Gain the Lame Hindrance (or the Missing Leg Hindrance if already Lame). |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5-6 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li></ul> |
A character can try to make an opponent drop a weapon (or other object) with either a close combat or a ranged attack. To cause a disarm check, the attacker must first hit the opponent’s arm (–2, see [[Called Shots]]). The defender must then make a Strength roll. If the roll is less than the damage, he drops his weapon. The attacker may choose to make this a nonlethal attack with a melee weapon. Ranged attacks can be nonlethal if the attacker targets the weapon instead of the limb (generally –4 instead of –2).
Diseases cover a wide range of maladies, from long-term debilitating illnesses to those which might cause immediate spasms or death. To handle such a diverse range of diseases, we’ve broken them down into those most likely to come into play in a typical game or campaign session. If you’re trying to model a specific disease, you’ll want to adjust the rules to better reflect that illness’ symptoms.
* ''Recovery'': Unless the disease description says otherwise, it can only be treated with specific medicines or very powerful magic. If the proper medicine is available, all the victim’s ailments vanish in 2d6 days minus half his Vigor die type, to a minimum of one day. If not, healers can make the victim more comfortable but have no further effect on his condition. For magical healing, see [[Healing(Power)]].
* ''Incapacitation Effects'': Typically death unless the text details a different result.
!!!Contracting Diseases
Diseases may be acquired in one of the following ways:
• ''Airborne'': The toxin is in the air. If a character is aware of the toxin he can hold his breath for a number of rounds equal to 2 plus his Vigor die, or half that if he wasn’t prepared. After that he must breathe and automatically contracts the disease. If the victim is surprised by the release of the disease (such as a creature with exploding spores), he must make a Smarts roll to hold his breath before the tainted air enters his lungs.
• ''Touch'': The victim must make a Vigor roll immediately on being touched. If successful, the disease didn’t manage to “take” and there is no effect. Failure means the disease takes immediate effect as described below.
• ''Induction'': The disease must enter the bloodstream, most typically by an animal’s bite, or a cut by an infected weapon. In these cases, if a victim is Shaken or wounded by such an attack, he must make a Vigor roll. If failed, he contracts the disease. If successful, the disease didn’t manage to get into the bloodstream and there is no further effect.
!!!Disease Types
* ''Long-Term Chronic, Majorly Debilitating'': These diseases cause constant irritation and exhaustion and eventually end in death. Leprosy, untreated tuberculosis, and similar fatal diseases fall into this category. Victims have frequent spasms and coughing fits and so are always Exhausted. If they suffer an additional Fatigue level, they are Incapacitated but do not die. At the start of every game session, the character must make a Vigor roll. If his total is ever a 1 or less, he’s going to pass away before the end of that session. The Game Master is encouraged to let the hero go out with style if possible, but he will perish before the game ends this time.
* ''Long-Term Chronic, Minorly Debilitating'': This works exactly as above except the unfortunate hero is constantly Fatigued rather than Exhausted. Examples of this kind of disease include malaria, fantasy diseases such as the touch of certain undead, or living in a foreign and slightly toxic environment.
<<<
''comments'': A minorly debilitating disease kills?
<<<
* ''Short Term, Debilitating'': These are extremely rare in the real world but are very appropriate for fantasy or science-fiction settings. They are typically acquired from the scratch of a creature or breathing air laden with toxins (see Airborne and Induction, above). A victim who fails his Vigor roll and contracts the disease suffers Fatigue and is Shaken as he begins to cough and wretch uncontrollably. Once he recovers from being Shaken he may act normally but the Fatigue level (and thus the disease) remains for 2d6 days while the sickness works itself out.
<<<
''comments'': Rare? Do they know what a flu is?
<<<
* ''Short Term, Lethal'': Even more rare are diseases that can kill in seconds. Treat this exactly as Lethal Poison (see [[Poison]]). If a character survives but suffers Fatigue from the poison, it lasts 2d6 hours.
''Rank'': Seasoned
''Power Points'': 3 – 5
''Range'': Touch
''Duration'': 10 minutes (1/10 minutes)
''Trappings'': Malleable features, illusionary appearance, hair of new form.
//Disguise// allows the character to assume the appearance (but none of the abilities) of another person. The base cost is 3 Power Points, plus 1 point per level of Size difference between the character and the person she is impersonating. The character cannot emulate someone more than 2 Size levels different from themselves. It requires a Notice roll at –2 to see through //disguise// if someone is familiar with the specific person mimicked; the penalty increases to –4 with a raise. If unfamiliar, the penalties are –4 and –6 respectively.
''Rank'': Seasoned
''Power Points'': 3
''Range'': Smarts
''Duration'': Instant
''Trappings'': Waving hands, whispered words.
//Dispel// allows a hero to negate enemy spells, miracles, mad science, or super powers. It has no effect on innate powers, such as a dragon’s breath or a banshee’s scream. Neither does //dispel// work on magic items or permanent enchantments unless the specific item or enchantment says otherwise.
//Dispel// can be used on a power already in effect or to counter an enemy power as it’s being used. The latter requires the countering mage to be on Hold and interrupt his foe’s action as usual.
In either case, //dispelling// the opponent’s power is an opposed roll of arcane skills. The //dispelling// character suffers a –2 modifier if the target power is of another type (magic vs. miracles, superpowers vs. mad science, etc).
''Rank'': Heroic
''Power Points'': 5
''Range'': Self
''Duration'': 1 minute
''Trappings'': Contact spirits of dead, commune with deity, demonic interrogation.
This power allows the caster to contact an otherworldly being to gain information. Due to the extraplanar nature of this power, it is very draining to the caster.
On a success, the caster may ask one question that can be answered by “Yes,” “No,” or “Possibly” (if there is no absolute answer). On a raise, the question may be answered in five words or less (the GM may allow a longer, more detailed answer in cryptic form).
The spell’s duration is one minute, during which the caster may take no other actions or movement. If the caster is Shaken during that time, he must make a Smarts roll or the power is disrupted.
If the question relates to a living being (including beings who may “live” by mystical means such as undead, constructs, elementals, etc.), then the arcane skill roll is opposed by their Spirit. //Divination// is also opposed by //conceal arcana//. In the case of //conceal arcana// on a being, the //divination// must first beat the //conceal arcana//, and then if successful, the subject may roll Spirit against the //divination// result.
Due to some wound or deformity, you don't have more than a nub of a tail. You can't use prehensile tail as a limb, nor any edge that required them.
''Requirements'': Seasoned, Agility d8+
Some crafty types know how to get out of harm’s way. This Edge allows them to use cover, movement, and concealment to make them harder to hit. Unless they are the victim of a surprise attack and taken completely unaware, attackers must subtract 1 from their ranged attack rolls when targeting them (even in close combat).
Characters who attempt to evade area effect attacks may add +1 to their Agility roll as well (when allowed).
''Requirements'': Wild Card, Seasoned, Spirit d8+
Your hero adds his wound levels to both his Fighting rolls and the damage he causes from them. A hero with 3 wounds, for instance, adds +3 to his Fighting and Fighting damage rolls.
!!Race Features
* //''Stalwart'' - Though visibly unassuming Donkeys are made of tougher stuff than most other races. Donkeys start off with a free d6 in Vigor.//
* //''Hardy Traveler'' - Many stories tell of famous donkeys who would trek for years on end without slowing no matter the environment. Any-pony who has actually tried to keep up with a Donkey can attest to their fortitude on the road. A donkey gets a +2 bonus to resist all negative environmental effects.//
* //''Hardy'' - Donkeys are known for being persistent and able to bounce back from things that others wouldn't. A second Shaken result in combat does not cause a Wound on a donkey.//
!!“Limbs”
* ''Mouth''
* ''Forehooves'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
<<<
''comment'': What do you think of this?
<<<
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Leg'': Gain the Lame Hindrance (or the Missing Leg Hindrance if already Lame). |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5-6 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li></ul> |
A character with a semi-automatic weapon (such as a Colt .45, an M1 Carbine, or even an M16) can fire two shots in one action by “double-tapping.” Double tapping is a single Shooting roll that gives the user +1 to hit and damage but expends two rounds of ammunition.
Many modern automatic weapons, such as the M16A2, have a selector switch that allows the user to go from single shot, to burst fire, to fully-automatic as a free action. Burst fire, or a Three Round burst, gives the user +2 to hit and damage, and uses exactly three rounds of ammunition.
''Requirements'': Veteran, Agility d10+
When you are dealt a Joker, you may take an additional turn at the end of the current initiative order, for the current round only.
No matter how many times you use a particular skill or how competent you know you are, you have a crippling doubt about your own abilities that causes you to freeze up at crucial times.
Choose a skill that is crucial to your character; it is almost always one that is linked to your highest attribute (the Game Master must approve of it either way). You receive a -1 to all rolls with that skill with a Minor Doubt and a -2 penalty for a Major Doubt.
Some people don’t believe in the supernatural until they’re halfway down some creature’s gullet. Doubting Thomases are skeptics who try their best to rationalize supernatural events. Even once a Doubting Thomas realizes the supernatural exists, he still tries to rationalize weird events, following red herrings or ignoring evidence
Doubting Thomases suffer –2 to their Fear checks when confronted with undeniable supernatural horror.
''Rank'': Heroic
''Power Points'': 3
''Range'': Smarts
''Duration'': Instant
''Trappings'': Prayer, whispered words, gestures.
This spell removes a spellcaster’s source of power, limiting his ability to cast magic.
The caster picks a single target within range and makes an opposed arcane skill roll. The caster suffers a –2 modifier if the target power is of another type (magic vs. miracles, superpowers vs. mad science, for example).
With a success, he drains 1d6+1 Power Points from the victim. On a raise, the victim loses 1d8+2 Power Points.
These rolls don’t Ace. Targets with Arcane Background: Weird Science lose the Power Points from all “gizmos” on
their person equally.
The victim cannot be reduced below zero Power Points. Drained Power Points are not taken by the caster — they are
simply lost to the victim. Drained Power Points recharge as normal. The spell works only on creatures with an Arcane Background — it has no effect on magic items except those created through Arcane Background: Weird Science as noted above.
Heroes often find themselves in dramatic situations such as defusing a bomb or hacking a computer with a definite—and often deadly—time limit. The system below simulates these events and helps the Game Master throw some monkey wrenches and drama into what would otherwise be simple skill rolls.
To start, first determine the skill to be used, such as Knowledge (Demolitions) to defuse a bomb, Knowledge (Occult) to complete a ritual, Knowledge (Electronics) to hack a computer, and so on.
A standard Dramatic Task takes five “actions,” and requires the same number of successes (see below). Actions here may mean combat rounds or they may mean “attempts.” That’s entirely up to the Game Master and the situation.
!!Performing a Dramatic Task
Each action, the hero draws an Action Card (even if not in combat) and acts on that card. Edges such as Level Headed or Quick work as usual.
If the character nets five successes with the required Trait before time runs out, he’s accomplished his goal. It’s best to keep track of these successes with tokens of some sort so you don’t forget from round to round—and to give the player a visible measure of his success.
If time runs out and the hero has not acquired five successes, the bomb detonates, the ritual fails, the computer shuts down, an alarm sounds, or the action otherwise fails. It’s up to the Game Master whether it may be attempted again, but since this was a Dramatic Task, it should normally have resulted in something very bad, or at least require an entirely new approach to attempt again.
► ''Difficulty'': Most Dramatic Tasks should have at least a –2 modifier. This reflects any safeguards on a bomb, the complexity of a ritual, security on a computer, etc. These are dramatic tasks, and by their very nature should be fairly difficult.
► ''Cooperative Rolls'': Other characters may assist the acting hero as usual, using the Cooperative Rolls.
!!Complications
If the acting character’s Action Card is a Club, something has gone horribly wrong. He must make his roll this turn at –2 (in addition to any other modifiers). If failed, the worst possible resolution to the task occurs—the target escapes, the argument ends violently, the bomb explodes, or the battle is lost.
<<<
''Example'': Ian “Haxxor” ~McTavish is trying to hack into a high-security mainframe at the corporate headquarters of Genesis, Inc. He draws a Three of Clubs and must make his Knowledge (Computers) roll this round at –2. If he fails, Genesis security system detects the intrusion. In this high-tech world of netrunners, the Game Master decides Ian doesn’t just fail—a powerful jolt of electricity is sent through the cables for 2d6 damage!
<<<
Driving allows your hero to control ground and hover vehicles common to his setting. See [[rules for handling vehicles|Vehicle Rules]] on the tabletop. Driving is also frequently used with the [[Chases]] rules.
Water is deadly to those who aren’t prepared for it. Here are some standard water hazards and how often a character must make a Swimming roll, with each failure adding a Fatigue level.
* A character with at least a d4 in Swimming does not have to roll when in calm water.
* In rough water, all characters must make a Swimming roll every minute.
* In white water, the hero is swept into eddies and whirlpools (hydraulics) and rolls every round.
* A hero forced to tread water for long periods without a flotation device must roll once every hour.
|!Drug|!Cost|!Wgt|!Avail|
|''[[BrainBurst]]''|$300| | U |
| Notes: See Description for effects |<|<|<|
|''[[Carrot Dog]]''|$50| | U |
| Notes: See Description for effects |<|<|<|
|''[[Iron Pony (Drug)]]''|$150| | S |
| Notes: See Description for effects |<|<|<|
|''[[Rad-Gone]]''|$300| | S |
| Notes: See Description for effects |<|<|<|
|''[[Rad-Protect]]''|$300| | R |
| Notes: See Description for effects |<|<|<|
|''[[Rage]]''|$100| | S |
| Notes: See Description for effects |<|<|<|
|''[[Slow-Mo]]''|$150| | U |
| Notes: See Description for effects |<|<|<|
|''[[Super Antibiotic]]''|$150| | R |
| Notes: See Description for effects |<|<|<|
''Requirements'': Seasoned, Vigor d8+
You appear to be a bottomless wellspring of energy.
You require only half as much sleep as a normal character, and you receive a +2 bonus to all rolls made to avoid negative environmental effects (heat, cold, bumps and bruises, etc).
Earth ponies most closely resemble the idea of the 'normal' pony, as they lack any of the magical or fantastic accoutrements of their relatives. Nevertheless, their mundanity belies their own unique inner strengths that many take for granted.
Earth ponies have an innate, intuitive understanding of the natural world around them, from plants and animals to all things mechanical and logical. This understanding can manifest in many different ways: some earth ponies have an almost supernatural rapport with animals, while others are instinctually in tune with plants and nature in general. Still others are gifted with unusually intuitive technical knowledge, and are able to design and construct complicated devices and machines whose ingenious design seem to defy understanding.
They are sometimes stereotyped as being simple and ordinary, but there is no field where Earth ponies cannot or do not excel. On the whole, Earth ponies are generally stockier, more physically adept, and possess a greater constitution than other ponies.
!!Race Features
* //''Adaptability'' - Earth ponies start the game with one free novice edge of their choice.//
* //''Cutie Mark'' - Earth ponies start with a free D6 in a skill of their choosing reflecting their true talent.//
!!“Limbs”
* ''Mouth''
* ''Forehooves'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Leg'': Gain the Lame Hindrance (or the Missing Leg Hindrance if already Lame). |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5-6 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li></ul> |
!!List of Background Edges
<ul>
<$list filter="[tag[Background Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Combat Edges
<ul>
<$list filter="[tag[Combat Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Physical Edges
<ul>
<$list filter="[tag[Physical Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Leadership Edges
<ul>
<$list filter="[tag[Leadership Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Professional Edges
<ul>
<$list filter="[tag[Professional Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Social Edges
<ul>
<$list filter="[tag[Social Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Weird Edges
<ul>
<$list filter="[tag[Weird Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Wild Card Edges
<ul>
<$list filter="[tag[Wild Card Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!List of Legendary Edges
<ul>
<$list filter="[tag[Legendary Edge]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
''Requirements'': Novice, Spirit d8+
When this spirited hero puts his heart into something it tends to pay off in big ways. When you spend a Benny on a Trait roll (including Soak rolls), add +2 to the final total.
Your adventurer is getting on in years, but he’s not quite ready for the
nursing home. His Pace is reduced by 1, and his Strength and Vigor drop
a die type to a minimum of d4, and cannot be raised thereafter.
On the plus side, the wisdom of his years grants the hero 5 extra skill points that may be used for any skills linked to Smarts.
''Rank'': Novice
''Power Points'': 1
''Range'': Smarts x 2
''Duration'': 3 (1/round)
''Trappings'': A few simple gestures.
A character who chooses this power can perform basic “tricks” using the four elements: air, earth, fire, and water (these elements may vary depending on the setting). The GM is the final arbiter on what effects can be performed (nothing that mimics another power), but some examples are listed below.
► ''Air'': The caster can create lesser air currents to blow out a candle, fan a flame, lift a skirt, or cool his body in oppressive heat (+1 to a single Fatigue roll caused by heat).
► ''Earth'': A wave of the hand can open a one-foot square hole in soft earth (or half that in stone), or cause a spray of sand that might blind an opponent (+1 to a Trick roll).
► ''Fire'': The caster can snap his fingers to create a small flame (about the size of a hot match). With existing fire, he can urge it to spread (+1 to see if a fire spreads), cause it to flare (perhaps as part of a Trick maneuver), or slowly light an object over the course of a few rounds (as if holding a match to it).
► ''Water'': The caster can conjure up to a pint of water somewhere within his sight (not “inside” objects or people). A wave of his hand also purifies one gallon of water, whether it be poisoned or simply salt-water. Those who have been poisoned within the last minute also get a second chance to resist any remaining effects.
//aka ''EMP''//
''Rank'': Novice
''Power Points'': 2–10
''Range'': Spirit
''Duration'': 3 (2/round)
An //electromagnetic pulse// fries non-shielded circuits and electronics. It’s a great way for a Doomsayer to level the playing field when faced with high-tech weapons and vehicles.
To use //EMP// the Doomie places a Medium Burst Template anywhere within range and then makes a Faith roll. The difficulty of affecting a target depends on any shielding it might have, as shown below. Affected electronics are fried and generally must be replaced.
► ''Large Target'': For two additional points, the Doomsayer may affect everything in a Large Burst Template.
!!!EMP TABLE
|! Cost |!Affected Items |
| 2 |Handheld electronics |
| 3 |Home computers, vehicle ignition systems |
| 4 |Light military gear, industrial computers |
| 6 |Military computers, junker tech, shielded electronics, headbanger chips, cyborgs, normal robots |
| 8 |Heavily shielded electronics, automatons |
''Requirements'': Novice, Intuition d6+, Notice d6+
The feelings of others are easy to read and interpret, and you have little difficulty seeing the motivations and inner workings of those around you. You gain a +2 bonus to Intuition rolls, and you may ignore up to 2 points of Charisma bonuses in rolls made against you.
Someone out there hates the character and wants him dead. The value of the Hindrance depends on how powerful the enemy is and how often he might show up. A Minor Enemy might be a lone gunslinger out for vengeance. A Major Enemy might be a supernatural gunslinger who wants your hero dead.
If the enemy is one day defeated, the GM should gradually work in a replacement, or the hero may buy off the Hindrance by sacrificing an Advance.
Each of the vehicle types has an engine listed for it. For our purposes, there are three engine sizes for each vehicle type: small, medium, and large (though for flavor’s sale we’ve given them cooler designations).
|!Size|!Name|!Value|
|!Motorcycles|<|<|
| Small | 250cc | $100 |
| Medium | 750cc | $500 |
| Large | 1250cc |$1,000 |
|!Cars/Trucks/Vans|<|<|
| Small | V-4 | $300 |
| Medium | V-6 | $1,000 |
| Large | V-8 |$3,000 |
|!Large Vehicles|<|<|
| Small | 250cc | $500 |
| Medium | 750cc | $2,000 |
| Large | 1250cc |$5,000 |
The costs listed on the Engines Table are to purchase a engines outright. If you’re designing a car for a new character, you don’t have to pay the full price for an upgrade—you can subtract the cost of the old engine. For example, upgrading a newly created car from a V–6 to a V–8 adds only ($3,000-$1,000=) $2000 to its cost.
If you’re upgrading an existing character’s ride, any refunds are up to the Marshal. Of course, if you’re stripping the new engine out of the car of the dead brainer who tried to run you off the road, it’s free. Regardless of how the engine was obtained, it takes about eight hours of work and a repair roll to install it. The TN for the roll depends on the size difference (higher or lower) between the new engine and the original. Cramming a V–8 into an econo-box can be done, but it’s going to be a tight fit.
|!Size Difference|!Repair Mod|
| Same size | 0 |
| One size off | -2 |
| two sizes off | -4 |
Changing the size of a vehicle’s engine affects its performance. Each level the engine size is changed up or down changes the car’s top speed by 10 and its Acceleration Rating by 5. This also changes its mpg, decreasing its MPG by 5 for increasing the size of the engine or conversely increasing the fuel efficiency by 5 for decreasing the engine size.
''Rank'': Novice
''Power Points'': 2 – 4
''Range'': Smarts
''Duration'': Special
''Trappings'': Glue bomb, vines, handcuffs, spider webs. This power allows the character to restrain a target with snaking vines, lengths of hair, spider webs, or some other vine-like trapping.
The arcane skill roll is opposed by the target’s Agility. Success indicates partial restraint so that the target suffers a –2 penalty to Pace and skills linked to Agility and Strength. A raise restrains the target fully. He cannot move or use any skills linked to Agility or Strength.
Each following action, an //entangled// target may make a Strength or Agility roll to break free. Other characters may also attempt to free the ensnared person by making a Strength roll at –2.
For 2 Power Points //entangle// targets a single opponent. For 4 points it affects everyone in a Medium Burst Template.
''School'': Illusion
''Range'': Self (Enunciate), visual (Silence)
''Duration'': 1 minute per rank
''Trappings'': Booming, commanding voice or total muteness
//Enunciate//: For the duration of the cantrip, you may precisely control the volume, pitch, and range of your own voice. This allows you to do such things as speak loudly and clearly to address crowds or adjust your voice to sing in proper tune.
//Silence//: Roll an opposed Spirit check against the target; if they are unsuccessful, they cannot speak for the duration of the cantrip, though they can communicate in other ways.
''Cast Option'' (-1): You may use Enunciate on another creature within visual range. If the target is unwilling, they may resist with a successful opposed Spirit roll against you.
''Rank'': Novice
''Power Points'': 2
''Range'': Touch
''Duration'': 1 hour (1/hour)
''Trappings'': A mark on the forehead, potions, gills.
Adventurers sometimes travel beneath the waves, in space, or other hazardous environments. This power protects them from the crushing depths or blazing sun as they do.
This power allows the target to breathe, speak, and move at his normal Pace while in one normally harmful environment, such as underwater, a zero-G vacuum, the lava of a volcano, or even the heat of the sun. Pressure, atmosphere, air, etc, are all provided for.
The power does not protect against attacks with similar trappings though. A fire attack still causes normal damage, for example. With a raise on the casting roll, maintaining the power becomes 1 Power Point per two hours.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
''The Second Night and the Great Spark''
//630 - 673 CM (Celestia Monarchy)//
Focused on holding her new-found grip on the south and its precious resources Celestias Government at first overlooks the growing resentment of its own people. Beyond the actual horrors of monsters and undead that threaten pony life on the frontier story’s spread of Buffalo being driven from homes and the criminal levels of mistreatment of Immigrants. For the first time since the Reformation ponies being to question there Monarch. With each year more fuel is added to the fire as Guard respond violently to Buffalo and Immigrant uprisings.
Meeting in private letters or succession were drafted by revolutionaries and leaders of many of equestrians provinces. Of the signers the largest and most shocking was the elegant and bold signature of Nightmare moon herself. Once delivered to Canterlot the letters were immediately denied as Celestia proclaimed them traitors to the crown. Lines were drawn and Armies formed as the Equestrian Civil war began with Celestias Solar Empire and Nightmare Moon taking a surprising position of Vice-Presidency in the newly formed Lunar Republic.
Unlike any war before and powered by Ghost rock machines the battles of the Equestrian Civil war were on a grand and terrifying scale as both sides threw themselves against each other. The fighting continued for decades before the last climactic battle which took place outside that most ancient and now overgrown battleground, the Everfree. As the two armies clashed Celestia made a rare appearance in the field of battle and lead Nightmare moon back to the ruins the castle of the two sisters. It was here that she revealed her secret weapon, A massive ghost rock battery that filled much of the castle attached to the elements of harmony. Intent on ridding the land of the Nightmare once and for all Celestia activated the weapon bathing the castle and everfree in light.
When the smoke cleared all that remained were a few smoldering ruins at the center of a crater, Both the sisters as well as the elements of harmony were no where to be found. The two armies retreated and waited. When no further attacks from the other side came nor any news of the Sisters a truce was agreed upon as the land was divided between the two nations. With open warfare behind them the NLR and SE began a long lasted cold war.
''Before the Bombs Dropped''
Here you can find Summaries of Various points in Equestrian History ranging from the fall of Discord leading all the way up to the Final War and the dropping of the GhostRock Bombs.
* [[Post-Discord]]
* [[The Royal Diarchy]]
* [[Strange Frontier]]
* [[Equestrian Civil War]]
* [[Two Nations Divided]]
* [[A War to end the World]]
''After Judgement Day''
* [[Deadlands]]
* [[The Alicorns Arise]]
* [[The Harvest]]
* [[The Battle of Worms]]
''Requirements'': Legendary, Professional in affected Trait
As above, but the Trait increases to d12+2.
''Requirements'': Novice, Vigor d6+, //Survival?/Tracking? d6+//
You do not have a permanent home, and you are constantly drawn to new places and new lands by your inherent wanderlust. You gain a +1 bonus to all rolls made to avoid negative environmental effects (heat, cold, bumps and bruises, etc). In addition, you gain a +2 bonus to Streetwise and Survival?/Tracking? rolls.
<<<
''comments'': This one used Nature. Should we use both Survival and Tracking or just one of them? Also, a bonus to Streetwise?
<<<
If you thought road rage was bad before the Last War, wait ‘til you try to pass a road ganger on the right! For these occasions, smart wasters have begun bolting additional armor to their rides
This modification could be anything from scrap metal to sandbags in the door panels A vehicle can only add as many points of extra Armor as it has Armor to begin with, so an HMMWV could add a maximum of 6 points of armor, while an SUV is limited to 3 Either way, the vehicle’s handling suffers under all that extra weight Driving rolls are reduced by half the armor added (round up).
It’s possible to hook up multiple sets of controls for a mount to allow more than one person to control the weapon. It’s also possible to link multiple weapons to a single control to allow them to be aimed and fired together. Each linked weapon needs a set of extra fire controls.
''Requirements'': Novice, Agility d8+
When a character normally withdraws from a melee, his attacker gets a free attack before he does so—a very dangerous proposition for most. Your hero is adept at retreating from an engagement.
Make an Agility roll. If successful, one opponent doesn’t get a free attack anytime you [[disengage|Situational Combat Rules]].
*[[The Combine]]
*[[The Law Dogs]]
*[[The Cult of Doom]]
*[[The Templars]]
*[[The Librarians]]
*[[The Iron Alliance]]
*[[The Chamber]]
Arcane Skill for the Power of Doomsaying, Templar Miracles, Toxic Shamanism
Falling damage is 1d6+1 per 10 feet fallen (round up), to a maximum of 10d6+10. If you’re playing on the tabletop, treat every 2” as 10’ for simplicity.
► ''Snow'': Particularly soft ground, such as deep snow, acts as a cushion. Every foot of soft snow reduces damage by one point.
► ''Water'': A fall into water reduces the number of dice rolled by half (rounded down), and an Agility roll means the character dives and takes no damage at all, though he is automatically Shaken if he dives from a height of greater than 50’. A fall over 15” (30 yards) requires an Agility roll at –2 to avoid damage.
''Requirements'': Novice
Something has happened to you, or you have accomplished something great that has garnered you a lot of attention and praise.
As a result, your name carries a lot of weight among many circles. You gain a +1 bonus to Charisma when dealing with characters who recognize you and acknowledge your accomplishments (those who do not know who you are or do not care are unaffected). You may take this Edge multiple times, up to a maximum of four times: each additional time you take Fame, its bonus to Charisma increases by 1 (the second copy of Fame you take gives you a +2 Charisma bonus, the third copy gives you +3 Charisma, etc.)
''Requirements'': Novice, Arcane Background (Witch), Witchcraft d10+
Your witch has summoned an animal familiar. The type of critter she’s acquired depends on her rank when she first takes this Edge. The Available Familiars table (below) tells you what type of animal your enchantress can choose at that time.
!!!Available Familiars
| !Rank |!Animal Type |
| Novice |Owl, cat, snake, frog |
| Seasoned |Dog, wolf, stag (deer), mule |
| Veteran |Cougar, riding horse |
| Heroic |Bear, bull, shark |
| Legendary |Brain buzzard, devil bat, dog o’ war |
Your witch and her familiar acquire the Loyal Hindrance with regards to each other. The familiar isn’t a slave though, and can refuse to follow your hero’s orders—particularly those which may cause it harm. Unless ordered to follow otherwise, a familiar acts in accordance with its nature. For example, a cat may stop to chase a mouse or take a brief nap and will most likely hide during combat.
A familiar is a Wild Card with respect to wounds and having a Wild Die, but it receives no Bennies. However, your witch can spend her own Bennies on behalf of her familiar.
The familiar can understand your character’s speech and vice-versa. Any eavesdropper just hears the witch speaking in her normal voice, while the creature makes noises appropriate for its species. The bond between the familiar and its mistress makes it more resistant to //beast friend//. Each Rank of your witch adds to the familiar’s Size when calculating how many Power Points are needed to control it.
A witch can dismiss her familiar to summon another if she chooses. The process takes two weeks from the time the original familiar is dismissed until the new one arrives.
This Edge can be taken more than once, although not to gain additional familiars. Each additional time you choose it, you may pick one of the powers below. Each power may be taken only once, and you can only take this Edge once per Rank (Taking during character creation does not prevent your character from taking it during Novice Rank).
* Your witch can transfer wounds and Fatigue to and from her familiar as a free action.
* Your witch can increase one attribute of her choice which is lower than that of the familiar by one die type, to a maximum of d12.
* Your witch can use the familiar’s senses as if they were her own. This requires concentration and the maximum range for this ability is your witch’s Smarts x 100 yards.
* The familiar can use your witch’s Combat Edges as its own.
* Any spells your witch casts on herself also affect her familiar. For example, if she casts armor on herself, both she and her familiar gain +2 Armor (+4 on a raise) for the duration of the spell.
* The familiar has 5 Power Points which your hero can use as if they were her own. The Power Points recharge at the same rate as the witch’s own (1 per hour).
''Rank'': Seasoned
''Power Points'': 3
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': Invisibly marked targets, guiding winds, eagle eyes.
This spell endows the recipient to see over great distances. With a success, ranged penalties are halved for the subject (–1 at Medium and –2 at Long). If a raise is achieved, all range increments for the subject are doubled in addition (12/24/48 becomes 24/48/96).
''Requirements'': Novice, Vigor d8+
Some individuals just seem to heal faster than others. Those with this blessing add +2 to Vigor rolls when checking for natural healing. See [[Healing]].
Rather than use regular bennies, Deadlands uses colored poker chips we call Fate Chips. When playing Deadlands, any references to bennies refer to Fate Chips instead. At the start of each game the Marshal builds a pool of chips called the “Fate Pot", by default this pool is made up of 15 white, 10 red, and 5 blue chips but can change over time as more are added. Each player randomly draws as many chips as his character is allowed—usually three. The Marshal does the same, drawing one for each player in the game, to use for the bad guys. When Marshal controlled Wild Cards turn up in the game, he draws two extra chips from the fate pot for each.
Fate Chips come in three colors because each grants a different benefit, but regardless of color, all allow you to attempt a Vigor roll to soak damage or remove a Shaken condition as usual.
All Fate Chips are thrown back in the pot at the end of each session, so you may as well use them brainer. What else are they good for?
Glad you asked.
!!!White Chips
If you’re lucky and you live long enough you’ll see a lot of these. White Fate Chips are the most common sort and act just like regular bennies. All the usual Savage Worlds rules on bennies apply to white Fate Chips.
!!!Red Chips
A red chip allows you to roll a d6 and add it to your current total (this die can Ace as usual). This negates a critical failure from rolling a 1 on your skill die, should that be an issue. Or you can choose to use a red chip as a white chip.
The bad news is that the Marshal gets a free draw from the Fate Pot for his critters and cowpokes every time you use a red chip. The Marshal does not get a draw if you use a red chip as a white (to reroll, soak a wound, or eliminate a Shaken condition).
!!!Blue Chips
Blue chips work just exactly the same as red chips except for one difference. Using a blue chip doesn’t give the bad guys a chip (the Marshal doesn’t get a draw), no matter what you use it for.
!!!Legend Chips
There’s one more type of chip your posse might see after it becomes a little better acquainted with the wastelands dark underbelly. These suckers aren’t put in the pot when you start the game. They’re added when your group beats a really nasty critter and live to tell about it. The Marshal has the complete info on when to add these to your pot. Legend chips are one-use affairs—spend ’em and they’re gone—and can be used in one of two ways :
* They can be used like a blue fate chip, and add +2 to the final total.
* They can be used to reroll ANY roll—damage rolls, rolls on a table, a malfunction check, and so on.
Certain creatures and horrific scenes may challenge a character’s resolve and cause them to make a Fear check (a Spirit roll) when they see them. A success on the Spirit roll means the character manages to overcome the situation and carry on. A failed Fear roll depends on whether the cause of the roll was grotesque or terrifying in nature.
* ''Fear/Nausea'': If the scene was grotesque or horrific, such as a grisly discovery or learning a secret “Man Was Not Meant to Know,” the character is Shaken and must make a Vigor roll or suffer severe nausea/mental shock that causes a level of Fatigue for the remainder of the encounter. A natural 1 on the Spirit die (regardless of the Wild Die) causes the victim to roll on the Fright Table as well.
* ''Terror'': A terrifying trigger, such as a monstrous creature or unknowable evil, is much more intense, and can rattle even the most stout-hearted hero. Extras are typically Panicked. Wild Cards must roll on the Fright Table should they fail their Fear check. Roll 1d20 and add the monster’s Fear penalty, if any, to the roll (a –2 adds +2 to the roll, for example).
► ''Becoming Jaded'': After encountering a particular type of creature, the character shouldn’t have to make Fear checks every time he sees another one in that particular scenario. If the party clears out a dungeon full of zombies, for example, they should only have to roll the first time they encounter them—not in every room. The Game Master might require a roll if the heroes encounter zombies in a particularly different or frightening situation, however, such as if they fall into a pit full of the ravenous creatures.
!!Fright Table
| !1d20* |!Effect |
| 1-4 |''Adrenaline Surge'': The hero’s “fight” response takes over. He adds +2 to all Trait and damage rolls on his next action. |
| 5-8 |''Shaken'': The character is Shaken. |
| 9-12 |''Panicked'': The character immediately moves his full Pace plus running die away from the danger and is Shaken. |
| 13-16 |''Minor Phobia'': The character gains a Minor Phobia Hindrance somehow associated with the trauma. |
| 17-18 |''Major Phobia'': The character gains a Major Phobia Hindrance. |
| 19-20 |''The Mark of Fear'': The hero is Shaken and also suffers some cosmetic physical alteration—a white streak forms in the hero’s hair, his eyes twitch constantly, or some other minor physical alteration. This reduces his Charisma by 1. |
| 21+ |''Heart Attack'': The hero is so overwhelmed with fear that his heart stutters. He becomes Incapacitated and must make a Vigor roll at –2. If successful, he’s Shaken and can’t attempt to recover for 1d4 rounds. If he fails, he dies in 2d6 rounds. A Healing roll at –4 saves the victim’s life, but he remains Incapacitated. |
∗ Add the creature’s Fear penalty as a positive number to this roll.
''Rank'': Novice
''Power Points'': 2
''Range'': Smarts x 2
''Duration'': Instant
''Trappings'': Gestures, eldritch energy, cold chills.
This power causes the target overwhelming dread and horror. The area of effect is the Large Burst Template. Every creature beneath the template must make a Fear check, at –2 if the caster got a raise. Wild Cards who fail roll on the Fear Table. Extras are Panicked instead.
''Requirements'': Veteran, Command, Spirit d8+
A simple phrase uttered by a great leader can sometimes have momentous results. A leader with this ability can inspire his men to bloody fervor by yelling a motto, slogan, or other inspirational words. Those in the command radius add +1 to their Fighting damage rolls.
This accessory is basically a sandbagged bunker on the roof of a vehicle. It can only be applied to the largest of vehicles, like buses, campers, or semi trailers. A single fighting position can hold up to three people, or two people if the position includes a Weapon Mount. A vehicle can fit one fighting position for every 10 people it can fit inside the vehicle itself.
Fighting Positions give those inside Medium Cover, and also grant a +2 bonus to any rolls made to retain footing atop a moving vehicle.
Fighting covers all hand-to-hand (melee) attacks, whether it’s with fists, axes, laser swords, or martial arts. The TN to hit an opponent is his Parry (2 plus half the highest between Fightning and Grace). See [[Combat]] for the combat rules and numerous maneuvers your warrior might attempt.
''Requirements'': Novice, Rich or Noble
This character is very wealthy. He has five times the starting funds for the setting.
Wealthier characters should have a very complete background as well. This needs to be worked out with the GM, and comes with many more assets as well as onerous responsibilities.
A completely helpless victim (bound, unconscious, etc.) may be dispatched with a lethal weapon of some sort as an action. This is automatic unless the GM decides there’s a special situation, such as a particularly tough or naturally armored victim, a chance for escape, and so on.
The killer must usually dispatch his foe up close and personal, but the GM may occasionally let finishing moves be performed at range.
Even giants impervious to the puny weapons of swordslingers are often afraid of flame and fire. Roll the damage listed below when a character is first burned and at the beginning of each round until he is free of the flame. Only sealed, fireproof armor adds to a character’s Toughness when resisting the effects of fire.
!!!Fire Damage
| !Damage |!Description |
| +2 |Burning weapon |
| 1d10 |“Spot fire,” such as a burning arm or leg |
| 2d10 |Flamethrower |
| 3d10 |Lava |
► ''Spreading'': Anytime something flammable is hit by fire, roll 1d6. On a 6, the target catches fire. Very flammable targets, such as a scarecrow, catch fire on a 4-6. Volatile targets, such as a person soaked in gasoline, catch fire on anything but a 1.
Each round after a victim catches fire (at the beginning of his action), roll as if checking to see if the victim catches fire again. If he does, the fire grows in intensity and does the damage listed above each round.
► ''Smoke Inhalation'': Fires in confined areas produce deadly smoke. Every round a character is in such an environment, he must make a Vigor roll. A wet cloth over the face adds +2 to the roll, and a gas mask negates the need for the roll entirely. If the roll is failed, the character gains a Fatigue level.
Occasionally heroes have to fire into the middle of hand-to-hand fights. The trouble is that even though we might see figures standing perfectly still on the table-top, in “reality,” they’re circling each other, wrestling back and forth, and moving erratically. For that reason, firing into a tangle of people, such as a melee, is quite dangerous. Use the Innocent Bystander rules when this occurs (see [[Innocent Bystanders]]).
''Requirements'': Novice, Agility d8+
Once per turn the hero (if not Shaken) gets a free Fighting attack against a single foe who moves adjacent to him. This automatically interrupts the opponent’s action and does not cost the hero his action if he is on Hold or has not yet acted this round.
''School'': Transmutation
''Range'': Smarts
''Duration'': Instant
''Trappings'': Warm orange glow
//Flavor//: Designate an amount of food or water, equaling no more than a total of a cubic foot in volume. This food and/or water is purged of all toxins or decomposition and becomes fresh and safe to consume.
//Foul//: Same as above, but the food and/or water instantly rots or becomes brackish and unsafe to consume.
''Cast Option'' (+0): As Flavor, you may change the flavor and composition of the food and/or water to something similar, such as turning pancakes into blueberry pancakes, in addition to being purified.
''Requirements'': Novice, Agility d6+
The hero’s Pace is increased by +2 and he rolls a d10 instead of a d6 when running or swooping.
''Requirements'': Novice, Agility d8+, Fighting d8+
A character trained to fight “Florentine” is a master at wielding two weapons at once. He adds +1 to his Fighting rolls versus an opponent with a single weapon and no shield. In addition, opponents subtract 1 from any “gang up” bonuses they would normally get against the fighter as his two flashing blades parry their blows.
<<<
''comment:'' Anypony can use it now, I think. Even without Tail Wielding there are Spurjacks
<<<
''Rank'': Veteran
''Power Points'': 3/6
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': Gusty winds, wings, broomsticks.
//Fly// allows a character to fly at his basic Pace with a Climb of 0. He may double his Pace by spending twice the number of Power Points.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
''Requirements'': Wild Card, Legendary
Heroes often acquire dedicated warbands, “merry men,” or others who voluntarily follow the hero on his adventures.
Each time this Edge is chosen, five followers join the hero’s band. Casualties are not automatically replaced, so a hero may need to choose this Edge again on occasion to replenish his losses. The followers must have some way to eat and earn income, and generally want a piece of whatever loot, treasure, or other rewards the hero acquires. Otherwise, they are completely dedicated to their idol and risk their lives for him under any normal conditions. They won’t knowingly throw their lives away except under very special circumstances.
The GM determines the followers’ statistics, but in general, use the Soldier statistics. Followers generally come with only basic equipment depending on their particular setting (warriors in fantasy come with at least leather armor and short swords, for example). The hero must purchase any additional equipment for his Followers himself.
!!!Soldier
''Attributes'': Agility d6, Smarts d4, Spirit d6, Strength d6, Vigor d6
''Skills'': Fighting d6, Notice d6, Shooting d6, Stealth d4
''Charisma'': —; ''Pace'': 6; ''Parry'': 5; ''Toughness'': 5
|!Food|!Cost|!Wgt|!Avail|
|''Canned Goods''|$5| 1 | U |
|''Dr. Pepper'' (12 oz.)|$100| .75 | S |
| Notes: Regain all Fatigue lost to radiation |<|<|<|
|''Coffee'' (pound)|$20| 1 | R |
|''Fresh fruit'' (Piece)|$5| .5 | U |
|''Jerky'' (1 Meal)|$1| .05 | C |
|''Loaf of Bread''|$10| .5 | U |
|''Milrats'' (1 Day)|$20| 1 | U |
| Notes: Military Rations |<|<|<|
|''Soda''|$50| .75 | R |
| Notes: (12 oz. Can, not Dr. Pepper)|<|<|<|
|''Veggies'' $55| .5 | U |
|''Whiskey''|$100+| 4 | R |
| Notes: Bottle, Pre-War |<|<|<|
|''Whiskey''|$10| 4 | C |
| Notes: Bottle, Moonshine |<|<|<|
''Fort 51''
For years Fort 51 was the Lunar Republics top-secret weapons research laboratory. Everyone knew it existed; they just couldn’t get close enough to see what was going on there. Fort 51 got hit hard both by conventional ghost rock bombs and specially created enhanced-yield devices designed to tunnel hundreds of feet into the earth and detonate below ground level. It had some sort of defense shield but apparently the system failed.
The surface of Fort 51 is a nightmarish sight. No less than five maelstroms overlap like some demonic Olympic symbol on a cosmic scale. More ghost rock bombs actually struck the installation, but several merged together to form the five seen today. Anyone entering these maelstroms finds them to be double the usual thickness. Far beneath the ruins are several levels of labs, storerooms, and living quarters..
If a way could be found to tunnel down to the intact installations hundreds of feet below ground, a group could find a veritable treasure trove of equipment, weapons, and goods of both a mundane and exotic nature. Fort 51 was the center of Southern research and development, so one can only imagine what equipment lies in the dusty storage vaults and laboratories.
''Requirements'': Novice, Arcane background (Psionics), Psionics d8+, Faraway??? syker
This was a skill perfected on Banshee??? to help the sykers of the UN Legion??? combat the supremely powerful skinnies???.
A syker can suffer a level of Fatigue to gain +d6 Power Points, or two levels of Fatigue to gain 2d6 Power Points. This is a free action.
The syker may not Incapacitate herself with this Edge. Fatigue accumulated in this way may be recovered by silent, still meditation or sleep at the rate of one level every four hours.
''School'': Divination
''Range'': Smarts
''Duration'': 1 round + 1 additional round per rank
''Trappings'': No obvious effects
//Fortune//: Roll a d6: for the duration of this cantrip, all Trait rolls the target makes gain a +1 bonus on a result of 2-6 or suffer a -1 penalty on a roll of a 1. This is considered to be a roll on a table (and thus cannot be Bennied). No individual creature may be affected by Fortune more than once per game session, no matter the result.
//Misfortune//: Roll a d6: for the duration of this cantrip, all Trait rolls the target makes suffer a -1 penalty on a result of 2-6 gain a +1 bonus on a roll of a 1. This is considered to be a roll on a table (and thus cannot be Bennied). No individual creature may be affected by Misfortune more than once per game session, no matter the result.
''Cast Option'' (-X): This cantrip may be used on a creature that has already been affected by it this game session. The casting penalty is equal to X, where X is the number of times Fortune/Misfortune has been used on the target so far.
''Requirements'': Seasoned, Fighting d10+
Frenzied fighters make fast and furious melee attacks, sacrificing finesse for raw speed. This allows them to make an extra Fighting attack per round at a –2 penalty to all Fighting rolls. This attack must be taken at the same time as another Fighting attack though it may target any two foes adjacent to the hero (Wild Cards roll two Fighting dice and one Wild Die).
The –2 penalty is subtracted from all attacks. A character armed with two weapons still only makes one extra attack
''Fuel Towns''
A portion of the Lunar Republics oil rigs were destroyed during the ghost rock bomb swap on Judgment Day, but the remaining ones were quickly claimed and fortified by survivors. Experienced oil workers were (and still are) treated like royalty, and survivor groups warred over chemical engineers who could get the refineries working again. Once the dust settled, what remained were a handful of well-fortified towns built around working oil wells and refineries, most found withing a 150 mile radius of each other in the eastern Badlands. All of these places continue to pump crude oil and refine it into a variety of fuels and lubricants.
Road gangs hover around these towns like flies around a carcass. Some actually trade for their fuel, but most lie in wait outside of town for people who have just topped off their tanks.
Because of this, the roads outside of these settlements are littered with 13 years’ worth of rusted wrecks and skeletal remains, the air smells of sulfur and other noxious chemicals spewing out of the refinery stacks, and the towns and surrounding countryside are covered with an oily grit from burned-off waste products.
The inhabitants of these places live under the constant threat of siege. The loyalties and alliances of the many gangs surrounding each town change every day, and the defenders never know when enough gangs might band together to completely cut off their outside supplies or actually assault the town. Since Judgment Day, most of the smaller fuel towns have changed hoofs a number of times. Some were starved into submission; others fell to organized attacks
In addition to the usual Defend option, a character can go for a full defensive action. He makes a Fighting //or Grace// roll at +2 and uses the result as his Parry until his next action. This is a trait test, so he gets to roll his Wild Die as well. And, of course, the dice can Ace, and you can choose to use Bennies on the roll if you want to.
Note that the character’s Parry never gets worse as a result of the roll. If the roll is lower than the hero’s Parry score, he keeps that instead (but gains no bonus from the full defense). A hero using the full defense maneuver cannot move at all, however. He’s doing everything he can to fend off whatever is attacking him. If he wants to move away as well, use the Defend maneuver instead.
''Requirements'': Novice, Arcane Background (Weird Science), Smarts d8+, Repair d8+, Weird Science d8+, at least two other scientific Knowledge skills at d6+
These mechanical gurus are so technically savvy they can quickly build a machine to handle nearly any situation.
Once per game session, a gadgeteer can create a “juryrigged” device from spare parts. The device functions just like any other Weird Science device, and uses any power available to Weird Scientists in that setting (though this is still subject to Rank restrictions). It has half the inventor’s Power Points, and once these are used up, the gadget burns out and does not recharge. The inventor must have access to some parts and a reasonable amount of time (GM’s call, but at least 1d20 minutes) to create the gizmo.
Gambling is useful from the saloons of the Old West to the barracks of most armies. Here’s a quick way to simulate about a half-hour of gambling without having to roll for every single toss of the dice or hand of cards.
First have everyone agree on the stakes, such as $10, 10 gold coins, etc. Now have everyone in the game make a Gambling roll. The lowest total pays the highest total the difference times the stake. The next lowest pays the second highest the difference times the stake, and so on. If there’s an odd man left in the middle, he breaks even.
<<<
''Example'': Kali rolls highest with a 10 and Yuri rolls
lowest with a 4. The difference is 6, so Yuri pays Kali
6 x the stake of $10, or $60.
<<<
► ''Cheating'': A character who cheats adds +2 to his roll.
The GM may raise or lower this modifier depending on the
particulars of the game or the method of cheating. If the player
ever rolls a 1 on his skill die (regardless of his Wild Die), he’s
caught. The consequences of this depend on the setting, but
are usually quite harsh.
Ganging up on a foe allows attackers to flank, exploit openings, and generally harass their outnumbered opponent. Each additional adjacent foe adds +1 to all the attackers’ Fighting rolls, up to a maximum of +4. If three warriors attack a single hero, for example, each of the three warriors gets a +2 bonus to their Fighting rolls.
''Currency''
<<<
There’s no standard currency in
Deadlands. Assume “dollars” are trinkets,
small food items, bullets, bits of jewelry, a
squirt or two of toothpaste, matches, and
the like.
In general, think of these as currency
and nothing else. In a pinch, the Marshal
might let a waster roll to find something
important in his “cash,” like a match or
one more bullet for his gun. This is based
on what the character was smart enough
to pick up, so he makes a Smarts roll at
–2 applying the item’s scarcity Streetwise
modifier (see page 42). On a success, he has
the item and deducts the cost from his
“money.”
<<<
''Damaged Goods''
<<<
Most anything except services can be bartered for cheaper than the listed price—if a waster is willing to settle for a little less quality. Common items such as clothes are ratty and torn, hats are crumpled, and dinged up playing cards can’t be used anywhere except by the campfire. The effects of these items are usually situational, though many items can cause bigger problems…or become them!
Damaged goods go for 50% of the list price. Cheap guns, tools, and so
forth—anything a brainer has to roll to use—malfunction when the player rolls a 1 on the skill die. Your warrior’s dinged-up golf club, for example, might fall apart while whacking on some no good mutie.
Items that don’t come into play for skill rolls might affect others’ perception. A ratty leather jacket, for example, has blood stains, tears, and other signs that it might be fresh off a corpse. These items inflict a –1 Charisma modifier on your waster. Even after the Apocalypse a blood-stained wanderer gives others the creeps.
<<<
---
*''[[Armor (Gear)]]''
*''[[Weapons]]''
*''[[Ammo]]''
*''[[Clothes]]''
*''[[Food & Drink]]''
*''[[General Equipment]]''
*''[[Weapon Accessories]]''
*''[[Medical Equipment]]''
*''[[Drugs]]''
*''[[Vehicles]]''
You are obligated to perform a specific task or mission, and you will do whatever you can to fulfill it.
A Minor Geas can be something relatively simple, such as delivering a letter to an important pony or keeping a treasure safe. A Major Geas necessitates a very dangerous and/or difficult task, such as recovering a stolen artifact from a dragon. As a Minor Hindrance, at the end of any session in which you failed to advance your progress in completing your Geas when given opportunity to do so, you start with one fewer Benny on the next session or two fewer Bennies as a Major Hindrance.
|!Item|!Cost|!Wgt|!Avail|
|''Backpack''|$30| 3 | U |
|''Battery, Ghost Rock''|x2| By Size | R |
|''Battery, Large''|$100| 3 | U |
|''Battery, Medium''|$50| 1 | U |
|''Battery, Small''|$20| .5 | C |
|''Bed roll''|$15| 10 | C |
|''Binoculars''|$100| 3 | R |
|''Camping 5 Gallon Water Jug''|$50| 40 (full) | U |
|''Canteen''|$10| 5 (full) | C |
|''Cigar (Pre-War)''|$25| | S |
|''Compass''|$100| R | U |
|''Drill''|$10| 2 | U |
|''File''|$2| 1 | C |
|''Flashlight''|$50| 4 | U |
|''Gas mask''|$30| 2 | U |
|''Geiger Counter''|$100| 8 | R |
|''Ghost Rock'' (ounce)|$15| .05 | U |
|''Guitar''|$100| 6 | U |
|''Hammer''|$5| 2 | C |
|''Hoofcuffs''|$20| 1 | U |
|''Harmonica''|$5| | C |
|''Hatchet''|$10| 2.5 | U |
|''Iron skillet''|$5| 5 | C |
|''Lockpicks''|$50| 1 | R |
|''Matches'' (100)|$5| .25 | C |
|''Mess kit''|$15| 3 | C |
|''NBC Suit''|$100| 20 | S |
|''Night Vision Goggles''|$1,000| 3 | R |
|''Pick''|$10| 12 | U |
|''Pipe''|$10| .75 | C |
|''Playing cards''|$5| | C |
|''[[Radio]]''|$40| 1 | C |
|''Rope'' (per 50’)|$25| 8 | C |
|''Shovel''|$10| 5 | C |
|''Spook Juice'' (per gal.)|$20| 6 | C |
|''Tent'' (2 Person)|$100| 4 | U |
|''Tobacco, chewing'' (pouch)|$10| 1 | U |
|''Toothpaste''|$10| .5 | U |
|''Watch, Wrist'' (Analog)|$30| | U |
|''Watch, Wrist'' (Digital)|$15| | R |
|''Watch, pocket''|$30| | R |
|''Water Purification kit'' (10 Doses)|$100| 1 | R |
|''Water Test Kit''|$100| 3 | R |
|''Wood Axe''|$50| 5 | U |
''Requirements'': Heroic, Harrowed
As his first action during his turn, the Harrowed can become incorporeal with a successful Spirit roll (he can perform no actions, including free actions, before using Ghost). Once incorporeal, he must remain in that state until the beginning of his action on the next round (unless he suffers damage, see below). While ghosted, the Harrowed is intangible—unaffected by the physical world and unable to affect it—though he is still visible and magical attacks affect him normally.
The deader may remain ghosted as long as he wishes, but it requires concentration and thus counts as an action for each round maintained. With a free action, the Harrowed can become tangible again at the beginning of his turn If he somehow suffers damage (Shaken or one or more wounds)—say, from a magical or supernatural attack—while in this state, he must make a Spirit roll at –2 or immediately become tangible.
''Ghost Rock Battery''
''Rank'': Novice
''Power Points'': 1
''Range'': Touch
This power allows a junker to create their very own Ghost Rock battery, a device capable of storing raw spiritual energy (or G-rays, as Junkers call them). Ghost Rock battery's are an alternative approach to powering Junker tech, this method takes a larger investment of time and resources in comparison to simply binding a tech spirit but offers various advantages of its own.
Devices powered purely by tech spirits are typically very short lived, the gizmo literally “giving up the ghost” once it has spent its power points. Unable to be recharged such devices are lost along with the components that were invested into them. Batteries however can provide devices a larger pool of power points than most tech spirits can and also have the benefit of being rechargeable.
Powering a device with a Ghost Rock battery requires it to have been designed to do so, a process that takes more time than simply binding a tech spirit. Creating a device capable of receiving a Ghost Rock battery eliminates the junkers benefit of speed, doing so is no longer a single action and instead takes 1d20 minutes unless the power says otherwise. Junkers only have to spend the components required to cast the power they are using once.
The cost for Creating a Ghost Rock Battery as well as how many power points it contains depends on its size. Besides Components the Batteries construction also requires Ghost Rock in its construction. After calculating the maximum power points for your battery divide this number by 10 rounding up, this is how many ounces of Ghost rock is required. A Raise may increase the max power points of a battery but this is not counted towards the amount of Ghost Rock required.
Consult the chart below when creating a Ghost Rock Battery.
|!Battery Size|!coast|!Rank|!Max Power Points|
|''Small Battery''|1|Novice|4 + Spirit Die type (+2 on raise)|
|''Medium Battery''|3|Seasoned| 12 + Spirit Die type x2 (+4 on raise)|
|''Large Battery''|5|Veteran| 24 + Spirit Die type x4 (+8 on raise)|
When Drained and after their creation a Ghost Rock Battery must be charged which can be done with raw ghost rock and a G-Ray Collector. Burning one ounce of Ghost rock produces 50 power points over the course of one hour. This energy can only be stored in Ghost Rock batteries and any not collected during this time is lost.
When the bombs hit, each one left behind a whirling mess of screaming souls, called a “ghost storm.”
These fearsome tornadoes circle ground zero in a five mile radius. The “walls” tend to be about ten feet thick. They aren’t quite as physically violent as a real whirlwind, but they’re more dangerous to one’s soul. Unfortunately for the scavengers of the Wasted West, every city that got hit by ghost rock bombs has one of these whirling hellstorms surrounding it. If a traveler wants inside, he has to pass through the ghost storm.
Doing so requires a Vigor roll at –4. Failure gives the waster a level of Fatigue that fades after one hour. If the victim rolls a 1 on his trait die, he immediately gains a mutation and suffers 2d6 damage as he sprouts a third eye, a few extra fingers, or worse. Only magical armor protects against this damage. Snake eyes on the roll results in 3d6 damage and two mutations. Have fun with that. You draw a card for each mutation, the GM will tell you the results.
''Requirements'': Veteran
The bigger they are, the harder they are to kill. At least for most. But your hero knows how to find the weak points in massive creatures.
Your hero does +1d6 damage when attacking creatures three sizes or more larger than himself. An ogre (Size +3) with this ability, for example, gains the bonus only against creatures of Size +6 or greater. A human Giant Killer (Size 0), can claim the bonus against the ogre, however.
You are quite fond of exaggerating or outright fabricating tales that make you sound more important or powerful than you actually are, and you do your best to make sure others believe your delusions of grandeur.
As a Minor Hindrance, you will occasionally have to make opposed Persuasion rolls versus the Intuition of skeptics to keep from being revealed as a liar. As a Major Hindrance, your tales will be so fantastic that you will be required to make Persuasion rolls frequently, and receive -2 to the roll. You get -2 to your Charisma against characters that realize that you are a liar.
''Globe''
//est. population: 1300//
The small town of Globe looks at first glance to be just another survivor settlement. But it actually houses the New United Nations, a group made up mainly of ex-soldiers of all nationalities with a sprinkling of non-soldiers who possess important skills needed by the organization.
Formerly led by Colonel Leo, an Italion liaison officer serving with the Solar Empire military just before the Last War, the group changed command just before the Harvest when the colonel suffered a stroke. The old Lions second in command Sergeant Major Brilliant Ray, an earth pony syker, has taken over his position.
This organized group tries to follow the tenets of the UN and hold with the ideals of pre-war government, but uses a “hearts and minds” approach as opposed to the iron fist method of Hawk Morwenna. Concepts such as service, duty, and rank still hold very strongly with this group, and it is this sense of belonging to a greater whole that has attracted so many veterans.
The UN has sent scavenging expeditions into the Phoenix maelstrom for military gear with which to increase the range of their “peacekeeping operations.” The rank and file troopers are dressed in scavenged military uniforms of various nationalities, and carry a variety of weapons. They all wear light blue hats (mostly baseball caps), and any helmets are painted a matching blue. All of the hats are embroidered with the old UN symbol, courtesy of a still functioning embroidery machine salvaged from Globe.
Towns that accept their offers of aid are protected, while those that turn them down are left to their own devices. Currently, the UN forces number around 200 ex-soldiers, stationed mainly in Globe, with small units deployed in “peacekeeping” operations in several smaller survivor settlements in the surrounding area. They have several scavenged armored personnel carriers, along with a single functioning Tank.
''School'': Evocation
''Range'': Self
''Duration'': 1 hour per rank
''Trappings'': Horn radiating soft, golden light or darkness
//Glow//: Your horn glows with bright light that extends outwards in a 3” radius around you for the cantrip’s duration. You may modify the intensity and color of the light at will.
//Dark//: Same as above, but instead of light your horn projects an aura that lowers the ambient light within its radius to on stage lower than it currently is (normal light to dim, dim to dark, dark to pitch black), which affects things such as ranged attacks and stealth rolls within its radius, including ranged attack rolls made against a target within its radius.
''Cast Option'' (-1): The radius of Light and Dark both increase to your Smarts, and you may focus the light into a beam or other patterns.
Grace is a character’s acrobatic ability, coordination, and poise.
It is rolled when extraordinary balance is called for such as dancing, leaping onto a narrow ledge without falling, or walking a tightrope. It is also used when attempting to maintain control or perform stunts in the air for Pegasus ponies.
The TN to hit an opponent is his Parry (2 plus half the highest between Grace and Fightning).
Grace can be used in [[Tests of Will]] in order to outmaneuver and befuddle your enemies. This is an opposed roll between the hero’s Grace and his opponent’s Agility.
Sometimes it’s best to restrain an opponent rather than beat him to a bloody pulp. That’s where grappling comes in.
Grappling is an opposed Fighting roll that causes no damage. If the attacker wins, he’s entangled his foe. With a raise, his foe is also Shaken.
Once entangled, the defender may attempt to break free on his next action. Both the defender and attacker pick either their Strength or Agility and then an opposed roll is made. If successful, the defender is free but the attempt consumes his action. If he does so with a raise, he’s free and may act normally. Failure means he is still entangled. Instead of breaking free the defender may attempt a different action but at a –4 penalty.
After grappling, the attacker may attempt to damage his victim on subsequent rounds by making an opposed roll as above. On a success he does his Strength in damage (gaining the extra d6 for a raise as normal).
''Requirements'': Novice, Luck
The player draws two extra Bennies instead of one at the start of each session.
''Rank'': Veteran
''Power Points'': 10/20
''Range'': Touch
''Duration'': Instant
''Trappings'': Laying on hands, touching the victim with a holy symbol, praying, giving a drink of water.
//Greater healing// restores wounds more than one hour old. This use of the power requires 10 Power Points and otherwise works exactly like the //healing// power. It can also be used to neutralize any poison, disease, or sickness.
//Greater healing// can also heal Permanent Crippling Injuries. This requires an arcane skill roll at –4, 1d6 hours of time, and 20 Power Points. Only one casting is permitted per injury — if it fails, the injury really is permanent.
Your miserly hero measures his worth in treasure.
If a Minor Hindrance, he argues bitterly over any loot acquired during play. If a Major Hindrance, he fights over anything he considers unfair, and may even kill for his “fair share.”
Some people just aren’t good with modern devices. Characters with this drawback suffer a –2 penalty to the Repair skill at all times. In addition, when a hero uses a mechanical or electronic device, a roll of 1 on his skill die (regardless of his Wild Die) means the device is broken. The damage usually requires a Repair roll at –2 and 1d6 hours to fix.
|!Type|!Range|!Dam|!Cost|!Avail|!Wgt|
|''Bean Bag''|Half|3D6|$50| U |1|
| Notes: Nonlethal |<|<|<|<|<|
|''Buck Shot''|Cone|2D10|$100| U |1|
| Notes: Affects all targets within cone |<|<|<|<|<|
|''Flash Bang''|5/10/20 (or launcher)|NA|$150| U |1|
| Notes: -4 Vigor test to Resist being Shaken; LBT |<|<|<|<|<|
|''Frag''|5/10/20 (or launcher)|3D6|$100| U |1|
| Notes: MBT |<|<|<|<|<|
|''Inferno''|5/10/20 (or launcher)|3D8|$150| R |1|
| Notes: Chance to set fire to targets; MBT |<|<|<|<|<|
|''Riot Control''|5/10/20 (or launcher)|NA|$100| C |1|
| Notes: MBT; -2 Vigor test to Resist being Shaken (-4 in inclosed area); |<|<|<|<|<|
|''Smoke''|5/10/20 (or launcher)|NA|$25| C |1|
| Notes: -2 Penalty to attacks through Smoke; MBT; Lasts 2D4 rounds (4D4 in inclosed area) |<|<|<|<|<|
On occasion, griffins have been known to associate with ponies and other creatures in order to further their own goals. Griffins are mundane creatures and are not considered to be magical. For more information on griffins, see their entries in the section on Heroes, Personalities, and Savage Foes.
!!Race Features
* ''Talons/Beak'' - Griffins have talons, a sharp beak, and hind-leg claws that give them their reputation as fierce hunters. They are considered to be armed, as with other creatures with natural weapons, and may use their talons/beaks/claws as weapons that deal Str+d6 damage.
* ''Flight'' - Griffins can fly at their basic Pace and may ‘run’ while flying, which is referred to as swooping. While swooping, griffins move at twice their basic Pace plus an additional 2d6”. It costs 2” of movement to gain 1” of altitude. A griffin that is Shaken or suffers a wound or daunt while flying must make an immediate Grace roll (or -2 if they are flying at flanking speed) or fall 6”. They continue to fall each turn until they are no longer Shaken or hit the ground.
* ''Great Wings'' - While flying, griffins receive a +2 bonus to their basic Pace.
!!“Limbs”
* ''Talons'' x2: Can hold any kind of non-limb specific weapon as long they are strong enough. Flank weapons must be wielded by two talons.???
* ''Wings'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Limbs'': One of your hero's limbs was damaged. Roll 1d6: <ul><li>1-3 //Torn Wing//: Gain the Lame Wing Hindrance (or the Clipped Wings Hindrance if already Lame).</li><li>4-6 //Crippled Leg//: Gain the Lame Leg Hindrance (or the Missing Leg Hindrance if already Lame).</li></ul> |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5-6 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li></ul> |
Your hero’s a killer. His family’s probably pushing daisies, his enemies are wormling food, and even a few friends have holes in ‘em the same size as his own shootin’ iron.
Only Wild Cards can take this Hindrance.
The good news is your hombre adds +1 to every single damage roll he ever makes, whether it’s from Fighting, Shooting, arcane skills, Throwing things at people in a most inhospitable manner, or anything else.
The downside is that your hero winds up in the local survivor settlement’s jail or on the run a lot. And there’s worse. Any attack roll that comes up a 1 on the skill die automatically hits the nearest friendly character in sight Player characters are always first choice, but an allied NPC will
do in a pinch A Benny may be spent to change the roll, but a Benny spent is a Benny burned, as they say.
Even hand-to-hand attacks hit allies when that nasty 1 comes up This may require a little imagination, but either the weapon flies out of the hero’s hand and strikes his friend, or the killer moves adjacent to his
compadre and “accidentally” whacks him.
In either case, if the hero rolls snake eyes, he damages his ally as if he rolled a raise.
''Rank'': Seasoned
''Power Points'': 2+
''Range'': Smarts
''Duration'': 3 (2/round)
''Trappings'': Gestures, words of power, potions.
//Growth// doubles the overall size of the target. The subject gains +1 Size for each 2 Power Points invested when the spell is cast. Each step of Size grants the target a one-step increase to Strength and a point of Toughness. This spell may be cast multiple times on the same target, though the caster must track each casting separately.
//Shrink// reduces the Size of the subject by one step for each 2 Power Points, down to a minimum of Size –2 (approximately the size of a rat). Each level of Size reduction reduces the target’s Strength by one die type (minimum of d4) and his Toughness by 1 (minimum of 2).
Subjects from Size +4 to +7 have the Large ability and fill a 2” square on the table-top. From Size +8 to +10, they are Huge and occupy an area 3” square. If the target is +11 or more, he is considered Gargantuan and occupies a 4” square area. Creatures of Size –2 have the Small ability.
For unwilling targets, the caster’s arcane skill roll is opposed by their Spirit.
External weapons are vulnerable to damage, especially in collisions. A gun cover is an armored box around a single weapon, giving the gun an armor rating of 2 against called shots to them.
''Requirements'': Veteran, Spirit d6+
Given time, a person can become jaded to even Hell on Earth. This character halves the Fear Level penalty (round down) when making Fear checks.
Your warrior has an annoying and constant habit of some sort. Maybe she picks her nose, says “y’know” in every sentence, or chews gum like it’s going out of style.
A Minor Habit irritates those around her but isn’t dangerous. Your hero suffers a –1 Charisma.
A Major Habit is a physical or mental addiction of some sort that is debilitating or possibly even deadly. This includes drug use, chronic drinking, or perhaps even an addiction to virtual reality in a high-tech setting. A character who doesn’t get his fix must make a Fatigue check every 24 hours thereafter (see Fatigue on [[Hazards]]). The first failed roll makes the character Fatigued, then Exhausted. The final result is a coma for hard drug use, or a bad case of the shakes for things like alcohol or VR. Medical care may ease the symptoms. Otherwise the victim must live with the penalties for 1d6 days. Afterward, the hero must buy off the Hindrance by sacrificing an opportunity to Advance or he eventually falls back into his dependency.
''Requirements'': Novice, Smarts d6+, Notice d8+
No matter the situation, you always seem to be able to improvise something on he spot and can make the most of very little. You do not suffer penalties on Trait rolls due to lack of proper equipment, and when crafting items you may ignore the penalties for inadequate tools and materials (you must still have useable tools and materials to craft items, however). The extent of this is entirely up to the Game Master, though creative options should be rewarded.
<<<
''comments'': This one is about crafting, should we delete it? We still need tools in the gear section.
<<<
Characters who have lost some or all of their hearing have this disadvantage. As a Minor Hindrance, it subtracts 2 from all Notice rolls made to hear, including awaking due to loud noises.
A Major Hindrance means the character is deaf. She cannot hear and automatically fails all Notice rolls that depend on hearing.
''Requirements'': Wild Card, Novice, Spirit d8+
This adventurer has more lives than a truckload of cats. When forced to make Vigor rolls due to Incapacitation, he may ignore his wound modifiers. This only applies to Vigor rolls called for to resist Incapacitation or death (see [[Damage]]). He still suffers from wound modifiers for other Trait rolls normally.
Renders the vehicle immune to spike traps.
''Requirements'': Veteran, Hard to Kill
Your hero is tougher to kill than Rasputin. If he is ever “killed,” roll a die. On an odd result, he’s dead as usual. On an even roll, he’s Incapacitated but somehow escapes death. He may be captured, stripped of all his belongings, or mistakenly left for dead, but he somehow survives.
''Requirements'': Wild Card, Novice, Spirit d6+
Harrowed may only be selected at character creation. Some wasters are just too tough to die, so they come back from the grave. The price is an eternal battle for their own soul with the demonic “manitous” that provide their incredible toughness and power.
!!!Special Rules
* ''Dominion'': See below.
!!!Harrowed Edges
The moment a character is Harrowed—regardless of the particulars of how it happens—he automatically gets one Harrowed Edge for free.
* __[[Cyborg]]__: A special Background Edge for Harrowed cybernetically-enhanced through wartime technology, subjected to an AI that restricts both their actions and the manitou's dominion.
<ul>
<$list filter="[tag[Edges]tag[Background:Harrowed]sort[]] -[[Cyborg]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!Dominion
When a Harrowed first returns from the grave he remembers suffering through his worst nightmare. The manitou puts him through its own little corner of Hell??? every night, hoping to weaken the host’s resolve.
Recently deceased characters who first become Harrowed start with a Dominion of
0, as do characters with the Harrowed Edge. The host and the manitou are on roughly even footing.
When the Marshal tells you to make a Dominion roll, make a Spirit roll and add your current Dominion. This is opposed by the manitou. Dominion can never go below –4 or above +4.
!!!Dominion Table
|!Success |The Harrowed retains control and gains a point of Dominion, or two with a raise |
|!Failure |The manitou takes over (and no doubt gets up to some evil shenanigans); you lose 1 Dominion point, or 2 if the manitou scored a raise |
|!Tie |The manitou doesn’t take control, but your hero is Shaken |
!!History
Some individuals are just too ornery to lay down and die. But no human??? can do this alone. To come back from the grave, a deceased soul has to catch a ride with a demon—or a manitou as the Native Americans??? called them long ago. The manitou takes up residence in its host’s body and grants it power, such as walking and talking despite being deceased, healing, and more.
These undead heroes are called Harrowed, which means “dragged forth from the earth”.
A manitou in an undead host is slain if the brain is destroyed (one of the few ways they actually can be killed), so they only risk their otherwise eternal souls on those with exceptional abilities. Weak or infirm mortals are only resurrected temporarily (hence the monstrous walkin’ dead common to the Wasted West???) so that they aren’t permanently destroyed.
The host and the manitou need each other to keep the body moving, but they don’t share this dwelling peacefully. It’s a constant and hellish battle for control. For the most part, the manitou simply sits back and lets the Harrowed go about his daily unlife. From time to time, however, the demon tries to hop into the driver’s seat to do some dastardly deed. If the manitou is strong enough, it can take control of your hero for a while and wreak havoc among strangers and friends alike.
!!The Unlife of a Harrowed
So what’s it like being undead? A mixed blessing. A walking corpse is a tough hombre??? to take in a fight, but he has trouble making friends.
!!!Death Wounds
Whatever puts a fellow down the first time leaves a mark. The “death wound” is essentially healed but scarred or otherwise a deformity. A hero who was shot in the chest, for example, has a bullet scar there. One who was hanged might have a slightly crooked neck and a visible rope burn that never fades.
!!!Decay
Undead have pale, sallow skin???. They don’t rot since the manitous sustain their bodies with supernatural energy, but they don’t smell like roses, either. Anyone who gets up close and personal with a Harrowed picks up the smell of decay with a Notice roll.
!!!Food and Drink
Harrowed need meat—fresh or carrion—to patch themselves up. Each healing roll attempted by a Harrowed consumes about a pound of flesh. The Harrowed must eat the meat, but he doesn’t necessarily have to cook it first.
Harrowed don’t need water, and while we’re on the subject of libations, can’t get drunk either. For that matter, Harrowed aren’t affected by booze or drugs, and can’t be poisoned or catch a disease (at least, not a normal disease). They are affected by supernatural radiation normally, however.
!!!Fear
Being a walking corpse hardens the mind to horrific experiences. It doesn’t get much worse than clawing your way out of your own grave. Harrowed characters add +2 to Fear tests.
!!!Sleep
Whoever first said “he sleeps like the dead” obviously didn’t know any dead folks. Harrowed themselves don’t need sleep, but the manitou inside needs 1d6 hours of downtime out of every 24 to recharge the batteries, so to speak.
Unlike normal folk, Harrowed can’t really push it to stay awake; when it’s time to sleep, the manitou just shuts the Harrowed down. The Harrowed can try to resist, but he must make a Spirit roll every hour or keel over on the spot (and likely get buried again when folks discover his heart isn’t beating) This roll gets tougher as the night drags on: each additional roll suffers a cumulative –1 penalty, to a maximum of –3.
For the record, sleeping Harrowed aren’t completely oblivious. The manitou keeps one eye open for trouble, so Harrowed are just as likely as any other folks to wake up if trouble comes along.
!!!Undeath
Harrowed are a pretty sturdy bunch. They don’t suffer Fatigue from mundane sources, and non-lethal damage has about as much effect on them as a mosquito does on a steer. Harrowed suffer wounds normally, but they can’t be killed except by destroying the brain.
The only way a Harrowed dies is by a head shot. A called shot to the noggin will
do it, as will a Head result on the Injury Table. In case of the latter, if he fails his Incapacitation roll he’s dead for good this time.
Harrowed never bleed out and can ignore all effects thereof.
Harrowed Incapacitated by damage to other parts of the body are down for 1d6 days. They then regain consciousness and can basically crawl until they get enough meat to heal their wounds. This even regrows lost limbs.
Harrowed don’t feel pain and they don’t really bleed either. That’s not to say they don’t suffer wound penalties. In the case of the Harrowed, these penalties reflect damage to the Harrowed’s muscles and bones, making actions more difficult—it’s also a little distracting having your stinking, rotted guts spilling all over your boots.
<<<
''comments'': Hombre means man
<<<
''Rank'': Seasoned
''Power Points'': 2 – 4
''Range'': Smarts x 2
''Duration'': Instant
''Trappings'': Whirlwind, chaotic poltergeists, repulsion field.
While unpredictable, this spell allows a wizard to change the field of battle in an instant as targets are thrown in every direction.
With a success, the caster places a Medium Burst Template anywhere within range. Any character touched by the template must make a Strength roll (at –2 if the caster gets a raise). Any target that fails is knocked 2d6” in a random direction (roll a d12 and read the result as a clock facing) and becomes prone. If the target strikes an inanimate object, he is Shaken as well. Targets with cover may subtract the cover modifier from the total distance moved (to a minimum of 0), and flying targets suffer an additional –2 to their Strength roll. Additionally, roll a d6 to see if the flyer is moved toward the ground (1 – 2), stays level (3 – 4), or is moved away from the ground (5 – 6).
► ''Additional Effects'': For double the Power Points, havoc affects a Large Burst Template.
Heat, cold, hunger, thirst, lack of sleep, and other hazards can wear down even the hardiest heroes, sending them into a downward spiral that can lead to death if he can’t improve his situation. Drowning, fire, and falling are much more immediate dangers, while others are more insidious—such as poison and disease.
On the following pages are the most common hazards, with details on when a character must roll, any important modifiers, and how one recovers from any effects he’s suffered from it. Use these hazards mostly for dramatic purposes. A quick trip to the outhouse through a blizzard isn’t worth keeping up with, but a long trek through the Mountains of Dread certainly is, especially if it heightens the drama and makes the party think about things they might otherwise ignore, such as shelter, warm clothing, or eating their mounts to stay alive.
!!!Fatigue
Some hazards cause direct damage, but most cause Fatigue—stress or weakness that makes a victim less effective and can eventually lead to Incapacitation or even death. A character who falls victim to Fatigue passes through several declining states before finally succumbing to his stress. Each of these states and the penalties they incur are described below.
* ''Fatigued'': The hero is tiring quickly. All of his Trait checks suffer a –1 modifier. If he suffers Fatigue again, he becomes Exhausted.
* ''Exhausted'': The hero is fading fast. He suffers –2 to all Trait rolls. If he suffers Fatigue again, he’s Incapacitated unless the hazard description says otherwise.
* ''Incapacitated'': The victim collapses and is Incapacitated. See Incapacitation Effects under each Hazard for what happens next.
► ''Recovery'': Recovering from Fatigue varies depending on its source. Severe hunger requires food, cold requires warmth, and so on. Exactly how Fatigue is relieved depends on how it was acquired. This is explained under each Hazard.
► ''Multiple Hazards'': It doesn’t matter what the source of Fatigue is. If a hero who’s already Exhausted from hunger then suffers a level of Fatigue from cold, he becomes Incapacitated. A character suffering from multiple sources of Fatigue must address both to recover.
!!!List of Hazards
*[[Bumps and Bruises]]
*[[Cold]]
*[[Disease]]
*[[Drowning]]
*[[Falling]]
*[[Fire]]
*[[Heat]]
*[[Hunger]]
*[[Poison]]
*[[Radiation]]
*[[Sleep]]
*[[Thirst]]
''Requirements'': Novice, Spirit d8+
A hero with this Edge adds +2 to all Healing rolls (including natural healing rolls for his own wounds), whether natural or magical in nature. Up to five companions traveling with a Healer add the bonus to their natural healing rolls as well.
The Healing skill can be used to treat any wound suffered within the last hour. Each attempt takes 10 minutes.
A character may only attempt to heal fresh wounds on a given patient once within the hour they were sustained. A different character may attempt a Healing roll, but once attempted, that healer has done all he can for that particular patient.
A success on a Healing roll removes one wound, and a raise removes two. Further raises have no effect.
► ''Modifiers'': The healer must subtract the patient’s wound levels from his skill roll. A wounded character trying to heal his own injuries suffers from both effects (his wounds plus the wound penalty to the Healing roll).
Healing requires some basic supplies such as bandages and reasonably clean water. If these aren’t available, the healer suffers a –2 penalty to his roll.
► ''The Golden Hour'': After one hour, only natural healing or the greater healing power can help.
► ''Incapacitated Patients'': If a victim is Incapacitated the healer must first make a Healing roll to remove that state, He may then attempt further Healing rolls to remove actual wounds.
<<<
!!!The Golden Hour
In the real world, paramedics have a term called “the Golden Hour.” Patients who survive their initial trauma have about an hour to survive most life-threatening injuries. If they receive medical attention during that time, they can generally be saved. The longer the wait, however, the more likely the wounds are to be fatal.
In Savage Worlds, we extend this concept to healing in general. A medic who can treat a wound within the first hour can typically negate some of its ill effects. Besides reflecting the real-world concept, it also provides good game balance and drama. If the party could simply retry Healing rolls over and over at any time, their group would never experience the drama of being beaten up by the bad guys, then deciding whether or not to seek shelter and rest up, or striving on despite their gruesome wounds.
<<<
!!Natural Healing
Every five days, wounded or Incapacitated characters may make Vigor rolls. Wild Cards remove one wound level (or their Incapacitated status) with a success, or improve two steps with a raise. A critical failure on a natural healing roll increases a Wild Card’s wound level by one. If the hero already has three wounds he becomes Incapacitated. Extras lose their Incapacitated status with a success and expire if they roll a 1 on their Vigor die.
<<<
''comments'': Keep your extras in the fridge.
<<<
Subtract wound penalties from these rolls as usual, as well as any of the modifiers below. These are cumulative, so rough traveling in intense cold with one wound is a total penalty of –5, for example.
Medical attention means that someone with the Healing skill is actively checking the patient’s wounds, changing dressings, giving what medicines are available, and generally looking after the patient’s well-being.
!!!Natural Healing Modifiers
| !Modifier |!Condition |
| –2 |Rough traveling |
| –2 |No medical attention |
| –2 |Poor environmental conditions, such as intense cold, heat, or rain |
| — |Medical attention (1940 or earlier) |
| +1 |Medical attention (1941 or better) |
| +2 |Medical attention (2010 and beyond) |
!!Aftermath
It’s often important to know what happens to Extras who were Incapacitated during a fight. This creates interesting choices for the players after battle as they must decide what to do with their wounded companions and living captives. Do they leave their men behind? Do they slaughter their foes? These situations should present your group with chances to roleplay their characters, and challenges to their overall plans as they have to deal with prisoners or walking wounded.
After a fight, the players make Vigor rolls for all of their wounded allies and the GM rolls for wounded foes. With a success, the Extra is alive but Incapacitated (failure indicates death). With a raise, the wounds were only superficial and the character may function normally.
► ''Walking Wounded'': If it becomes important to know which Incapacitated characters can walk and which cannot, make a second Vigor roll for each. Those who make it are “walking wounded”—they may shamble slowly but still cannot fight or perform other useful actions.
Those who don’t make the roll can be moved but risk aggravating their injuries. They must make another Vigor roll for each and every hour of movement. Should they fail, they begin to die. They may be stabilized with a Healing roll at –2, but any further movement will no doubt be fatal.
''Rank'': Novice
''Power Points'': 3
''Range'': Touch
''Duration'': Instant
''Trappings'': Laying on hands, touching the victim with a holy symbol, prayer.
//Healing// repairs recent bodily damage. It must be used within the “Golden Hour,” though, for it has no effect on wounds more than one hour old.
For Wild Cards, each use of the //healing// spell removes a wound with a success, two with a raise. The roll suffers a penalty equal to the victim’s wounds (in addition to any the caster might be suffering himself).
For Extras, the GM must first determine if the ally is dead (see Aftermath on page 78). If so, no healing may be attempted. If not, a successful arcane skill roll returns the ally to the game Shaken.
//Healing// can also cure poison and disease if used within 10 minutes of the event.
Healing is the art of stopping wounds and treating existing injuries. In general, every success and raise on a Healing roll eliminates a wound. The healer must subtract not only his own wounds from the roll as usual, but those of his patient as well.
See the [[Healing]] rules for specific information.
► ''Relief'': In addition to treating injuries, the Healing skill may be used to reduce the effects of Fatigue, such as soothing aching muscles from Bumps and Bruises or a cough from smoke inhalation. Each attempt at Relief takes 10 minutes, and all modifiers to Healing rolls to treat wounds are applied here. A success on a Healing roll allows the patient to ignore up to 1 point of penalties from Fatigue or 2 points on a raise; further raises have no effect. This effect lasts a variable amount of time, based on the Game Master’s discretion (typically 1 hour to a day, depending on what caused the Fatigue levels). A character may only attempt Relief on a given patient once until their Fatigue is gone. A different character may attempt a Healing roll, but once attempted, the healer has done all they can for that particular patient.
Intense heat, typically that over 90 degrees Fahrenheit, can cause heat exhaustion and heat stroke, both of which are very dangerous. The actual danger is from dehydration, so well-supplied and conscientious characters can greatly improve their chances in extreme heat simply by carrying a good amount of water and drinking frequently.
When the temperature reaches 90 degrees or more, the GM should pay attention to how much water characters are able to drink. If they are able to drink at least four quarts of water a day, they may be tired and sunburned, but are in no immediate danger.
If that amount of water isn’t available, characters must make Vigor rolls every four hours. Subtract two from the roll if the hero has half the water he needs, and subtract 4 if he has less than half. Failure means the character gains one level of Fatigue.
* Subtract 1 from the roll for each additional 5 degrees above 90 degrees Fahrenheit.
* Add +1 if the hero stops all physical activity.
* Add +1 to the roll if the character has substantial shade.
* ''Recovery'': A victim who receives sufficient water recovers one Fatigue level every hour.
* ''Incapacitation Effects'': An Incapacitated character suffers heat stroke and may suffer brain damage. Make a Vigor roll. If the roll is failed, the victim’s Smarts and Strength decrease by one step permanently (to a minimum of d4).
''School'': Evocation
''Range'': Smarts (if in an enclosed area) or Smarts/2 (if in an outdoor or otherwise convective environment)
''Duration'': 1 hour per rank
''Trappings'': No visible effects
//Heat//: You may increase the temperature of the area within this cantrip’s radius by up to 20° Fahrenheit and change it in this range with a thought.
//Cold//: You may decrease the temperature of the area within this cantrip’s radius by up to 20° Fahrenheit and change it in this range with a thought.
''Cast Option'' (+0): The range of temperature that you can choose increases by 10°, or 20° on a raise.
Heavy duty shocks decrease the risk of damage while driving off-road. This modification gives a vehicle the Four Wheel Drive (4WD) ability. Additionally, the vehicle gains a +1 bonus to avoid Vehicle Fatigue; this bonus can be gained by adding the shocks even if the vehicle already has the 4WD ability.
|!Weapon|!Range|!Dmg|!~RoF|!Cost|!Avail|!Wgt|!Shots|!Min Str|
|''HI Brimstone'' (12mm)|30/60/120|2D8+1|4|$1500| VR |32|60|D8|
| AP 2; 3 Round Burst; Caseless Ammo; Snapfire |<|<|<|<|<|<|<|<|
|''LA SAW'' (5.56)|30/60/120|2D8|5|$750| R |29|100|D6|
| AP2; 3 Round Burst; Snapfire |<|<|<|<|<|<|<|<|
|''M2HB'' (.50)|50/10/200|2D10|3|$1000| R |84|250(B)|D8|
| AP 3; Heavy Weapon; Snapfire |<|<|<|<|<|<|<|<|
|''M-120'' (7.62mm)|30/60/120|2D8|6|$1500| VR |100|300|D10|
| AP 2; May Not Move; Snapfire |<|<|<|<|<|<|<|<|
|''[[M-200 PPSW]]'' (20mm)|24/48/96|2D10|3|$2000| VR |75|50|D8|
| AP 3; Heavy Weapon; Snapfire, Gyro Harness |<|<|<|<|<|<|<|<|
|''SA SAW'' (.50)|50/100/200|2D10|3|$1000| R |37|60|D8|
| AP 3; 3 Round Burst; Snapfire |<|<|<|<|<|<|<|<|
''Requirements'': Heroic, Harrowed
The Harrowed blasts raw fire drawn from the depths of hell from his fingertips???. This acts just like a flamethrower (see below as from Savage Worlds Deluxe) and causes 2d10 damage. This uses the Shooting skill to hit the targets, and a 1 on the Shooting die type causes a Shaken result on the Harrowed.
|!Flamethrowers | !Range | !Damage | !~RoF | !AP | !Burst | !Notes |
|Flamethrower | Cone Template | 2d10 | 1 | — | Cone |Ignores Armor |
''Hequston''
//Est. Population: 0//
Before the Last War Hequston was a major oil refinery hub terminal, but was best known as the home of the world famous Houston Spaceport and International Launch Center. Both the Solar Empire and the Lunar Republic, along with every nation with a space program, operated out of this facility at one time or another. Hill Storm Industries leased large areas, and it was from here that the Tunnel was built in orbit, as well as the ships that discovered the Faraway system.
When the bombs fell on Hequston, the ghost storms swept through the facility, killing almost all of the base personnel where they sat, stood, or slept. Within minutes, the Hequston Spaceport went from a bustling facility to a massive tomb. There’s not much left there these days. Fires from the refineries raged for the better part of six months after Judgment Day, laying waste to most of the metropolitan area. Junkers scavenged most of the valuable parts left at the spaceport long ago.
This noble soul never says no to a person in need. She doesn’t have to be happy about it, but she always comes to the rescue of those she feels can’t help themselves. She’s the first one to run into a burning building, usually agrees to hunt monsters for little or no pay, and is generally a pushover for a sob story
''Requirements'': Novice, Spirit d6+, Taunt d8+
You are a master of the well-timed insult and well-placed jab, and your taunts can so infuriate your enemies that they will focus their attention on showing you what’s what.
When you make a successful Test of Wills using Taunt, instead of gaining the bonus on your next action, the opponent must target you with any attacks, spells, or maneuvers on their next available turn, even if there are other valid targets. This overrides the effect of the Obsequious Edge if used.
<<<
''comments'': We are using Taunt keyed by Smarts, unlike the pony book. Do we change the requirements here?
<<<
''Highway Patrol''
//Est. Group Size: ???//
This group is still pretty young having only sprung up a few years ago but in that time they have certainly have made a name for themselves grinding road gang flank into the asphalt.
Cruising in small bands of four to five vehicles the Highway Patrol operate out of a well hidden secret base somewhere in the foothills of the Neighvada mountains. While no one can guess at the full size of there fleet, thanks to their great effort to keep such information private, many assume from there favored tactics (mostly ambushes and hit and run style attacks) and small patrol sizes that it cannot be to to large. What the Highway Patrol lack in size however they make up for with quality, every one of their vehicles are in top condition and heavily modified with high performance upgrades and enough firepower to go bumper to bumper with nearly anything on the road.
The founder and leader of the Highway Patrol is a pegasus mare named Bolt Charger. Bolt claims to have been a cop before the war but most agree she looks a bit young for that, a common theory of those who have seen her drive is that she may have been some sort of professional race car driver. Following judgment day Bolt Charger drifted about the wasteland as a lone road warrior, this existence ended however after finding a small town under siege by a band of road trash. Feeling her conscious emerging Bolt agreed to help the small town, and while the town did have to be abandoned Bolt managed to buy them enough time to evacuate everyone in town.
Inspired Bolt went on to found the Highway Patrol, today most ponies just call her either by her call-sign “Ghost Rider” or simply chief. Chief Bolt's Custom car “the Grey Ghost” is the prize of the Highway Patrols fleet of muscle cars and heavy sedans. Not one to sit back and simply delegate Bolt spends most of her time out on extended solo-patrol.
So if your in the neighborhood and run into some trouble on the road give a shout over the radio for Ghost Rider, if she is nearby and can hear you it wont be long till you see a gray streak with a skull painted on the hood coming to help.
Hindrances are character flaws and physical handicaps that occasionally make life a little tougher for your hero. Some Hindrances are more or less subjective (such as Overconfident). They’re there to help you roleplay your character, and might even net you more Bennies since the Game Master awards them for properly playing your character.
You can take one Major Hindrance and two Minor Hindrances. A Major Hindrance is worth 2 points, and a Minor Hindrance is worth 1 point.
''For 2 points you can:''
* Raise an attribute one die type, or
* Choose an Edge
''For 1 point you can:''
* Gain another skill point, or
* Gain additional money equal to your starting funds (if you start with $250, you gain an additional $250)
You’re free to take more if you think they fit your character description, but you don’t get additional points for them.
!!List of Hindrances
!!!List of Major Hindrances
<ul>
<$list filter="[tag[Hindrance:Major]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!List of Minor Hindrances
<ul>
<$list filter="[tag[Hindrance:Minor]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
''Requirements'': Seasoned, Command, Smarts d8+
This Edge strengthens the will of the men under the hero’s command. The troops add +1 to their Toughness.
''Requirements'': Novice, Arcane Background (Miracles), Spirit d8+, Faith d6+
Acolytes, clerics, paladins, holy slayers, and other avatars of the gods are frequently tasked with battling the forces of evil in the mortal world. This Edge gives them a slight advantage against such foes.
As an action, a priest or other holy person may call upon his chosen deity to repulse supernaturally evil creatures, such as the undead, demons, and the like. It also works on evil characters with the Arcane Background (Miracles) Edge.
Repulsing evil costs 1 Power Point and has a range of the character’s Spirit. Targeted creatures within that range must make a Spirit roll. Failure means the creature is Shaken; a 1 means it is destroyed. Wild Cards suffer an automatic Wound instead.
A character may also be an Unholy Warrior working for the forces of evil. In this case, he repulses good creatures, such as angels, paladins, or good characters with Arcane Background (Miracles).
Since Judgment Day, you can’t just roll up to a gas station and top off your tank. Spook juice is often hard to come by in the Wasted West, and resourceful road warriors have found alternate sources of fuel.
A Hooch Converter enables your vehicle to run on either alcohol or spook juice. When fueled up with alcohol (regardless of quality), it gets only half the usual mileage. This is rough on the engine, so Vehicle Fatigue rolls suffer a –2 penalty when running on booze.
Heads-up-displays (HUDs), which project data onto the inside of a car’s windshield, had become a common option before the Last War. With a few modifications to the system’s software, it’s possible to tie weapon systems into a vehicle’s HUD. In addition to displaying things like speed, fuel remaining, and route maps, a HUD can also show targeting cues for the weapons it is hooked to. The computer controlling the system needs to know where the guns are facing, so this system only works with fixed-mount weapons.
Survival checks to navigate while in the car receive a +2 thanks to vast stored maps from before the war. Likewise drivers benefit from a +1 to their drive checks.
When using weapons linked to the HUD change your wild die out for a D8. The bonus only apples against targets visible through the front windshield. The vehicle must have an intact windshield for the HUD to display properly.
Humans need approximately one pound of food every 24 hours. If sufficient sustenance isn’t available, a character begins to suffer from severe hunger.
Starting the first day after the meal was missed, the character must make a Vigor roll. Subtract 2 if the hero has less than half the required amount of food. Failure means the character gains a Fatigue level.
After the first day, the character must roll for hunger every 12 hours, and thirst every 6 hours.
► ''The Survival Skill'': A successful Survival roll each day provides enough food and water for one person, or enough for five with a raise.
* ''Recovery'': At least a pound of decent food allows a character to recover a Fatigue level every hour, or every 12 hours if he reached Incapacitated.
* ''Incapacitation Effects'': A character Incapacitated by hunger dies 3d6 hours later.
Your hero cannot read. He can probably sign his name and knows what a STOP sign says, but can do little else. He also doesn’t know much about math either. He can probably do 2+2=4, but multiplication and the like are beyond him.
Illiterates can’t read or write in any language, by the way, no matter how many they actually speak.
''Requirements'': Veteran, Harrowed
Most Harrowed take a while to get used to the fact that they don’t suffer pain anymore. They still grunt when shot and limp when their ankle gets chewed by some unholy varmint. It’s a mental thing.
Your Harrowed, on the other hand, has overcome this block. He ignores two points of wound penalties, cumulative with Nerves of Steel.
''Requirements'': Animal Companion, Survival d8+
Your animal companion may have a Size modifier of up to (+0), is treated as a separate ally in combat, and is treated as a Wild Card. On your Initiative Card, you may choose to act or have your companion act instead. If you take this Edge at start, you may start with an improved animal companion (Size +0 or more) instead of the one normally provided by [[Animal Companion]].
''Requirements'': Novice, Arcane Resistance
As above but Armor and resistance are increased to 4.
''Requirements'': Veteran, Block
As Block, but the hero adds +2 to his Parry.
''Requirements'': Seasoned, Harrowed, Cat Eyes
The Harrowed can see in the dark, ignoring all penalties for lighting. He can also see sentient beings’ auras. With a successful Spirit roll, he can divine an Extra’s attitude as defined by the Reaction Table (Savage Worlds). A raise tells the deader if the target is a supernatural creature of some sort.
''Requirements'': Veteran, Harrowed, Claws
The Claws inflict Str+d10 damage.
''Requirements'': Heroic, Coordination
As [[Coordination]], but you can ignore up to -4 off-limb penalties.
<<<
''comment'': What do you think?
<<<
''Requirements'': Veteran, Counterattack
As Counterattack but the character may ignore the –2 penalty.
''Requirements'': Novice, Extraction
As Extraction but if you succeed with a raise all opponents currently in melee with the character lose their free attack as your warrior withdraws.
''Requirements'': Heroic, First Strike
As [[First Strike]] but the hero may make one free attack against each and every foe who moves adjacent to him.
''Requirements'': Veteran, Frenzy
As Frenzy but the character may ignore the –2 Frenzy penalty.
''Requirements'': Seasoned, Level Headed
As above but the hero draws 3 cards.
''Requirements'': Veteran, Martial Arts, Fighting d10+
The character now adds +d6 to his bare-handed damage.
''Requirements'': Novice, Nerves of Steel
The hero ignores 2 points of wound penalties.
''Requirements'': Novice, Obsequious
As per Obsequious, but now Wildcard enemies are affected by Obsequious on the first round.
''Requirements'': Veteran, Rapid Recharge
The character regains 1 Power Point every 15 minutes.
''Requirements'': Seasoned, Signature Cantrip
When you take this Edge, choose one of your Signature cantrips. The bonus provided to your Signature Cantrip increases to +2. You may take this Edge multiple times, each time choosing a different Signature cantrip.
''Requirements'': Veteran, Harrowed, Stitchin’
The Harrowed may roll every hour.
+1 to Driving rolls made to avoid going Out of Control.
''Requirements'': Veteran, Sweep
As Sweep but the hero may ignore the –2 penalty.
''Requirements'': Legendary, Tough as Nails
Increase your hero’s Toughness by another +1.
''Requirements'': Veteran, Trademark Item
The bonus from your Trademark item increases to +2. You may take this Edge multiple times, each time applying it to a different Trademark item.
''Requirements'': Veteran, Trademark Weapon
As above but the bonus when using the weapon increases to +2.
''Requirements'': Seasoned, Smarts d6+
Heroes often find themselves fighting with pieces of equipment or furnishings not designed for combat. A character with this Edge has a knack for using such improvised weapons, and does not suffer the usual –1
penalty to attack and Parry when wielding them. See [[Situational Combat Rules]] for details.
Heroes often find themselves fighting with objects that aren’t intended for use as weapons. Torches, vases, chairs, tankards, bottles, tools, and other mundane items are frequently pressed into service in combat. And sometimes characters find themselves using existing weapons in improvised ways, defending with a ranged weapon in melee or trying to throw a hand weapon not designed to be thrown.
Such improvised weapons cause the wielder to suffer a –1 Fighting or Throwing penalty, as well as –1 to Parry. The Game Master is the final judge of an improvised weapon’s effectiveness.
* ''Small Weapons'': Range 3/6/12, Damage Str+d4, ~RoF 1, Min Str d4, –1 attack and Parry
* ''Medium Weapons'': Range 2/4/8, Damage Str+d6, ~RoF 1, Min Str d6, –1 attack and Parry
* ''Large Weapons'': Range 1/2/4, Damage Str+d8, ~RoF 1, Min Str d8, –1 attack and Parry
''Requirements'': Novice
You have become known for some sort of less-than reputable activity, such as being a con artist or mafioso, while escaping the judgment of the law.
Though this means that many are hesitant to deal with you, others are more likely to listen to you because of your underworld connections. You gain a +1 bonus to Charisma when dealing with characters who recognize you and acknowledge your accomplishments (those who do not know who you are or do not care are unaffected). You may take this Edge multiple times, up to a maximum of four times: each additional time you take Infamy, its bonus to Charisma increases by 1 (the second copy of Infamy you take gives you a +2 Charisma bonus, the third copy gives you +3 Charisma, etc.)
''Requirements'': Novice, Harrowed
Insects also have spirits in the Hunting Grounds and manitous have learned a few tricks to control them. A Harrowed with this power can control swarms of biting, stinging insects. The creatures aren’t created by the power, so they must be present in the surrounding area.
To summon the swarm, the Harrowed suffers a level of Fatigue. This gives rise to a swarm of insects (see Savage Worlds) under the undead’s control. The Harrowed cannot use this ability if he’s already Exhausted. The swarm dissipates when destroyed or after about five minutes.
Halves darkness penalties (round down) for any of the vehicle’s integral weapons.
The action in Savage Worlds is fast and furious. To help the Game Master keep track of who goes in what order and add a little randomness to the game, we use a single deck of playing cards with both Jokers left in to determine everyone’s initiative.
Deal in characters as follows:
* Every Wild Card is dealt a single card. Any allies under that player’s control act on his initiative card as well.
* Each group of Game Master characters, such as all zombies, all wolves, and so on, share a card.
Exactly which nonplayer character groups get their own cards is up to the GM. If he wants to break his 30 zombies into 5 groups of 6, that’s fine. Your goal is to do whatever makes running the battle as quick and easy as possible. Generally, Wild Cards and other unique characters get their own card.
► ''Shuffle'': Shuffle the deck after any round in which a Joker was dealt.
► ''Large Groups'': In very large groups, or time-sensitive games, the Game Master might want to try dealing a single card per side (heroes and villains). On the heroes’ turn, simply start at one end of the group and work quickly around. This will speed things up dramatically if that’s more important than varying initiative order. If one or more characters have Level Headed or Quick, let that apply to the draw (but only once).
!!!The Countdown
Once the cards are dealt, the Game Master starts the round by counting down from the Ace to the Deuce, with each group resolving its actions when its card comes up.
► ''Ties'': Ties are resolved by suit order: Spades are first, then Hearts, Diamonds, and Clubs (reverse alphabetical order).
!!Jokers
When a player draws a Joker, his character can go whenever he wants in the round, even interrupting another character’s action if he wants. In addition, add +2 to all Trait tests this round, and +2 to damage totals as well!
!!Hold
A hero may choose to wait and see what happens by taking a Hold action. He may then go later in the round if he chooses. A Held action lasts until it’s used. If a character has a Held card when a new round starts, he’s not dealt in. If a character is Shaken while on Hold, he loses his “Hold” status.
► ''Interrupting Actions'': If a character on Hold wants to interrupt an action (including a rival who was also on Hold), he and the opponent make opposed Agility rolls. Whoever rolls highest goes first. In the rare case of a tie, the actions are simultaneous.
!!Surprise
Combat often starts before everyone involved is prepared. An ambush, a sudden double-cross, or a trap might all give one side in a fight an edge over the other.
When this happens, the side that started the fight is not dealt cards but begins the fight on Hold. Victims of the surprise attack must make Notice rolls. Those who make it are dealt in as usual. Those who fail get no card in the first round of combat.
!!The Dealer is Cheating!
//Since the card dealing bot is incomplete and doesn't actually keep track of deck drawing yet, multiple people may be dealt the same card. In that case, they characters make an opposed Agility roll. Whoever wins goes first or may interrupt the other.//
When an attacker misses a Shooting or Throwing roll, it may sometimes be important to see if any other targets in the line of fire were hit. The GM should only use this rule when it’s dramatically appropriate—not for every missed shot in a hail of gunfire.
Each miss that comes up a 1 on the Shooting die indicates a random adjacent character was hit. If the attacker was firing on full-auto or with a shotgun, a roll of 1 or 2 hits the bystander. Roll damage normally.
Horses and other animals are possible targets when firing on mounted characters as well.
It’s sometimes easier to hit an adjacent victim than the original target using this quick system. That may not be entirely realistic, but it’s fast and simple, it makes large groups of people vulnerable to missile fire, and best of all, increases the drama of firing at opponents locked in melee with the attacker’s allies.
''Requirements'': Seasoned, Command
Leaders with exceptional reputations and experience in battle inspire the soldiers around them. They add +2 to Spirit rolls when recovering from being Shaken (this includes the original +1 bonus for the Command Edge).
''Rank'': Heroic
''Power Points'': 5
''Range'': Touch
''Duration'': 3 (2/round)
''Trappings'': Ghost form, body of shadow, gaseous transformation.
With a successful arcane skill roll, the user becomes incorporeal. He is unable to affect the physical world, and it in turn cannot affect him. He can travel through walls, and non-magical weapons pass straight through him. Any items carried at the time of casting are also incorporeal. While incorporeal, the mage may affect other incorporeal beings (including himself), and he is still susceptible to magic attacks, including physical powers, such as bolt, and magic items.
The character may not become corporeal while within someone or something. If that occurs, the caster is instantly shunted to the nearest open space, and he is Shaken.
In most heroic tales, characters engage in small talk that reveals something about their past or further develops their personality. Such “Interludes” are rare in roleplaying games where we focus primarily on action and the next encounter.
The system below formulizes these scenes and rewards players for roleplaying their character and revealing their backstory to the rest of the group.
!!Running an Interlude
The Game Master should run an Interlude during natural down-time such as when healing up after a fight, performing research, or between legs of a long trip.
To start, pick a player and have her draw a card. The Suit determines the general topic as shown on the Interlude Table below. Each entry requires the player to tell a story in the voice of her character. The tale should be substantial enough to take a few minutes and may draw in other characters’ participation as well.
The next time the Game Master feels an Interlude is appropriate, he should pick a different player so that everyone has a chance to participate and reap the rewards.
► ''Rewards'': After a player completes her tale, award her a Benny or an Adventure Card—her choice.
!!!Interlude Table
| !__Clubs__: //Tragedy// |Describe a tale of tragedy or misfortune from your hero’s past, featuring one of his Hindrances if possible. If the teller has a dark secret of some kind, hint strongly at it, drop clues, or otherwise give the rest of the group a glimpse into your hero’s dark side during your narrative. |
| !__Spades__: //Victory// |Tell the group about a great victory or personal triumph in your adventurer’s past. How did it affect him afterward? Was there a reward? |
| !__Hearts__: //Love// |Speak fondly of the character’s greatest love—lost, found, or waiting on him back home. What is her name? Where does she live? Why is the traveler not with her now? |
| !__Diamonds__: //Desire// |Tell a tale about something your hero wants (or already has). It might be a material possession, recognition, a political goal, or even a trip he wishes to take to some amazing destination. |
<<<
!!!Example: Crossing Mars
Colonel Green of the Martian 24th Highlanders, his guide Sanjay of the Gurkhas, Lady Emily, and big game hunter extraordinaire Sir John Hobbsworth cross the vast Martian desert. They face sandstorms, intense heat by day, and bonenumbing cold at night.
The Game Master decides to call for an Interlude after each encounter along the way.
Colonel Green goes first and draws a Spade. He describes with great vigor his travails against the wild Martians at Zimkangaroon and the tense battle he fought there. “It’s how I got this injury,” he says as he points to his Lame leg.
Later, after surviving a terrible sandstorm, Lady Emily draws a Heart. “I will withstand any trauma,” she begins, “if only it will help me discover what happened to my beloved Nathaniel, lost in the mountains I have asked you all to escort me to.” She then goes on about how she and Nathaniel met, traveled to Mars, and began a new life far away from the grime and corruption of New York City.
A day later, the party is ambushed by Martian raiders. Sanjay draws the next card—a Diamond. “See this bandit blade?” he says proudly. “It is a poor substitute for my kukri, awarded ten years ago when I joined the regiment.” Sanjay goes on to describe his training and some of the terrible battles he fought in the 6th Gurkha regiment before volunteering for service on faraway Mars.
Sir Hobbsworth is next, with a Club. “I have hunted every creature on earth. Now I’ve come to Mars to bag the biggest, most ferocious beast on all the known worlds—the crask. I’ll kill the thing and mount its head on my wall. And nothing will stop me.” Hobbsworth then hints that he hopes the monster slays him as he slays it—revealing his Death Wish and the chronic disease he picked up during the campaign in the process.
<<<
Intimidation is the art of frightening an opponent with sheer force of will, veiled or overt threats, or sometimes just really big guns. This is an opposed roll between the hero’s Intimidation and his opponent’s Spirit. See [[Tests of Will]] for game effects.
A game of survival and supernatural terror
[[Setting]]
[[Rules]]
[[Character Creation]]
<<<
Marshall, go [[here|http://tiddlywiki.com/static/WikiText.html]] for instructions on how to format articles. Remember to tag new articles, like Rules, Setting or Gear. Also check the Calling Marshall tag.
Erase this block of text when you are done editing.
<<<
Intuition is a character’s instinct and ability to read a situation correctly and quickly.
It can be rolled when trying to determine if another character is lying, come up with hunches based on clues and evidence, and tell if a particular option or decision ‘feels right’. A successful Intuition roll generally means that the Game Master will impart insights about the situation to the character, while an unsuccessful Intuition roll may result in the character coming to incorrect conclusions (sometimes disastrously).
''Requirements'': Novice, Smarts d8+, //Research d8+//, Streetwise d8+
Investigators have spent a great deal of time researching ancient legends, working the streets, or deducing devilish mysteries. Some of these heroes are actual Private Investigators for hire while others may be sleuthing mages in a fantasy world or perhaps inquisitive college professors stumbling upon Things Man Was Not Meant to Know in the dark of night. Investigators add +2 to Investigation and Streetwise rolls, as well as
Notice rolls made to search through evidence.
''Rank'': Seasoned
''Power Points'': 5
''Range'': Self
''Duration'': 3 (1/round)
''Trappings'': Powder, potion, iridescent lights.
Being invisible is a powerful aid in combat and useful for spying on maidens’ changing rooms as well.
With a success, the character is transparent, but a vague outline is visible. A character may detect the invisible presence if he has a reason to look and makes a Notice roll at –4. Once detected, he may attack the foe at –4 as well. With a raise, the character is completely invisible. The penalty to Notice or hit him is –6.
In either case, the power affects the character and his personal items. Anything picked up after the power was cast remains visible.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
''Requirements'': Seasoned, Pony (Any Breed), Agility and Strength and Vigor d6+
You are a paragon athlete, and possess much in the way of raw talent.
You gain a +1 bonus to all Agility, Strength, and Vigor rolls. In addition, you may treat your Agility and Strength attributes as if they were one die type larger for the purposes of gaining or improving skills. For example: you have a Strength die of d8. Skills tied to Strength may be increased to d10 as if they were still below the tied attribute.
A combat drug widely used by both sides in the Last War, Iron Pony adds +2 to the user’s Toughness. The drug lasts 2d10 minutes
This rifle, which equipped Bitish
Army infantry squads, fires a .50 gyrojet
round. Venting the exhaust through a
compensator allows users to ignore the
auto-fire penalty. Unlike the [[IW-91]], the
IW-40 cannot fire normal .50 bullets.
Originally used by Bitish forces in Equestria, this is a six shot, smooth bore revolver that fires gyrojet rounds. The weapon may be fired with ordinary .50 rounds, but its Range is reduced to 6/12/24, and it does 2d6+2 damage, AP 2 (not halved vs. armor).
''Requirements'': Novice, Smarts d10+
Through advanced schooling, booklearning, computer-enhanced skill programs, or just amazing intuitive perception, your hero has a talent for picking up skills on the fly. There is little he can’t figure out given a little time and a dash of luck.
Any time he makes an unskilled roll for a Smarts-based skill, he may do so at d4 instead of the usual d4–2.
Jammers use a variety of methods to prevent enemies from locking on to there aircraft. When active attempts to lock on are at a -4.
''Requirements'': Novice
When you are dealt a Joker, you or another ally of your choice that can see and hear you, immediately regains a Benny.
''Requirements'': Heroic
This hero hates losing. If he ties on an opposed roll of any sort, he wins. In addition, if his skill die on an opposed skill roll is a 1, he can reroll it (but must keep the second result, even if it’s another 1).
''School'': Evocation
''Range'': Touch
''Duration'': Instant
''Trappings'': Flash of white light and loud *bang*
The target of this cantrip must be a non-living object. //Knock// deals 2d6 damage to the target when touched with your horn, which can be used to cut ropes, break locks, or other similar utilitarian uses.
Knowledge is a catch-all skill that must have a focus of some sort, such as Knowledge (Occult) or Knowledge (Science). The player can choose the focus of his character’s knowledge, which might reflect his background and education. The skill can be taken multiple times with different focuses to reflect different areas of expertise. An archaeologist, for example, should have Knowledge (History) and Knowledge (Archaeology).
General focuses such as Knowledge (Science) are acceptable, but the GM should give a bonus to a character who has a focus more relevant to a particular task, such as using Knowledge (Biology) to identify a plant or animal.
Some Common Knowledge focuses are: Area Knowledge, Battle (used in [[Mass Battles]]), Computers, Electronics, History, Journalism, various languages, Law, Medicine (though actually caring for someone is the [[Healing|Healing(Smarts)]] skill), or Science.
► ''Common Knowledge'': Characters don’t need a Knowledge skill to know something about a particular field. Basic information should be covered by [[Common Knowledge|Skills]] assuming it makes sense within a character’s background. A mercenary with a penchant for reading or a young history student, for example, doesn’t necessarily need Knowledge (History). If tasked with a historical question, however, the two might roll normally while those without such a background roll at a penalty.
► ''Languages'': Knowledge can also be used to reflect
knowing a language other than one’s own. The higher the
level, the better the character can speak and mimic regional
dialects, as shown below.
In settings where inhabitants typically speak many
languages, see the Languages Setting Rule on page 94.
!!!Knowledge (Language) Table
| !Skill | !Ability |
| d4 |The character can read, write, and speak common words and phrases |
| d6 |The speaker can carry on a prolonged but occasionally halting conversation |
| d8 |The character can speak fluently |
| d10 |The hero can mimic other dialects within the language |
| d12 |The speaker can masterfully recite important literary or oral works|
''Requirements'': Novice, Martial Artist, Spirit d8+, Fighting d8+
Those who truly dedicate themselves to the martial arts often adapt very specific styles and specialties. Rather than list the hundreds of different styles such as Mantis or Drunken or Shaolin Temple, we’ve broken them down into general categories you can customize and describe for yourself.
A warrior may know multiple styles by taking this Edge additional times, though no specialty may be taken more than once. Combined with standard combat Edges such as First Strike and Frenzy, Kung Fu
warriors can be phenomenal fighters.
* ''Confusion'': This style emphasizes distraction, feints, or keeping a foe off-balance. The martial artist can make a Smarts trick and a Fighting attack with no multi-action penalty.
* ''Focus'': The martial artist focuses his mind to rule out all other distractions, increasing his accuracy over long distances He halves range penalties for all Shooting or Throwing attacks (–1 at Medium and –2 at Long).
* ''Defensive'': The martial artist moves in strange ways or perhaps senses where his opponent is about to strike. She gains an additional +2 to Parry when using the Full Defense maneuver (+4 total), and ranged attacks suffer a –2 to hit her when using the maneuver as well.
* ''Power'': The martial artist considers his Strength to be two die types higher for Fighting attacks, whether attacking bare-handed or with melee weapons. This increases damage and counts toward the minimum Strength for using a weapon.
* ''Precision'': The attacker looks for weak spots, pressure points, or other openings to increase the effectiveness of his strikes This counts as +2 AP to all Fighting attacks. With a raise on a Fighting attack, the martial artist does +1d8 damage instead of +1d6.
* ''Resilient'': This fighter has mastered mind over matter He gains the Hardy monstrous ability (see Savage Worlds).
* ''Speed'': The warrior draws an extra Action Card for initiative. This stacks with Level Headed and Improved Level Headed.
* ''Toughness'': Those who practice this style have learned to train their bodies and minds to ignore their body’s pain. This grants them +1 to Toughness and Vigor rolls made to soak damage.
* ''Trickery'': The martial artist adds +2 to in-combat Taunt rolls and Agility tricks.
This weapon was introduced near the end of the war to replace the
XM-21 as the standard assault rifle for the US military.
The weapon has a telescoping stock and marginally shorter barrel than many other assault rifles, which reduces its effective range slightly. The M-21 can mount a variety of accessories but was never designed to accept a bayonet. The LA M-730 grenade launcher was Designed to be fit on the underbarrel of the M-21
The M-730 is the Lunar Alliance’s standard single-shot 20mm grenade launcher. It was designed to be attached under the barrel of the LA
M-21, but has a foregrip and collapsible stock of its own, allowing it to be fired independently of the assault rifle. It fires all standard 20mm grenades.
This was the standard sidearm for the Lunar Alliance. While not as burly as the sidearms fielded by the SA this firearm offers burst fire options and Its integral laser sight grants +1 to Shooting rolls made against targets in short Range.
The sniper rifle of the Lunar Alliance, this state of the art
weapon boasts a laser sight, bipod, and scope. In addition, the special
electric trigger adds +3 when aiming rather than +2.
A past wound has nearly crippled your hero. His basic Pace is reduced by 2 and he rolls only a d4 for running rolls. A character’s Pace may never be reduced below 1.
When you take this Hindrance, you must specify whether you have a lame leg or wing (you must be a Pegasus or otherwise have wings to take the latter). With a lame wing, your basic flying Pace and running (swooping) dice are reduced in the same fashion with respect to flight but not your Pace or running dice while on the ground.
|!Weapon|!Range|!Dmg|!~RoF|!Cost|!Avail|!Wgt|!Shots|!Min Str|
|''Grenade Launcher'' (40mm)|75/150/300|as grenade|1|$2000| R |32|12|D6|
| Notes: |<|<|<|<|<|<|<|<|
|''LA M-720 Launcher'' (20mm)|50/100/200|as grenade|1|$2000| U |22|6| |
| Notes: |<|<|<|<|<|<|<|<|
|''[[LA M-730]] Launcher'' (20mm)|24/48/96|as grenade|1|$2000| R |3|1| |
| Notes: Weapon Attachment (May be fired independently) |<|<|<|<|<|<|<|<|
|''SA M-230 Launcher'' (40mm)|60/120/240|as grenade|1|$1250| U |27|1| |
| Notes: |<|<|<|<|<|<|<|<|
|''[[SA M-202]] Launcher'' (40mm)|30/60/120|as grenade|1|$3500| R |5|1|D6|
| Notes: Weapon Attachment |<|<|<|<|<|<|<|<|
|''Law Rocket Launcher'' (88mm)|30/60/120|4D8+2|1|$1000| VR |10|1| |
| AP 4; Heavy Weapon; Snapfire penalty; Single Use |<|<|<|<|<|<|<|<|
Requirements: Novice, Knowledge (Law) d6+, Shooting d6+, Intimidation d8+, Survival d6+, Major Vow (bring law to the Wastes)
“Law Dogs” is the name given to those who try to bring justice to the Wasted West. Some were actual local law enforcement personnel, a few might have been at the federal level, some might have even been Lunar Republic Rangers or Celestial Secret Service Agents (although most of these heroes died off in the Last War or the days that followed).
Whatever their history, they all seek to protect and serve those eking out a living in the Wastes All carry badges of some sort, giving them authority over those who respect the law (and +2 Charisma). Exactly
what this means depends on the situation, but most survivor settlements are happy to embrace an impartial, traveling Law Dog as judge, arbiter, and peace officer if there are problems.
The downside is that Law Dogs have vowed to protect and serve. Unlike Templars, they tend to help everyone they can.
''School'': Divination
''Range'': Self
''Duration'': Instant
''Trappings'': Swirling ring of light at your feet.
You are immediately able to discern any one of the following pieces of information: direction of true north, time of day, nearest source of water, nearest source of food, or direction of nearest wild animal.
''Cast Option'' (+0): You may determine all of the above pieces of information upon successfully casting the spell.
''Requirements'': Veteran, Command
Command comes easy to this commander. Those under his command work like a well-oiled machine when he’s in charge. Allies under the leader’s command roll a d10 as the Wild Die instead of a d6 when making group rolls.
''Requirements'': Seasoned, Smarts d8+
Fighters who can keep their cool when everyone else is running for cover are deadly customers in combat.
A hero with this Edge draws an additional Action Card in combat and acts on the best of the draw
''School'': Transmutation
''Range'': Smarts
''Duration'': 1 round
''Trappings'': Shimmering, blue concentric rings spinning around the levitated object
You may move a single inanimate object with your mind, with a weight of up to 10 pounds times your Spirit. Theobject levitates at a Pace of 3 anywhere within the cantrip’s range.
''Cast Option'' (-1): The duration of the cantrip becomes a number of rounds equal to your Smarts or until dismissed as a free action. During this time, you may levitate the object at a Pace of 3 as a free action once per turn.
''Requirements'': Novice, Smarts d8+, Knowledge (Any) d8+, Notice d8+, Cannot be Illiterate
This person has joined the Librarians, an order dedicated to the preservation of the knowledge gained before the Apocalypse. He has gone through his initial training and has been sent into the Wastes to rescue information.
Librarians receive a free hoofcorder when they join the Order to collect data Librarian hoofcorders store data on ghost steel versions of data slugs. Each is about the size of an AA battery and can store more information than a large library If lost, ghost steel slugs cost $10 to replace.
Librarians are expected to assist each other in acquiring data and to do whatever is required to recover lost information. Effectively, in addition to any other Hindrances, they also have the Major Vow (gather and restore knowledge).
The training of a Librarian grants them the Investigator Edge for free. Additionally, their goal of preserving information also gives them a +2 Charisma when dealing with any intellectual or scientific people.
Their mission of recovering books gives them a unique opportunity when
[[Scavenging]]. Whenever the character draws an Ace, they can choose to trade the listed result for discovering some book on the Librarians’ want list instead. They’re rewarded with a Benny immediately and get 2d6 x $100 on arrival back at the Grand Library with the volume (along with the accolades of their superiors).
All Librarians also have free access to the Grand Library in SacraCrillo. Research performed there can find just about any information with a successful Investigation roll The Marshal has more information on this
(page 119 of Hell on Earth Reloaded).
''Rank'': Novice
''Power Points'': 2
''Range'': Smarts
''Duration'': 30 minutes (1/10 minutes) or 3 (1/round)
''Trappings'': Illusionary torch, sunlight, darkness, thick fogs.
The ability to affect visibility (create or remove obscurement) is a pretty simple but very effective power.
//Light/obscure// can be cast on an inanimate object, but if the item is in an opponent’s possession, the arcane skill roll is opposed by Agility.
//Light// negates any darkness/obscurement penalty up to –6 in an area equal to a Large Burst Template for 30 minutes (1/10 minutes). The reverse of the power, //obscure//, creates a –6 obscurement penalty of the same size lasting for 3 (1/round).
''Requirements'': Novice, Agility d6+
You have a very soft hoofprint, and you are able to walk daintily without disturbing the terrain.
You gain a +2 bonus to all Trait rolls made to avoid dangerous terrain or other hazards, such as not causing an avalanche while walking along rocks, setting off traps, making noise while sneaking, or not sinking into thick mud when trying to walk across it. In addition, you may ignore 1 point of penalties for trying to take an action while Running or Swooping.
''Requirements'': Novice, Smarts d6+
The character has an ear for languages and a rare talent for recognizing similarities between them. A character with this Edge starts with a number of languages equal to his Smarts die, and can make a Smarts roll at –2 to make herself understood in any language or dialect she has heard spoken for at least a week.
''Requirements'': Novice, Vigor d8+
Your hero processes alcohol far differently than most. The round after consuming a stiff drink (at least 8 ounces of hard liquor or equivalent), the character’s Vigor increases by one die type (increasing Toughness as well). The hard drinker can also ignore one level of wound modifiers (which stacks with other abilities that do the same).
The effect lasts for one hour after it begins. If the drunkard seeks inebriation he suffers –2 to Smarts and Agility-based rolls for as long as he continues to drink and the next 1d6 hours thereafter.
''School'': Divination
''Range'': 1 mile
''Duration'': Instant
''Trappings'': No obvious effect
When you use this cantrip, choose a single non-living object of importance to you; it must be something you have had extended contact with or have studied extensively within the last month, and that you can picture what it looks like. You instantly know precisely where it is as long as it is within range. Examples include a well-read book, favorite bauble, or coin purse.
''Cast Option'' (-1): Locate Object’s range increases to 1 mile x Smarts.
*The Great Northwest
*The High Plains
*The Great Basin
*[[The Maze]]
**[[Purgatory]]
***[[The Fire Brigade]]
**[[Lost Pegasus]]
***[[Dead Pool]]
***[[Rock Island Prison]]
***[[Old Prosper Mission]]
**[[The Canyon Causeway]]
**[[Movie Town]]
***[[The Director]]
**[[Sacracrillo]]
**[[Lynchburg]]
**[[Turtle Island]]
**[[Sham Fan]]
**[[The Road Orcs]]
**[[Highway Patrol]]
*[[The Badlands]]
**[[Fuel Towns]]
***[[Oil Town]]
***[[OPEC]]
**[[Phoenix]]
**[[Globe]]
**[[Dead Towns]]
**[[Whimsy Islands]]
**[[Hequston]]
**[[The Lone Biker]]
**[[Fort 51]]
**[[The S-Mart Overlord]]
**[[Shiitake Flats]]
*East Coast & Missipony Delta
Lockpicking is the ability to bypass mechanical and electronic locks. Lockpicking is also used to disarm the catches and triggers on traps, unless a more relevant skill seems appropriate for a particular trap.
''The Free City of Lost Pegasus''
//Est. population: 2000//
''History''
Few Cities in Equestria have as long and twisted of a story behind them as the mist shrouded city of Lost Pegasus. Long before it was known as Lost Pegasus or came to rest on the West coast of Equestria the City went by another name: Cloudsdale. Once the largest of the Pegasus Cloud cities in its day Cloudsdale was a mobile wonder and one of the greatest weather facilities at the time. When the Ghost-Rock Rush started Cloudsdale followed along, dispatched by royal decree to aid colonization of the arid southern badlands.
To this task Celestia appointed a Pegasus by the name of Grim Forecast to lead the weather efforts. Chosen not only for his years of experience Grim was also a fervently loyal subject to the Crown. Under his leadership Cloudsdale made great strides in many regions with taming the weather in the badlands all while making extremely generous donations to Canterlot on a regular basis, so its almost understandable why officials would turn a blind eye to some of Cloudsales more questionable practices.
Under the Leadership of Grim Forecast and his inner circle of followers much of the area of the land that Cloudsdale was responsible was left to starve as Grim extorted exorbitant taxes and fines for rainwater. With few options for fresh water to help irrigate there lands the settlers bent to the will of Cloudsdale. As whole sections of the frontier began to starve Grim expanded his control of Cloudsdale showering those he favored with riches earned from his scheme, removing those who did not see eye to eye with him, and paying off any officials who poked there muzzles into Cloudsdales business.
Eventually an unnamed group of ponies stood up on behalf of the Oppressed settlers and through an impressive (If Treasonous) display of stealth and sabotage set Cloudsdales weather factories ablaze. In a massive rolling storm of Discordian proportions the city crashed down along the coast and sank into the waters. No one knows what became of the ponies who brought down the cloud city or Grim but many believe that the spirit of Grim Forecast still haunts the Ruins of old Cloudsdale.
The crash of Cloudsdale was a massive ecological disaster which forever transformed the face of the region now known as the Maze. As the Weather factories spiraled out of control Cloudsdale unleashed massive storms in all directions which shattered and flooded the coastline creating a labyrinth of patchwork islands. These islands are shrouded even to this day by an unending layer of dense fog and cloud cover which bubbles to the surface from the still churning weather vats beneath the waves. No efforts to squelch the centuries old factories beneath the waves have ever met with success.
In time small refugee camps started by survivors of the crash formed a proper settlement which became known as Lost Pegasus in memory of the devastation of Cloudsdale. Sizable portions of the population repented for the cities past sins and dedicated themselves to the ideal of harmony. This following remains even today long after the bombs dropped.
Already suffering Lost Pegasus remained neutral for the duration of the civil war siding with neither the Solar empire nor the Lunar Republic. While Lost Pegasus never truly gave up there independence they did eventually agree to terms with the Solar empire to become a protectorate of the crown and by the time of the great war had regrown into a large thriving city.
When the final days of the war arrived and the bombs flew Lost Pegasus was as much a target as any other major city in Equestria but miraculously none of the bombs managed to strike down within the city proper. The City remained untouched even as the outer civilian districts suffered the brunt of the assault and by the time the dust settled Lost Pegasus still stood. The inhabitants of the city blessed there good fortune and some even speculated that maybe the Ghost of old Grim Forecast himself might have had something to do with Lost Pegasus good fortune.
Whatever the reason for the Cities suspiciously good fortune the celebration was not long lived as months later Famine herself, one of the four Alicorns of the apocalypse, marched on the city with a seemingly unending army of faminites (Undead blessed by Famine which spread there infection at frightening speeds). Famine Laid siege to Lost Pegasus for nearly a year as the city's inhabitants fought back against the tide of undead until at long last Famine breached the cities wall and laid hoof into Lost Pegasus.
As the Reckoner entered the city all seemed lost of a moment until a brilliant gout of searing white light split the sky and struck the Mare sending her spiraling into the coast. Chain blasts of light raked across the city decimating Famines forces and destroying much of what was left of Lost Pegasus triggering an quake that sunk still more of the city into the water. Famine crawled out of the murky ocean wings crippled from the unexplained attack and limped away Never to be seen by the city again.
''Lost Pegasus Today''
While the strange blast destroyed many of the undead withing the city they continued to plague Lost Pegasus all the way up until shortly before the Battle of Worms when they up and disappeared. Unknown to the city at the time Famine had recalled her forces to prepare to stand alongside her fellow Reckoners against Sombra in that great battle. Today Lost Pegasus is relatively Undead free only seeing the occasional few faminites that for some reason or another were unable to exit the city, by far the largest concentration of the dead lies within the bloody depths of the Dead Pool (see below).
After being destroyed a second time Lost Pegasus inhabitants began building floating docks and boardwalks between boat homes, Still standing buildings, and (when shallow enough) even homes on stilts. Eventually these interconnected platforms grew into floating villages which became known as "hoods" which typically engulf one to two city blocks each.
The Hoods are mostly cooperative but no larger force or faction holds sway over more than one at a time and for the most part each Hood looks after itself. From time to time new Hoods will spring up but not many survive long enough to become established having to deal with Pirates, mutants, and other threats within the city.
One of the greatest threats to Lost Pegasus is the lack of food. While some of the larger and more robust Hoods have hydroponic facilities or other methods of farming and all Hoods fish there simply is not enough to go around at the end of the day. Nearly everyone within the sunken city gos hungry surviving off just enough to live another day if even that. Food merchants can make a killing in Lost Pegasus but are often prized targets for the Pirates and gangs of the area.
Though not truly united the Hoods of Lost Pegasus form one of the largest populated cities left in Equestria.
''Ponies/Areas of Interest''
*[[Dead Pool]]
*[[Rock Island Prison]]
*[[Old Prosper Mission]]
Your character may not be a hero, but he’d give his life for his friends. This character can never leave a man behind if there’s any chance at all he could help.
''Requirements'': Novice
The adventurer seems to be blessed by fate, karma, the gods, or whatever external forces he believes in (or believe in him!). He draws one extra Benny at the beginning of each game session, allowing him to succeed at important tasks more often than most, and survive incredible dangers.
''Requirements'': Unicorn pony, Novice, Arcane Background (Witch), Witchcraft d8+, Female
Your witch is one of Trixie Lulamoon's clones. Though not a TRUE full blooded Devilin witchcraft is still in her blood, her very DNA. She’s a conduit for supernatural powers of a witchy variety, and like all Devlin mares she’s more than a little easy on the eyes but more than that she is naturally charismatic. You gain the Charismatic edge for free.
She can also spend an Ingredient to make her spells harder to resist. Each Ingredient spent this way gives the target a –1 penalty to resist the spell. Alternately, she can give a damaging spell AP 1 for each Ingredient expended. Your character can’t spend more Ingredients than half of her Smarts die type on a single spell this way.
The computer banks responsible for educating your hero while she was in suspended animation within the artificial mirror pool vats weren’t updated once the Last War began. As a result, she has virtually no knowledge of what’s changed in the world since the first bombs began falling. Your character has the Clueless Hindrance with regards to anything that occurred after the beginning of the hostilities.
Thanks to the techniques used by Genetech, she’s not an exact duplicate of either Trixie or the other clones, but she does share an uncanny resemblance to them. Given the Devilin family tendencies, this could cause problems for her if one of her sisters has been raising hell in the wrong places. For obvious reasons, this Edge can only be selected at character creation.
Lies just don’t come naturally to this brainer. That sounds good, but often causes problems when dealing with more nefarious types. Subtract 4 from any Persuasion rolls where lies—even little white ones—must be told.
''Lynchburg''
//est. population: 750//
Lynchburg is an old mining town near the center of the Maze. It didn't get any bombs during Judgment Day and no so survived relatively intact.
The towns main business is a supply depot and stopping-off point for salvagers and ghost rock miners, with spook juice refineries running day and night. The ponies here don't get many visitors outside of Maze locals coming to trade but are more welcome of outsiders than most places these days. Its a good place to replenish supplies or hire a local guide to the Maze.
Lynchburg has a good harbor, an old Solar Empire navy yard, and a well-stocked marina at water level. A elevator connects the lower portions of the town at water level to the mesa above which houses the town proper, the town charges a fee for outsiders to use the elevator. In the city itself one can find the GoldenRod Medical Center, the closest you're going to find to a modern hospital in the Maze. All in all Lynchburg is a convenient center for any travelers to the Maze great for grabbing supplies or kicking your hooves up for a spell.
It should be said however that Sheriff Wanda Right has no compunction about tossing troublemakers off the 100-foot mesa into the sea if they start making trouble in her town.
The M-200 Pony Portable Support Weapon was developed in Germaney, but sold to both the NLR and SE prior to the Last War. It is a bulky weapon consisting of a backpack-like ammo container which feeds ammunition via a flexible metal tube. All told, the M-200 is nearly four feet long, and the entire weapon system weighs in at 75 pounds when fully loaded.
It is normally used in conjunction with a gyroscopic harness (included in the price and weight) that not only helps offset the unbalancing effect of the long barrel, but also helps compensate for the gun’s massive recoil. When using the harness, a firer suffers only a –1 penalty for full automatic fire. Without the harness, the M-200 imposes a –4 penalty
to all Shooting rolls, due to its awkward weight distribution and recoil.
''School'': Transmutation
''Range'': Self
''Duration'': Instant
''Trappings'': Flash of blue light
Designate a single small bag, container, purse, or other similar container. That container now contains a single small non-living, non-magical common object (or a few similar objects such as matches or marbles) of no more than a few ounces in weight of your choice. The object continues to exist for an hour after being summoned. Common choices are things like needles, scissors, glasses, magnifying
glasses, or other small tools or implements.
''Cast Option'' (-2): The object is permanent until dispelled as a free action. You may only have one permanent object from Magic Box in existence at once, though you may have other temporary objects in addition to it.
''School'': None
''Range'': Touch or 1”
''Duration'': 1 minute per rank
''Trappings'': Faint glow that matches your eye color
Magic Trick can be cast once per turn as a free action. Magic Trick allows you to do one of the following at a time: levitate and manipulate small objects weighing less than five pounds within 1”, create harmless sensory effects (flashes of light, sounds, scents), color or clean/soil objects such as cloth or paint, or make a small object disappear for a few seconds (sleight of hand) within 1”. The Game Master has final say on the limits of this cantrip.
''Cast Option'' (-1): The effect generated by Magic Trick is permanent until dispelled as a free action; this is usually only for minor effects (at the Game Master’s discretion).
► ''Magic Weapon Trick'': Magic Trick can be used to wield weapons, however the attack rolls will use the lesser between Spellcraft and the adequate combat skill. Spirit is also used instead of Strength for wielding requirements and melee damage. The weapon must not weight more than 5 lbs. On a roll of 1 on the trait die, the recoil or poor grip flings the weapon 2” away in a random direction, going beyond the reach of the Magic Trick and dispelling it.
<<<
All unicorns start with Magic Trick automatically: it is the ‘swiss army knife’ of spells. The wording of the spell is intentionally open, as it is meant to be
used for a variety of different practical uses such as opening doors, adding flourish to a display, and anything else the player wishes.
<<<
''Requirements'': Seasoned
The hero excels at taking controlled, measured shots. If he does not move in a turn, he may fire as if he took the Aim maneuver. Marksman may never be used with a Rate of Fire greater than 1.
Marksman works with both Shooting and Throwing.
''Requirements'': Novice, Fighting d6+
This character is highly trained in hand-to-hand fighting. He is never considered unarmed in combat and so is never subject to the Unarmed Defender rule (see [[Situational Combat Rules]]). With a successful unarmed attack, he adds +d4 to his Strength roll (as if he were using a small weapon).
''Requirements'': Legendary, Improved Martial Arts, Fighting d12+
The warrior is deadly with his hands. He adds +2 to his bare-handed damage every time he takes this Edge, up to a maximum of five times for a total damage bonus of +10.
Truly savage worlds often feature wars with massive and bloody battles. The system below rewards players who not only take part in these battles, but are instrumental in gathering political support, recruiting troops, and deciding strategies that win them.
These rules allow the Game Master to handle everything from a small warband holding a fort against an undead horde to full divisions of troops fighting a massive field battle or a planetary assault from a space-based invasion fleet. It’s abstract, but provides a narrative base for heroes to plan, get involved, and even become involved in the fight themselves.
!!Setup
To start, give the larger or more powerful army 10 tokens. Give the opposing army a proportional number of tokens. If one army has 10,000 men, for example, and the other has 7,000, give the smaller army seven tokens.
The Game Master will need to adjust for special or elite troops, better equipment, and so on. It’s not important to count every point of armor and damage point—just get close enough to give a reasonable approximation of strength, adjust where needed, and trust in the dice and the player’s actions to handle the rest.
!!!Knowledge (Battle)
Once the odds are determined, both sides make opposed Knowledge (Battle) rolls, modified by any of the circumstances below:
!!!Battle Modifiers
| !Modifier |!Circumstance |
| +1 |The side with more tokens adds +1 for every token it has more than the foe each round |
|!Artillery or Air Support |<|
| +1 |Light |
| +2 |Medium |
| +3 |Heavy |
|!Terrain |<|
| –1 |Foe has slight advantage |
| –2 |Foe has minor advantage |
| –3 |Foe has major advantage |
|!Battle Plan (GM’s Call—determined each round) |<|
| +/–? |The army gains a penalty or a bonus depending on the tactical decisions made by the leader each round. Springing a hidden flank attack, sending reserves to a crucial front, and so on, all add to the Battle roll. |
► ''Casualties'': Each success and raise causes the other side to lose one token. Casualties are generally distributed evenly throughout the force.
► ''Morale'': Each round in which an army loses a token, its leader must check morale. This is a Spirit roll modified by the circumstances below. With a success, the army fights on and both sides make another Knowledge (Battle) roll as described above.
Failure means the army is defeated but the troops conduct an orderly retreat. Make one more Battle Roll and then end the fight. (A leader may voluntarily choose this option as well.) On a result of 1 or less, the troops rout and the battle is over immediately.
!!!Morale Modifiers
| !Mod |!Situation |
| –1 |For each token lost in battle so far |
| +2 |The army is made up predominantly (75% or more) of undead or other fearless drones |
| +2 |The army is within major fortifications, such as fortress or prepared positions |
| +2 |The army cannot retreat |
!!!Characters in Mass Battles
The heroes of your campaign aren’t likely to sit idly by while war rages around them. Fighters may want to charge the gates, wizards unleash fireballs into the masses, and a gallant knight may ride his trusty warhorse directly into the enemy formations.
Those who want to get involved can dramatically affect the results of the battle. Have each character make a Fighting, Shooting, or arcane skill roll (their choice) each action and consult the Character Results below.
► ''Modifiers'': Add or subtract the number of tokens difference between the heroes’ side and their opponent. If the enemy has 8 tokens and the heroes have 5, for example, the heroes must subtract –3 from their attack rolls.
Also add +1 to the roll for each Rank a hero has above Novice to account for his various Edges and abilities that aren’t reflected in a straight skill roll.
!!!Character Battle Results
* ''Failure'': The hero is stopped by overwhelming numbers, an unfortunate tactical development, or bad fortune. He suffers 4d6 damage.
* ''Success'': The hero fights well and adds +1 to his side’s Battle Roll, though he suffers 3d6 damage.
* ''Raise'': The hero wreaks havoc, slaying enemy leaders and destroying important assets. He suffers 2d6 damage, but adds +2 to his side’s Battle Roll.
* ''Two Raises'': The warrior covers himself in glory! Scores of foes fall before him and his success inspires his allies to fight like demons. His efforts add +2 to his side’s Battle Roll and he emerges from the fight unscathed.
► ''Ammo'': If it’s important to track, each round a hero enters the fray and uses his Shooting or an arcane skill (such as Spellcasting), he expends some of his ammunition or Power Points.
Arcane types use 2d6 Power Points per round. Characters with ranged weapons use 3d6 shots for ranged weapons (triple that for weapons that usually fire bursts or full-auto). If the hero winds up without any ammo or Power Points she’ll have to change tactics for the next round.
!!Battle Aftermath
When one side routs, retreats, or runs out of tokens, the battle ends and casualties are removed. Some of the troops lost in the battle can be recovered as they regroup or receive first aid.
If it’s important to know how things stand after the fight, roll 1d6 for each token lost. The victor recovers a lost token on a roll of 4-6. The loser recovers a lost token on a roll of 5-6. A routed army recovers tokens only on a roll of 6.
After the battle and once both sides have figured out how many tokens they lost, remove the actual casualties from their armies. The side that started with the larger force simply multiplies the number of tokens lost by 10%. Losing four tokens, for example, means the entire army suffered 40% casualties. The side with the smaller force must figure out what percentage of his men are left. If he started with 8 tokens and ends up with only 2, for example, he’s lost 75% of his force.
Once you’ve figured the total percentage of casualties to your army, distribute the losses among specific units as evenly as possible.
<<<
!!!Example: The Invasion of Earth
The insectoid Gorram Empire is conducting a planetary assault of Earth. The Gorram have 10 tokens that represent their massive invasion fleet and armored walkers with fiery death rays. Earth has all the world’s militaries at their disposal. Given the superiority of Gorram technology and greater numbers, the GM decides the Earth Defense Force (EDF) gets 8 tokens.
Both sides have heavy artillery and air support (+3 to both sides), but there are no terrain advantages since it’s a worldwide battle.
The Gorram Empire makes a Knowledge (Battle) roll and gets a 13. The player characters load up in stratospheric fighters and lend a hand. Collectively, they suffer some damage but also add a grand total of +3 to the roll. The EDF’s Knowledge (Battle) final total is 17—Earth wins by 4. That destroys two of the invaders’ tokens and 20% of their force.
The Game Master describes the first few hours of the invasion and a spirited defense by earth’s militaries. The evil insectoids are dealt heavy losses, but are far from defeated, and the battle goes on.
<<<
''Requirements'': Wild Card, Legendary, Expert in affected Trait
The character’s Wild Die increases to a d10 when rolling a particular Trait of his choice. This Edge may be chosen multiple times, though it only affects a particular Trait once.
''Requirements'': Legendary, Weapon Master
Increase your hero’s Parry by another +1.
''Requirements'': Novice, Smarts d6+, Repair d6+, Notice d8+
This character can improvise something when the need for a tool arises. He suffers no negative penalties on Trait rolls for lack of equipment in most situations.
In addition, given a few simple tools, props, or devices, he can generally rig devices to help escape from death-traps, weapons to match some bizarre need, or otherwise create something that’s needed when such a thing isn’t actually present. The extent of this is completely up to the Game Master, but creativity should be rewarded, particularly in dire situations where few other answers are possible.
This fellow is ill-tempered and disagreeable. No one really likes him, and he has trouble doing anything kind for anyone else. He must be paid for his troubles and doesn’t even accept awards graciously. Your character suffers –2 to his Charisma.
|!Equipment|!Cost|!Wgt|!Avail|
|''Medchip''|Free| | R |
| Notes: +2 to checks to treat with a Scanner or +4 with a Medboard; GM approval needed to take at character creation |<|<|<|
|''Medchip Scanner''|$50| 1 | S |
| Notes: Reads Medchips; +2 to checks to treat ponies with a Medchip |<|<|<|
|''Medboard''|$250| 15 | S |
| Notes: Reads Medchips; +2 to treat Ponies; +4 to treat ponies with a Medchip |<|<|<|
|''Medkit''|$100| 4 | S |
| Notes: On a Natural one the medkit needs to be restocked and all attempts to use it suffer a -1 penalty until then |<|<|<|
|''Medkit Restock''|$25| | S |
|''Sprayskin'' (20 applications)|$200| .5 | U |
| Notes: Automatically stabilizes Bleeding patients; +2 bonus to Vigor roles to resist infection and aid natural healing |<|<|<|
|!Weapon|!Damage|!Wgt|!Cost|!Avail|!Equip|!Additional Notes|
|''Axe''|Str+D6|2|$50| C |Mouth/Talons| |
|''Axe, Battle''|Str+D8|10|$75| U |Mouth/Talons| |
|''Axe, Great''|Str+D10|15|$150| R |Talons| AP 1; Parry -1 |
|''Bayonet''|Str+4|1|$25| C |Mouth/Talons/Rifle| Counts as Spear when Attached to Rifle |
|''Brass Knuckles/horse Shoes''|Str+4 |1 |$20| C |Hooves/Talons| |
|''Club''|Str+D4 |1 |$25 | C |Mouth/Talons| |
|''Katana''|Str+D6+2|6|$400| R | Mouth/Talons| AP 2 |
|''Knife''|Str+D4|1|$25| C |Mouth/Talons| |
|''Lance''|Str+D8|5|$100| U |Flank/Talons| AP 2; Parry +1 |
|''Machete''|Str+D6|4|$75| C |Mouth/Talons| |
|''[[Mini-Chainsaw]]''|Str+D6+2|0|$500| U |Mouth/Talon| AP 2; Improvised Weapon; Battery Powered |
|''[[Pinion Knife]]''|Str+D4|1|$35| C |Wings|2 Penalty to checks to notice this weapon|
|''Spear''|Str+D6|5|$50| C |Flank/Talons| Parry +1; Reach +1; 2 Hands |
|''[[Spur-Jack]]''|Str+D4|1|$35| C |Hooves| -2 Penalty to checks to notice this Weapon |
|''Sword''|Str+D8|8|$100| U |Mouth/Talons| |
|''Sword, Great''|Str+D10|12|$150| R |Talons| Parry -1; Two Handed |
|''Sword, Short''|Str+D6|5|$75| U |Mouth/Talons| |
''School'': Transmutation
''Range'': Touch
''Duration'': Instant
''Trappings'': Intense purple glow for a brief moment
//Mend//: Designate a single broken object no larger than a foot or two in size, which can be something such as a cracked wooden beam, broken rope, or shattered vase; the damage is repaired and the object restored to normal. This can only be used to repair simple damage on something that was once whole, and cannot fix more complicated devices.
//Break//: This version of the cantrip does the opposite of Mend, and allows you to break something that was once fixed; it cannot be used to break something anew. For example: Break could be used to re-do damage done to a brick wall that has been patched up.
''Requirements'': Novice, Arcane Background (Psionics), Smarts d8+, Psionics d6+
Mentalists are masters of mind control and psionics. Some are pulp heroes, others are trained in secret government academies to root out traitors. Their frequent toying with human minds gives them a +2 on any opposed Psionics roll, whether they are using their powers against a foe or are trying to defend against a rival Mentalist.
''Requirements'': Wild Card, Seasoned, Fighting d10+
When dealt a Joker, the character doubles his total damage when making a successful Fighting attack this round.
''Rank'': Novice
''Power Points'': 3
''Range'': Smarts
''Duration'': 1
''Trappings'': Psionic invasion, soulsight.
//Mind reading// allows a character to read another’s thoughts. This is an opposed roll versus the target’s Smarts. A success allows the character to gain one truthful answer from the subject. The target is aware of the mental intrusion unless the mind reader gets a raise. The GM may apply modifiers based on the subject’s mental Hindrances or current state of mind.
''Rank'': Novice
''Power Points'': 1+
''Range'': Smarts * 5
''Duration'': 30 minutes (1/10 minutes)
//Mindlink// allows a syker to create a limited telepathic connection between a group of people. The syker is automatically part of the group and pays 1 Power Point for each additional character in the link up to a maximum number of people equal to the syker’s Smarts. The link is purely willing communication, no thoughts that aren’t consciously transmitted are read. Those who do not wish to be part of the link make an opposed Smarts roll against the syker’s Psionics result.
If any character in a //mindlink// suffers a wound or more, all other members must make a Smarts roll or be Shaken. If the linking syker is the one damaged, the roll is at –2.
''Rank'': Novice
''Power Points'': 3
''Range'': Smarts
''Duration'': Permanent
Sykers rarely get embarrassed. If they do something they regret, they just scramble the witnesses’ memories and make them forget it ever happened.
//Mindwipe// causes a target to forget a certain period of time defined by the syker. The power requires a full five minutes to cast, during which the victim must be conscious (and usually restrained).
//Mindwipe// literally erases the memories. The victim has no recollection of the time lost. He likely won’t know this unless he has specific reason to note a hole in his recollection.
To use the power, the syker makes a Psionics roll opposed by the victim’s Smarts. If the syker succeeds, the victim forgets up to five minutes of time, plus another five minutes per success and raise. The time lost doesn’t have to be recent—it could be a childhood memory or something that happened recently.
Mine droppers discharge a cluster of anti-vehicular micromines. Place a Small Burst Template at the rear of the vehicle. Other vehicles touching the Template automatically detonate the mines (and remove the template). Damage is 4d6, AP 5, vs the vehicle’s base Toughness. Active mines must be deactivated with a successful Knowledge (Demolitions) check before they can be reused. A reload of micromines are Scarce and costs $300.
Adds +4 Armor vs mines but reduces Acc and Top Speed by 10%.
Both North and South??? used minefields extensively along the Mason-Dixon Wall, but it’s possible to run across an old minefield nearly anywhere in the wastelands. Conventional troops used mines to control routes of travel, while special ops troops employed the devices to deter pursuers or hamper movement behind the lines.
There are several types of mines, but in general, they break down into two categories: anti-personnel and antivehicle, depending on the intended target. Anti-vehicular mines usually require several hundred (if not thousand) pounds of pressure to detonate, allowing foot travelers to pass safely over them. On the other hand, most vehicles do trigger anti-personnel mines, but the explosives in those devices are seldom sufficient to cause significant harm to armored vehicles. Unarmored vehicles, however, may be damaged or even disabled by anti-personnel mines.
When moving through a minefield, roll 1d6 for every yard each character (or vehicle) moves. On a 1, the waster has encountered a mine. Give the scav an immediate Notice roll—at –2 if he’s moving at his normal Pace. If he fails, he’s triggered the mine and suffers the listed damage (or other effect). If he’s successful, he spots the device and avoids it. Characters equipped with a metal detector or similar device get a +2 bonus to their Notice rolls. Running heroes roll at –4 to detect the device before they trigger it!
With the advances in battery technology many power tools went cordless and with the Apocalypse their use as weapons was unavoidable. Mini-chainsaws are the most common, but the same stats can be used any similar power tool (circular saws, masonry drills, etc.). Such weapons suffer penalties as improvised weapons (–1 to Fighting and
Parry), which can be removed with the Improvisational Fighter Edge (see Savage Worlds). Mini-chainsaws can normally run for 2 hours off a large battery but aren’t designed for combat. If a 1 is rolled on the Fighting die, the stress drains any remaining power in the battery.
Air-to-air (or space-to-space) weapons are designed to destroy enemy fighters and other small targets with a focused warhead. To activate, the pilot must first “capture” the target’s signature on his own control panel. This is accomplished by various means including heat-signature, radar, emissions, or even profile, depending on tech level.
To get a lock, the pilot picks his target and must then succeed at an opposed Piloting roll. The attacker must subtract range modifiers from the Piloting roll just as if he were Shooting.
Once locked, the pilot decides how many missiles to release (usually up to his full ROF of linked weapons). At Short Range, the target has one round to evade. He has two rounds (and chances) at Medium Range, and three at Long Range.
Evading a missile requires a Piloting roll at –4. Note that many craft contain additional evasion systems, such as chafe or flares, that add +4 to this roll if they’re of the right type (flares for heat-seeking missiles and chafe for radar-guided missiles).
For Air to ground use the same procedure as above but the target makes a Driving or Boating roll against the attacker’s Piloting skill. When firing surface to air the attacker makes a shooting roll and the defender makes a piloting roll.
|!Missile|!Range|!Dam|!ROF|!AP|!Burst|!Value|!Avail|
|''Tartarus fire''| 75/150/300 | 5D8 | 4 | 150 | MBT | $3,500 | VR |
||//''Notes'' Air to Surface, Heavy weapon//|<|<|<|<|<|<|
|''Sidewinder''| 100/200/400 | 4D8 | 2 | 6 | MBT | $2,000 | VR |
||//''Notes:'' Air to Air, Heavy weapon//|<|<|<|<|<|<|
|''Sparrow''| 150/300/600 | 5D8 | 2 | 6 | MBT | $6,000 | VR |
||//''Notes:'' Air to Air, Heavy Weapon//|<|<|<|<|<|<|
With a prosthetic, Missing Leg acts like a Lame Hindrance for the leg, reducing Pace by 2 and running rolls are now a d4.
Without a prosthetic, the character’s Pace is 2 and he can never run. He also suffers –2 to Traits that require mobility, such as Climbing and Fighting, and obviously can't use the missing limb to hold or wield anything. A character with a missing leg also suffers a –2 penalty to his Swimming skill (and Pace).
''School'': Abjuration
''Range'': Self
''Duration'': Special
''Trappings'': Eyes flashing blue for a brief moment
Mnemonic Sequencer allows you to memorize a set sequence of information and be able to remember it with perfect clarity, which can be either auditory (music, speech) or visual information (writing, pictures). Use this cantrip immediately before reading/watching what you intend to remember: for the next sixty seconds, everything you read, see, and hear is committed to memory. On average, you can read two full pages of text or clearly examine six pictures. This information is held in your mind indefinitely until the cantrip is dispelled as a free action or used again: you may only have one ‘sequence’ of information memorized at one time.
''Cast Option'' (-X): You may increase the amount of time you
can spend taking in information by up to a number of
minutes equal to your Smarts with a casting penalty equal to
X, where X is the number of extra minutes you chose.
Characters fighting from horseback (or other strange beasts) have certain advantages and disadvantages in combat, as described below.
Mounts aren’t dealt Action Cards—they act with their riders. Animals specifically noted as being trained to fight (such as warhorses) may attack any threat to their front during their riders’ action. Untrained horses do not fight unless riderless, and even then usually only if cornered.
► ''Horsemanship'': Characters who wish to fight from horseback must use the lowest of their Fighting or Riding skills. This makes it important for cavalrymen to actually be able to ride well!
► ''Collisions'': If a mounted character runs into something solid—such as a wall—both he and the mount suffer Collision Damage as explained in the [[Vehicle Rules]].
► ''Running'': Riders suffer the usual running penalty (–2) to attacks if the animal runs.
► ''Falling'': Anytime a character is Shaken or suffers a wound while on horseback he must make a Riding roll to stay horsed. If he fails, he falls. If the horse is moving, the rider suffers 2d6 damage (he’s merely Fatigued for the rest of the fight if the horse was still).
► ''Firing on Mounted Targets'': Shots directed at mounted characters use the Innocent Bystander rules to see if the horse was hit. Of course, an attacker can always aim for the horse instead.
► ''Charging'': A rider on a charging horse adds +4 to his damage roll with a successful Fighting attack. To be considered charging, the rider must have moved at least 6” or more in a relatively straight line towards his foe.
► ''Setting Weapons'': A weapon with a Reach of 1 or greater can be “set” against a cavalry attack. To do so, the attacker must be on Hold when he is attacked by a charging mount (see above).
If so, he rolls to interrupt as usual, but each combatant adds +2 to his Agility roll for each point of his weapon’s reach. The winner attacks first, and adds the +4 charge bonus to his damage; the loser gains no bonus.
► ''Wounded Mounts'': When an animal is Shaken or Wounded, it rears or bucks. A rider must make a Riding roll to stay mounted, or suffer the consequences of falling (see above). Mounts which aren’t trained in fighting flee in a random direction when Shaken, taking their riders with them.
Characters may move their full Pace (usually 6” for ponies) in a round. This is considered a free action and doesn’t inflict a penalty to any other actions, such as firing a weapon or taunting a foe.
► ''Crawling'': A character may crawl 2” per turn. This counts as being prone when being fired upon.
► ''Crouching'': A character may move while crouching at half Pace. He may run while crouched (halve his total Pace after rolling for running). Ranged attacks against him suffer a –1 penalty.
► ''Going Prone'': A character may fall prone at any time during his action. Getting up costs 2” of movement. See Prone on [[Situational Combat Rules]] the benefits of being prone.
► ''Difficult Ground'': Difficult ground such as mud, steep hills, or snow, slows characters down. Count each inch of difficult ground as two inches for purposes of movement.
► ''Jumping'': A character can jump 1” horizontally from a dead stop, or up to 2” with a “run and go.” A successful Strength roll grants one extra inch of distance.
► ''Flight'': Winged characters may move their basic pace through air. It costs 2” of movement to gain 1” of altitude. A character that is Shaken or suffers a wound while flying must make an immediate Grace roll (or -2 if they are flying at swooping speed) or fall 6”. They continue to fall each turn until they are no longer Shaken or hit the ground (See [[Falling]]).
!!Running
A character may run an additional 1d6” during his turn if he wishes. Characters suffer a –2 penalty (the standard multiaction penalty) to all other actions made while running.
► ''Swooping'': Winged characters may may ‘run’ while flying. They move at twice their basic Pace plus an additional 2d6”.
► ''Group Running Rolls'': When rolling for a group of nonplayer characters, villains, or monsters, the GM or controlling player makes a single running roll. The whole group doesn’t actually have to run—it’s just a convenient way to save a little time in the heat of battle.
''Movie Town''
//est. Population: 500//
Before judgment day the heart of the Equestrian film industry beat in the suburbs of Lost Pegasus in what famously became know as Applewood, and while many film company's operated studios within the city a majority of there epics where shot farther outside of the city. Massive lots were built outside of Lost Pegasus which employed not only the bright stars of cinema but tens of thousands of workers. While some of these workers commuted from surrounded towns or Lost Pegasus itself many simply lived there in what many called Star Town.
No city busters were aimed at the town but was still heavily bombed which destroyed most of the town. Though reduced to rubble the ruins of Star Town were not radiated which seemed reason enough for many of the surviving film makers to stick around and rebuild. Eventually the survivors managed to rebuild a small section along the towns western outskirts including a few film studios. These Studios are fully stocked with supplies scavenged from the remains of Star Town and constantly in use as the town, now simply known as Movie Town, ply's its craft shooting new films.
These movies are surprisingly well made given the equipment available thanks in part to the large number of freely available stunt doubles and extras in the form of undead. Why make do with blanks and special effects when you can dress up a walking corpse for your hero to mow down with his machine gun? Movie town keeps a healthy supply of zombies on hoof locked up in an old sewer drain called the pit.
Movie Town trades with towns and merchants across the wastes, selling data slugs of there films and various equipment to watch them on. Slugs are always in high demand in Movie town and are a great place to sell them, likewise salvaged viewing or projecting equipment can be sold here depending on its condition. Nearly everyone in Movie town works in some way with the film industry so the ponies here truly depend on the trade to support themselves.
''Ponies/Places of interest''
*[[The Director]]
''Requirements'': Novice, Arcane Background (Weird Science), Smarts d10+, Repair d8+, Weird Science d8+, at least two other scientific Knowledge skills at d6+
The inventor adds +2 to Repair rolls. With a raise, he halves the time normally required to fix something. This means that if a particular Repair job already states that a raise repairs it in half the time, a Mr. Fix It could finish the job in one-quarter the time with a raise.
Somewhere along the line, your waster came down with a bad case of the glows and gained a mutation for his troubles. As a Minor Hindrance, draw one card off the Action Deck to determine the mutation (your Marshal has the skinny on the results on page 95). As a Major Hindrance, your survivor has likely picked up a more nasty mutation Draw three cards off the Action Deck to determine the mutation and keep the lowest (Doomsayers take the lowest of two cards).
Whatever the case, the mutation is difficult to hide, and some folks out there don’t look too kindly on mutants. Your hero suffers a –2 Charisma penalty when dealing with these narrow-minded norms.
''Rank'': Veteran
''Power Points'': 6
''Range'': Touch
''Duration'': Special
This insidious power is feared by “normals” and all but the craziest mutants. The Doomsayer must expend his Power Points and then make a successful touch attack against his opponent. With a success, he makes a Faith roll opposed by his victim’s Spirit.
On a success, the victim gains one random mutation for a period of a week. With a raise, the mutation is permanent.
► ''Additional Effect'': By reducing the Power Points spent to 1, the Doomsayer can control the Glow so that the effects are temporary (about 24 hours). This bestows minor but very noticeable mutations such as boils, purple skin, scales, horns, and the like. This is usually used to give a norm an appreciation of what their mutated brothers and sisters go through each day. It counts as the Outsider Hindrance among other norms.
''Requirements'': Novice, Command, Spirit d8+
This Edge signifies a special link between a leader and his men. With it, he may share his Bennies with any troops under his command.
''Requirements'': Wild Card, Novice, Vigor d8+
Your hero has learned to fight on through the most intense pain. He may ignore 1 point of wound penalties.
Not everyone has ice water in his veins. Your hero is squeamish at the sight of blood and gore and terrified of coming to harm. He subtracts 2 from all of his fear-based Spirit checks.
''Requirements'': Novice, Arcane Background
An arcane character may learn a new power by choosing this Edge (which may be taken multiple times). He may choose from any powers normally available to his particular Arcane Background.
Your caballo doesn’t sleep well. In fact, the Land of Nod is a constant nightmare for him. He tosses and turns like a demon on a rack, and likely keeps everyone within a dozen yards of him awake with his nightly torment Each night, your hero must make a Spirit roll or suffer a level of Fatigue, which he regains the next time he beds down.
If the Marshal skips over long periods of time, such as during a trip, roll once instead of each night that would have passed.
Eliminates lighting penalties for any of the vehicle’s integral weapons.
This system injects highly flammable gas from canisters right into the engine. A driver may activate it at the beginning of an action for free, doubling his vehicle’s Acceleration and Top Speed for the round. A canister contains enough nitrous for six rounds, and refills go for $200 (Scarce Availability: there are more systems lying around than unused canisters).
''Requirements'': Seasoned
The character may spend a Benny to reroll any one damage roll, including those made for area effect attacks.
''Requirements'': Novice
Those born of noble blood have many perks in life, but often have just as many responsibilities. Nobles have high status in their societies, are entitled to special treatment from their foes, gain +2 Charisma, and also have the Rich Edge. This gives the hero several Edges for the price of one, but the responsibilities more than offset the additional perks. Nobles often have troops under their control, as well as land, a family home, and other assets. All of this must be determined by the GM, and balanced by the grave responsibilities the character faces.
As an example, a character in a fantasy campaign might have a company of swordsmen, a small keep, and even a magical sword he inherited from his father. But he also has an entire region to manage, criminals to judge, justice to mete out, and a jealous neighbor who covets his lands and constantly plots against him at court.
<<<
''comment:'' The resentment over the devastation of Equestria may change this edge, GM input impending.
<<<
A character who wants to beat someone up without killing them can choose to do nonlethal damage. This requires the attacker use only his fists or a blunt weapon of some sort. Edged weapons may be used if they have a flat side, but this subtracts –1 from the attacker’s Fighting rolls.
Nonlethal damage causes wounds as usual, but if a character is rendered Incapacitated he’s knocked out for 1d6 hours instead.
Nonlethal wounds are otherwise treated exactly as lethal wounds. This means it’s much easier to render an Extra unconscious than a Wild Card. This is intentional, and should work well for most genres where heroes can take multiple punches before going down for the count, but most “mooks” go out with one or two good punches.
<<<
''Example'': Virginia is whacked on the head by a cultist. The villain gets lucky and does 4 wounds to our heroine. Virginia rolls her Vigor and gets a failure. Because he was doing nonlethal damage, Virginia is simply knocked out for 1d6 hours.
<<<
Notice is a hero’s general alertness and ability to search for items or clues. This covers hearing rolls, detecting ambushes, spotting hidden weapons and even scrutinizing other characters to see if they’re lying, frightened, and so on.
The more raises a character gets on a Notice roll, the more information the Game Master should reveal.
Your character is one of the Faraway sykers who swore the Oath of Unity. He’s vowed never to harm another syker who also took the oath except in self-defense.
Particularly large people often have great difficulty in dangerous physical situations. Those who carry their weight well have the Brawny Edge. Those who don’t handle it very well are Obese. A character cannot be both Brawny and Obese.
An Obese hero adds 1 to his Toughness, but his Pace is decreased by 1 and his running die is a d4. This penalty applies to flying Pace and swooping die as well. Obese characters may also have difficulty finding armor or clothing that fits, squeezing into tight spaces, or even riding in confined spaces such as coach airplane seats or compact cars.
''Requirements'': Novice, Smarts d6+, Spirit d6+
Blending into the background and avoiding drawing attention to yourself seems to be your specialty, whether or not you try to do so consciously.
On the first round of any combat encounter (which can be the Surprise round if there is one), non-Wildcard enemies cannot target you with any attacks, spells, or maneuvers if there are other valid targets.
Sometimes characters have sufficient power to attack their foes through obstacles. (See the Breaking Things section to actually destroy intervening obstacles.) To do so, first decide if the attack hits. If it misses, there’s no additional effect other than a small hole in the intervening obstacle.
If the attack would have hit without the cover modifier, the round is on target but the obstacle acts as armor for the target behind it. In the table below are the Armor bonuses for some obstacles commonly used as cover. This is added directly to the target’s Toughness, including any actual armor he’s wearing in the affected location. Subtract the weapon’s Armor Piercing value from the total protection offered—not from both the obstacle and armor actually worn by the target.
<<<
''Example'': A soldier blasts an Axis abomination hiding behind a stone wall (Armor +10) with a bazooka. The bazooka ignores 9 points of Armor, so the wall only provides 1 point of protection.
<<<
!!!Obstacle Toughness
| !Armor |!Obstacle |
| +1 |Glass, leather |
| +2 |Plate glass window, shield |
| +3 |Modern interior wall, sheet metal, car door |
| +4 |Oak door, thick sheet metal |
| +6 |Cinder block wall |
| +8 |Brick wall |
| +10 |Stone wall, bulletproof glass |
Generally, characters are expected to use only their mouth, or only their hooves to handle objects. Pointing a gun with your mouth while kicking and throwing a grenade with your tail is much harder than just striking with two hooves.
Actions that require precise coordination, such as Fighting or Shooting, suffer a –2 penalty for each different set of limbs and grasping appendages used.
<<<
''comment'': Should we call them "grips" instead of "limbs"? Maybe it would be more adequate but I dunno if it might make them confusing along with weapon grips.
<<<
Place a Cone template streaming from the back of the vehicle. Any other vehicle that hits the spot must make an Out of Control roll at –4. It holds 5 Shots; each Shot is Common and costs $50. If ignited (triggered automatically for 2× the price), vehicles which contact the oil slick suffer 2d10 damage to base Toughness.
''Oil Town''
//est. population: 2000//
Oil Town is the biggest and most stable of the fuel towns, this is thanks to the presence both before and after the war of the 3rd Regiment and the 25th Armored Division of the Lunar Republic military which survived Judgment Day unscathed. Already posted to the oil fields to protect against Solar Empire sabotage the regiment simply stayed put after the bombs dropped and set to work.
The oil company workers kept the rigs pumping and engineers were recruited to build a new refinery on the site. Soon the 3rd of the 25th was the proud owner of the largest operational oil refinery in Equestria. Civilian survivors from the area migrated to the oil fields where they could be safe under the big guns of the 3rd’s tanks.
The unit’s combat engineers have built a sturdy concrete wall around the place with firing ports for defending troops and prepared positions from which the regiment’s tanks can fire while under cover. The area outside the wall is a maze of razorwire, mines, and camouflaged pillboxes. Surrounding the settlement for a 10 mile radius is the Oil Town Exclusion Zone, a free-fire zone for Oil Town patrols under the guns of the garrison’s 155mm self-propelled howitzers
The regiment’s commander, Colonel “Rex” Meadows, became the leader Oil Town, under his leadership the town has grown to become the largest and most well protected settlement in the badlands. Aiding Colonel Meadows with day to day administration is a six-seat town council, the voting seats of the council are all elected by the citizens and consist of prominent traders and local politicians. Colonel Meadows holds veto power over anything the council decides.
The town has two hotels and a campground outside its walls called Merchant Field. The front gates open to Oil Town at 6am, visitors are welcome to stay overnight in one of the hotels but must obey the towns strict 2am curfew. Though not open for business after the gates close Merchants Field is free to park and set up camp at, so long as you can can find an open space that is.
There are three operational wells and a refinery inside the town walls, which operate around the clock. Although plenty of shipments, guarded by troops from the regiment, go out to a variety of settlements throughout the Badlands and beyond, there is ample fuel for sale in the town itself. Gasoline goes for $5 a gallon, diesel for $4, and even motor oil, which is nearly impossible to come by in some areas, can be had for $10 a quart.
Since the Harvest and the mutant attacks in the area, many members of the Council have been calling for the annexation of the towns that form OPEC, a decision that Meadows has vetoed several times. Discontent with the military governor among the town’s oil barons is growing, although the average citizen still knows just how good they have it in Oil Town.
The regiment is still well equipped with 12 tanks, 18 armored personnel carriers, 8 Stork air defense vehicles, and a host of military support vehicles, including self-propelled artillery pieces.
''Old Prosper Mission''
//population: 1//
Prosper is a blind old stallion who lives in the ruins of an old Maneish mission in the hills overlooking the ruins of Lost Pegasus. The locals of Lost Pegasus say he can heal better than any Doctor, Templar, or Doomsayer in all of Equestria.
Originally one of the caretakers of the Harmony temple in the city and was blinded by the column of holy fire that knocked Famine on her Reckoner flank. Local pirates and gangs know better than to harass the old stallion, as easy of a target as he would be, as he has somehow won good favor with the Lakers of Rock Island Prison. No one is sure what Prosper did to achieve this but the gang has set him up at the old Mission and regularly check up on him.
''Requirements'': Veteran, Iron Pony, Strength and Agility and Vigor d10+
Few can match your sheer athletic prowess, and you are able to excel in just about any physical activity. Your attribute bonuses from Iron Pony increase to +2, and you gain a +1 bonus to all skills tied to those attributes.
Your hero lost an eye for some unfortunate reason. If he doesn’t wear a patch or buy a glass replacement (typically $500), he suffers –1 to his Charisma for the grotesque wound.
He suffers –2 to any Trait rolls that require depth perception, such as Shooting or Throwing, jumping a ravine or rooftop, and so on.
''Requirements'': Novice, Persuasion d6+, Survival d8+
Animals seem to gravitate to you and respect you, and you are able to communicate with them on a basic level. You gain a +2 bonus to Trait rolls made to influence or communicate with animals, and you are able to communicate with them in a limited fashion (allowing you to use skills such as Persuasion against them).
''OPEC''
A few of the larger fuel towns have formed a loose economic alliance to try to compete with their larger neighbor. There are five principal towns involved in the Oil Producing Economic Council (OPEC for short) and A number of smaller fuel towns which come and go from the alliance, depending on which road gang has captured their oil well this week. The five core towns are New Nagdoches, Skyler, Furant, Coggins, and Fort Bowson.
OPEC members pool their production together and use their combined resources to ship their product to other survivor communities in the area. They target settlements that have standing trade deals with Oil Town in particular. OPEC trucks race to get to these towns ahead of the Oil Town caravans and sell their fuel at much lower rates.
During the Harvest, the Cult of Doom launched several attacks against the members of OPEC in an attempt to cut off the supply of petroleum to the Iron Alliance. Aided by several infiltration teams from the Combine, the Cult overran many of the smaller fuel towns. Mutie attacks damaged production facilities in Furant and Fort Bowson, and Coggins was completely wiped out. A task force cobbled together from the various OPEC members retook it but not before Silas’ minions torched the nearby wells and smashed the refineries. The alliance would pay good money for anyone capable of putting out the well fires whose smoke has blackened the skies of the area for the last six months.
While OPEC is still a going concern, all this damage has weakened the alliance; perhaps fatally. Many Oil Town traders cast covetous eyes towards the wells and refineries of OPEC, and despite Colonel Meadows’ refusal to take some sort of military action against the OPEC settlements, several of the oil barons have been covertly hiring bands of mercenaries in a bid to pluck the more low hanging fruits of the fuel towns.
''Requirements'': Wild Card, Novice, Fighting d6+, Shooting d8+, Survival d6+, Throwing d6+, Bat Pony, Marshal’s approval
Operation Lasting Night was to be the NLR's insurance policy in the event of a general nuclear exchange between the NLR and the SE.
Select Special Forces soldiers from the Night Guard were cryogenically frozen and placed in storage vaults throughout Equestria along with their equipment. In the event of such a disaster, their mission would be two-fold: defeat any would-be warlords and help the survivors rebuild their communities.
A character with the Operation Lasting Night Solider Edge has just woken up to find himself in a strange new world. Maybe his freeze tube malfunctioned, or maybe a wandering road gang found his Vault and looted it, leaving him for dead Maybe a computer glitch activated the thawing process.
This Edge can only be taken at character creation, since Operation Lasting Night soldiers start the game with +20 Experience Points (typically four extra Advances). In addition to whatever Hindrances the character has of his own, he also has a Major Vow to restore civilization and Equestria, in that order.
Those chosen for this program will give their lives for that cause. They don’t have to be idealistic, but they are definitely driven. These soldiers can never take the Arcane Background, Harrowed, Rad Resistant, or Veteran o’ the Wasted West Edges.
''Requirements'': Seasoned, Arcane Background (Doomsayer), Vigor d8+, Faith d8+
This priest of the Glow is blessed by one of the Nine Great Saints of the Cult of Doom. Unfortunately, the reactor that burns brightest also runs the greatest risk of melting down.
All of the Doomsayer’s damage-causing powers, such as //bolt//, are increased a die type (so 2d6 becomes 2d8). However, should he suffer backlash on any power, he is Shaken and suffers 3d6 damage. If this kills the Doomsayer, the last miracle goes off as if it were successful with a raise. He then explodes in a burst of radioactive energy that causes 4d10 damage to everything in a Large Burst Template centered on the priest. Those who suffer a wound or more gain a mutation as well!
In a society made up of only a few types of people, your hero isn’t one of them. An Indian in a Western town, an alien in a sci-fi game of human marines, or a half-orc in a party of elves, dwarves, and humans are all examples of outsiders. Locals are likely to raise prices on the Outsider, ignore pleas for help, and generally treat him as if he’s of a lower class
than the rest of their society.
In addition to the roleplaying effects above, your hero’s Charisma suffers a –2 modifier among all but his own people.
There’s nothing out there your hero can’t defeat. At least that’s what he thinks. He believes he can do most anything and never wants to retreat from a challenge. He’s not suicidal, but he certainly takes on more than common sense dictates.
''Requirements'': Novice, Arcane Background (Psionics), Psionics d8+, Earth??? syker
Earth??? sykers who found themselves thrown on the battlefields of the Last War were unprepared to fight battles against hovertanks, hordes of infantry, and warbots. Those who survived did so by learning to boost their powers by spending bits of their souls.
A syker who has this Edge can increase the damage of a single psychic attack by incurring one level of Fatigue for an extra 2d6 damage, or two levels for an extra 3d6 damage. This must be decided before damage is rolled.
Bonus damage applies to a single damage total. If the power has multiple attacks (such as projecting two bolts), the syker may add the damage to two totals by suffering two levels of Fatigue (Exhaustion).
The syker may not Incapacitate herself with this Edge. Fatigue accumulated in this way may be recovered by silent, still meditation or sleep at the rate of one level every four hours.
Your hero absolutely despises violence. Minor pacifism means he only fights when given no other choice, and never allows the killing of prisoners or other defenseless victims.
Major Pacifists won’t fight living characters under any circumstances. They may defend themselves, but won’t do anything to permanently harm sentient, living creatures. Note that undeniably evil creatures, undead, demons, and the like are fair game. A Major Pacifist might also fight with nonlethal methods, such as with his fists. Such characters only do so when obviously threatened, however.
You never know when your brainer may need to bail out, so it’s a good idea
to have a few parachutes handy. Parachutes come in two basic varieties,
round and wing-shaped. Trying to guide your parachute requires a grace check, parachutes with a wing-shaped canopies are designed to be guided and provide a +2 to your grace check.
''Requirements'': Novice, Intuition d6+
To others, your actions and predictions sometimes make very little sense, and you are considered to be a bit more ‘random’ than perhaps what is healthy.
Despite this, even some of your more unhinged predictions or ideas tend to either come true or work better than it seems that they should. It is up to the Game Master as to exactly how to use this Edge, but typically you can make an Intuition roll once per game session per rank to find out random but useful facts about the current situation, even ones that seem anachronistic (predicting the future either purposefully or accidentally).
''Requirements'': Novice, ??? d6+, Persuasion d8+
Among your friends, you are the go-to pony when settling disputes, and you are able to fairly and impartially resolve almost every conflict. You gain a +2 bonus to Trait rolls in order to prevent or stop violence or ongoing conflict, such as breaking up fights or negotiating with two hostile sides. This bonus is applied at the discretion of the Game Master.
<<<
''comments'': The original requires the Leadership skill, but we aren't using that. What do we use? Streetwise?
<<<
The most distinguishing feature of Pegasus ponies are their wings, which grant them the ability to soar through the air in exactly the way that ponies normally do not.
As masters of the air, Pegasi also have their own form of innate magic that allows them to control the weather and especially clouds, which they can both fly through and walk on as if they were solid objects. As such, Pegasi can build entire cities of cloudstuff and are almost always more at home in the air than on the ground.
They are typically called upon to ensure good weather for their earth and unicorn pony kin, while others become hotshot fliers. Pegasus ponies are typified as flighty (both literally and figuratively) and mercurial free spirits, but their pith and energy make them as stalwart and heroic ponies as any. Pegasi are generally thinner, sleeker, and possessing of quicker wits and coordination than other ponies.
!!Race Features
* //''Graceful Flight'' - Pegasus ponies can fly at their basic Pace and may 'run' while flying, which is referred to as 'swooping'. While swooping, Pegasi move at twice their basic Pace plus an additional 2d6”. It costs 2” of movement to gain 1” of altitude. A character that is Shaken or suffers a wound or daunt while flying must make an immediate Grace roll (or -2 if they are flying at flanking swooping speed) or fall 6”. They continue to fall each turn until they are no longer Shaken or hit the ground.) Pegasi start with a d4 in Grace.//
* //''Cutie Mark'' - Pegasus ponies start with a free D6 in a skill of their choosing reflecting their true talent.//
!!“Limbs”
* ''Mouth''
* ''Wings'' x2
* ''Forehooves'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Limbs'': One of your hero's limbs was damaged. Roll 1d6: <ul><li>1-3 //Torn Wing//: Gain the Lame Wing Hindrance (or the Clipped Wings Hindrance if already Lame).</li><li>4-6 //Crippled Leg//: Gain the Lame Leg Hindrance (or the Missing Leg Hindrance if already Lame).</li></ul> |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5-6 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li></ul> |
Everything must be absolutely perfect for you, and many consider you obsessive about meaningless details.
You will go out of your way to make sure that everything you do, no matter how petty or unimportant, is done with exacting precision. As a result, you are sometimes quite tiring to deal with.
Persuasion is the ability to convince others to do what you want them to do.
Nonplayer characters start at one of five different attitudes: Hostile, Uncooperative, Neutral, Friendly, or Helpful.
A successful Persuasion roll improves the Extra’s attitude one step, or two with a raise. Failure, on the other hand, decreases the character’s attitude by a step, or two if a 1 is rolled on the Persuasion die (regardless of the Wild Die). Most Extras won’t change their reaction more than one or two levels during a single exchange, but that’s entirely up to the Game Master and the situation.
► ''Charisma'': Persuasion is always modified by a character’s Charisma.
► ''Player Characters'': Persuasion should never be used on other player characters. Their attitudes should be decided entirely by their players.
► ''Reaction Table'': If the Game Master doesn’t already have an initial attitude in mind for the Extra, he can roll on the chart below.
!!Reaction Table
| !2d6 | !Initial Reaction |
| 2 |''Hostile'': The target is openly hostile and does his best to stand in the hero’s way. He won’t help without an overwhelming reward or payment of some kind. |
| 3-4 |''Uncooperative'': The target isn’t willing to help unless there’s a significant advantage to himself. |
| 5-9 |''Neutral'': The target has no particular attitude and will help for little reward if the task at hand is very easy. If the task is difficult, he’ll require substantial payment of some kind. |
| 10-11 |''Friendly'': The target will go out of his way for the hero. He’ll likely do easy tasks for free (or very little), and is willing to do more dangerous tasks for fair pay or other favors. |
| 12 |''Helpful'': The target is anxious to help the hero, and will probably do so for little or no pay depending on the nature of the task. |
Phobias are overwhelming and irrational fears that stay with a hero for the rest of his life. Whenever a character is in the presence of his phobia, he subtracts 2 from all his Trait tests as a Minor Hindrance, and 4 if the fear is a Major Phobia.
Phobias shouldn’t be too obvious—everyone should be afraid of vampires, for example, so it’s not a phobia—it’s common sense. Instead, the phobia usually centers on some random element the mind focused on during whatever encounter caused such a fright. Remember, phobias are irrational fears.
''Phoenix''
//est. Population: 0//
During the Last War, Phoenix was devastated by two large scale battles and a number of city busters, leaving scores of bodies in the sun-scorched city. A few weeks after the bombs dropped, Death stepped out of the ruins of the city and raised the Phoenix dead for her horde.
To this day, Phoenix is crawling with Death’s minions, making the recovery of all the military equipment left around the place by the various armies that clashed there difficult to say the least. The forces from globe have made a few successful runs on Phoenix in the past, hunting for rare military hardware, but the place is far from panned out.
Piloting allows a character to fly airplanes, helicopters, jet packs, and any other flying devices common to his setting and background. See [[rules for handling vehicles|Vehicle Rules]] on the tabletop. Piloting is also frequently used with the [[Chases]] rules.
A pinion knife is a small feather-shaped blade that is clipped in along the leading edge of a Pegasus’ wing. It is spring-loaded so that it can be deployed and put away with the press of a small metal stud. The Weapon is Small and Easily concealed imposing a -2 Penalty on checks to notice the weapon when not deployed.
|!Weapon|!Range|!Dmg|!~RoF|!Cost|!Avail|!Wgt|!Shots|!Min Str|
|''Colt Peacemaker'' (.45)*|12/24/48|2D6+1|1|$50| R |3|6| |
| Notes: AP 1 |<|<|<|<|<|<|<|<|
|''Desert Phoenix'' (.50)|15/30/60|2D8+1|1|$175| U |7|5|D6|
| Notes: AP 2; Cannot Double Tap |<|<|<|<|<|<|<|<|
|''Glock'' (9mm)|12/24/48|2D6|1|$75| C |3|16| |
| Notes: AP 1 |<|<|<|<|<|<|<|<|
|''HI Thunderer'' (9mm)|12/24/48|2D6|3|$125| R | 7 |30| |
| Notes: AP 2; 3RB; Caseless ammo |<|<|<|<|<|<|<|<|
|''[[IW-91]]'' (gyrojet)|24/48/96|2D6+2|1|$300| R |9|6| |
| Notes: Half Dam vs. Armor; May chamber standard .50 rounds (changes weapon statistics) |<|<|<|<|<|<|<|<|
|''Marlin Target Pistol'' (.22)|10/20/40|2D6-1|1|$50| C |2|15| |
| Notes: |<|<|<|<|<|<|<|<|
|''Police Pistol'' (.45)|12/24/48|2D6+1|1|$100| U |4|7| |
| Notes: AP 2 |<|<|<|<|<|<|<|<|
|''[[LA Sidearm]]'' (9mm)|12/24/48|2D6|1|$100| U |4|15| |
| Notes: AP 1; 3RB; Laser Sight |<|<|<|<|<|<|<|<|
|''Ruger Redhawk''|12/24/48|2D6+1|1|$125| R |4|6| |
| Notes: AP 1; Chambers both .357 and .38 rounds |<|<|<|<|<|<|<|<|
|''Ruger Thunderhawk'' (.357)|12/24/48|2D6+2|1|$125| R |5|6|D6|
| Notes: AP 2 |<|<|<|<|<|<|<|<|
|''SA Sidearm'' (.50)|15/30/60|2D8|1|$150| U |8|6|D6|
| Notes: AP 2 |<|<|<|<|<|<|<|<|
|''S&W .357''|12/24/48|2D6+1|1|$100| U |4|6|D6|
| Notes: AP 1 |<|<|<|<|<|<|<|<|
|''S&W .38 Snub''|10/20/40|2D6|1|$50| C |3|6| |
| Notes: |<|<|<|<|<|<|<|<|
|''S&W 85'' (.44)|12/24/48|2D6+1|1|$125| U |5|7| |
| Notes: AP 1 |<|<|<|<|<|<|<|<|
Poisons can be delivered many ways. If ingested, its effects occur automatically. If a victim is Shaken or wounded by a bite or weapon coated in poison, he must make an immediate Vigor roll against the type of poison listed on the Poison Effects Table below. If the poison has a modifier associated with it (such as Venomous [–2]), the victim’s Vigor roll is modified appropriately.
The Game Master must decide which category is appropriate based on the poison. Most real-world animals are Venomous with only a few falling in the Lethal category. Ghouls might have paralyzing poison in their claws, while spies might use Knockout poison in drinks or gases.
Characters who suffer Paralysis or a Knockout are Incapacitated until they recover.
► ''Treatment'': To treat a poisoned victim, the healer can try a Healing roll minus the strength of the poison itself (found in the poison’s description). If successful, the victim’s life is saved and the poison no longer has any effect—paralyzed victims can move and those rendered unconscious wake.
Each character may only attempt one Healing roll per incident to cure the poison, but another character with Healing may make a second attempt, and so on.
* ''Recovery'': Fatigue leves from poison recover in 24 hours.
* ''Incapacitation'': Characters Incapacitated by accrued Fatigue recover as above. Other effects from the table below are handled separately.
!!!Poison Effects Table
|!Type | !Failure | !Success | !Raise |
|Lethal | Death in 2d6 rounds | 1 wound and Exhaustion | Exhaustion |
|Venomous | Death in 2d6 minutes | 1 wound and Exhaustion | Exhaustion |
|Paralysis | Paralyzed for 2d6 minutes | Paralyzed for 2d6 rounds | Fatigue |
|Knockout | Knocked out for 2d6 hours | Knocked out for 2d6 minutes | Fatigue |
''The Crystal Wars and the rise of Equestria''
//0 - 200 AD (After Discord)//
Claiming the Elements of Harmony from the Tree of Harmony Luna and Celestia Petrify Discord the lord of chaos, This marks the end of the Discordian Era and the beginnings of Reinaissance. During this time many diverse communities once separated by chaos storms and the whims of Discord began to interact for the first time in centuries. Cultural differences and scarcity of resources lead to a patchworked landscape of bickering tribes. The greatest of these factions was the Crystal Empire which had locked itself away from Discords rule with the power of the Crystal Heart.
Upon its return the Crystal Empire found itself a cultural, ecological, and scientific juggernaut by comparison to the remainder of the land which had lapsed into a lingering dark age during Discords reign. For Several Decades the Crystal Empire defends its boundaries from barbarians until a practitioner of the dark arts named Sombra claimed the throne and began a proper offensive to claim the lands surrounding the Empire. Fueled by their overwhelming victories Sombra and his armies continue to march, seizing land and slaves as they rapidly expand. This marks the beginning of the Crystal Wars.
In response Luna and celestia begin their own campaign to unify the feuding clans of Equestria. For the better part of a century the two sisters sweep across the land uniting factions into what would eventually become the nation of Equestria. The Crystal Empires push south eventual grinds to a stop before reversing as the Sisters army forces a retreat back to the frozen north. Conceding lands quickly the Crystal Empires situation becomes more and more desperate, Sombra eventually turns to enslaving his own people to fuel his war machine.
Despite Sombras best attempts to salvage his attempt at conquest The sisters armies eventually make it to the Empires lands. With the advantage of numbers the Sisters were almost assured victory at last but the last conflict took an unforeseen turn as the land began to shake. A great quake shattered the land as the dead from both sides climbed back on their hooves and attacked. Repulsed from the city by the army of dead the Sisters could only watch as Sombra made his last play as he and his Empire Disappeared.
The Shattered North is left to the Dead, It is not long afterward the first Harrowed awaken.
It’s said a fool and his money are soon parted. Your hero is that fool. He starts with half the usual money for your setting and just can’t seem to hang onto funds acquired after play begins. In general, the player halves his total funds every game week.
''Requirements'': Novice, Arcane Background
Wizards, weird scientists, and other arcane types always want more power. This Edge grants them an additional 5 Power Points.
Power Points may be selected more than once, but only once per Rank.
''Requirements'': Wild Card, Seasoned, arcane skill d10+
This Edge is for those characters with Arcane Backgrounds. When dealt a Joker, the character recovers 2d6 Power Points. He may not exceed his usual limit.
Listed below are a number of powers available in most Savage Settings. Each power has the following statistics:
* ''Rank'': This is the Rank a character must be in order to earn this power: Novice, Seasoned, Veteran, Heroic, or Legendary.
* ''Power Points'': The number of points it costs to use the power. Some powers allow the character to pay additional points for additional effects. This is always determined—and paid for—before the dice are rolled.
* ''Range'': The maximum distance the target of the power can be from the user when the power is first activated (it remains in effect even if the target moves out of Range as long as it’s maintained). A Range of Smarts, for example, means 10” for a character with a Smarts of d10. If a power lists three Ranges, such as 12/24/48, these are read just like missile weapon Ranges, and subtract the standard penalties for each Range bracket (0/–2/–4). The arcane character’s skill roll acts as both his “casting” and attack total for these type powers (Weird Scientists use Fighting or Shooting as usual instead).
* ''Duration'': How long the power lasts in rounds. A power with a Duration of 1 lasts until the heroes’ next action. A Duration of 2 means it lasts for two actions, and so on. If the Duration of a power has a second entry in parentheses, such as 3 (1/round), it means the power has a Duration of 3 rounds and may then be maintained from round to round by spending the listed number of Power Points (1 in this case). Each power maintained subtracts 1 from future uses of the hero’s arcane skill.
* ''Trappings'': Listed here are some ideas for what the power might look like in different types of settings. In a science fiction game, armor might represent the psyker’s telekinetic force pushing attacks away from him. The same power used by a superhero might be a force field, or a body of flame that melts incoming projectiles.
<<<
''Example'': Greywald the Melodious is a bard in a high-fantasy setting. In battle, he strums his lyre or sings songs to enable his powers.
His burst is a sonic cone that rattles nerves and shatters eardrums. He calls this one “The Battle Cry of Evanier.” Greywald’s slumber is “Lullaby of the Fallen,” a sad mournful tune that puts his enemies to sleep even in the heat of battle.
Greywald’s player has decided for himself that he won’t take powers that don’t work well within his theme—such as disguise or elemental manipulation.
<<<
!!List of Powers
<ul>
<$list filter="[tag[Powers]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
You love a good practical joke, and sometimes you have a hard time saying no to humiliating someone else.
As a Minor Hindrance, you are prone to playing more or less harmless but annoying practical jokes on your friends. As a Major Hindrance, you will attempt to prank other ponies at very inopportune times, and you are fond of particularly cruel or embarrassing pranks that anger and alienate the victim.
''Requirements'': Legendary, d12 in affected Trait
The character is an expert at a particular skill or attribute (his choice). That Trait becomes d12+1. This Edge may be selected more than once, but it may never be applied to the same skill or attribute twice.
''School'': Illusion
''Range'': Visual
''Duration'': 1 minute per rank
''Trappings'': Glowing image projected on designated surface
You project a color image from the tip of your horn onto any flat surface like a projector within visual range. The image can be anything you can clearly imagine, such as a recent memory. You may change or dispel the projected image as a free action.
Smart heroes lie down when lead starts flying. They move, shoot, and then get prone behind cover before their action is over, forcing attackers to go on Hold to attack them. Prone gives them Medium Cover against most attacks. Ranged attacks within 3” ignore the modifier since the target is just as exposed as if he were standing next to these characters.
If a prone defender is caught in melee, his Parry is reduced by 2 and he must subtract 2 from his Fighting rolls. Getting up from prone costs 2” of movement.
Arcane Skill for the Power of Psionics.
''Rank'': Seasoned
''Power Points'': 2
''Range'': Cone Template
''Duration'': Instant
''Trappings'': Rippling earth, buffeting winds, rushing waters.
//Pummel// allows a character to knock down multiple foes. The caster makes an arcane skill roll and then places a Cone Template in front of him. Any friend or foe touched by the template must make a Strength roll (at –2 if the caster gets a raise). Any target that fails is knocked back 2d6” and becomes prone. If the target strikes an inanimate object, he is Shaken as well. Targets with cover may subtract the cover modifier from the total distance moved (to a minimum of 0), and flying targets suffer an additional –2 to their Strength roll.
''Rank'': Veteran
''Power Points'': 3
''Range'': Smarts
''Duration'': 3 (1/round)
''Trappings'': Glowing eyes, trance-like state, a swinging pocket watch, voodoo dolls.
Sometimes it pays to persuade others to do your fighting for you. Some do this by blatant mind control, others do it by manufacturing visual and auditory illusions. //Puppet// is an opposed roll of the character’s arcane skill versus the target’s Spirit. The user must score a success and beat the target’s roll to gain complete control. The victim will attack friends and even commit suicide, though such acts allow the victim another opposed Spirit roll to break the spell.
''Purgatory''
The first think you should know about the Maze is that a good chunk of it is on fire. A city buster intended for Lost Pegasus “missed” and landed north Igniting a large vein of ghost rock. The blast shattered the coast and the fire eventually spread nearly 100 miles up the coast covering a most of the area between Lost Pegasus and Lynchburg. The Mysterious bolt in Lost Pegasus snuffed out the ghost storm at ground zero of the strike that set the match to the blaze but the fire remains. Maze locals call refer to this strip of coast as Purgatory.
You'll never find darkness in Purgatory as there is always a sickly glow to everything be it from radiation or burning ghost rock. Everything is cast in shades of orange and green bright enough to be seen even during the day. The fire burns along seams in mesa walls and exposed rocky cliff-sides eventually causing them to collapse, with this every changing landscape attempts to map the maze are frequently outdated and made obsolete. Even the caves under the water are on fire causing the water to boil hot enough to cook ponies alive in some places.
There are plenty of safe places from the fire in Purgatory but even there the fumes from the fire are enough to make it inhospitable to pony kind. A pony without protection can only make it a few hours before feeling the effects of the poisonous fumes. More than a few ponies have become lost in the maze and died from exposure without ever coming close to Purgatories fires.
For those willing to face the fire, radiation, boiling waves, poisonous fumes, and the strange creatures which make their home here there is a vast treasure trove of mostly unspoiled land to be scavenged. Whole towns, collapse portions of the Canyon Causeway, and wrecked Boats wait for those brave enough to come along and plucky there valuables.
''Ponys/Places of interest''
*[[The Fire Brigade]]
Sometimes characters may want to push a foe in hopes of knocking him out of position, prone, or even into a deadly hazard. This is called a Push.
To push a foe, the attacker and the target make opposed Strength rolls. If successful, the attacker has three choices. He can:
* ''Bash'': Push the target 1” for a success and 2” on a raise on the Strength roll. If the defender hits an obstacle, he suffers 1d6 damage for every 1” he would have moved.
* ''Shield Bash'': If the attacker has a shield, he can push the attacker as above, but also causes Str damage. Add +1 to the damage for a small shield, +2 for a medium shield, and +3 for a large shield.
* ''Knock Prone'': The defender is knocked prone.
► ''Running'': If the attacker ran at least 3” before the push, he adds +2 to his roll.
► ''Hazards'': The Game Master must determine results from any other obstacles or hazards, such as a cliff edge, wall of fire, etc.
''Requirements'': Novice, Agility d8+
Quick characters have lightning-fast reflexes and a cool head. Whenever you are dealt a 5 or lower in combat, you may discard and draw again until you get a card higher than 5.
Characters with both the Level Headed and Quick Edges draw their additional card and take the best as usual. If that card is a Five or less, the Quick Edge may be used to draw a replacement until it’s Six or higher.
''Requirements'': Novice, Agility d8+
This Edge allows a hero to draw a weapon as a free action (and thus ignore the usual –2 multi-action penalty if he chooses to fire as well). If the character must make an Agility roll to draw a weapon (see [[Combat]]), he adds +2 to the roll.
''Rank'': Seasoned
''Power Points'': 4
''Range'': Touch
''Duration'': 3 (2/round)
''Trappings'': Blurred motion, hyperactivity.
This power grants incredible swiftness to the recipient. With success the target has two separate turns per round on his action card instead of the usual one. Each turn is handled independently with its own actions, but the character must resolve one turn entirely before beginning the second. With a raise, the recipient can redraw any initiative cards lower than Eight each round.
Your hero has some minor foible that is usually humorous, but can occasionally cause him trouble. A swashbuckler may always try to first slash his initials on his foes before attacking, a dwarf may brag constantly about his culture, or a snobby debutante might not eat, drink, or socialize with the lower class.
!!!List of Races
<ul>
<li>Ponies
<ul><$list filter="[tag[Races]tag[Race:Pony]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list></ul></li>
<$list filter="[tag[Races]!tag[Race:Pony]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
Radiation affects your waster more than most. He suffers a –2 penalty when resisting radiation (see [[Hazards]]). Damage-causing spells of the Doomsayers or other creatures of radioactive origin cause an additional 2 points of damage as well. The hero suffers both penalties against a power that is resisted and causes damage.
''Requirements'': Novice, Vigor d6+
Your brainer could eat rads for breakfast. He gains +4 on Vigor rolls to resist Fatigue from radiation. Rad Resistant provides no benefit versus targeted or damaging effects.
This drug was designed as a chelator, a chemical that attaches to another and allows it to be removed. Rad-gone courses through the body, binding with any radioactive particles. These particles are removed from the body at the next visit to the outhouse. 50 A dose of Rad-gone cures a character of the glows in minutes. Doomsayers are affected in strange ways by Rad-gone. Any user of the Glow who is administered a dose of the chelator must make a Vigor check at –4. Failure causes the loss of 2d6 Power Points which can be recovered normally. Those who critically fail this roll actually have their meridians altered, suffering a loss of 5 Power Points until the Doomsayer sacrifices an Advance to recover them.
Vials of Rad-gone are commonly found in the ruins of military bases, nuclear power plants, or hospitals located near nuclear facilities.
Another fine chemical from your friends
at Pentacorp, this drug binds with the
user’s DNA, protecting it from damage
caused by radiation. Any Vigor rolls caused
by radiation poisoning are at +2. The effects
of Rad-protect last for six hours before the
chemical breaks down and is removed from
the body.
Rushed through the approval process
by Pentacorp execs, not all the kinks were
worked out of this drug before the Last War.
A critical failure on any radiation-induced
Vigor checks while under the influence of
Rad-protect indicates the drug has become
fused to the DNA. This prevents the DNA
from dividing normally. The long-term effect
is the character gains the Ailin’ (Major)
Hindrance as her body is unable to repair
itself. This effect can be removed with the
healing power at –4 or greater healing at
no penalty, but each healer only gets one
attempt (one per power if they have both).
Characters in a radioactive environment must make a Vigor roll every hour spent in low radiation, and every minute in high radiation. Each failure results in a Fatigue level.
* ''Recovery'': Fatigue from radiation fades at the rate of one level every 24 hours, or half that if the victim can shower or scrub away lingering dust and other contaminants.
* ''Incapacitation Effects'': The victim contracts radiation sickness, a Long-Term Chronic, Minorly Debilitating disease, as explained under [[Disease]].
One of the only remaining ways to communicate over long distances (and an iffy one at that), radios come in all shapes and ranges. The price given is for a hands-free set or walkie-talkie capable of broadcasting for a half mile.
For every multiple of 4 the range is increased (2 miles, 8 miles, 32 miles, up to a maximum of 128 miles), double the cost and the weight of the radio and increase the scarcity by a level. Basic radios with an 8 mile or less range use small batteries lasting for two hours of total use; larger ones use medium batteries that last for four hours or can be connected to a vehicle for continuous use as long as the engine is operational.
|!Radio Type|!Value|!Wgt|!Broadcast Range|!Avail|
|''Basic Radio''|$40| 1 | .5 Miles | C |
|''Radio''|$80| 2 | 2 Miles | U |
|''Radio''|$160| 4 | 8 Miles | R |
|''Large Radio''|$320| 8 | 32 Miles | R |
|''Large Radio''|$640| 16 | 128 Miles | VR |
Another combat enhancement popular
among military personnel and private
security forces, this drug boosts the user’s
strength at the cost of brainpower, turning
him into a frenzied killing machine.
A dose of Rage gives the user the Berserk
Edge for 2d10 minutes. Once the drug has
worn off, the user must make a Spirit roll
or suffer a loss of one die type in Smarts
for 1d6 hours. Snake eyes on the roll results
in the permanent reduction of Smarts by
one die type.
''Requirements'': Veteran, Spirit d8+
The first time you are Incapacitated each game session, you may immediately spend a Benny in order to remain active until the end of your next turn. You may take actions as normal, including those which would make you no longer Incapacitated.
A ram plate is a heavy piece of metal wielded to a vehicle’s front end. Often, these nasty pieces of work include heavy spikes, or are sharply angled at the center, creating a wedge. When this vehicle rams another,
it suffers 1d6 less damage than normal and the target suffers 1d6 more
No ranged weapon larger than a pistol may be fired at adjacent foes engaged in melee. Larger weapons may be used as clubs, however. Pistols can be fired in close combat, but since the defender is actively fighting back, the TN for the Shooting roll is his Parry rather than the standard TN of 4.
That means it’s harder to hit someone who’s wrestling with your character in melee than someone a few feet further away who isn’t actively wrestling with your hero.
Sometimes an outnumbered fighter needs to sacrifice skill for blind luck. A rapid attack is a wild swing of the blade or a hasty spray of shots that favors fortune over expertise. Both the melee and ranged version inflict a –2 penalty to Parry.
In melee, the warrior can make up to three attacks as a single action. Roll a Fighting die for each, and subtract –4 for the totals (Wild Cards get a Wild Die as usual).
Ranged attackers with a semi-automatic weapon or revolver may fire up to six shots at a –4 penalty to each. Roll a Shooting die for each shot (along with the Wild Die if the attacker is a Wild Card). Single action revolvers refer to this maneuver as “fanning the hammer,” and it requires two hands to perform.
Rapid attack cannot be combined with any other effect that allows attacking multiple foes in one action (Sweep, Frenzy, Autofire, Two Weapons, etc.), nor may it be used with a Double Tap or Three Round Burst.
The rapid attack must be taken all at once but the warrior can assign his skill dice to multiple targets if he chooses.
''Requirements'': Seasoned, Spirit d6+, Arcane Background
This Edge allows an arcane character to regain 1 Power Point every 30 minutes.
|!Search tag: | <$edit-text tiddler="$:/temp/RenameTags/search" tag="input" type="text"/> |
|!Replace by: | <$edit-text tiddler="$:/temp/RenameTags/replace" tag="input" type="text"/> |
---
<$reveal type="nomatch" text="" state="$:/temp/RenameTags/replace">
!First step
!!//Apply the tag <$tiddler tiddler={{$:/temp/RenameTags/replace}}><$transclude tiddler="$:/core/ui/TagTemplate"/></$tiddler> to the following tiddlers//
<$list filter="[!has[draft.of]tag{$:/temp/RenameTags/search}!tag{$:/temp/RenameTags/replace}sort[created]]">
<$checkbox tag={{$:/temp/RenameTags/replace}}> <$link to={{!!title}}><$view field="title"/></$link></$checkbox><br/>
</$list>
</$reveal>
<$reveal type="nomatch" text="" state="$:/temp/RenameTags/search">
!Second step
!!//Remove the tag <$tiddler tiddler={{$:/temp/RenameTags/search}}><$transclude tiddler="$:/core/ui/TagTemplate"/></$tiddler> from the following tiddlers//
<$list filter="[!has[draft.of]tag{$:/temp/RenameTags/search}tag{$:/temp/RenameTags/replace}sort[created]]">
<$checkbox tag={{$:/temp/RenameTags/search}}> ~~<$link to={{!!title}}><$view field="title"/></$link>~~</$checkbox><br/>
</$list>
</$reveal>
Repair is the ability to fix gadgets, vehicles, weapons, and other machines.
Characters suffer a –2 penalty to their rolls if they don’t have access to basic tools.
A raise on a Repair roll halves the time required by the specific task.
A character skilled in Research knows how to make good use of libraries, newspaper morgues, the internet, or other written sources of information.
Deciphering an old grimoire, for example, would require an Research roll (as well as the ability to read the book’s writing if it is in another language or a cypher). To get information from people rather than books and computers, use the [[Streetwise|Streetwise(Smarts)]] skill.
''Requirements'': Novice
Whether the individual was born with a silver spoon in his mouth or earned it through hard work, he’s got more money than most. Rich heroes start with three times the normal starting funds for the setting.
Riding allows a hero to mount, control, and ride any beast common to his setting.
Players should note that mounted characters use the lowest of their Fighting or Riding skills when fighting from horseback. See additional rules for [[fighting while mounted]].
|!Weapon|!Range|!Dmg|!RoF|!Cost|!Avail|!Wgt|!Shots|!Min Str|
|''AK47'' (7.62)|24/48/96|2D8+1|3|$200| U |9|30|D6|
| Notes: AP 2 |>|>|>|>|>|>|>|>|>|
|''HI Damnation'' (10mm)|24/48/96|2D8+1|3|$300| U |12|30|D6|
| Notes: AP 2; 3 Round Burst; Caseless Ammo; |>|>|>|>|>|>|>|>|>|
|''Hunting Rifle'' (.30-06)|24/48/96|2D8|1|$150| C |10|9| |
| Notes: AP 2 |>|>|>|>|>|>|>|>|>|
|''[[IW-40]] (gyrojet)''|50/100/200|2D10|3|$450| VR |25|18|D6|
| Notes: 3 Round Burst; Half Dam vs. Armor |>|>|>|>|>|>|>|>|>|
|''[[LA M-21]]'' (5.56)|20/40/80|2D8|4|$500| U |8|30| |
| Notes: AP 2; 3 Round Burst; Cannot be fit with Bayonet |>|>|>|>|>|>|>|>|>|
|''[[LA Sniper Rifle]]'' (.50)|40/80/160|2D10|1|$800| R |11|8|D6|
| Notes: AP 2; Snapfire Penalty; Laser Sight; Bipod; Custom Electric Trigger |>|>|>|>|>|>|>|>|>|
|''Plinking Rifle'' (.22)|15/30/60|2D6|1|$75| C |7|12| |
| Notes: Scope |>|>|>|>|>|>|>|>|>|
|''SA Sniper Rifle'' (.50)|40/80/160|2D10|1|$750| R |11|10|D6|
| AP 2; Snapfire Penalty; Scope |>|>|>|>|>|>|>|>|>|
|''[[SA XM-40 “Ripper”]]'' (.50)|24/48/96|2D10|2|$500| R |16|20|D8|
| Notes: AP 2; 3 Round Burst; Gyroscopic Compensator |>|>|>|>|>|>|>|>|>|
|''SK-70'' (7.62)|24/48/96|2D8|3|$300| R |10|30|D6|
| Notes: AP 2 |>|>|>|>|>|>|>|>|>|
|''SK “Sporter”'' (7.62)|24/48/96|2D8|1|$150| C |9|10|D6|
| Notes: AP 2 |>|>|>|>|>|>|>|>|>|
''Requirements'': Seasoned, Shooting d8+
Some veteran shooters learn to compensate for the recoil of fully automatic weapons. If a character with this Edge does not move, he may ignore the recoil penalty for firing a weapon on full automatic.
Just outside of Lost Pegasus is a large rocky slope jutting up from the water, sitting on top of that is what is left of Rock Island Prison. Partially flattened by the bombs that redirected around Lost Pegasus Rock Island Prison is actually one of the most well preserved buildings in the area as its rocky perch has saved it from the same level of flooding the rest of Lost Pegasus was subjected to.
The Lakers, Lost Pegasuses largest and most organized gang, operates out of this prewar facility. The Lakers have proven to be a very industrious lot as they have not only moved into the old building but expanded, burrowing down into the rocky island below and building a large hanger jutting out into the water where they launch, build, and repair there ships which are by far the fastest in all of Lost Pegasus. Though large in number the Lakers do not seem to take on new members often and are a very secluded and secretive bunch.
Outside of the immediate area around Rock Island you are most likely to run into the Lakers at Blood Pool where they are often patrol. Unlike most other gangs however run-ins with the Lakers are hardly ever lethal as the gang operates on a "catch and release" policy striping those hostile to them of there weapons, goods, and even ships before dropping them off at the nearest Hood. Though not likely to respond immediately with violence they are not above killing to defend themselves or there home.
Most Ponies in Lost Pegasus agree the Lakers are odd but are just thankful the gang isn't as active as they could be and leave them, Blood Pool, and Rock Island alone.
!!Setting Rules
<<<
''comment'': Marshall, see page 94 of Savage Worlds Deluxe
<<<
!!Character Creation
*[[Races]]
*[[Attributes]]
*[[Skills]]
*[[Hindrances]]
*[[Edges]]
*[[Arcane Background]] & [[Powers]]
!!Basic Rules
*[[Wild Cards and Extras]]
*[[Trait Tests]]
*[[Bennies]]
*[[Combat]]
**[[Initiative]]
**[[Movement]]
**[[Actions]]
**[[Attacks]]
**[[Damage]]
**[[Damage Effects]]
**[[Situational Combat Rules]]
***[[Aim]]
***[[Area Effect Attacks]]
***[[Automatic Fire]]
***[[Breaking Things]]
***[[Called Shots]]
***[[Defend]]
***[[Disarm]]
***[[Double Taps and Three Round Bursts]]
***[[The Drop]]
***[[Finishing Move]]
***[[Firing into Melee]]
***[[Full Defense]]
***[[Ganging Up]]
***[[Grappling]]
***[[Improvised Weapons]]
***[[Innocent Bystanders]]
***[[Mounted Combat]]
***[[Nonlethal Damage]]
***[[Obstacles]]
***[[Off-Hand Attacks]]
***[[Prone]]
***[[Push]]
***[[Ranged Weapons in Close Combat]]
***[[Rapid Attack]]
***[[Tests of Will]]
***[[Touch Attack]]
***[[Tricks]]
***[[Two Weapons]]
***[[Unarmed Defender]]
***[[Unstable Platform]]
***[[Wild Attack]]
***[[Withdrawing from Close Combat]]
*[[Healing]]
!!Situational Rules
*[[Allies]]
*[[Chases]]
*[[Dramatic Tasks]]
*[[Fear]]
*[[Hazards]]
**[[Bumps and Bruises]]
**[[Cold]]
**[[Disease]]
**[[Drowning]]
**[[Falling]]
**[[Fire]]
**[[Heat]]
**[[Hunger]]
**[[Poison]]
**[[Radiation]]
**[[Sleep]]
**[[Thirst]]
*[[Interludes]]
*[[Mass Battles]]
*[[Social Conflict]]
*[[Travel]]
*[[Vehicle Rules]]
**[[Vehicular Movement and Manuevers]]
**[[Collisions]]
**[[Vehicle Attack]]
**[[Vehicle Damage]]
**[[Vehicle Repair]]
**[[Vehicle Fueling]]^^Hell on Earth^^
**[[Vehicle Fatigue]]^^Hell on Earth^^
!!Hell on Earth Rules
*[[Bartering]]
*[[Counting Coup]]
*[[Death]]
*[[Scavenging]]
*[[Ghost Storms]]
*[[Battlefield Hazards]]
**[[Minefields]]
**[[Wire]]
**[[Booby Traps]]
The M-202 is a single-shot, 40mm grenade launcher. It is designed to be attached under the barrel of the [[SA XM-40 "Ripper"]] assault rifle and cannot be fired independently. It fires all standard 40mm grenades.
The XM–40 assault rifle was designed to be the first successful .50 caliber assault rifle. The secret to the weapon is its slower rate
of fire combined with a battery-powered gyroscopic compensator. The weapon can be fired without an active compensator, but single shots suffer a –1 penalty to Shooting and any other use (double tap, three round
burst, autofire, rapid fire, etc.) suffers an additional –2 penalty.
The XM-40 uses a small battery good for 20 shots. The battery is installed in the magazine, so reloading the weapon replaces the battery at the same time.
''Sacracrillo, The Grand Library''
//est. Population: 100//
''History''
Sacracrillo was struck by city busters on judgment day decimating all but the outermost populated areas which suffered still from the fallout. The ghost storm from the bombs still rages to this day around the city keeping all but the most dedicated of scavenger at bay. While the city itself was lost Sacracrillo University, the areas greatest site of higher learning, still managed to survive in part. The most well survived building was by far was the library which for a time housed the the soul surviving inhabitant of the University: Twilight Sparkle.
Twilight Sparkle was a graduate and junior librarian at Sacracrillo University with hopes of one day becoming Head librarian, a mare with a muzzle always in a book she loved nothing more than peace, quiet, and learning. Fortunately for Twilight it was her preference towards solitude that may have saved her life as on judgment day the mare had hidden herself away in the secluded vaults below the Library which housed the rarest tomes. The ground shook as Sacracrillo and the surrounding area was pounded into radioactive dust by Ghost Rock bombs but the mare managed to ride out the worst of it inside her impromptu shelter.
When Twilight emerged a week later she found the rest of the faculty and student body had either died or fled from the area. Not knowing what ells to do the lavender unicorn started to clean up the mess as best as she could and gather what supplies she could find, with no other destination in mind she made the library her home.
For living next to a Ghost storm Twilight's life was fairly quiet for a time until a pack of scavengers targeted the Library. Defending her home Twilight fought back but was no match for the attackers who brutally beat her before looting her supplies, destroying large sections of the library, and leaving her to die. As Twilight lay alone she made a silent promise that if she lived she would dedicate her life to protecting against the destruction of knowledge and to shelter those who wanted to learn. Against all odds Twilight pulled through and has been living by her word ever since.
Calling like minded ponies to her cause Twilight moved the remaining books from Sacracrillo Universities Library and lay them to rest in a Massive bank vault farther outside of the city. Over time more ponies joined Twilight and her Librarians gathering together a massive repository of knowledge. The bank has become known as “The Grand Library” and is the heart of a large well fortified complex and while the Librarians are not known for there numbers they are, like there Leader, willing to die to the last to protect pony kind from a new dark age.
''The Grand Library Today''
Twilight has been busy ever since she started her self appointed task and while The Grand library dose not host to many of them at one time her Librarians can be found all across Equestria. Only the Head Librarian Twilight Sparkle herself and the organizations head officials remain at the Grand Library while the rest circle in and out of rotation to quest for more knowledge to bring back for the Library. The Librarians are a secretive group who don't much like others poking into there business and it is rare for there leader to ever give an audience to visitors these days.
While secretive of there own matters the Grand Library is certainly open for business. Visitors can pay for services here and under the watchful eye of a librarian, research just about any topic anypony can imagine. Some of the more esoteric or rare bits of knowledge may cost you a bit more but when your in need there is no better group to turn to for information. The Librarians also purchase items they have interest in, books and other forms of information (such as maps, data-slugs, or even gossip) can be sold to them for various prices. Sadly its a dangerous world out there for Librarians and not all of them make it back, the Grand Library also pays for retrieval of Librarian palmcorders.
Librarians can be easily identified by there palmcorders, love of knowledge, and their pins which are issued to them upon there initiation into the order. A librarians pin is minted localy at the Grand library and features the same design as their founders Cutie mark: A chain bound book featuring a Star motif on the cover. The Chained book stands as the Librarians emblem much to the dismay of the embarrassed Head Librarian (at least if you believe the rumors that is).
''Requirements'': Novice, Luck
Once per session the hero may “suddenly remember” that he has a much-needed piece of equipment on his person. The item must be capable of being stored in the hero’s pocket or bag (assuming he has one), and the Game Master has the final word on what can be found.
''Requirements'': Seasoned, Arcane Background (Junker), Knowledge (any kind of science) d8+
These junkmen have a keen eye for odds and ends they can pull, cut, or yank out of the scraps they sort through. When a junker with this Edge is allowed to scavenge (see [[Scavenging]]), he gains 1d10 Components with a success, 2d10 with a Raise.
Scavenging is the ability to find saleable bits or life’s necessities in the ruins of civilization.
When the Marshal decides a location might have scavengable materials, each member of the party who chooses to search may make Notice rolls. With a success, the waster finds $2d6 worth of saleable bits he can use as cash the next time he finds a trader. These bits are unnamed odds and ends good for nothing other than currency.
In additon, if the searcher gets a raise, he may also draw a single card from a fresh Action Deck. The Marshal has the scoop on what the scavenger finds.
Naturally, most of the really good caches of loot have already been picked over in the 16 years since Judgment Day. The scroungers’ Notice rolls are modified by the size of the find and whether or not it’s already been picked over, as decided by the Marshal and using the Scavenging Table below as a guide.
!!Scavenging Modifiers
| !Modifier | !Time |!Location |
| –4 | 1d6 rounds |Corpse |
| –2 | 1d6 min |Civilian car, group of corpses |
| –1 | 3d6 min |Military vehicle, traffic pileup in a small town (a dozen cars or so) |
| 0 | 1d6 hours |Home or small office, former battlefield, jetliner, traffic pileup in a large city (50+ cars) |
| +1 | 2d6 hours |Large office (up to 100 people) |
| +2 | 3d6 hours |Office building, department store, cruise ship |
| +4 | 1d6 days |Laboratory |
| !Modifier |!Condition |
| –4 |Likely to have been picked over already |
| –2 |Unlikely to have been picked over already |
| 0 |Untouched |
| +2 |Organized cache (such as a survival shelter) |
''Requirements'': Veteran, Earth Pony
Nature is eerily at home around you, and you exude an unnamable charm and aura of calm that rubs off on just about any other creature. You gain a +2 bonus to Charisma.
''Requirements'': Novice, d8+ in affected Knowledge skill
Learned professors, devoted students, and amateur enthusiasts spend months of their lives studying particular subjects. They become experts in these fields, and rarely fail to answer questions in their particular area of expertise.
Pick any two Knowledge skills the Scholar has a d8 or better in. Add +2 to your total whenever these skills are used. Those who study military history have a natural edge when commanding troops in Mass Battles (see page 92)—a +2 to a Knowledge (Battle) roll can mean the difference between a rousing victory and a crushing defeat.
''Requirements'': Novice, Notice d8+
Scroungers are those brave (or foolish) souls who enter the remnants of the ruined cities of the Wasted West searching for vital supplies—and the occasional luxury item. Skill in picking over the detritus of a devastated town is a prized ability in these difficult times.
Scroungers get a +2 to Notice rolls when scavenging. Additionally, if successful, they double the normal results, gaining $2d6 x2 on a success or drawing two cards on a raise (see [[Scavenging]]).
''School'': Divination
''Range'': Visual
''Duration'': 1 round x Smarts
''Trappings'': Targets feel a slight chill
Send Thoughts allows you to communicate silently and telepathically with a single creature in visual range that understands your language. The target can respond back telepathically, and each round you maintain the link allows for a few lines of dialogue. You and the target each hear each other’s voices as if you were whispering in each other’s ears.
''Cast Option'' (-X): You may communicate with multiple creatures simultaneously. The casting modifier is equal to X, where X is the number of additional creatures you wish to communicate with.
[[Events]]
[[Factions]]
[[Locations]]
''Sham Fan''
//est. population: 100//
Sham Fan was founded way back in the early days of the Ghost Rock rush and thanks to all the mining in the area prospered quickly. Unlike other settlements Sham Fan never had trouble paying up to Cloudsdale and Grim Forecast which made Sham Fan the place to be shooting property value through the roof. This prosperity continued well past the rush and lasted all the way up to the last war. When the bombs flew Sham Fan was the most populated city on the west coast, the City busters leveled Sham Fan and its inhabitants into radioactive dust.
A few years later a large number of mutants took up residence in the ruins inside of the Sham Fan malestrom. The Muties are a nasty bunch loyal to the cult of doom in Las Pegasus (when it suites them). They are led by a brute of a Mutant calling himself Sham Fang who has an extra head jutting from his shoulder, Sham Fang insists this extra head makes him twice as smart and often chats with his “brother”. Sham Fang rules over his tribe of mutatants and is always surounded by a pack of at least a dozen of his personal body guards.
The Mutants of Sham Fang attack any normies who enter there territory but are more than willing to deal with there own kind.
''Rank'': Special
''Power Points'': Special
''Range'': Self
''Duration'': 1 minute (1/minute)
''Trappings'': “Morphing,” talismans, tattoos.
Many cultures have legends of shamans or wizards who take on the shape of animals. This power does just that. This version of the power only allows a user to transform into mundane animals, but more bizarre transmutations may be found.
A character may learn this spell while of Novice Rank but cannot transform into the more powerful creatures until he attains the appropriate Rank. The cost in Power Points depends on the type of creature the character wishes to change into. Use the Shape Change table as a guideline for unlisted creatures.
Weapons and other personal effects are assumed into the animal’s form and reappear when the power ends, but other objects are dropped.
While transformed, the character retains his own Smarts, Spirit, and linked skills (though he may not be able to use them since he cannot speak). He gains the animal’s Agility, Strength, and linked skills and cannot use most devices. He has no capacity for speech and cannot use powers, though he may continue to maintain powers previously activated. Vigor is the higher of the caster’s or the creature’s.
The GM has final say on what an animal can and cannot do. A shaman in dog-form might be able to pull the trigger on a shotgun, for instance, but would use a default skill roll of d4–2 as the animal has no Shooting score of its own. The shaman’s Persuasion functions normally, but might suffer a –4 or worse penalty without speech, depending on what he tries to accomplish.
!!Shape Change
| !Cost | !Rank |!Animal Types |
| 3 | Novice |Hawk, rabbit, cat |
| 4 | Seasoned |Dog, wolf, deer |
| 5 | Veteran |Lion, tiger |
| 6 | Heroic |Bear, shark |
| 7 | Legendary |Great white shark |
This cantrip works the same as the //Elemental Manipulation// power (see [[Elemental Manipulation]]), with differences noted below.
''School'': Transmutation
''Range'': See //Elemental Manipulation//
''Duration'': Instant
''Trappings'': Pale glow corresponding to element’s color
When you first choose this cantrip, select one of the four elements listed under Elemental Manipulation to control, in addition to a fifth element, Void. You can take this cantrip multiple times, each time picking a different element. Shape Nature can be cast once per turn as a free action.
► ''Earth'': The size of the hole you can open up increases to 1 cubic yard (or half that in stone).
► ''Water'': The amount of water you can create and/or purify increases to four gallons.
► ''Void'': You can channel the essence of emptiness to help clear your mind of distractions. You may use this cantrip at the same time that you spend a turn preparing a spell; you may ignore up to 3 points of casting penalties instead of the normal 2.
You must be a Unicorn to take this Hindrance. Either through some misfortune or since birth, you have been unable to use your innate magic as your horn is non-functioning or missing.
You cannot have or use or learn new cantrips, though you may still have any die type in Spellcraft and may still use Sense Magic (see the section on Spellcraft for more information). You can never attune Spellcraft into other forms of magic.
''Requirements'': Seasoned, Arcane Background (Templar), Spirit d8+, Faith d8+
Supernaturally evil opponents gain no Gang Up bonus on this Templar.
''Shiitake Flats''
//est. population: 200//
Shiitake Flats is sizable settlement that has really grown over the past months. Originally a small community of farmers living off mushrooms they grow inside the Plateau they live on, which is linked to a large underground aquifer, the population swelled with ponies who fled South to escape the war between The Combine and the Iron Alliance. For nearly a month they waited on news the refugees camped around the plateau, after word finally came many of the ponies drifted off or returned home.
Having always been small and relatively easy pickings for any gang that passed through looking for tribute the mushroom farmers had become used to the visitors, whose large numbers kept the gangs away, they eagerly invited as many to stay who liked. Several took them up on the offer and like that Shiitake Flats had a sizable population boom. In the following months the new work force has scavenged enough scrap to expand the town and even build a few proper blockades along the winding road leading up to the town.
With guards now posted and some defenses in place local gangs are less of a threat, but those extra mouths mean less food to go around. Previously Shiitake flats traded water and food to travelers but can no longer spare many of there mushrooms, there is enough to go around for now but the surrounding area has lost a much needed source of food.
Shittake Flats is located about 75 miles west by north west of Phoenix and built on top of a 60 foot Plateau accessible only by a steep road that snakes half way around the mound, cave entrances along the side of the Plateau lead into a sizable Aquifer. A pony powered well pulls water up to the town and farmers tend to large mushroom farms underground inside the caves. Until recently a Shittake Flats was the frequent target of a local road gang, The Pistons, who have since been successfully repelled multiple times.
Shooting covers all attempts to hit a target with a ranged weapon such as a bow, pistol, or rocket launcher.
The basic Target Number to hit is 4 as usual, though there are a number of important modifiers such as range that frequently come into play. See [[Combat]] for more details.
Shotguns List three different Damages for each weapon, these apply at the three different ranges (short/Medium/Long). All Shotguns grant a +2 bonus to Shooting tests to hit.
|!Weapon|!Range|!Dmg|!~RoF|!Coast|!Avail|!Wgt|!Shots|!Min Str|
|''Auto-Shotgun''|10/20/40|3/2/1D6|3|$600| R |15|20|D8|
| Notes: +2 to Hit |<|<|<|<|<|<|<|<|
|''[[Breacher]]''|5/10/20|3/2/1D6|1|$200| R |4|3| |
| Notes: +2 to Hit; Underbarrel Attachment |<|<|<|<|<|<|<|<|
|''Double Barreled''|12/24/48|3/2/1D6|1-2|$200| C |11|2| |
| Notes: +2 to Hit |<|<|<|<|<|<|<|<|
|''DB Sawed Off''|5/10/20|3/2/1D6|1-2|$150| C |6|2|D6|
| Notes: +2 to Hit |<|<|<|<|<|<|<|<|
|''Semi-Auto Shotgun''|12/24/48|3/2/1D6|1|$150| U |8|6| |
| Notes: +2 to Hit |<|<|<|<|<|<|<|<|
A sidecar increases a motorcycle’s passenger rating by 1 but inflicts a –1 penalty to Driving rolls. For extra mayhem, sidecars can also carry one additional Weapon Mount. Sidecars can only be mounted on motorcycles
''Requirements'': Legendary
Your exploits are such that they have become an inspiration to others, and now a young crusader has joined you in your cause.
You gain a Novice-rank sidekick character who is also Wild Card, gains experience as a character, and is otherwise treated exactly as another player-controlled character. Create the sidekick as you would any new character; you control both this character and your sidekick at once.
Of course, the sidekick may occasionally cause trouble (by getting captured, running into danger when he’s not supposed to, etc.). The player should be prepared for his “Edge” to occasionally become a “Hindrance.”
If the sidekick dies, he isn’t replaced unless the hero chooses this Edge again.
''Requirements'': Novice, Unicorn, Spellcraft d6+
There is a particular cantrip that you have cast so often, it has become almost second nature.
When you take this Edge, choose a single cantrip you have: when casting this cantrip you receive a +1 bonus to the Spellcraft roll made to cast it. You may take this Edge multiple times, each time choosing a different cantrip.
''Requirements'': Seasoned, Arcane Background (Templar)
Though Simon Mercer has passed on, some say he still watches over his flock from whatever spirit world the rest of the saints reside in.
With this Edge, a Templar can cast one spell on himself each round as a free action.
!!List of Situational Combat Rules
*[[Aim]]
*[[Area Effect Attacks]]
*[[Automatic Fire]]
*[[Breaking Things]]
*[[Called Shots]]
*[[Defend]]
*[[Disarm]]
*[[Double Taps and Three Round Bursts]]
*[[The Drop]]
*[[Finishing Move]]
*[[Firing into Melee]]
*[[Full Defense]]
*[[Ganging Up]]
*[[Grappling]]
*[[Improvised Weapons]]
*[[Innocent Bystanders]]
*[[Mounted Combat]]
*[[Nonlethal Damage]]
*[[Obstacles]]
*[[Off-Hand Attacks]]
*[[Prone]]
*[[Push]]
*[[Ranged Weapons in Close Combat]]
*[[Rapid Attack]]
*[[Tests of Will]]
*[[Touch Attack]]
*[[Tricks]]
*[[Two Weapons]]
*[[Unarmed Defender]]
*[[Unstable Platform]]
*[[Wild Attack]]
*[[Withdrawing from Close Combat]]
!!Common Knowledge
Instead of asking characters to have dozens of background skills they rarely need in actual play, we use the concept of “Common Knowledge.” Your hero knows the basic history of his land, common etiquette, how to get around geographically, how to operate common machinery or equipment native to his time period and location, and who the major players in his locality are. A Common Knowledge roll is made by rolling the adventurer’s Smarts attribute.
If a character’s background suggests he should know something about a subject and he must make a roll, add +2 if most in his area or profession would know the answer. If the subject is foreign to a character, subtract 2 or more from the roll. Everyone else breaks even and gets no modifier.
If it becomes important to know how well a character performs a common task, the GM can ask for whatever roll is appropriate. Knowing how to do a dance, for example, is a Common Knowledge roll. If it becomes important to see how well a character performs the dance, the GM might ask for an Agility roll (with no bonuses or penalties).
For example, an adventure might read: “Anyone who makes a Common Knowledge roll detects that this cavern was carved by civilized hands, not formed naturally.” A dwarf knows more about stonework than an elf, so give the dwarf a +2 on the roll. A human has about average knowledge, so no bonus is granted. An elf who has spent most of his life in a forest won’t know much about stonework, so the roll is at a –2 penalty.
!!Lists of Skills
!!!List of Arcane Skills
<ul>
<$list filter="[tag[Arcane Skill]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
!!!Full list of Skills
<ul>
<$list filter="[tag[Skills]sort[]]">
<li><$link to={{!!title}}><$view field="title"/></$link></li>
</$list>
</ul>
Most people need a minimum of six hours sleep out of every 24. A character who goes without this amount of sleep must make a Vigor roll at a cumulative –2 every 12 hours thereafter (maximum penalty of –6). A large amount of coffee, soda, or other stimulant adds +2 to the roll.
* ''Recovery'': Every four hours of restful sleep removes a level of Fatigue.
* ''Incapacitation Effects'': A character who suffers this much Fatigue simply falls into a deep sleep for 2d10 hours.
''Rank'': Seasoned
''Power Points'': 1
''Range'': Smarts x 2
''Duration'': 3 (2/round)
''Trappings'': Tying a knot in a piece of string, slowing time, distracting invisible ghost monkey.
Skilled fighters and monsters with fast reflexes can strike before lesser beings have time to blink. Slowing their reflexes reduces their advantage.
The caster makes an arcane skill roll opposed by the target’s Spirit. With a success, movement becomes an action, giving the target a multi-action penalty if he wants to move and act in the same round. With a raise, the target must redraw initiative cards above 10, except Jokers.
A victim who usually draws multiple initiative cards discards only those with a value higher than the spell allows.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
''Rank'': Novice
''Power Points'': 1-8
''Range'': 24/48/96
''Duration'': Instant
On the battlefields of Earth, traditional syker powers proved of little use against hovertanks and armored personnel carriers. Left with little choice but to improvise, brainburners learned to hyper-focus beams of pure pyrokinetic energy that could eventually penetrate even the heaviest armor.
A syker casting //slow burn// must be stationary. He cannot move or be on an unstable platform such as most vehicles. The Power Points required depend on the Armor of the target, as shown on the table below. If a syker wants to burn through a vehicle with 70 Armor, for example, he must spend 6 Power Points, and does 4d10 damage, ignoring all armor, if successful.
The beam counts as a Heavy Weapon. The syker can’t spend more points than required or increase his damage by spending more Power Points.
!!!SLOWBURN TABLE
| !Armor | !Power Points | !Damage |
| 1–4 | 1 | 2d6 |
| 5—10 | 2 | 2d10 |
| 11–40 | 4 | 3d10 |
| 41–70 | 6 | 4d10 |
| 71–100 | 8 | 5d10 |
Any character on Slo-Mo feels like the
world is moving in slow motion around her.
The user draws an additional Action Card
(and may take the highest) in combat for
1d6 minutes, and her Pace is increased by
2. This stacks with Level Headed, Improved
Level Headed, and Fleet-Footed.
Unfortunately, the drug works a little too
well. Unless a Vigor check is made with a
–2 penalty when the drug is taken, the user
gets “the shakes,” causing all Agility-based
skills to be made at –2 for 1d6 hours.
Your survivor is slow. Maybe he has a limp from an injury that never heals, or maybe he’s just choosey about where he places his feet. Either way, reduce his Pace by 1. This is cumulative with the Lame Hindrance if you really want to compete in the next tortoise and hare race. You can guess which one you are.
''Rank'': Seasoned
''Power Points'': 2
''Range'': Smarts x 2
''Duration'': 1 minute (1/minute)
''Trappings'': A lullaby, blowing powder or sand at targets.
Blasting a hoard of enemies into tiny pieces may be popular with some mages, but those who favor stealth or have a pacifistic bent are drawn to this spell.
The caster picks where he wants to center the spell and places a Medium Burst Template. He then makes an arcane skill roll. Any living creature (not undead or constructs) within the area must make a Spirit roll, at –2 if the caster scored a raise. Those who fail fall asleep.
Loud noises awaken the sleepers as if they were a normal sleeper (Notice roll). When the duration expires, the sleepers naturally wake up.
Your character is either very skinny, very short, or both relative to his particular race. Subtract 1 from his Toughness for his reduced stature.
''Rank'': Novice
''Power Points'': 2
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': A colored glow, runes, sigils, crackling energy, barbs grow from the blade.
This power is cast on a weapon of some sort. If it’s a ranged weapon, it affects one entire magazine, 20 bolts, shells, or arrows, or one full “load” of ammunition (the GM may have to determine the exact quantity for unusual weapons). While the spell is in effect, the weapon’s damage is increased by +2 or +4 with a raise.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
Place a Medium Burst Template touching the rear of the vehicle. Smokescreens give a –6 penalty to Driving or Shooting rolls made through them (such as when driving through one to perform a Ram). Smoke lasts until the user’s next turn. Recharging the smoke canisters costs $50 of Uncommon cartridges.
Not every conflict is won by the blade. Successful oratory can topple nations.
The following system works well for protracted and dramatic negotiations, such as convincing a council to send troops to a noble’s lands, winning a court case, or tricking a guard into opening the gates to the space station.
The conflict is broken down into three rounds of conversation, each focusing on one particular point (or a few highly connected points). Further rounds represent the turn of conversation to additional points.
Each round, the player character roleplays his argument and makes a Persuasion roll (or an opposed Persuasion roll if a rival is arguing against him).
A speaker accumulates a success for each success and raise on the Persuasion roll (it’s best to keep track of this with tokens).
At the end of the third round of conflict, the side with the most successes “wins” the argument. The more successes, the more convinced the target to be persuaded is, as shown on the Social Conflict Table below.
► ''Modifiers'': The Game Master should grant a +2 bonus to a side that makes a particularly brilliant or undeniable point; or a –2 penalty if the speaker commits a faux pas, such as making a provably untrue statement or insulting the audience he hopes to convince.
► ''Knowledge Is Power'': If the characters are arguing technical points, such as a legal battle or the best plan for a kingdom’s defense, the character must roll the lowest of his Persuasion or appropriate Knowledge roll. So for example a lawyer with a Persuasion of d10 and Knowledge (Law) of d4, would roll d4. It always pays to know what you’re talking about.
!!!Social Conflict Results
| !Margin of Victory |!Result |
| Tie |The issue is unsettled and no action is taken until new and more compelling evidence can be presented to reopen the negotiation. In a court case, the defense would win as the burden of proof is on the prosecution. |
| 1-2 |The target isn’t truly convinced but decides it’s better to be safe than sorry. He provides the minimum amount of support possible. In a court case, the jury barely finds reasonable doubt if the defense wins, or assigns minimal sentencing if the prosecution wins. |
| 3-4 |The target is reasonably convinced. He grants the help requested, more or less, but may have conditions or ask favors in return. In a court case, the judge invokes severe sentencing if the prosecution wins. If the defense wins the defendant is cleared of all charges. |
| 5+ |The target is sure of his decision. He provides more support than requested. If the prosecution wins in a court case, the defendant receives the maximum penalty. |
''Requirements'': Seasoned, Arcane Background (any but Weird Science), Knowledge (Arcana) d10+
Spellcasters, mentalists, and other arcane types in dire need of Power Points may use this Edge to drain energy from their own souls.
To use this dangerous ability, the arcane character first decides how many Power Points he wants to draw from himself. Then he makes a Spirit roll minus the number of points he’s trying to drain. (This is a free action.) On a Spirit total of 1 or less, the character suffers a wound and falls unconscious for 1d6 hours. On a failure, the character suffers a wound. On a success or better, the character gets the points he needed and may attempt to cast a spell with them immediately (they may not be saved).
''Requirements'': Veteran, Harrowed
A successful bare-handed attack with a raise allows the Harrowed to drain the life force of his victim, automatically inflicting a wound on any living being.
Each time the Harrowed causes a wound in this way, he may make a Spirit roll opposed by his victim. If he is successful, he repairs one wound. Even if the Harrowed causes multiple wounds (from a Wild Card, for example), he still only recovers one wound himself.
Alternately, the Harrowed hero may use the drained energy to recover a Fatigue level.
''Rank'': Novice
''Power Points'': 1
''Range'': Touch
''Duration'': 10 minutes (1/10 minutes)
''Trappings'': Words, pictures, hand motions.
This power allows a character to speak, read, and write a language other than his own. The language must be of an advanced form — not animalistic. A raise on the arcane skill roll allows the user to project a particular dialect as well.
''Rank'': Novice
''Power Points'': 1
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': Blurred motion, “floating,” acrobatics.
Warriors who need to close with their foes quickly often use this power, as do those who sometimes need to outrun things Man Was Not Meant to Know. //Speed// allows the target of the power to move faster than usual. With a success, the recipient’s basic Pace is doubled. With a raise, running becomes a free action, so he may ignore the usual –2 running penalty.
Spellcraft represents knowledge of magic and how to both use and manipulate it; non-Unicorns may take this skill, but they are limited to academic knowledge of magic as they have no way of actually applying it directly.
Spellcraft is the skill used by Unicorns to cast spells and determines the number of cantrips that they know inherently. See the chapter on Magic for more information. Unicorns with at least a d4 may use the Spellcraft skill to Sense Magic:
► ''Sense Magic'': Unicorns with this skill can detect whether or not something is magical, or if magic is being used in their vicinity. A successful Spellcraft roll tells a character whether or not an object is magical in nature, with possible additional details about its enchantment on a raise. In addition, you may roll Spellcraft in order to recognize the effects of a spell as it is being cast or if it is in effect nearby; this is typically an opposed Spellcraft roll against the Spellcraft of the spell’s caster (the Game Master rolls for this). On a success, you can detect the presence of a magical effect (such as determining if something nearby is a magical illusion) but nothing else about it.
► ''Attunement'': Unicorns with this skill may choose once to add a focus for their Spellcraft. It must be a Smarts-based arcane skill, with the exception of Weird Science. Attunement lets the Unicorn to use Spellcraft for both Cantrips, as well as every requirement and use of a single arcane skill. They also get +2 on rolls to sense that particular type of arcane skill use, but -2 to sense any other non-Cantrip magic.
| !Attunements | !Effects |
| Spellcraft | Cast Cantrips; Sense Magic |
| Spellcraft(Bibliopathy) | Cast Cantrips and Bibliopathy; +2 to Sense Bibliopathy, -2 to other non-Cantrip magic |
| Spellcraft(Psionics) | Cast Cantrips and Psionics; +2 to Sense Psionics, -2 to other non-Cantrip magic |
| Spellcraft(Witchcraft) | Cast Cantrips and Witchcraft; +2 to Sense Witchcraft, -2 to other non-Cantrip magic |
These devices drop caltrops or sharp junk onto the road that flatten tires. Place a Small Burst Template adjacent to the appropriate side of the vehicle. Any vehicle that drives through the spikes (and doesn’t have hardened wheels) automatically suffers an Out of Control roll at –4, and loses 20% of its Top Speed until the tires are repaired. Reloading the canister costs $20 (Common).
Spoilers deflect air passing over a vehicle, pushing it down and improving traction. This adds +1 to the driver’s Driving roll at speeds of 20 and higher. Spoilers can’t be fitted to motorcycles.
''Requirements'': Novice, Harrowed
The Harrowed draws upon the power of the manitou within him to lend a little extra substance to his intimidating glare or grating voice. This adds +2 to his Intimidation rolls, In addition, Wild Cards who fail must roll on the Fright Table (see [[Fear]] in Situational Rules) Extras are Panicked. The ability may not be used on the same target more than once in the same general encounter.
The spur-jack is a small, spring-loaded knife that is strapped to the lower leg and can be deployed by stomping on a small metal stud. The blade is slightly curved and points upwards at a 45° angle, making it ideal for raking slashes and upward kicks. When not Deployed the weapon imposes a -2 penalty to being spotted.
Reduces the Unstable Platform penalty for integrated weapons penalty to –1, or 0 if an Improved Stabilizer for $8K.
''Requirements'': Novice, Agility d8+
Your hero ignores the “unstable platform” penalty for firing from the backs of animals or while riding in moving vehicles. In addition, when performing actions while Running (see [[Movement]]), his penalty is –1 instead of –2.
''Requirements'': Novice, Agility d8+
Your hero ignores the “unstable platform” penalty for firing from the backs of animals or while riding in moving vehicles. In addition, when performing actions while Running (see [[Movement]]), his penalty is –1 instead of –2.
–4 to spot the vehicle with sensors.
Stealth is the ability to both hide and move quietly, as well as palm objects and pick pockets. In many Savage Worlds games, knowing exactly when your hero has been spotted and when he hasn’t can be critical.
For a character to sneak up on foes and infiltrate enemy lines, start by figuring out if the “guards” the heroes are sneaking up on are “active” or “inactive.” Inactive guards aren’t paying particularly close attention to their surroundings. The group need only score a standard success on their individual Stealth rolls to avoid being seen. Failing a Stealth roll in the presence of inactive guards makes them active.
Active guards make opposed Notice rolls against the sneaking characters’ Stealth skills. Failing a roll against active guards means the character is spotted.
Apply the following modifiers to all Stealth rolls:
!!Stealth Modifiers
|!Situation | !Modifier |
|Crawling | +2 |
|Running | –2 |
|Dim light | +1 |
|Darkness | +2 |
|Pitch darkness | +4 |
|Light cover | +1 |
|Medium cover | +2 |
|Heavy cover | +4 |
► ''The Last Step'': Sneaking to within 6” of a foe (usually to get close enough for a melee attack) requires an opposed Stealth roll versus the target’s Notice, whether the guard is active or inactive.
► ''Movement Rate'': Out of combat, each Stealth roll covers moving up to five times the character’s Pace. In combat, the Stealth roll covers only a single round of movement.
► ''Stealth for Groups'': Out of combat, make only one Stealth roll for each like group of characters (see [[Group Rolls]]). Use the lowest movement rate to determine how much ground is covered. The observers also make a group roll to Notice their foes. Once a combat breaks down into rounds, Stealth and Notice rolls are made on an individual basis.
► ''Discreet Casting'': Sometimes, an unicorn may wish to hide the fact that they are casting a cantrip from others around them. When you declare the cantrip you are casting, make a Stealth roll (the Game Master determines if those around you are Active or Inactive). If you are successful, you may then attempt to cast the cantrip with no one the wiser, even if you fail the Spellcraft roll. If you are unsuccessful, you may proceed with the Spellcraft roll but it will be obvious that you are casting a cantrip.
''School'': Transmutation
''Range'': 1”
''Duration'': Instant
''Trappings'': Flash of white light
You teleport to any spot within the cantrip’s radius, which you must be able to see (no intervening barriers or obscuring effects such as fog) and that is not through a solid object. Enemies adjacent to you when you reappear do not get free attacks against you.
''Cast Option'' (-2): The range of this cantrip increases to half your Smarts.
''Requirements'': Novice, Harrowed
A dead man with Stitchin’ regenerates damage much faster than normal. He may make natural Healing rolls every day, provided he consumes a pound of meat for each attempt.
''Celestial Reformation and the great Ghost Rock rush''
//0 - 630 CM (Celestial Monarchy)//
After Nightmare moons retreat Celestia immediately begins a strict reformation of her regimes policies beginning with striping as much power from the hooves of the extended royal family as possible. Bringing nearly full governmental power under her own control Celestia reigns in all Dissenters she can lay hoof upon, to this end she deploys the newly created Solar Service to act as her private police force reporting only to the crown. With her had hooved Tactics Celestia Squelches any talk of revolution within a decade and cements her new monarchy. A new fortified capital is founded on the highest peek at the end of the Unicorn rang in the city of Canterlot.
The now tested Solar Service are tasked with Hunting down the last threat to Celestia and her Empire, Nightmare Moon. It is one of these search parties that eventually makes the discovery of massive Deposits of Ghost rock to the south of then settled Equestria within Buffalo lands. To this point Ghost rock was precious to the point that the only sizable amounts within equestria proper were within Canterlots treasury and a few installations of higher learning and research. More Ghost rock is found in the first six months than were ever successfully recovered from the Shattered north.
Fueled by the promise of great wealth and Celestias Governments stance of “Manifest Destiny” the Ghost rock rush was on. Despite resistance from the Buffalo Nations Ponies flood the south and southwest quickly beginning colonization and staking claims to Ghost Rock mines. Fearing reprisals from the Buffalo the Solar Guard are deployed as peacekeepers. Celestia Opens Equestrian boarders to Griffin, Zebra, and even Diamond Dog (who had been driven from Equestria in mass before Discords Rise) immigrants to bolster her expanded lands.
With more Ghostrock on hoof Infrastructure began to be set into place to shuttle the precious material back to Equestria proper, Canterlot offers massive government contracts and rewards for the establishment of a cross Equestrian rail line reaching to the southern expansion colonies. This following conflicts are now known as the rail wars as companies competed for the prize. The eventual Victor of the Rail Wars was a famous Pegasus business pony and Inventory named Hill Storm who was one of the leading forced behind the growing “new science” movement that was producing amazing devices powered by Ghost Rock. Hill Storm uses his fortune to expand his company, Hill Storm Industries, into one of the largest in all of Equestria.
Weird Shadows began to form in the south as “Mad scientists” turned out bizarre inventions, unexplained bolstering of undead sightings, appearance of strange creatures, Ponies tapped into strange magics, and the land itself seems to twist as well into dark forms. This is the Strange Frontier.
Streetwise characters are able to gather information from the street, saloons, or other contacts through bribes, threats, or carousing. Finding written information in libraries and the like is covered by the Investigation skill.
Streetwise is always modified by a character’s Charisma modifier.
''Requirements'': Novice
The jaws and neck muscles of this character are used to handling heavy things. This allows them to wield two-handed weapons with their mouth, as long as they can be used with a single strong grip. This would apply to Great Axes, but not Compound Bows.
The character also gets a bite attack of d4, or a die increase if they already have a bite attack.
<<<
''comment'': What do you think?
We might also want to clarify what can hold what. Melee weapons are defined, but guns aren't. Should we also restrict mouth if using flank held weapons, like battlesaddles? Should we add a cost to that?
<<<
''Requirements'': Novice, Intimidation d6+, Taunt d6+
Characters with strong willpower use their voice, steely stares, or quick wits to unnerve their opponents. Strong Willed adds +2 to a character’s Intimidation and Taunt rolls, as well as his Spirit and Smarts rolls when resisting Test of Wills attacks.
This stubborn individual always wants his way and never admits he’s wrong. Even when it’s painfully obvious he’s made a mistake he tries to justify it with half-truths and rationalizations.
''Rank'': Novice
''Power Points'': 2
''Range'': 12/24/48
''Duration'': Special
''Trappings'': Bolts of energy, stun bombs, sonic booms, burst of blinding light.
//Stun// shocks those within a Medium Burst Template with concussive force, sound, light, magical energy, or the like.
If the arcane character scores a success, targets within the area of effect must make Vigor rolls or be Shaken. With a raise, victims must make Vigor rolls at –2.
|!Weapon|!Range|!Dmg|!~RoF|!Cost|!Avail|!Wgt|!Shots|!Min Str|
|HI Blazer (9mm)|12/24/48|2D6+1|3|$200| U |12|30|D6|
| AP 2; 3 Round Burst; Caseless Ammo |<|<|<|<|<|<|<|<|
|HK MP-20 (10mm)|12/24/48|2D6|3|$150| U |10|20| |
| AP 2; 3 Round Burst |<|<|<|<|<|<|<|<|
|LA Commando (5.56)|12/24/48|2D6|4|$150| U |11|30| |
| AP 3; 3 Round Burst |<|<|<|<|<|<|<|<|
|SA Commando (.50)|12/24/48|2D8|3|$150| U |14|20|D6|
| AP 2; 3 Round Burst ; Carbine |<|<|<|<|<|<|<|<|
|Machine Pistol (9mm)|10/20/40|2D6|3|$150| R |7|15| |
| AP 1; 3 Round Burst |<|<|<|<|<|<|<|<|
|Trotson SMG (.45)|12/24/48|2D6+1|3|$150| S |11|50| |
| AP 1; Auto |<|<|<|<|<|<|<|<|
|Uzi (9mm)|12/24/48|2D6|3|$150| U |9|30| |
| AP 1; 3 Round Burst |<|<|<|<|<|<|<|<|
''Rank'': Novice
''Power Points'': 1
''Range'': Touch
''Duration'': Instant
''Trappings'': Prayer, laying on hands, curative tonic.
//Succor// removes one Fatigue level, two with a raise. It can also remove a character’s Shaken status.
//Succor// may be used to restore consciousness to those who have been Incapacitated due to wounds as well, though the wounds remain. It does not stop bleeding or otherwise stop mortal wounds from worsening, however.
''Rank'': Novice
''Power Points'': 3+
''Range'': Smarts
''Duration'': 3 (1/round)
''Trappings'': Call elemental, ghostly dog, dimensional double.
This power allows the character to summon a loyal and obedient servant. On a success, the ally is placed at any point within the range of the power. On a raise, the ally is more durable and gains the Hardy ability. A summoned ally acts on the initiative card of the caster and gets an immediate action as soon as it is summoned.
All Allies are Extras, even Mirror Selves (see below).
A character may learn this spell while of Novice Rank, but he cannot summon more powerful allies until he attains the appropriate Rank. The cost in Power Points depends on the type of ally the character wishes to summon. Use the Summon Ally table as a guideline for unlisted creatures.
A caster of sufficient Rank to summon more powerful allies may instead choose to summon additional lower Rank allies instead at the same cost. For each decrease in Rank, he gains one additional ally. For example, a Veteran caster could spend 5 Power Points to summon one Veteran-Rank-allowed ally, two Seasoned-Rank-allowed allies, or three Novice-Rank-allowed allies. Allies summoned by a single casting must all be of the same type.
See the Bestiary for statistics of some of the creatures listed below.
!!Summon Ally
| !Cost | !Rank |!Ally Types |
| 3 | Novice |Bodyguard, experienced soldier |
| 4 | Seasoned |Dire wolf, ogre |
| 5 | Veteran |Elemental (any kind) |
| 6 | Heroic |Sentinel |
| 7 | Legendary |Mirror self |
!!!Bodyguard
A bodyguard is a humanoid soldier made of stone (or equally tough material).
''Attributes'': Agility d6, Smarts d6, Spirit d6, Strength d8, Vigor d8
''Skills'': Fighting d6, Notice d6
''Pace'': 6; ''Parry'': 5; ''Toughness'': 10 (4)
''Gear'': Long sword (Str+d8)
''Special Abilities'':
* ''Armor +4'': Stone skin.
* ''Construct'': +2 to recover from being Shaken; no additional damage from called shots; constructs do not suffer from poison or disease.
* ''Fearless'': Bodyguards are immune to fear and Intimidation.
!!!Sentinel
A sentinel is a larger and more powerful version of a bodyguard.
''Attributes'': Agility d6, Smarts d6, Spirit d8, Strength d12+3, Vigor d10
''Skills'': Fighting d10, Intimidation d10, Notice d8
''Pace'': 8; ''Parry'': 6; ''Toughness'': 14 (4)
''Gear'': Great sword (Str+d10; Parry –1)
''Special Abilities'':
* ''Arcane Bond'': Sentinels count as having Arcane Resistance for anyone other than their summoner.
* ''Armor +4'': Stone skin.
* ''Construct'': +2 to recover from being Shaken; no additional damage from called shots; constructs do not suffer from poison or disease.
* ''Fearless'': Sentinels are immune to fear and Intimidation.
* ''Improved Sweep'': Sentinels may attack everyone adjacent to them as a single action.
* ''Size +3'': Sentinels are 8–9 feet tall and very dense.
!!!Mirror Self
This is an ally that appears identical to the caster but with the following differences. The ally is an Extra as normal for the power. The duplicate has half the total Power Points of the caster, and all of the duplicate’s Traits are one die type less than the caster’s Traits (to a minimum of d4). The duplicate has identical mundane equipment, but none of it has any magical qualities.
Heralded by pharmaceutical companies
and medical experts as “the cure for
the common cold”, these super
drugs were expensive and rare, and have
been made even rarer after being out
of production for more than 18 years. A
week-long course of Super Antibiotics
allows a +2 to natural Healing rolls, or +4
to Vigor rolls if used to treat diseases.
A supercharger improves an engine’s performance by forcing additional air into the pistons. This provides more oxygen for combustion inside the engine, increasing its power output.
Your vehicle’s Acc/Top Speed is increased by +2/+4, and it gets five more miles per gallon of spook juice.
''Requirements'': Novice, Harrowed
Supernatural Trait immediately improves any one attribute two die types (a d12 becomes a d12+2, and so on). This Edge may be taken up to five times, but only once for each one attribute.
Survival allows a character to find food, water, or shelter in hostile environments.
A character may only make one roll per day. A successful roll finds sustenance for one person, a raise on the roll finds food and water for five adults. Horses and
other large beasts count as two adults. Children, camels or others with small appetites count as half.
Those who benefit from the roll do not have to make Fatigue rolls for the day for food, water, or shelter
''Requirements'': Novice, Strength d8+, Fighting d8+
Sweep allows a character to make a single Fighting attack and apply it against all currently adjacent targets at a –2 penalty (friends and foes alike—be careful). Resolve each damage roll separately. The attack is applied immediately when rolled and only affects targets adjacent at that time.
A character may not use Sweep in the same round she uses Frenzy, nor may she Sweep more than once per round, or with a second weapon held in another hand. In effect, the hero may only perform Sweep once per action unless she somehow gets two entire actions (perhaps under the effects of a spell or power, for example).
Requirements: Seasoned, Arcane Background (Templar), Faith d8+, Fighting d8+
A Templar with this Edge does +2 damage with any Fighting attack against supernaturally evil creatures. Additionally, a raise on the Fighting roll against such a foe adds +1d10 damage instead of +1d6.
''Requirements'': Wild Card, Seasoned, Command, Smarts d8+, Knowledge (Battle) d6+
The leader has a natural grasp of small unit tactics and can frequently take advantage of a rapidly changing situation.
At the beginning of a fight and before any Action Cards are dealt, the hero makes a Knowledge (Battle) roll. For each success and raise he receives one Action Card. These are kept separate from his regular Action Cards and are not placed back into the deck until used or the combat ends (including Jokers!). At the start of any round, the hero may give one or more of these extra cards to his allies, whether Extras or Wild Cards, who then use it as their Action Card for the round in place of the one dealt them. This allows Extras to operate independently of Wild Card characters for one round if they receive their own card.
Only one character per encounter may use this Edge
''Requirements'': Tail "limb", Novice
By training and practice, the character became able to use their prehensile tail with greater skill and power than others.
They can use any weapon or object up to their Strength die in weight without any off-limb penalty. Multi-action penalties still apply unless otherwise stated.
''Requirements'': Novice, Persuasion d8+, Charisma +1 or higher
A good storyteller not only entertains, he gives hope and comfort as well. The survivors of the Last War can use all the hope and comfort they can find. When making a Persuasion roll to tell the tale of your posse’s exploits and reduce the Fear Level, add +2 to your total.
Further, where most tale tellers bungle the story when they roll a 1 on the skill die, you do so only on snake eyes. Anytime a Tale Teller lowers the Fear Level, he automatically gains a Benny.
''Requirements'': Seasoned, Arcane Background (Junker), //Research// d8+, Weird Science d8+
Tech spirits see the Hunting Grounds as a vast network of knowledge and information. A junker with this Edge has learned to get those spirits to do research for him. Once per game session, he can make a //Research// roll without any resources (books, computers, etc.) with a +2 bonus. Additionally, the spirits are constantly streaming him generalized information, granting a +2 bonus to Common Knowledge rolls.
Taunt is a Test of Wills attack against a person’s pride through ridicule, cruel jokes, or one-upmanship. This is an opposed roll against the target’s Smarts. See [[Tests of Will]] for the effects of a successful Taunt.
''Rank'': Seasoned
''Power Points'': 5
''Range'': Smarts
''Duration'': 3 (1/round)
''Trappings'': A wave of the hand, magic wand, steely gaze.
//Telekinesis// is the ability to move a single object or creature (including one’s self) with arcane will. The weight a caster can lift is equal to 10 pounds times his Spirit die type, 50 pounds times his Spirit with a raise.
► ''Lifting Creatures'': Living targets may resist with an opposed Spirit roll. If the roll is greater than the caster’s skill total, the victim is unaffected. If the creature loses, however, it is lifted as usual and does not get another attempt to break free.
Occasionally a victim might manage to grab onto something solid to prevent itself from being lifted. When this happens, the victim may make an opposed Strength roll versus the caster’s arcane skill. If the victim is successful, he manages to grab onto whatever was available and is not moved, bashed, or otherwise affected that round.
► ''Telekinetic Weapons'': A caster can use //telekinesis// to wield a weapon. When this occurs, the weapon’s Fighting is equal to his arcane skill, and its damage is based on the caster’s Spirit instead of his Strength. A sword that does Strength+d6 damage, for example, does Spirit+d6 when wielded by //telekinesis//. The weapon otherwise functions normally, including granting bonus damage when it strikes with a raise.
► ''Dropping Things'': Particularly ruthless characters often use //telekinesis// to drop their foes or bash them into walls and the like. A creature affected by this power can be moved up to the caster’s Smarts in inches per turn in any direction. Dropped creatures suffer falling damage as usual.
Victims who are bashed into walls or other solid objects suffer the caster’s Spirit+d6 as damage. If a caster with a d12 Spirit smashes an orc into a wall, for example, the orc suffers d12+d6 damage.
''Rank'': Seasoned
''Power Points'': 3
''Range'': Smarts
''Duration'': Instant
This grotesque power uses telekinesis to squeeze, pull, and tear internal organs, bones, and other vitals. A good attack can kill a foe in one quick blast, leaving nothing but a mangled pile of bleeding flesh and busted bones. Sykers have been known to rip out hearts (they call this “Aztec surprise”), snap bones (“bone ripper”) or subtly pinch off major veins and arteries (“the big one”).
Regardless of the specific effect and reaction, the attack is an opposed roll between the syker’s Psionics and the victim’s Vigor. Such fine manipulation of an unseen object is very difficult—the Psionics roll is made at –2. It does not work on undead, constructs, or creatures without a beating heart.
Success inflicts 1d10 damage, plus 1d10 per raise. Only magical armor protects against this attack.
''Rank'': Seasoned
''Power Points'': 3+
''Range'': Special
''Duration'': Instant
''Trappings'': A cloud of smoke, “phasing” out, change into a bolt of lightning.
//Teleport// allows a character to disappear and instantly reappear up to 10” distant for each 3 Power Points spent, or 15” with a raise. This counts as his movement for the round. Adjacent opponents do not get a free attack against the
teleporting character. If the hero wishes to //teleport// somewhere he can’t see, he must make a Smarts roll at –2. If it is an unknown area he has never seen, the roll is at a –4 penalty.
Failure of either roll means the teleporter hit an object of some sort. He returns where he came from and is Shaken. A roll of 1 on the casting die (regardless of the Wild Die) indicates a more serious disaster — in addition to being Shaken he also suffers 2d6 damage.
The teleporter can never enter a solid space even if he tries. The power instantly returns him to his starting location as above.
► ''Carrying Others'': The hero can carry other beings with him at the cost of a level of Fatigue per additional “rider.” More than two may be carried at once, but causes instant Incapacitation. One Fatigue level is regained for each full hour of rest.
Grace, Intimidation and Taunt allow a character to make a “Test of Wills” attack against an opponent. In combat situations or during competitive miniature battles, Tests of Will have objective effects, as seen below. More subjective effects are determined by the Game Master in roleplaying situations.
To make a Test of Wills, the character makes an opposed roll against his chosen target. The defender uses Agility to resist Grace, Smarts to resist Taunt, and Spirit to resist Intimidation.
The Game Master should modify both character’s rolls depending on the situation. Waving a gun in someone’s face isn’t polite, but it’s definitely worth a +2 bonus to Intimidation, for example (unless the target has an even bigger gun!).
A success means the attacker gets a +2 bonus to his next action against the defender during this combat. A raise on the roll gives the attacker the bonus and makes the defender Shaken as well. This can be a great setup for an attack, a trick, or even a second Test of Wills if the first one didn’t get a Shaken result.
!Test of Wills Table
| !“Attack”| ! |!Skill Resisted By... |
| Grace| vs. |Agility |
| Taunt| vs. |Smarts |
| Intimidation| vs. |Spirit |
<<<
''Example'': Buck Savage tries to Taunt a crocodile cultist by flipping his machete and grinning like a hyena. He rolls his Taunt and beats the warrior’s Smarts with a raise. The cultist is Shaken and Buck adds +2 to his next action against the spearman.
<<<
''The Alicorns Arise''
Just as the dust was settling from the bombs things were already starting to get worse as the Reckoners arrived on Equestria. Death trotted out of Phoenix with an army of undead, Famine marched on Lost Pegasus with her hordes (where her wings were clipped by a mysterious bolt of light), Pestilence appeared in the Badlands spreading diseased walking corpses, and War Cut a bloody path across the Northwest. The Four Alicorns raised some Tartarus, literally, for a few years before disappearing to spread there influence across the globe.
The Reckoners were not seen again until the Battle of Worms.
''The Badlands''
//The Badlands has the last major accessible oil reserves left on the continent, which makes it a site of strategic importance. While ghost rock can be used for fuel and power production, only oil allows for the production of plastics and other items essential for the rebuilding of civilization. The Oil fields also attract large road gangs to the area, mostly around the fuel towns.
Gangs are not the only threat between settlements here as Rattlers still roam the area, as to there wormling offspring. //
''Common Threats''
*Bearded Horror
*Desert Gator
*Rattlers
*Wormlings
*Road Gangs
*Doom Bringers
''Locations, Important Faces, and area factions''
*[[Fuel Towns]]
**[[Oil Town]]
**[[OPEC]]
*[[Phoenix]]
*[[Globe]]
*[[Dead Towns]]
*[[Whimsy Islands]]
*[[Hequston]]
*[[The Lone Biker]]
*[[Fort 51]]
*[[The S-Mart Overlord]]
*[[Shiitake Flats]]
''The Battle of Worms''
Just as the Combine was on its last metallic legs, Sombra himself showed up, marching from across the Missispony at the head of an army of undead, Mojave rattlers, and wormlings!
This unholy horde smashed into the forces of the Iron Alliance besieging Denmare then proceeded to attack the Combine for good measure. Despite the high-tech weaponry wielded by their living foes, Sombra’s troops were handily winning the battle until the Four Alicorns of the Apocalypse showed up to save the day.
That’s right. The Reckoners.
Apparently, Sombra and his dark masters had a bit of a falling out. It’s unclear why they decided to fight it out in the middle of the Harvest, but before things got too far out of hand, Dr. Hill Storm played one last card.
The world’s most famous mad scientist somehow managed to capture the Reckoners in one of his infernal devices. He was badly wounded in the process and believed himself dying, so he turned the lockbox of evil over to a band of heroes. They vanished and that was the last anyone has seen of the Reckoners since that day.
The furious Sombra kept up his attack on Denver but his forces were broken, Sombra and his retinue burrowed down into the earth and escaped have have not been seen since.
The power of the Templars comes from those heroes who died fighting the Reckoners. Some of the “saints,” as the Templars call such fallen warriors, take an even more active role. These long-dead heroes are the Martyrs.
A list of the known Martyrs known as "The Book of Martyrs" has be compiled and serves as a holy text for the Templars. The book includes basic information about the saints, how they gained sainthood, and clues as to how you may gain their favor. But how did this book come about?
Well sit and hear the story of A Librarian, The Templars, and A Dead man.
!! Rhetoric Press comes to Baise
By 1089, news of Simon’s new order reached the ears of the Librarians in Sacramento. The Head Librarian, Twilight Sparkle, dispatched a senior Librarian, Brother Rhetoric Press, to learn all he could about these post-apocalyptic knights.
Press arrived in Baise just as a horde of mutants tried to attack Simon’s Rock. Several Templars and a small army of hopefuls showed up just in time to turn the raiders away. Biletnikoff saw the whole thing from a
nearby hillside and knew he must chronicle the Templar’s adventures.
Press recorded most of the battle on his hoofcorder and then followed the trail of the Templars to the Baise storm. He knew the risks of passing into the storm but pushed through anyway. The howling spirits nearly tore his sturdy body to pieces, but he staggered onward and eventually found himself at the Baise temple. Sunest herself came forward and healed the unfortunate traveler, causing Press to become even more enchanted with the Templars.
When he was able, Press told Sunset that he had come to find out about his order. Sunset told him the bare essentials—not wanting to reveal too much to the outside world at this time. In exchange, Sunset asked Press what he knew of the world, for the Templars needed every bit of information possible to succeed in their quest to rebuild the world as a strong but peaceful place. The Librarian agreed, and the two spent most of the night sharing stories.
Over the next few weeks, they became trusted allies. As Templars came to Boise and shared their adventures, Press decided Boise was as good a place as any to gather information for the Great Library in Sacramento. He sent his report through a trade caravan to Twilight Sparkle himself, and concluded by requesting permission to stay in Boise permanently. Twilight agreed.
!!Who in Tartarus is Omen Lynch?
A few months after the librarians arrival, Sunset quietly told him that she sometimes received visions of a gunslinger from the Old West. The Grand Master didn’t know how she knew this, but the Stallions name was Omen Lynch. In Sunsets dreams, Omen battled horrors in the boomtowns and deserts of the West sometime during the Civil War. The strangest thing
about this lightning-fast gunfighter, however, was that he was a walking dead man. Sunset knew of the Harrowed, but to see one in action was still a shock.
More importantly, there had been a rare few occasions when Sunset thought her number was up. Then, just as some horror or waster was about to finish her, she had pictured Omen Lynch. By some miracle, she then managed to escape what should have been certain death. It was almost as if Lynch’s spirit had been watching over her and provided her with some small but important ability to escape her predicament.
Press's jaw dropped, but he said nothing. The next day, he sent a private message to Twilight Sparkle requesting a complete copy of all the Tombstone Epitaph articles dealing with Omen Lynch. Even better, Twilight sent a dataslug collection of old dime novels, the star of which were Omen Lynch himself. Lynch was a real pony, and according to the stories, he really had battled the creatures of the Reckoning before the War.
When he showed the articles to Sunset, both were amazed. They poured through the tales like madponies and pieced together the gunfighter’s tale. Was it possible that Lynch was one of the so-called “saints” Simon said provided the Templars with their power?
Press and Sunset called in more Templars, and found that many of them had visions of heroes from other times, fighting the same kinds of horrors they confronted. Over the next two years, the two put together a list of the saints who had appeared to the Templars, and compiled information from the Great Library and other sources about their lives.
While there were likely thousands of saints who had fought the creatures of the Reckoning on occasion, those saints who appeared to the Templars had a few things in common.
First, there had no doubt been many individuals who had battled some dark creature as it intruded into their lives. All of the Martyrs, however, once exposed to the world’s secretive dark side, had dedicated their entire lives to fighting the forces of Darkness.
And second, all of the Martyrs had eventually fallen at the hands of these dark powers.
For this reason, Simon stated there were many saints, but those few who were known by name and had chosen to somehow intervene on the Templars’ behalves from the afterlife would now be called the Martyrs.
!!The Great Council of ‘91
Sunset called a great council of every Templar she could get word to. On a cold night in January of that same year, Sunset announced that the saints were indeed real, and that some of them, the Martyrs, sometimes watched over their living descendants of spirit. From that point forward, every Templar would be required to learn about the lives of the known Martyrs. Doing so might gain Templars the Martyrs’ blessings if they honored their memories by replicating their deeds.
Sunset appointed Frederick Biletnikoff as the Chronicler of the Martyrs. It was his job to gather information on any of the saints the Templars had claimed appeared to them. He was then to keep the saints’ histories in the Book of Martyrs. New Templars would be required to read the book, and could thus appeal to these saints should they one day replicate their great deeds.
!!The Martyrs
* Brilliant Blaze: Saint of Confidence
* Clear skies: Saint of Mercy
* Jasmin Dream: Saint of Winter
* Gyatt Earp: Saint of Composure
* Drafty Gates: Saint of Justice
* El Gato: Saint of Daredevils
* Mary Times: Saint of Stealth
* Jenny Haze: Saint of Sacrifice
* Stone Quarry: Saint of Rage
* Omen Lynch: Saint of Death
* Doctor North: Saint of the Lost
* Neighvada Sluth: Saint of Intrigue
* Rex Stern: Saint of Ruthlessness
* Brawn "The Duke" Whinny: Saint of Grit
* Sunset Shimmer: Saint of Determination
''The Canyon Causeway''
A joint effort between the Solar Empire and Lunar Republic the canyon causeway was an enormously large undertaking and a engineering marvel. Through great coast and effort the causeway connected many of the mesas in the Maze with the mainland using interconnecting roads and massive bridges Starting south of Sham Fan and stretching all the way to Lost Pegasus only about 600 miles of the causeways original 800 survived the the bombs. Even less of it is still serviceable today as more and more of the causeway disappears every year for one reason or another.
Gangs and Maze locals like to set up blockades and charge fees for use of the causeway or ferry travelers across missing gaps. The most well known and stable of entrances to the causeway is just north of Purgatory where a group known as the Causeway Collective have set up shop building a small town known as Cannonsburg. More than just a name anyone trying to make trouble for Cannonsburg will be in for a sad surprise when the towns entrenched tanks open fire.
The causeway can be expensive to gain access to and difficult to navigate but is the best way to travel the Maze if you have a set of wheels.
''The Chamber''
//Headquarters: ???//
This collection of junkers was one of the first groups to join Brick Layers Iron Alliance. The Chamber was formed after the war by a group of junkers who wanted to work together to study the full ramifications of the presence of the tech spirits in the Hunting Grounds, and to explore the depth of technical knowledge stored away in the Net. Led by a High Master who dresses in flowing, arcane symbol-covered robes like some character out of the Berry Trotter books, the Chamber runs an Academy that teaches prospective junkers not only the ins and outs of junker tech, but also basic classes in science and engineering. These techno-mages live in a mountainous walled research facility whose location is a closely guarded secret. Those who wish to join must first find the Chamber, then pass a whole slew of tests and an interview with the High Master.
''The Combine''
//Headquarters: Denmare//
Unlike most major cities in the Wasted West, the industrial sectors of Denmare were spared the ravages of the Last War. Turns out this is where Hill Storm built the core of his company’s automated manufacturing might, and he was a pretty paranoid fellow. He built state-of-the-art energy shields over his holdings in both Denmare and Salt Lick City which prevented their destruction. The rest of Denmare was hit by neutron bombs as well as some sort of bioweapon, and is now a giant graveyard of mostly intact buildings filled with rat-gnawed skeletons.
Before anyone ells could get a proper chance to loot the city a Solar Empire soldier named Morwenna led her remaining troops in to secure the factories. General “Hawk” Morwenna, a cyber griffin, Set to work rebuilding and for a time seemed to be doing some good for Denmare and the surrounding area, this all changed once she figured out how to get Hill Storms plants running. In short order Morwenna had the industrial complex churning out advanced weapons for her troops and a new mechanized battle force, complete with automatons, drones, and heavy infantry carriers. The locals Morwenna had been helping before were soon forced into slavery working in her factories.
Not all of Morwenna's troops agreed with the sudden shit in gears and many left, most notable of these deserters was her second in command Coal Ballad. An elite Diamond Dog Solider Coal tried to knock Morwenna off her perch but failed, escaping with his life Coal went on to become one of the wastelands greatest legends, helping found the Law Dogs and fighting against evil wherever he found it.
The troops that remained in Denmare helped the General form the Combine. Though the bulk of Morwenna’s military is made up of Black Hats and their Red Hat officers—so called because in the absence of uniforms, they can be identified by their distinctive headgear—his most powerful forces are entirely robotic. Most are automatons, humanoid robots with the killing power of a tank squadron. These days automatons usually stick pretty close to Denver and protect Morwenna’s assets there. Any humans caught in and around the ruined city without the appropriate identification are enslaved or killed.
The Combine’s human troops range a little farther afield. The hardcore elite, the Red Hats, are those who have been with Morwenna since the beginning, as well as some of the more promising Black Hats who have been promoted. On the next rung are the technical experts. Known as Green Hats, these are the mechanics, doctors, scientists, and even a few junkers who swear allegiance to the Combine in return for a fairly cushy existence in the ruins. At the bottom of the Combine cesspool are the Black Hats, Morwenna’s foot soldiers. Recruited from the ranks of the wasteland scum to fill out the Combine’s legions, these bullies, thugs, savages, and murderers patrol the region surrounding Denver and exact “tribute” from nearby settlements. The nature of this tribute ranges from food, to arms and ammunition, and sometimes even warm bodies to work as slaves in Denver’s factories.
For years General Morwenna spread her talons out from Denmare, building power and casting her cybernetic gaze at Junkyard, which had sprung up from what was left of Salt Lick City. Six months ago she finally made her move against the Iron Oasis, launching her grand Harvest. Joined by the the Cult of Doom the Harvest was surprisingly short lived as not only did the attack on Junkyard fail, but Morwennas birdy butt was kicked all the way back to Denmare. The final confrontation, the now famous Battle of Worms, was nearly the end of the combine but it seems you just cant keep a evil despot down.
Denmare still stands but, much like the Combine, is in bad shape. Many of the cities factories have been heavily damaged and Morwennas forces have been dangerously thinned out. For now the Combine is licking its wounds, Green hats work around the clock to bring Denmares production line back to full efficiency and Black hat slavers seek warm bodies to restock there workforce.
Word of advice if you are eyeballing that shiny Denmare tech, keep your hooves of. Morwenna docent like to share and Combine forces booby trap all there gear, supplies, and weapons, only black hats can use Denmare tech safely thanks to the chip installed in the base of there neck. This chip also serves a second purpose as it carries an explosive charge, an extra bit of incentive for troops to follow orders.
''Cult of Doom''
//Headquarters: Las Pegas//
The Cult of Doom is a collection of lunatics and mutants holed up in the ruins around Las Pegas. Surprisingly, Las Pegas itself came through the Last War relatively unscathed. For some reason, it seems the Solar Empire “missed” the City of Sin, and the ghost buster intended for Pegas actually struck the city’s easterly suburbs.
Just about everyone east of the Strip died instantly. Those who survived farther west quickly fell under the dominion of the Vegas mobs and later the “Cult of Grendel,” which worshipped a monster that laired in the ruins of the Tropicana. A couple years later, Spireas Hedgerow showed up.
Spireas was a professor before the Big Bang, and became a powerful mutant after arriving in Pegas. He claimed radiation should not be feared, but worshipped, and had an actual consciousness and will of its own. Maybe so, maybe no, but the upshot was that Spireas was a powerful priest of this new god, which he called “the Glow.” He cemented his power by destroying the Grendel and therefore the power of the Cult of Grendel.
Spireas capitalized on this new-found celebrity status and the resulting power vacuum, building a new society in Pegas, with himself at the top, and his Green Robed Doombringers serving as priests and enforcers. Mutants flocked to his banner from all over Equestria. Most brought with them stories of atrocities and intolerance against mutants, perpetrated by norms. These story's gave Spireas the excuse he needed to flex his radiation-enhanced muscles. He gathered his Doombringers and mutant legions and launched a crusade
The Cult of doom began a series of attacks on surrounding settlements, initially meeting with overwhelming success they eventually met there match at the well fortified walls of Cartson City. Finally tasting defeat Spireas and his followers retreated back to pegas but a seed of doubt had been planted. A Heretical faction of priests split of from the Cult of Doom, lead by one of Spireas inner circle, a unicorn mare known as Bone, they fled Pegas into the wasteland to form the Purple robed Doom Sayers.
Bone and her followers still believe mutant kind is the future and normies are doomed but preach tolerance, Doomsayers work tirelessly to prove not all mutants are dangerous and make great efforts to build relations between normies and there kind. The mare also preached of visions of the arrival of a leader who would guide mutant kind to a golden age, she dubbed this giant one eyed figure the Harbinger
After Cartson City and the Doomsayers betrayal you would think Spireas would have at least one win left in him, but after siding with the Combine against junkyard he has suffered yet a even greater blow. During the attack who should show up but Hill Storm himself in a mechanical body matching the description of the Harbinger to the letter. Enough chaos was thrown into the ranks that the Cult of doom fell into a full retreat yet again. The Doomsayers, who stood with the Iron Alliance during the attack, have finally started to make some headway changing ponies minds about mutants.
No word yet on if Hill Storm truly is the fortold Harbinger as his shiny tin can flank has up and disappeared again.
The “Mayor” of Movie town is a mysterious unicorn mare known only as the Director. Known for wearing wide brimmed tinted shades and bandages over her body the Director works tirelessly to put out one heroic epic after another.
Not many ponies complain about the Directors films and the few critics that do speak up have a nasty habit of disappearing, the ones that are eventually found are rarely in one piece. Naturally law dogs have stopped by more than once to poke around but no hard evidence ever comes to light to connect the Director to the murders. Between the rumors and her eccentric quirks no pony in Movie town wants to find themselves on her bad side.
Rumors aside, one thing that cant be denied about the Directors films is they are down right inspiring. All of her pieces are based of true stories of bravery in the wasteland and sometimes even feature the heroes the story is based on!
Sometimes an attacker is able to catch a foe off-guard and gets “the drop” on him. This usually happens at a distance of only a few feet, but other situations may occur (a sniper on a nearby rooftop).
Only the GM can determine when one character has obtained this kind of advantage over another. Usually it’s when the victim is in the classic hostage pose, is completely unaware of the danger, or has been caught unarmed by an armed foe. The attacker is considered on Hold and adds +4 to his attack and damage rolls should he decide to strike.
Any Place as rick as Purgatory will eventually going to be plundered despite the danger. Purgatory is a particularly tricky bit of business with its many dangers but not even it is free of this rule. While groups have tried in the past to make a living of scavenging in Purgatory none have met with as much success as the Fire Brigade.
A Burly Stallion named Mc-Candles leads his group on there frequent trips into Purgatory. Not one to put up with foolishness Mc-Candles is always ready for the worst the Burning coast has to offer. Besides his attention to detail Mc-Candles Fire Brigade owe there success to good fortune as the group managed to lay hoof on a stash of firefighter outfits and supplies.
The Fire Brigade, sometimes called “Silver Suits” by locals (referencing there fire flashy fire proof suits), ply fireproofed boats through the Maze looking for ripe salvage spots. The items the Fire Brigade are enough to fetch a small fortune and even with high expenses keeping there gear in one peace the Fire Brigade still do well for themselves, well the ones that make it out alive.
With a high turn over of Silver Suites either retiring or meeting a sticky end Mc-Candle is always looking for more recruits to staff his ships.
''The Harvest''
The Combine’s General “Hawk” Morwenna had long set her sites on Junkyard. But to take down the home of the Iron Alliance he knew she’d need more than just his robotic automatons and Black Hats. It took a few years, but Morwenna convinced Spireas and his mutants to ally with his legions in exchange for free plunder of Junkyard. Morwenna called the attack Operation Harvest, and later just “the Harvest”, as a nod to his Combine threshing the chaff (the Iron Alliance) from the wheat (her troops and the mutants).
During the Harvest, Spireas' mutants attacked a blocking force composed of the Convoy and the Doom Sayers south of Junkyard. Just as it seemed the glowing horde would overrun the Iron Alliance’s positions, the legendary Harbinger descended from the sky in a sleek black ship, and revealed himself at last…
…to be none other than Dr. Hill Storm! He had returned from his long absence, and in a shiny chrome body to boot. More importantly, a blazing red electronic eye was mounted in the center of his robotic head. The mutants, both Heretic and the faithful, were awestruck, and the attack on the Iron Alliance petered out as the mutant horde followed Hill Storms orders to return to the City o’ Sin and await his arrival. Some of the more radical stayed to take part in the slaughter, but without the Mutant King’s Cult of Doom, the Combine’s “Harvest” broke on the walls of Junkyard.
Most in the Alliance wanted to call it quits there, but the Grand Master of the Templars, Rose, convinced the army to counterattack and pursue the Combine all the way back to Denver.
''The Iron Alliance''
//Headquarters: Junkyard//
This alliance of disparate groups grew out of Junkyard’s boss, Brick Layer, and his realization that the only way that Junkyard would have a chance against Spireas and his mutant crusade, to say nothing of General Morwenna's Combine, was to forge a coalition of like-minded folks. After a whole lot of diplomacy and more than a little bit of luck, Layer managed to put together the Junkyard Summit. It took a hell of a lot of courting, but Layer eventually managed to convince the junkers of the Chamber, Bones Heretic mutants, the Templars, and a whole bunch of other groups that an alliance against the Combine was necessary. It took another few months to actually get them to agree on terms, but the hard part was over.
It was a good thing, too, because Morwenna was just about ready to come knocking on Junkyards gates. The Iron Alliance was badly battered by the Harvest. Brick Layer and a few key leaders fear that the defeat of the Cult of Doom and the Combine was a pyrrhic victory for the good guys, one from which they might not be able to recover.
The Convoy, that traveling caravan that made the rounds about Equestria each year and provided a tenuous thread that connected hundreds of survivor settlements large and small, was basically destroyed in the fighting. The Sky Pirates lost a large number of irreplaceable high-tech military aircraft, as well as scores of converted civilian planes, gutting the force.
The one bright spot is that the city of Junkyard itself weathered the storm fairly well, only losing a few hundred during the Harvest and being untouched by the Battle of Worms outside Denmare. The bad news is that a large and ever-growing refugee population is now camped outside the walls, as well as outcast mutants and the remnants of various road gangs. This volatile mix could explode at any time, with results that could devastate Junkyard.
''Law Dogs''
//Headquarters: none//
While there’s no national law (or even a government to make it) there are ponies who take it on themselves to bring justice to the people. Most are former law enforcement officers who were duly authorized before the Apocalypse and saw no reason to stop just because the paychecks did.
One of these was Rain Windfall, a former Lunar Ranger. She gathered every law dog she could find, whether Rangers, Celestial Solar Service (the Rangers’ former rivals), or traffic cop, and tasked them all with continuing their sworn oaths. The “Law Dogs” gained acceptance in most survivor settlements thanks to Windfall’s cool head and fairness—and dedication to hunting down anyone who shamed their name.
Law Dogs are not a formal organization so much as a loose band of heroes sworn to protect the innocent. Any innocent. They aren’t stuck up about it like the Templars (who only help those who have proven there worth) and don’t distinguish between race, faction, or even mutantdom. The law is blind, they say, and the Law Dogs, mostly, believe that’s a sacred principle.
Law Dogs are a bit more varied in their sentencing, however. It’s rarely practical to jail someone they see as an evil-doer in the nearest settlement since the natives would then have to feed the poor sap. Thieves are usually relieved of their goods (except for perhaps a few essentials) and the loot given to the nearest town (or the victims if they’re known). Violent types are beaten and threatened viciously, and murderers are usually executed.
Most Law Dogs don’t revel in this kind of eye-for-an-eye thing—it’s just a necessity in the wastelands where there are no jails to feed or house these wasters.
The most famous of the Law dogs was a D-Dog named Coal Ballad, he did a lot of good for the world but was finally put down by Sombra himself at the Battle of worms, you had better bet he got his licks in before going out.
''Librarians''
//Headquaters: The Grand Library, Sacracrillo//
Led by Head Librarian Twilight Sparkle, the Librarians are an order dedicated to preserving the past to help rebuild the future. Holed up in a fortified complex on the outskirts of Sacracrillo, these folks have hundreds of data slugs that store electronic copies of books on just about every subject you can imagine. They also record interviews with folks who have the knowing of things, both from before the Last War and after. Among the luminaries the Librarians have recorded are Bone, leader of the Heretics; Pawn Corners, leader of the Denmare Resistance; and Rose Blossom, the Grand Master of the Templars.
Despite their crusade to preserve knowledge, the Librarians are pretty secretive folk. They don’t issue library cards, as far as Twilight Sparkle is concerned the knowledge in their vaults is to stay put until it’s needed.
The Librarians consider themselves an order of monks, dedicated to the two tenets of their motto: “Fides Et Scientia” (Faith and Knowledge). These precepts are the Alpha and Omega of a Librarian’s existence. Librarians see lives (even those of their own order) as expendable if that is the price that must be paid to preserve knowledge, no price is to high for them to save the world from a dark age.
Most of the Librarians responsible for collecting and recording texts from across Equestria are Junior and Assistant Librarians. Before they are trusted with this vital duty, they must serve as Novitiates in the Grand Library itself, cataloging the findings of their comrades in the field. Those Junior and Assistant Librarians who excel are eventually promoted to Librarian proper, then Head Librarian. Both of these ranks serve in the Grand Library, overseeing the day to day functions of the place.
Librarians have a few outposts in larger settlements where they operate schools and educate those willing to learn.
There are a lot of bad ponies out there, ponies so nasty their blood’ll eat through your horse shoes as you stomp there head in, But there’s one fellow out there who puts them all to shame. This monster of a a earth pony never talks, so everyone just calls him the Biker. If they’re feeling particularly melodramatic, they call him the Lone Biker of the Apocalypse.
The Biker is a big fellow armed with a double-barreled shotgun and a bandoleer full of grenades. He rides a huge, souped-up bike over the broken highways of the Southwest. The Biker seems to be on a quest of some sort, because he’ll ride into a town, sniff the air a few times, and look everyone over (particularly if they’re carrying a child). If anyone talks to him, he shoots them.
He’s been shot back, of course. Ponies aren’t afraid of much these days, and they aren’t too slow on the draw either, but so far he’s survived every attempt on his life. No one is sure if he is a mutant, just tough as sin, or something... ells.
''The maze''
//The Maze stretches between a shattered coastline to the foothills of the Neighvadan mountains and ends just just north of the Badlands. Part sunken, part choked in fog, part on fire, and horribly polluted The maze is a nightmare for travel by sea. Travel by land is not much better of an option thanks to the high concentration of road gangs lured to the area by the high availability of cheep ghost rock for use in refining spook juice, only the badlands rivals The Maze for sheer number of road gangs.
One good thing about visiting the maze though is the reduced price on ghost rock which is only $8 (compared to the typical price of $10 most places)//
''Common threats''
*Maze Pirates
*Road Gangs
*Blood waves
*Croakers
*Maze Dragons
*Shraks
*Trotting Dead
''Locations, important faces, and area factions''
*[[Purgatory]]
**[[The Fire Brigade]]
*[[Lost Pegasus]]
**[[Dead Pool]]
**[[Rock Island Prison]]
**[[Old Prosper Mission]]
*[[The Canyon Causeway]]
*[[Movie Town]]
**[[The Director]]
*[[Sacracrillo]]
*[[Lynchburg]]
*[[Turtle Island]]
*[[Sham Fan]]
*[[The Road Orcs]]
*[[Highway Patrol]]
''The Road Orcs''
//est. gang size: 200//
One of the largest road gangs in Equestria the Road Orcs are a group of mutants which patrol between Sham fan and Cannonsburg. Though many agree they have a silly name these mutants mean business, enjoying the support of Sham fan and the cult of doom. With there large numbers and their wide range of activity, odds are good that if your traveling around the norther portions of the Maze for any length of time and you will run into this gang.
In typical road gang fashion this group of mutants travel in large groups shaking down small towns for “tribute” and prey on anything on the road striping it for parts, this is not limited to just vehicles however as the Road Orcs are well known for there cannibalistic habits. Mutant exclusive biker bars throughout the Road Orcs territory act as small bases of operation and the owners dont take kindly to normies. The largest of these bars, Mordor, can be found in Sham Fan and acts as the Gangs headquarters.
Road Orcs live by a simple creed of “might makes right” with all advancement coming from physical conquest. The leader of this band of killers is a massive tusked mutant known as Red, he has been on top for a long while and seen his share of challengers, if you ever want to know the exact number you just have to count the skulls mounted behind the bar in Mordor. While most of the gang drive bikes Red himself prefers his heavily modified SUV.
The Highway Patrol have posted a 600 bullet bounty on Red’s head, similarly the Law Dogs have there own standing 1,000 bullet bounty.
''Reign of the Two Sisters and Birth of Nightmare moon''
//200 - 1300 AD (After Discord)//
Following the Disappearance the Crystal Empire the two Sisters Luna and Celestia consolidate their forces as they break ground on what will become the Capital of there new Empire on the Everfree battleground, sight of their first victory against the armies of the Tyrant Sombra. Legitimizing their claim to leadership the sisters surround themselves in an extended royal family created from leadership from the founding factions of Equestria as well as even displaced royalty from the Crystal Empire which fled Sombras oppressive rule.
The now Royal Sisters began what would be a millennial rule that is dominated primarily by peaceful existence and marked with great strides in knowledge and culture. Of note during this time is the discover of Ghost rock, a potent mineral that burns nearly one thousand times hotter than coal and posses incredible arcane properties. The largest deposits are found in the inhospitable and monster infested shattered North, during this time many expeditions are lead into the north to claim this valuable resource but few return.
During the final Century of the Sisters Rule growing resentment from certain members of the royal family leads to ever growing tensions in the capital. Underhooved Smear campaigns begin as the first of the EverFree marches demonstrates in the capital. Decent spreads slowly as Celestia becomes more and more active mobilizing guard to disperse demonstrators and prevent riots. Finally the hot bed of political strife explodes following the assassination of one of the movements greatest supporters Rich blood at one of his private gatherings. Celestia is blamed publicly by the remaining dissenters.
With the Capital already thrown into turmoil Matters immediately become even more dire with the emergence of “Nightmare Moon”, a transformed Princess Luna. Beginning her Eternal Night the two sisters battle over the capital for days before Celestia falls back on her ultimate weapon, the Elements of Harmony. Calling upon the power of the elements Celestia attempts to banish the Nightmare but fails, instead Nightmare Moon flees from the Everfree as the Sun rises again.
''The S-Mart Overlord''
//est. group size: 500//
S-Mart was the largest chain of “superstores” in the Southwest. In the last few years before the war, the owner went little mad with his competitive pricing and started discounting things like crazy. A high-definition monitor that cost $400 at most discount stores went for $210 at S-Mart. The stores blew through inventory like mad, and the central processing warehouse grew into a huge factory outlet.
Then the bombs hit. Within hours, thousands rushed to the warehouse. These refugees came armed for the worst with pistols, rifles, shotguns, and even confiscated military equipment like machine-guns and flamethrowers. The unfortunate security guards had only 10mm pistols. Still, they circled the trucks, manned the guard towers and the warehouse roofs, and did the best they could.
Then the meanest bastard of the bunch showed up. He was a professional fighter whose stage name was the “Overlord”. The Minotaur really took his nick name to heart, gathered a group of fans who instantly recognized his wrestling costume, and assaulted the looters camped around the S-Mart Warehouse. The security guards at first thought the Overlord was on their side and welcomed him into the compound. As you might expect, the Overlord gave them an easy choice: join him or die. Most joined.
The S-Mart Overlord looked out over his spoils and realized that most of it was useless. S-Mart didn’t stock much in the way of food or weapons, and rubber trash cans and kitchen drainers wouldn’t be a big help in taking over the world.
Turning this lemon into lemonade the Overlord took what was left of his army, gathered up the weapons of the fallen, and turned the stockyard’s semis into massive wartrucks. Then the Overlord and his horde scoured the surrounding plains for more weapons. They hit several squads of soldiers stationed far away from the blast sites, a few survivor towns, and finally a National Guard armory. During these bloody battles, the gang also accumulated a fair number of vehicles they used to complement their fleet.
When the Overlord was satisfied, he returned to the old warehouse and put his minions to work rebuilding its defenses. This they did, complete with tin walls made from the warehouses and trailers, a moat of broken glass and jagged metal, machine-gun turrets on the corners of the walls, and hidden bunkers out in the surrounding hills.
Today the Overlords minions patrol his territory, collect tribute from nearby settlements for “protection”, and prey on caravans.
''The Templars''
//Headquaters: Baise//
This group of wasteland warriors is dedicated to fighting the good fight. That said, the Templars don’t throw their lives away on lost causes, nor do they die for those who don’t deserve their efforts. The Templars are only interested in helping those willing to help themselves. Somebody up there obviously approves, because the Templars have all kinds of abilities they claim are a reward from the Powers That Be—the good ones that is!
The Templars are headquartered in Baise, where the order was founded by Sunset Shimmer. Just to give you an idea of what kind of badasses these folks are, their headquarters is located inside the Baise maelstrom. This has a lot to do with their philosophies, in that only deserving folks will be able to get past the maelstrom looking for their help.
Yep, deserving. The Templars are pretty picky about whom they help, and no one outside the order is really clear on the criteria. Because of this, a lot of folks think the Templars are just a bunch of selfish jerks. Individual Templars have been known to turn their backs on entire survivor settlements, only to turn around and lay down their lives for a single child.
The Templars are a small order, with only about 300 actual knights along with a few squires and aspirants, but they’re an important part of the Iron Alliance. The arch enemies of the Templars are the Anti-Templars which are all former Templars themselves.
''Requirements'': Novice, Agility d8+, Climbing d6+, Lockpicking d6+, Stealth d8+
Thieves specialize in deceit, treachery, and acrobatics. They can be invaluable where traps must be detected, walls must be climbed, and locks must be picked.
Thieves add +2 to Climbing, Lockpick, Stealth, as well as Notice or Repair rolls that relate to traps and similar devices. The bonus to Stealth does not apply when the character is in a wilderness environment—only in urban areas.
Every little ol’ cut and scrape makes your waster whine for mama. As long as he has at least one wound, he suffers an additional –1 penalty to all his actions (so a hero with two wounds suffers a –3, for example).
* Everything?
* What changes among rules and available options?
* Do we have a harpoon gun or grappling hook? That might be handy but I couldn't find it. Build one?
* Skills already added
* Which Edges?
* Some pony-specific Gear looks interesting. Are we using that? Altering it?
* Cantrips to be added
* Anything else?
An average-sized man requires two quarts of water a day. This requirement is doubled in both very dry conditions (such as the desert) or areas of high humidity (the jungle) as the character perspires constantly and begins to dehydrate.
If enough water isn’t available, the hero begins to suffer from dehydration. Starting the first day after the water runs out, he must make a Vigor roll. Subtract 2 if the hero has less than half the required amount. Failure means the character gains a Fatigue level. After the first day, the character must make the required Vigor roll every 6 hours.
► ''The Survival Skill'': A successful Survival roll each day provides enough water (and food) for one person, or enough for five with a raise.
* ''Recovery'': Two quarts of water allows a character to recover a Fatigue level every hour.
* ''Incapacitation Effects'': Death in 2d6 hours.
Gracefulness has never been one of your strong points, and you have to constantly worry about tripping and falling.
You receive a -2 penalty to all Trait rolls that require balance, such as Grace when trying not to trip on exposed tree roots while galloping through the forest.
Throwing governs all sorts of thrown weapons, from hand grenades to knives, axes, and spears. Throwing works just like the [[Shooting|Shooting(Agility)]] skill, and uses all the same modifiers, including those for Range.
The Rate of Fire of a thrown attack is 1 per hand, so a human character could throw two items at once (one with each hand), suffering the usual multi-action and off-hand penalties (see [[Combat]]).
|!Weapon|!Range|!Dmg|!Cost|!Avail|!Wgt|!Min Str|!Notes|
|''[[Bolas]]''|3/6/12|N/A|$5| U |1| | Successful called shot (leg) knocks target prone |
|''Boomerang''|5/10/20|Str+D4|$15| U |2| | |
|''Knife''|3/6/12|Str+D4|$10| C |1| | |
|''Saw Blade''|4/8/16|Str+D6|$10| C |3|D6| AP 1 |
|''Shuriken''|3/6/12|Str+1|$10| U |1| | |
''Requirements'': Seasoned, Pegasus pony, Fleet-Foooted, Agility d10+
You are one of the top flyers in Equestria, even if you are not on a major racing team like the Wonderbolts. Your basic Pace increases by 2 and your running/flanking dice increase to d10’s. In addition, you gain a +1 bonus to all Grace rolls.
<<<
''comment'': In the MLP book, Fleet-Footed is nerfed to give only a d8 when running. Do we go for that or do we make this a d12? Do the leave the Fleet-Footed normal Pace bonus? Will both of them add up to +4 Pace?
<<<
A character who simply wants to touch a foe (usually to deliver a magical effect of some kind) may add +2 to his Fighting roll.
''Requirements'': Legendary
Your hero is a grizzled veteran. Increase his Toughness by +1.
Tracking allows a character to follow the tracks of one or more individuals in any type of terrain.
Each roll generally covers following the tracks for one mile, but the GM may adjust this dramatically for more specific or small scale searches.
!!Tracking Modifiers
| !Modifier | !Situation |
| +2 |Tracking more than 5 individuals |
| +4 |Recent snow |
| +2 |Mud |
| +1 |Dusty area |
| –4 |Raining |
| –2 |Tracking in poor light |
| –2 |Tracks are more than one day old |
| –2 |Target attempted to hide tracks |
''Requirements'': Novice
You have one unique piece of equipment that you have used for so long it has become second nature. Only you can gain these bonuses. The item provides a bonus depending
on what it is:
* ''Armor'': Trademark armor provides an additional +1 Armor bonus when worn (that does not contribute to its weight).
* ''Equipment'': Trademark equipment provides a +1 bonus to Trait rolls that use this piece of equipment, at the Game Master’s discretion.
You may take this Edge multiple times, each time applying it to a different item. If a Trademark item is lost it can be replaced, but the benefit from this Edge does not return to the replacement item for two weeks.
''Requirements'': Novice, Fighting or Shooting of d10+
The hero knows one unique weapon (Excalibur, Old Betsy, Sting) like the back of his hand. When using that weapon, he adds +1 to his Fighting, Shooting, or Throwing rolls. A hero can take this Edge multiple times, applying it to a different weapon each time. If a Trademark Weapon is lost, the hero can replace it, but the benefit of the Edge doesn’t kick in for two game weeks.
To use an attribute or skill, simply roll the die assigned to it. If the result is a 4 or better (the “Target Number” or TN), the action is successful. For example, if a character’s Strength is a d6, he rolls a six-sided die. On a 4 or better, he’s successful.
► ''Modifiers'': Circumstances modify the die roll, such as shooting at something at long range or finding a well-hidden clue. Some things, such as ranged attacks, have standard modifiers. It’s up to the GM to determine any modifiers for more subjective tasks, such as spotting an ambush or eavesdropping on a conversation through a door.
In general, an easy task, such as finding tracks in the mud, is
made at +2. A difficult task, such as finding tracks by torchlight,
is made at –2. A very difficult task, such as finding tracks in
a rainstorm, is made at –4.
!!!Aces
All Trait tests and damage rolls in Savage Worlds are open ended. That means that when you roll the highest number possible on a die (a 6 on a d6, an 8 on a d8, and so on), you get to roll that die again and add it to the total. This is called an “Ace.” Any modifiers to the die roll should be tacked on after adding up an Aced roll.
!!!Raises
Sometimes it’s important to know just how successful a Trait test was. Every 4 points over what you need for success is called a “raise.” If your hero needs a 4 to Shoot an opponent and rolls an 11, he hits with one raise (and would have two raises with a roll of 12). Figure raises after adjusting for any modifiers.
!!!Unskilled Attempts
If a character doesn’t have a skill for an action he’s attempting, he rolls a d4 and subtracts 2 from the total. Wild Card characters still get their Wild Die for these rolls (which are also subject to the –2 penalty). The GM may decide that a character has no chance at a particular skill if he has no training in it—such as performing surgery or flying a plane.
!!!Opposed Rolls
Sometimes rolls are “opposed” by an opponent. If two characters are wrestling for control of an ancient artifact, for example, they both make Strength rolls and compare results.
When this happens, the acting character gets his Trait total first. If he wants to spend Bennies (see [[Bennies]]), he does so now. When he’s satisfied with his total, his opponent gets to roll. The highest total wins. In a tie, the two foes continue to struggle with no clear victor.
The winner of an opposed roll considers his opponent’s total as his TN for purposes of determining any raises.
!!!Cooperative Rolls
Sometimes characters may want to cooperate and help a friend complete some kind of urgent task. If two or more characters want to perform a task together (and the GM decides it’s possible for them to do so), the lead character makes his roll and adds +1 for every success and raise his companions achieved on their own rolls. This has a normal maximum of +4 for all tasks except those of Strength, which have no maximum.
Characters may not make cooperative rolls if they don’t actually have the skill in question. (You can’t make default rolls to aid with Boating, for example, if your character doesn’t actually have the Boating skill.)
!!!Group Rolls
When you want to make a noncombat Trait roll for a group of Extras, roll one Trait die as usual along with a Wild Die. Take the better of the two as always and treat this as the group’s total. This way you get a nice average without having to make individual Fear rolls for every Extra who sees a dragon, or watch one clumsy soldier ruin a stealthy approach for his companions.
!!The Wild Die
Extras roll a single die as described above. But Wild Cards roll an extra d6 and take the highest of their normal die or the “Wild Die” when making skill or attribute rolls. Wild Dice are rolled just like the Trait die, and can Ace as well (see above). Any bonuses or penalties applied to the Trait Die also apply to the Wild Die.
► ''Critical Failure'': The downside is that snake-eyes (double 1s) on one of these rolls is a critical failure. The GM gets to make up something rotten to happen to your character. That’s the price Fate charges for making someone a hero.
<<<
''Example'': Buck Savage, international adventurer, faces wild-eyed cultists. He has a d10 Shooting and rolls his d6 Wild Die. The Wild Die comes up 4, but he Aces (a 10) on the d10. He sets the Wild Die aside and rolls the d10 again. He gets another 10, then rolls again and gets a 3. His total is (10+10+3=) 23!
<<<
Trappings are the heart and soul of the powers system. With just a few simple twists, a bolt power can represent rays of ice, streaks of light, or swarms of stinging bees.
The powers themselves are designed to be as simple to use and remember as possible. This helps the Game Master remember what all the powers do, and helps players remember the rules for common powers even between different settings. But just because these powers work the same from setting to setting doesn’t mean they have to look the same, have the same names (to the characters in that world), or even have the exact same effects—that’s where Trappings come in.
For the most part, Trappings should be merely cosmetic as described on [[Powers]]. But sometimes it makes sense for there to be additional effects. A heat ray should have a chance of catching combustible objects on fire, for example, and an electric blast should do slightly more damage to targets in full metal armor.
Below are examples of effects players and Game Masters can use for common Trappings:
Acid
Cold/Ice
Darkness
Electricity
Fire/Heat
Light
Necromantic
Sound
Most epic tales feature trips across great expanses— whether it’s the Hobbits’ quest to Mordor in The Lord of the Rings books or warping across space in a hard science-fiction tale. This section helps you figure out how long these journeys might take and what might dramatic events might happen along the way.
!!Time and Distance
!!!Land Travel by Foot or Mount
A creature or character’s Base Speed is half its Pace in miles per hour, with a minimum of ½ mile per hour. A human with a Pace of 6, for example, walks about 3 miles per hour.
Groups move at the speed of their slowest member. Fatigue and Encumbrance penalties don’t normally modify Pace, but the Game Master may choose to apply them when calculating overland movement rates if it’s dramatically appropriate.
► ''Flying Speeds'': Travelers with the luxury of flying mounts or some other means of leaving the ground behind may ignore the modifiers below and may be able to take shorter routes than the land-bound. Game Masters may adjust airspeeds for headwinds, thin air, smoke, or other aeronautical phenomena.
!!!Overland Speed Modifiers
|!Ground | !Speed |!Terrain Type |
|Easy | –0 mph |Plains, road |
|Average | –1 mph |Rocky desert, light forest, low hills |
|Hard | –2 mph |Steep hills, sand, medium forest |
|Difficult | –3 mph |Mountains, heavy forest, marsh |
!!!Vehicular Travel
For reasonably paced travel over the course of one or more days, just use the vehicle’s Top Speed as its average miles per hour.
Multiply Top Speed by the number of hours traveled (eight per day being typical) to see how far a vehicle can travel in one day. For example, a vehicle with a Top Speed of 40 could travel 320 miles in 8 hours.
Multiply the mileage by 1.5 for interstate or autobahn travel, or by .5 if traveling over difficult terrain such as clogged highways in a post-apocalyptic aftermath, lack of roads, etc.
!!!Sailing Ships
Powered vessels use the same system as Vehicles, above. Sailing ships require more work on the part of the crew. Each day, the ship’s captain makes a Boating roll, plus or minus any modifiers the Game Master feels are appropriate for strong or weak winds, currents, traveling upriver, and so on. These rates are based on eight-hour stretches, but sailing ships with enough crew don’t usually stop, so multiply the results by three if the vessel sails the entire 24-hour period.
* ''Total of 1 or Less'': The craft is becalmed, goes in circles, or is effectively lost. It makes no progress that day and must make a Knowledge (Navigation) roll the following day or sail in a direction other than intended.
* ''Failure'': 3 x Top Speed in miles traveled
* ''Success'': 10 x Top Speed in miles traveled
* ''Raise'': 15 x Top Speed in miles traveled
!!Encounters
Unless the area traveled is patrolled, draw a card from the Action Deck once per day (or whatever period the Game Master feels is dramatically appropriate for the current scene). A face card or higher represents an encounter, and the card suit can be used to determine the type.
Game Masters are highly encouraged to customize encounters based on their setting.
!!!Encounter Table
|!__Clubs__: //Obstacle// |The heroes encounter an obstacle of some kind and must figure out how to circumvent it. Some examples are a flooded river, minefields, a decaying rope bridge, whirlpool, etc. The obstacle might also be defended by creatures or enemies as well. |
|!__Hearts__: //NPCs// |The group comes upon neutral or friendly nonplayer characters such as merchants, lost travelers, a guide, or even other adventurers. |
|!__Diamonds__: //Fortune// |Somewhere along the way is something of value—the hulk of a spaceship full of supplies, a small treasure cache, a vein of useful or valuable minerals, or a minor magic item in the clutches of some unfortunate corpse. |
|!__Spades__: //Enemies// |Monsters, enemies, or hostile beasts bar the way. Perhaps they lie in ambush if it’s known the heroes are coming this way. |
Heroes often attempt fancy maneuvers or clever tricks to distract their foes and set them up for deadly follow-up attacks. This might include throwing sand in an opponent’s eyes, ducking between a tall foe’s legs to stab him in the back, and so on. Tricks do not include weapon feints—those are already “assumed” in a character’s Fighting and Parry scores.
To perform the trick, the player must first describe exactly what his character is doing. Next he makes an opposed Agility or Smarts roll against his foe. The GM must determine which is more appropriate based on the player’s description of the maneuver.
If the character is successful, his opponent is distracted and suffers –2 to his Parry until his next action. With a raise, the foe is distracted and Shaken as well.
These penalties do not stack. Tricking a foe twice has no additional effect.
<<<
''Example'': Buck is backed into a corner by a very large and dangerous thug. Our hero pulls the oldest trick in the book. He says “Hi Virginia!” and pretends to smile at someone behind his less-than-brilliant foe. He and the thug both make Smarts rolls, and Buck wins with a raise. The thug swirls about, expecting an attack from behind, and is momentarily Shaken. The unfortunate goon also suffers –2 to his Parry until his next action, giving Buck time for a quick rabbit punch that just might put the big fellow down.
<<<
''Requirements'': Novice, Smarts d6+
Though you cannot explain it, you have an uncanny ability to read your internal clock and senses.
At any given time, you are aware of the current time of day, temperature, and generally what direction is north. In addition, you gain a +1 bonus to Notice rolls.
''Turtle Island''
//est. Population: 6000 - 6500 (including guests)//
When the ghost rock rush began Celestia herself opened Equestrias boarders wide to immigrants, among those who answered the call was a large number of zebras from Zebrica. Zebras soon became a fairly common sight in the frontier but no where was there a greater concentration than in the cities of Dragons Breath, Lions Roar, and Bears Claw. These three cities were founded on a chain of small islands by a zebra known as Zang who built his own criminal empire from the ground up. Old Zang was one smooth operator and even competed against the likes of the Black River Rail company and Hill Storm Industries in the rail wars.
Fast forward centuries and all three of Zangs island cities are sunken radioactive craters, the last piece of his empire is the massive casino boat which acted as a ferry between the islands and the mainland. Known as Turtle island the boat is a city unto its self traveling up and down the coast selling sin at every port. Turtle Islands cassinos still run much like they always have but its not all they are pushing these day, nearly any pleasure that can be purchased can be found for sale on the floating city.
The captain of Turtle Island is a Zony (pony/zebra half breed) named Zanchu Fu, a deadly warlord who keeps all under his command in line with a iron hoof. Larger settlements are safe from Zanchus raiding parties but the Zony is not above taking advantage of smaller prey when it presents itself. While one wouldnt suspect it looking at the pleasure boat Zanchu has somehow managed to outfit Turtle island with military grade cannons and possesses a small number of armed attack helicopters. Maze Pirates learned quickly not to try and stand against Turtle Island.
Known as a great place to go for some fun or to get your throat cut Turtle island is always on the move only stopping for short stays outside larger settlements and cities. Few ponies known as much about the Maze and its secrets as Zanchu and the inhabitants of Turtle Island.
''Resources Dwindle and the discovery of Faraway''
//673 - 1045 CM (Celestial Monarchy)//
After the dust settled from the Civil war Equestria again moved into a time of relative peace. The NLR and SE were far from friendly but at least limited hostilities to covert espionage over open conflict. Just as many if not more issues were settled by the CSS (Celestial Solar Service) and the LRR (Lunar Republic Rangers) as were ever brought before the two nations politicians.
Over time the prevalence of arcane focused study shifted to more Scientific matters with the availability of Ghost Rock and while there was no shortage of students of more traditional magic there was no doubt that “new science” had taken root. Industry grew and ever greater and greater products of science rolled out to help improve life. Over the course of a few centuries Equestria advanced by leaps and bounds surpassing even what was said to be possible in the fabled Capital of the Crystal Empire from ancient history.
Before long Equestria and indeed most of the rest of the civilized world become almost completely dependent upon Ghost rock and many started to stockpile the valuable mineral long before the first shortages began. As Previously rich veins of Ghost rock ran dry one after another Nations took ever more and more drastic measures to locate new sources. With few options available it seemed it would take a miracle to avoid a global war over the remaining ghost rock but luckily a Miracle is exactly what happened when a Pony who many thought was long Dead returned to the public's eye.
Hill Storm, founder and owner of Hill Storm Industries, had long since fallen out of public view and was understandably assumed to have died some time ago so it was quite the shock when the half a millennia old Pegasus appeared again to announce a solution to the Ghost Rock Shortages. Sporting a new Mechanical body Hill Storm proudly announced the discovery of a distant star system which he dubbed Faraway. Accessed through a technological marvel called “the tunnel” Hill Storms ships had already located the planet of Banshee which was quite rich with Ghost rock.
Nations around Equas Took to the stars as Colonist flooded to Banshee to stake their claim on the new planet. The local inhabitants of Banshee, Purple skinned bipedal aliens named the Anouks, were less than pleased by this but for a time the Crisis had been averted.
A character may attack with a weapon in each limb if he desires. This works just like any other multi-action, and inflicts a –2 penalty to each attack. (Note that the [[Two-Hooved]] Edge negates the multi-action penalty when attacking with two weapons.)
Unless your hero has the [[Coordination]] Edge, subtract another 2 points from the off-limb attack (see [[Off-limb Attacks]]). A hero with the [[Frenzy]] Edge adds the additional die with either melee attack of his choice.
<<<
''Example'': A warrior is backed into a corner by a pack of ravenous dire wolves. He has two short swords but isn’t Coordinated. The roll suffers a –2 penalty (for using two weapons), and the second suffers a –4 penalty (the multi-action penalty for two weapons plus the off-hand penalty). He makes his Fighting roll twice, and gets his Wild Die with each roll.
<<<<<<
''comment'': We need another example. Our system works differently and two attacks would only have -2 each
<<<<<<
<<<
''Requirements'': Novice, Agility d8+
A Two-Hooved hero isn’t coordinated—he’s simply learned to fight with two weapons (or both hooves) at once. When attacking with a weapon in each limb of the same type, he rolls each attack separately but ignores the multi-action penalty (see [[Combat]]).
<<<
''comment'': This is really, really powerful for Griffin and D. Dogs. Maybe we should increase the requirements?
<<<
Unfortunately, this individual hit more than a few ugly sticks on his way down the tree of life. His Charisma is lowered by 2, and he is generally shunned by members of the opposite sex.
If one character has a melee weapon and his foe doesn’t, the opponent is considered unarmed and is very likely in a world of hurt. Since he can only dodge and evade rather than parry, any armed attacker trying to hit him may add +2 to his Fighting roll. Nearly all animals and monsters are considered armed due to natural weapons such as claws and teeth.
While each breed of pony has their own inherent form of magic, Unicorn ponies possess the most versatile and refined magical abilities of the three breeds. The Unicorn’s horn serves as a focus for their magical energies, allowing them to mentally channel and shape the ambient magical energy in the universe into the form that they choose.
While most Unicorns know only a few pragmatic spells called ‘cantrips’ which they adapt for a variety of purposes, some go on to memorize and learn especially complex and powerful spells through rigorous formal study. Their power make Unicorns respected among the other breeds for their ability to bend the very laws of the universe to their will. Unicorn ponies are generally regarded as being haughty and arrogant as a result of their powers, but they understand their place in the universe and need to work with others for the betterment of all.
Unicorns are typically of average build and size, but possess sharp minds and keen intellects that predispose them to being more erudite than other ponies.
!!Race Features
* //''Derped Third Eye'' - Unicorn ponies start with a d4 in Spellcraft. They may choose to Attune their Spellcraft to a Smarts-based arcane skill with the exception of Weird Science. Attunement lets the Unicorn to add a focus, as Spellcraft(“arcane skill”) letting them to use Spellcraft for both Cantrips, as well as every requirement and use of a single arcane skill. They also get +2 on rolls to sense that particular type of arcane skill use, but -2 to any other non-Cantrip magic.//
* //''Fading Magic'' - Unicorn ponies can use magic, allowing them to cast cantrips, but the stronger unicorn spells are now beyond their reach. All Unicorns start with the Magic Trick cantrip, plus an additional cantrip for each rank of Spellcraft they possess (you automatically gain new cantrips of your choice whenever this skill is raised). Every unicorn has the Fading Magic ability inherently; there is no need for an Arcane Background Edge. Unicorns may still acquire another Arcane Background regardless of their innate magic. See [[Cantrips]] for more information.//
* //''Cutie Mark'' - Unicorn ponies start with a free D6 in a skill of their choosing reflecting their true talent.//
!!“Limbs”
* ''Mouth''
* ''Forehooves'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
* ''Horn'' (See the [[Magic Trick]] Cantrip)
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Leg'': Gain the Lame Hindrance (or the Missing Leg Hindrance if already Lame). |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li><li>6 //Cracked Horn//: Your hero now has the Shattered Magic Hindrance.</li></ul> |
For some unknown reason, a few lucky Harrowed come back from the grave with an unnaturally powerful craving for some (technically) edible material. Invariably though, the craving is always for a substance a normal person finds particularly disgusting. And when we say “edible,” we really mean it’s something the deader can force down
his gullet.
It’s up to you what your character has a hankering for, but it must be repulsive to the average waster. Rotted food, mold, grave dirt, live bugs, motor oil, or animal blood are common examples. If your Harrowed doesn’t eat at least a handful of the substance each day, he acquires a level of Fatigue. While this Fatigue can’t cause incapacitation, it persists until he consumes enough of his chosen de-appetizer to make up for his missed meals.
This eccentric dietary habit doesn’t replace the need to eat raw meat to heal. It might make for some uncomfortable dinner conversations though...
A character attempting to fire a ranged attack from the back of a horse or other mount, a moving vehicle, or other “unstable platform” suffers –2 to his Shooting roll.
''Requirements'': Seasoned, Earth Pony
In times of great need, you can willingly overextend yourself in order to accomplish the task at hand.
When you make a Agility, Strength, or Vigor roll, or make a skill roll that is tied to one of these attributes, if you are successful you may voluntarily take a level of Fatigue in order to get a free raise. This Fatigue level remains until you have a good night’s sleep (6-8 hours).
Combat between vehicles and their crews works just like [[regular combat|Attacks]] but with two additional modifiers.
!!!Attack Modifiers
| !Penalty |!Situation |
| –2 |Unstable Platform |
| –1 per 10” of Speed |Fast Targets |
► ''Unstable Platform'': Any character on an unstable platform, including a moving vehicle, suffers a –2 penalty to any “fine” physical skills such as Fighting and Shooting. This applies to characters who are firing vehicular weapons as well. Note that the Steady Hands Edge eliminates this penalty.
► ''Fast Target'': A fast-moving vehicle is more difficult to hit, and subtracts 1 from any attacks directed at it for every full 10” of its speed. This is relative, so a vehicle heading directly toward a character doesn’t get the modifier, nor does the modifier apply if the hero is shooting at a vehicle driving parallel to his own.
!!Sidecars and Trailers
Attackers aiming for the sidecar must have a line of sight to it given whichever side it’s on.
If randomly shooting at these vehicles, for motorcycle/sidecar combos, a 1–2 on a d6 means the sidecar is hit and a 3–6 hits the bike, although if the shooter is on the opposite side of the bike to the sidecar, he won’t be able to damage or target it. For a tractor trailer, a 1–2 on a d6 is the tractor and 3–6 the trailer. When striking the sidecar or trailer, use the modified [[Critical Hit Table|Vehicle Damage]] to represent them not having an engine or controls.
Damage that equals or exceeds the vehicle’s Toughness forces the driver to make a Driving roll or go Out of Control (roll on the [[Out of Control Table|Collisions]]). Each raise on the damage roll also inflicts a “wound.” Each wound caused to the vehicle inflicts a –1 penalty to the driver’s Driving skill rolls until someone repairs the damage. The attacker also scores a critical hit for each wound inflicted, and rolls on the Critical Hit Table to find out exactly what happened. When a vehicle takes its fourth wound, it is automatically wrecked and the driver must make a Driving roll or go out of control.
A wrecked vehicle won’t run anymore, though its weapons may still be able to fire if they aren’t powered by the vehicle’s propulsion system.
► ''Wrecked Aircraft'': If an aircraft goes Out of Control, don’t use the usual table. Instead, the pilot makes a Piloting roll. If he fails, the aircraft crashes and is destroyed. If the pilot can eject, he gets one chance to do so by making an Agility roll.
► ''Wrecked Watercraft'': Unless the vessel is cracked open and sinks instantly, a wrecked boat sinks at the following rate:
* //Small craft// (rowboats, canoes) sink at the end of the round in which they’re wrecked.
* //Medium craft//, such as a fishing boat, sink in 1d6 minutes.
* //Large craft//, such as a private yacht, sink in 4d6 minutes.
* //Ships//, such as oil tankers, cruise ships, or naval vessels, sink in 2d6 hours.
* A wrecked boat that hasn’t sunk drifts with the current (if any). This is typically 2d6” per round for fast-moving rivers, and 1d6” for most other rivers or in strong seas. In the ocean, the GM can roll 1d12 to determine which direction a vessel drifts.
!!!Critical Hits Table
| !2d6 |!Effect |
| 2 |''Scratch and Dent'': The attack merely scratches the paint. There’s no permanent damage. |
| 3 |''Engine'': The engine is hit. Oil leaks, pistons misfire, etc. Acceleration is halved (round down). This does not affect deceleration, however. |
| 4 |''Locomotion'': The wheels, tracks, or whatever have been hit. Halve the vehicle’s Top Speed immediately. If the vehicle is pulled by animals, the shot hits one of them instead. |
| 5 |''Controls'': The control system is hit. Until a Repair roll is made, the vehicle can only perform turns to one side (1–3 left, 4–6 right). This may prohibit certain maneuvers as well. |
| 6–8 |''Chassis'': The vehicle suffers a hit in the body with no special effects. |
| 9–10 |''Crew'': A random crew member is hit. The damage from the attack is rerolled. If the character is inside the vehicle, subtract the vehicle’s armor from the damage. Damage caused by an explosion affects all passengers in the vehicle. |
| 11 |''Weapon'': A random weapon on the side of the vehicle that was hit is destroyed and may no longer be used. If there is no weapon, this is a Chassis hit instead. |
| 12 |''Wrecked'': The vehicle is wrecked and automatically goes Out of Control. |
► ''Motorcycles and Tires''^^HC^^: A bike which suffers a Locomotion Critical Hit automatically goes out of control and has its Top Speed reduced to zero. It isn’t necessarily wrecked, and the driver can still stand the bike up and fire its weapons. It just isn’t going anywhere fast until that tire is fixed.
!!!Sidecar & Trailer Critical Hit Table^^HC^^
| !2d6 |!Effect |
| 2 |''Scratch and Dent'': The attack merely scratches the paint. There’s no permanent damage. |
| 3 |''Locomotion'': The wheels have been hit. Quarter the primary vehicle’s Top Speed immediately for a trailer and halve it for a sidecar. |
| 4-5 |''Cargo'': Each Hit destroys 1d6 pieces of cargo. If the vehicle isn’t carrying any cargo, treat this as a Chassis hit instead. |
| 6 |''Modification'': A random modification is destroyed. This doesn’t include Armor or Weapons. If the vehicle has no mods, treat this as a Chassis hit instead. |
| 7-8 |''Chassis'': The vehicle suffers a hit in the body with no special effects. |
| 9-10 |''Crew'': A random crew member is hit. The damage from the attack is rerolled. If the character is inside the vehicle, subtract the vehicle’s Armor from the damage. Damage caused by an explosion affects all passengers in the vehicle. If there is no crew, treat this as a Chassis hit instead. |
| 11 |''Weapon'': A random weapon on the side of the vehicle that was hit is destroyed and may no longer be used. If there is no weapon, this is a Chassis hit instead. |
| 12 |''Wrecked'': The vehicle is wrecked. If you’re treating sidecars and trailers as separate vehicles, the primary vehicle automatically goes Out of Control. |
All the rough roads in the Wasted West are tough on any vehicle, and scheduled maintenance is pretty much impossible. For each day traveling by car, the driver must make a Driving roll or the vehicle suffers a level of Fatigue.
Fatigue has the same effect on vehicles it does on people. Recovery requires a Repair roll and one hour of work per Fatigue level. On a success, the vehicle recovers one Fatigue level, two with a raise.
If a Repair roll is failed the Fatigue can only be recovered with 1d6 x $100 worth of spare parts per Fatigue level (no roll required).
Pretty much every vehicle in the Wasted West runs on spook juice. As a rule, they can generally travel about 20 miles on a gallon of go juice. That may seem low, but keep in mind it’s tough to maintain a fuel-efficient speed on the wrecked highways. Some vehicles may get better or worse mileage (see the notes below) but typically, they are all designed to travel about 300 miles on a full tank. That means most tanks hold about 15 gallons, but a vehicle with Fuel Hog would hold 30 gallons and one with Light Weight would hold 10.
* ''Fuel Hog'': Fuel hogs guzzle spook juice, and make about 10 miles per gallon.
* ''Fuel Guzzler'': These vehicles go through fuel like their gas tank is leaking, and barely make 5 miles per gallon.
* If nothing else is mentioned, the vehicle makes 20 miles per gallon as above.
* ''Light Weight'': These vehicles give you a lot of bang for your spook juice buck, and travel 30 miles per gallon.
* ''Fuel Efficient'': These vehicles sip spook juice, and give 50 miles per gallon.
* ''Fusion Powered'': The vehicle has a fusion-powered engine and essentially never needs fuel.
''Pimp My Ride!''
Okay, brainer, now that you’ve got wheels, it’s time to shine ‘em up real
nice. Well, nothing really shines anymore, but you get the idea. Here are a bunch of modifications you can make to your vehicle. Each modification has a listed cost and availability (which works the same as vehicle availability).
Each modification also lists a Repair roll modifier, which is the roll required to install the modification. Your wrench-monkey can do this work himself or he can pay double the cost and increase the availability rating
by one step—if he has a mechanic to do it for him. If the character fails his own attempt, he’ll need to find someone to show him how it’s done. He may also try again if he later increases his skill level
|!Modification|!Cost|!Repair Roll|!Avail|
|''[[Air Bags]]''| $200 | 0 (1 hour) | C |
|''[[Air Damn]]''| $200 | -2 (2 hours) | U |
|''[[Automatic Fire Extinguishers]]''| $300 | -2 (2 hours) | S |
|''[[Combat Shocks]]''| $200 a wheel | -2 (4 hours) | R |
|''[[Extra Armor]]''| $500 per point | 0 (1 hour per point) | C |
|''[[Extra Fire Controls]]''| $100 per Weapon | 0 (1Hour) | U |
|''[[Fighting Position]]''| $100 per Pony | 0 (2 hours +1 per pony) | C |
|''[[Gun Cover]]''| $25 Per Weapon | 0 (1 hour) | S |
|''[[Hardened Wheels]]''| $125 per wheel | 0 (1 hour) | U |
|''[[Heavy Duty Shocks]]''| $50 per Wheel | 0 (2 hours) | U |
|''[[Hooch Converter]]''| $1000 | -4 (4 hours) | R |
|''[[HUD]]''| $5,000 | -4 (4 hours) | VR |
|''[[Improved Suspension]]''| $1000 | -2 (4 hours) | C |
|''[[Infrared Night Vision]]''| $2000 | -2 (2 hours) | U |
|''[[Mine Dropper]]''| $500 | -2 (2 hours) | U |
|''[[Mine Plate]]''| $500 | 0 (2 hours) | c |
|''[[Night Vision]]''| $3000 | -2 (2 hours) | S |
|''[[Nitrous Oxide]]''| $600 | -2 (1 hour) | U |
|''[[Oil Sprayer]]''| $500 | 0 (1 hour) | C |
|''[[Ram Plate]]''| $250 | 0 (1 hour) | C |
|''[[Sidecar]]''| $500 | -2 (2 hours) | U |
|''[[Smoke Screen]]''| $300 | 0 (1 hour) | U |
|''[[Spikes]]''| $200 | 0 (1 hour) | C |
|''[[Spoiler]]''| $200 | 0 (1 hour) | U |
|''[[Stabilizer]]''| $5000 | -2 (2 hours) | s |
|''[[Stabilizer]] (Advanced)''| $8000 | -4 (4 hours) | R |
|''[[Stealth Paint]]''| $2000 | -2 (4 hours) | VR |
|''[[Supercharger]]''| $800 | -2 (2d4 hours) | R |
|''[[Weapon Mount]] (Fixed)''| $250 + Weapon | 0 (1 hour) | C |
|''[[Weapon Mount]] (Swivel)''| $750 + Weapon | -2 (1 hour) | U |
!!!Repairs
Characters may repair vehicles given sufficient time and at least some basic tools. This requires a Repair roll that takes two hours per wound the vehicle has (regardless of how many are actually repaired). Attempting to fix up a tank that has suffered two wounds, for example, takes four hours regardless of the result of the Repair roll.
Field work requires at least a toolbox and basic supplies, and subtracts 2 from the Repair roll. An average garage negates this penalty, and an excellent or dedicated facility adds +2.
Each success and raise on the Repair roll fixes one of the vehicle’s wounds. With an additional raise above and beyond that required to fix all its wounds, the repair time is halved.
► ''Wrecks'': Wrecked vehicles can also be repaired, but it takes much more time and decent spare parts. The time is equal to 1d6 x 10 hours per wound level repaired.
<<<
''Example'': Corporal Tunny has been tasked with patching the holes in a B-17 bomber with two wounds. He’s at the airbase with a dedicated garage and thus adds +2 to his rolls. Each attempt takes four hours, and each success and raise removes one wound.
<<<
From armored combat in World War II to ship-to-ship battles on the high seas, vehicles often play a key role in the furious action of our Savage Settings. The following section contains rules for handling vehicle combat on the table-top. For more abstract Chases that take place over larger areas, see [[Chases]]
!!!List of Vehicle Rules
*[[Vehicular Movement and Manuevers]]
*[[Collisions]]
*[[Vehicle Attack]]
*[[Vehicle Damage]]
*[[Vehicle Repair]]
!!!List of Hell on Earth Vehicle Rules
*[[Vehicle Fueling]]
*[[Vehicle Fatigue]]
''Vehicles''
Here’s a rundown of the more common vehicles in the Equestrian wasteland. Before we get into the nitty gritty of statistics, let’s talk about fuel. Pretty much every vehicle in the Wasted West runs on spook juice. As a rule, they can generally travel about 20 miles on a gallon of go juice. That may seem low, but keep in mind it’s tough to maintain a fuel-efficient speed on the wrecked highways. Some vehicles may get better or worse mileage (see the notes below) but typically, they are all designed to travel about 300 miles on a full tank. That means most tanks hold about 15 gallons, but a vehicle with Fuel Hog would hold 30 gallons and one with Light Weight would hold 10.
|!Fuel Efficiency|!MPG|
|''Fuel Efficient''| 50 mpg |
|''Fuel Guzzler''| 5 mpg |
|''Fuel Hog''| 10 mpg |
|''Fusion Powered'' | *seen notes* |
| //''Notes:'' The vehicle has a fusion-powered engine and essentially never needs fuel// |<|
|''Light Weight''| 30 mpg |
Each of the vehicle types has an engine listed for it. For our purposes, there are three engine sizes for each vehicle type: small, medium, and large (though for flavor’s sale we’ve given them cooler designations) and can be swapped out if desired.
>[[Civilian Ground Vehicles]]
>[[Engines]]
>[[Vehicle Mods]]
>[[Aircraft's]]
>[[Aircraft Mods and Extras]]
>[[Watercraft]]
!!Movement
A vehicle’s Acceleration value is how many inches per turn it can increase its current speed. A pickup with an Acceleration of 5, for instance, can increase its movement by 5” every action, up to its Top Speed. A vehicle can decrease its speed by twice its Acceleration (or more in a Hard Brake—see Maneuvers).
The player controlling the vehicle decides his speed at the beginning of his action, and moves it that many inches. The vehicle remains at that speed until the driver’s next action, so record the current speed somewhere for the next round and in case it hits something.
Vehicles have some restrictions on maneuvering, particularly in how they turn. Use the Turning Template for normal turns, or perform a maneuver (see below) for tighter moves.
► ''Action Cards'': Vehicles move on their driver’s Action Card. Driving is a free action unless the driver attempts a maneuver. Passengers act on their own initiative as usual.
► ''Speed Kills'': It’s much easier to maneuver a vehicle slowly than it is at high speed. A vehicle moving over 15” a round on the tabletop inflicts a –2 handling penalty on its driver. A vehicle moving over 30” inflicts a –4 penalty.
► ''Difficult Ground'': Slippery gravel, uneven ground, and mud are all difficult ground and work just as for characters on foot. Count each inch moved through such rough terrain as two, and apply a –2 penalty to all Driving rolls made while in rough terrain. Driving through rough terrain at over half of Top Speed requires a Driving roll every round.
► ''Reverse'': A vehicle can move up to half its Top Speed in reverse. Driving rolls made while in reverse suffer a –2 modifier.
► ''Aircraft'': Aircraft ignore terrain. Unless the aircraft has the ability to hover, it must move at least half its Top Speed each action. Climb isn’t used in table-top battles—only in Chases.
► ''Animals and Conveyances'': Animals don’t have to worry about Acceleration or Top Speed—they simply move their Pace (plus any running roll) each round. Animal-drawn transportation has an Acceleration equal to half the animal’s basic Pace. Carts and wagons don’t have a Top Speed
because the animal simply moves its Pace as usual (plus a running die if it runs).
!!!Turning
To perform turns on a map, use the Turning Template. Simply line your vehicle up with the template and move it along the outside, as shown in the Turning diagram. Vehicles can perform tighter turns as a Maneuver (see Maneuvers).
!!Scale^^HC^^
For the map, it’s recommended you divide Acceleration, Top Speed, and weapon Ranges by 10. This allows you to run battles without needing an actual stretch of highway to play on.
!!Maneuvers
Below are some common maneuvers with any penalty to the Driving roll listed in parentheses. If the maneuver is failed, move the vehicle to the point of the maneuver, then roll on the Out of Control Table to see where it actually ends up.
* ''Bootlegger Reverse'' (–4): The vehicle moves forward at half its current speed and then turns between 90 and 180 degrees (player’s choice). The vehicle instantly decelerates to a complete stop and cannot move further this round.
* ''Hard Brake'' (0): The driver decelerates up to three times the vehicle’s Acceleration.
* ''Jump'' (0): With a ramp, ground and water vehicles can jump a distance equal to one-quarter of their current speed, plus 1d10” with a raise on the Driving roll. They descend one inch for every two inches jumped forward, so a vehicle jumping 20” falls 10” by the end of its jump.
* ''Maneuver'' (–1 to –4): This one covers most everything else a driver, rider, or pilot might try to do, such as riding a horse down a steep or slippery hill, avoiding a manhole cover or other obstacle, or driving through an oil slick at high speed. The GM sets the modifier. If the roll is failed, the driver goes out of control as usual.
* ''Obstacle'' (–2 or more): Driving through a really tight obstacle looks easy enough on the tabletop since a vehicle is simply moved however the player wants. But in “reality,” the car is shifting around and is much more difficult to hold steady than the table-top shows. For this reason, drivers trying to pass through tight obstacles— narrow alleys, other cars, flying under power lines—must make Driving rolls. The standard difficulty is –2, but really tight spots might call for a –4 or greater penalty. If the roll is failed, the vehicle hits the obstacle and suffers collision damage as usual.
* ''Ram'' (Opposed): Though we have to move vehicles in turns on the table-top, they’re actually moving simultaneously in the “real world.” For that reason, when one car rams another, we give the defender a chance to get out of the way—even if it’s not his turn. When this happens, the two drivers make opposed Driving rolls. If the attacker wins, he’s managed to ram his foe and damage is calculated normally. If the defender wins, he must move his vehicle just out of the way, whether backwards, forwards, or sideways. Sometimes cars run into people as well. In this case, the driver makes an opposed roll against the target’s Agility instead.
* ''Tight Turn'' (0): The vehicle can turn up to 90 degrees.
* ''Two Wheels'' (–4): Sometimes a character needs to put a wheeled vehicle on its side, maybe to squeeze through a narrow alley or avoid running over some deadly obstacle. Turning a vehicle up on two wheels requires a ramp of some kind—even an embankment can do the trick. The effect is to decrease the width of the car—usually by about 25%. The driver must make a Driving roll at the beginning of each turn he wants to keep the car up on two wheels.
* ''Steamroller''^^HC^^: When colliding with a car or motorcycle, a tractor trailer or similar large vehicle may try to actually drive right over it. To do so, the driver of the tractor has to make an opposed Driving roll to perform a Steamroller maneuver, which is actually a variant of the Ram maneuver from Savage Worlds. If the attacker wins, he performs a standard Ram. With a raise, the tractor treats the bike or car as being a Soft Obstacle. The tractor simply drives over the smaller vehicle and continues its movement as normal (assuming it isn’t destroyed by the collision, of course)
!!Sidecars and Trailers^^HC^^
Sidecars and tractor trailers have been a stock part of the post-apocalypse genre since a young man named Max strapped himself into the last of the V-8 interceptors. The big question with these combo vehicles is how they are treated in combat.
!!!Movement^^HC^^
Sidecars are fixed to the bike and move exactly as the bike does. No special movement rules are required.
Tractor trailers, however, are a different matter, as the trailer is held on via a kingpin. If you simply rule the vehicle moves as a single, long object, you’ll probably find tractor trailers can’t turn corners. For the best results on a game map, use a counter for the tractor and one for the trailer, each with a black dot showing where they’re joined. Move the tractor as normal, as if it had no trailer. When moving the trailer, hold down the rear end, rotate the front to line up with the black dot on the tractor, and then move the trailer in a straight line so the dots line up. It’s pretty easy, though not
100% realistic.
We strongly suggest you don’t let tractor trailers try a bootlegger.
<<<
''comment'': But it would be an awesome move. Car flail!
<<<
!!!Releasing the Sidecar or Trailer^^HC^^
As an action, the driver can release the sidecar or trailer from the main vehicle.
The sidecar or trailer immediately goes Out of Control. Roll on the Out of Control Table in Savage Worlds and reduce the speed by 10” each round until it stops moving. Since sidecars have only one wheel and trailers don’t have front wheels, they are very unlikely to roll far when released. The Out of Control check has a cumulative –1 penalty to the roll each 10” the vehicle is moving. A roll of 2 or lower means the vehicle has performed a Roll Over.
Unless otherwise specified (such as the cost for grenades), ammunition for each weapon costs 10% of the weapon’s cost for a full load of ammunition. For example, 40 shots for the 8mm rail gun cost $800
|!Weapon|!Range|!Dmg|!~RoF|!Cost|!Avail|!Shots|
|''8mm Rail Gun''|200/400/800|3D10|1|$8000| R |40|
| Notes: AP4; Heavy Weapon; SBT |<|<|<|<|<|<|
|''10mm Laser''|100/200/400|3D6|3|$12000| R |Unlimited with fusion reactor|
| Notes: AP 8; Heavy Weapon |<|<|<|<|<|<|
|''15mm AT Laser''|150/300/600|4D8|3|$20000| R | Unlimited with fusion reactor|
| Notes: AP 40; Heavy Weapon |<|<|<|<|<|<|
|''15mm AA Beam Laser''|120/240/480|3D8+2|1|$25000| VR |Unlimited with fusion reactor|
| Notes: AP16; Heavy Weapon; Auto Tracking |<|<|<|<|<|<|
|''125mm'' (AI Rounds)|120/240/480|3D8+2|1|$10000| VR |5|
| Notes: AP 80; Heavy Weapon; MBT |<|<|<|<|<|<|
|''125mm'' (DU Rounds)|120/240/480|5D8|1|$10000| VR |5|
| Notes: AP 120; Heavy Weapon |<|<|<|<|<|<|
|''140mm''|100/200/400|5D10|1|$12000| VR |1|
| Notes: Halves Armor; AP 60; Heavy Weapon; MBT |<|<|<|<|<|<|
|''20mm Autocannon''|50/100/200|2D12|4|$2500| U |80|
| Notes: AP 4; Heavy Weapon |<|<|<|<|<|<|
|''30mm Autocannon''|50/100/200|3D8|3|$3500| R |60|
| Notes: AP 6; Heavy Weapon |<|<|<|<|<|<|
|''40mm Autocannon''|50/100/200|4D8|3|$5000| R |40|
| Notes: AP 5; Heavy Weapon |<|<|<|<|<|<|
|''Flame Thrower'' (Spook Juice)|Cone/40|3D10|1|$2000| U |10(g)|
| Notes: MBT (for 40 range); Ignores unsealed armor |<|<|<|<|<|<|
|''Flamer''|Cone|3D10|1|$1500| U |Unlimited with fusion reactor|
| Notes: Ignores unsealed armor |<|<|<|<|<|<|
|''M-95 Missile Launcher''|100/200/400|4D10|1|$5000| VR |2|
| Notes: AP 65; Heavy Weapon; MBT |<|<|<|<|<|<|
|''M-240 Grenade Launcher'' (40mm)|100/200/400|as grenade|2|$3000| R |30|
| Notes: |<|<|<|<|<|<|
|''XL-99 Plasma Cannon''|100/200/400|5D10|.5|$7000| R |Unlimited with fusion reactor|
| Notes: AP 30; Heavy Weapon; SBT |<|<|<|<|<|<|
Your character always attempts to right a wrong he feels was done to him. If this is a Minor Hindrance, he usually seeks vengeance legally. The type and immediacy of his vengeance varies by character, of course. Some plot and scheme for months to extract what they see as justice. Others demand immediate results.
If this is a Major Hindrance, your character will kill to rectify his perceived injustice.
''Requirements'': Novice, Attractive
Your hero is drop-dead gorgeous. His Charisma is increased to +4.
''Requirements'': Wild Card, Novice, Spirit d6+, Knowledge (Occult) d6+
Veterans o’ the Wasted West start the game with +20 Experience Points (typically four extra Advances) This Edge can only be taken at character creation.
There’s a price, though If you take this Edge, draw a single card from the Action Deck and show it to your Marshal. He’ll check the table on page 96 of Hell on Earth Reloaded to see just what kind of bad luck your hombre wandered into. If you draw a Joker, keep drawing until you get a red or black card and tell your Marshal which you got If your deck has red and black Jokers, just use that instead.
Beware, because the results can be quite extreme—from serious maiming to insanity. Your Marshal has the details. You’ve been warned, tough guy.
''Requirements'': Novice, Command, Notice d6+
With your guidance, your allies can spot threats and clues with greater precision and speed.
All allies within your command radius receive a +1 bonus to Notice rolls made to spot threats, ambushes, and other dangerous situations.
The character has a vow of some sort. Whether it’s Major or Minor depends on the Vow itself. Some may have Vows to particular orders or causes, to the Hippocratic Oath, to rid the world of evil, and so on. The danger in fulfilling the Vow and how often it might occur determines the level of the Hindrance.
Whatever the Vow, it’s only a Hindrance if it actually comes into play from time to time and causes the character some discomfort.
''Rank'': Novice
''Power Points'': 2
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': A crushed spider, bit of web, piece of tentacle.
Spellcasters are frequently targeted in combat because of their arcane prowess and high-utility spells such as this are great for getting the caster safely out of harm’s way. Of course, it has countless other uses too.
//Wall walker// allows the recipient to function much like a human spider. He can stick to any surface, allowing him to climb walls and even hang from the ceiling. With a success, the character can move along such surfaces at half his normal Pace. With a raise, he may move at full Pace and even run.
► ''Additional Targets'': The character may affect up to five targets by spending a like amount of additional Power Points.
Your hero has committed some crime in his past and will be arrested if discovered by the authorities. This assumes the setting actually has laws and police officers to enforce them.
The level of the Hindrance depends on how serious the crime was. A hero with numerous unpaid parking tickets (in a game where he might have to drive occasionally) has a Minor Hindrance, as does someone wanted for more serious crimes away from the main campaign area. Being accused of murder is a Major Hindrance in almost any setting
''Rank'': Seasoned
''Power Points'': 4
''Range'': Touch
''Duration'': 3 (1/round)
''Trappings'': Gestures, prayer, whispered words, concentration.
Even combat mages cannot afford to spend all their time learning new combat maneuvers and martial skills. For those who enjoy the thrill of melee or want to improve their companions’ skills, this spell provides a quick solution to a lack of training.
With a successful arcane skill roll, the recipient gains the benefits of a single Combat Edge chosen by the caster. The caster (not the recipient) must be one Rank higher than the Rank requirement of the Edge but ignores other requirements, even those requiring other Edges. For the duration of the spell, the recipient gains all the benefits of the Edge.
Edges gained through this power provide no additional benefit if the character already has the Edge.
|!Vehicle|!Acc/TS|!Toughness|!Crew|!Value|!Avail|
| ''Rowboat'' | 1/2 Str/Str | 7(1) | 1+3 | $100 | U |
||//''Notes:''// |<|<|<|<|
| ''Jet Ski'' | 10/22 | 8(2) | 1+1 | $300 | U |
||//''Notes:'' Fuel tank is 5//|<|<|<|<|
| ''Speedboat'' | 20/55 | 10(2) | 1+5 | $1,000 | S |
||//''Notes:'' Fuel Hog//|<|<|<|<|
| ''Mini-Sub'' | 5(2)/8(4) | 12(2) | 1+3 | $20,000 | VR |
||//''Notes:'' Fuel Hog, 12 hours of Air, Periscope, 2 torpedo tubes//|<|<|<|<|
| ''Sailboat'' | 2/6 | 10(2) | 1+7 | $5,000 | S |
||//''Notes:'' Increase Acc and TS by 2 for each raise on your boating check//|<|<|<|<|
| ''Patrol Boat'' | 10/15 | 15(3) | 1+9 | $15,000 | S |
||//''Notes:'' Fuel Hog, Deck mounted torpedo tube//|<|<|<|<|
|!Accessory|!Cost|!Wgt|!Avail|
|''Bandolier''|$10 | 1 | U |
|''Holster''|$30| 1 | C |
|''Laser Sight''|$150| .5 | R |
|''Scope''|$20| .5 | R |
|''Suppressor'' (Pistol)|$100| 1 | R |
|''Suppressor'' (SMG)|$150| 4 | R |
''Requirements'': Legendary, Fighting d12
Increase your hero’s Parry by +1.
Weapon mounts help your wasteland warrior do unto others before they can do unto him. These vital accessories come in two varieties: fixed mounts and swivel mounts. The statistics above indicate fixed mount information to the left of the slash, with the swivel mount information to the right.
A fixed mount, as the name implies, is in a fixed position relative to the vehicle. Usually this is forward, but more than one lucky waster has escaped a road gang by virtue of a SAW stuffed in his trunk. In any event, this weapon can only fire in the direction it is mounted, but since the fire controls are usually wired to the driver’s steering wheel, he can fire it once each round without incurring a multi-action penalty. To make an attack, the driver rolls the lower of his Driving or Shooting skills.
Swivel mounts can be as crude as a hole hacked in a car roof or as sophisticated as a motorized turret, but always require a passenger to serve as gunner. This style of mount allows a weapon to be fired in any direction. Don’t forget that unstable platform penalty, though.
Vehicles can only carry as many weapon mounts as their base Toughness divided by 4, rounded down
//Some weapons are prefaced with the letters HI, this stands for Hill-Storm Industries. HI weapons are a special case and are worth noting because all but a rare few examples of these weapons are produced and controlled by the Combine. Combine Weapons are only usable by Black Hats and are booby trapped. Only characters with the [[Combine Deserter]] Hindrance may use them. //
*[[Melee Weapons]]
*[[Thrown Weapons]]
*[[Bows]]
*[[Pistols]]
*[[Rifles]]
*[[Shotguns]]
*[[Submachine Guns]]
*[[Heavy Machine Guns]]
*[[Launchers]]
*[[Grenades]]
*[[Vehicular Weapons]]
*[[Missiles]]
*[[Bombs]]
No matter where you go or what you do, bizarre and unlikely things seem to gravitate towards you like moths to a fire. These things are not necessarily harmful, but they are typically unexpected and awkward for those around you.
As a Minor Hindrance the events are mostly harmless, if inconvenient and off-putting. As a Major Hindrance, you are plagued with potentially dangerous events that can easily cause harm to those around you.
Arcane Skill for the Power of Weird Science
''Requirements'': Novice, Repair d6+
Your survivor scrounged up a vehicle of some sort Even better, he’s managed to keep it in working order! Whether he traded for it, fixed up a wreck abandoned on the highway, or took the keys of some no-good road ganger, he snagged himself some wheels.
You have $5,000 to build a sweet ride (this includes any accessories, as well as fuel) If you have the Rich or Filthy Rich Edge, you apply the multiplier to this money as well (allowing for some real hot rods) This gives you more than the usual additional starting funds, but comes with the downside of owning a vehicle in a world without gas stations and repair shops.
First, your cruiser has to find gas or spook juice to keep it running. Second, many highways are clogged with wrecked and abandoned vehicles Even clear roadways are a hazard as busted-up asphalt and debris-strewn streets tend to tear up a suspension. On the plus side, he’ll never have to deal with the DMV!
See [[Vehicles]] to build your baby and for how the wear and tear of the Wasted West affects your new set of wheels.
''Whimsy Islands''
//est. population: 0//
Before the Last War, the Whimsy Corporation ran a chain of child-oriented amusement parks in both the Solar Empire and the Lunar Replublic. Its creator and owner, A lovable donkey named Wild Whimsy, was one of the most well-known entertainment moguls in the world, earning his fortune from designing and licensing cute and lovable characters for computer games and films. Even before opening his theme parks, Wilds name was a household word across the World. The first of his parks, Whimsy Islands was the most popular amusement park Equestria.
Built on a series of ponymade islands a half-mile off the west coast and far enough south of the Maze so that the water was still clean, Whimsy Island offered not only good clean family fun but featured the latest and greatest in entertainment technologies. The park had its own nuclear reactor and was staffed by a special line of robots based loosely on Hill Storm Industries’ automatons.
A monorail line connects each of the islands, all of which are themed with robots dressing to match, but a chunk of the half mile stretch of rail connecting the island to the mainland was blown up a few years back for some reason by an unnamed group of adventures.
Sometimes a desperate character may want to throw caution to the wind and attack with everything he’s got. This is called a “wild attack,” and can be devastating if used correctly. If used recklessly, it can quickly get even a veteran character slaughtered.
Performing a wild attack adds +2 to the character’s Fighting attack and resulting damage roll, but his Parry is reduced by 2 until his next action.
Wild attacks can be used with multiple attacks, such as from the Frenzy or Sweep Edges, or with two weapons.
Your hero (a player character), and unique allies, villains, and monsters are collectively called “Wild Cards.” These beings have a little better chance at doing things, are a little tougher to put down, and are generally more detailed than common guards, minions, or lackeys—collectively called “Extras.”
In [[Trait Tests]], Extras only roll the Trait Die, while Wild Cards also roll one Wild Die and can choose to take the best result between either. On the downside, only Wild Cards can face Critical Failures by rolling 1 in both dice.
Player Character's Wild Cards usually get 3 [[Bennies]] each. Game Master's Wild Cards only get 2 Bennies each that can only be used by the owner character. GMs also get one additional Benny per PC, which they can use for any of their Wild Cards or even Extras.
Every Wild Card draws their own [[Initiative]]. Extras are grouped under one Initiative card as the GM sees fit and can even [[run|Movement]] using the same rill.
When Extras take a [[wound|Damage Effects]], they are Incapacitated and removed from combat. Wild Cards can endure up to 3 Wounds and keep fighting, though their skills are reduced by the amount of Wounds they took.
Concertina (or razor) wire is strung far and wide across the Wasted West. Nearly every inch of the North-South border is lined with the vicious stuff, often several coils deep. Permanent emplacements, like those along the Mason-Dixon Wall, are usually fixed to wooden or iron stakes, but in battlefield conditions, it’s not unusual to find coils simply strung haphazardly without any anchor points.
It’s possible to crawl through a wire obstacle, but it makes for slow going. Wasters picking their way through wire cautiously can only move 1” a round if they make an Agility roll. Any scavs trying to rush can push through 2” a round with an Agility roll (–2). A roll of one on the Agility die (regardless of the Wild Die) means the poor sucker has become entangled. He suffers a Fatigue level from the many cuts and punctures the wire inflicts. Worse, further attempts to get free take 1d6 x 10 minutes—which is a death sentence in the middle of a fight!
Wire cutters add +1 to the Agility roll and cut away a space 1/2” (three foot) wide and deep per round.
Arcane Skill for the Power of Witchcraft
Inevitably, your hero will decide discretion is the better part of valor. Whenever a character retreats from melee, all adjacent non-Shaken opponents get an immediate free attack (but only one—no Frenzy or other Edges apply unless they specifically say otherwise).
A character may take the Defend option (+2 Parry) while retreating from combat, but won’t be able to perform other actions that round besides movement and still suffers the free attack.
<<<
''Example'': Inspector Mars is attacked by three cultists in melee. He decides to run for it, giving each cultist a free Fighting roll against him. Mars wisely uses the Defend maneuver as well to increase his Parry by +2 until he can get away.
<<<
''Requirements'': Novice, Harrowed
This terrible ability allows a deader to drain the life and years of some poor sod. With a touch, the Harrowed and the target make opposed Spirit rolls. If the Harrowed wins, the target’s Strength is reduced one die type to a minimum of d4. With a raise, his Strength and Vigor are both reduced. This is a permanent loss but may be recovered by advancement as usual.
''Requirements'': Novice, Arcane Background (Magic), Smarts d8+, Knowledge (Arcana) d8+, //Spellcraft d6+//
Wizards range from young apprentices to frighteningly powerful supreme sorcerers. They are often physically weak, however, and rarely have the divine powers or healing abilities of priestly spellcasters. What they lack in spiritual favor, however, they more than make up for in utility and eldritch might.
Wizards tend to learn their craft in formalized institutions or under the tutelage of experienced masters. Each raise a Wizard gets on his Spellcasting roll reduces the cost of the spell by 1 Power Point. The Wizard must have the points available to cast the spell in the first place before rolling.
''Requirements'': Novice, Spirit d6+, Survival d8+, Tracking d8+
Woodsmen are rangers, scouts, and hunters who are more at home in the wilderness than in urban areas. They are skilled trackers and scouts, and know how to live off the land for months at a time. Woodsmen gain +2 to Tracking, Survival, and Stealth rolls made in the wilderness (not towns, ruins, or underground).
Children are sometimes forced to go on dangerous adventures through unfortunate circumstances. Think carefully before choosing this Hindrance, for your youngster starts at a significant disadvantage.
Young heroes are generally 8–12 years old (in human years—adjust this for races with different aging paradigms). They have only 3 points to adjust their attributes and 10 skill points. On the plus side, youths like these have a fair amount of luck. They draw one extra Benny at the beginning of each game session in addition to any additional Bennies gained from such things as the Luck or Great Luck Edges.
If the character should live long enough to mature, the Hindrance doesn’t have to be bought off, he’s already paid the price for the Hindrance by starting at a disadvantage. He stops getting the extra Benny when he reaches 18 years of age however (or the age of adulthood in your particular setting).
Though largely distrusted and misunderstood in pony society, many zebras have found cause to join with ponies and other creatures for various reasons. Zebra are mundane creatures and are not considered to be magical. For more information on zebras, see their entries in the section on
Heroes, Personalities, and Savage Foes.
!!Race Features
* //''Zebraica Fighting Tactics'' - Zebras are renowned for their natural grace and balance in combat and their homeland is considered the birthplace of martial arts. Start the game with the Martial Artists edge for free regardless of if you meet the requirements.//
* //''Glyph of Destiny'' - Zebras start with a free D6 in a skill of their choosing reflecting their true talent.//
!!“Limbs”
* ''Mouth''
* ''Forehooves'' x2
* ''Flank''
* ''Tail'': Can only hold up to half the Strength die
!!!Injury Table
| !2d6 |!Wound |
| 2 |''Unmentionables'': If the injury is permanent, reproduction is out of the question without miracle surgery or magic. There is no other effect from this result. |
| 3 |''Tail'': Gain the Docked Tail Hindrance |
| 4-5 |''Leg'': Gain the Lame Hindrance (or the Missing Leg Hindrance if already Lame). |
| 6-10 |''Guts'': Your hero catches one somewhere between the crotch and the chin. Roll 1d6: <ul><li>1-2 //Broken//: Agility reduced a die type (minimum d4).</li><li>3-4 //Battered//: Vigor reduced a die type (minimum d4).</li><li>5-6 //Busted//: Strength reduced a die type (minimum d4).</li></ul> |
| 11-12 |''Head'': A grievous injury to the head. Roll 1d6: <ul><li>1-2 //Hideous Scar//: Your hero now has the Ugly Hindrance.</li><li>3-4 //Blinded//: An eye is damaged. Gain the One Eye Hindrance (or the Blind Hindrance if he only had one good eye).</li><li>5-6 //Brain Damage//: Massive trauma to the head. Smarts reduced one die type (min d4).</li></ul> |
''Rank'': Veteran
''Power Points'': 3/corpse
''Range'': Smarts
''Duration'': Special
''Trappings'': Carving symbols on corpses, throwing bones, graveyards, “leather” books.
This power is considered evil in most settings, and so is typically used only by villainous nonplayer characters such as necromancers, evil scientists, dark cultists, and the like.
When cast, //zombie// raises a number of dead specified by the character when he spent his Power Points. The undead are immediately obedient, though perhaps a bit mischievous and literal-minded in their duties.
Corpses aren’t summoned by this ability, so there must actually be a supply of bodies available for the power to have any effect. The bodies don’t have to be fresh — //zombie// can raise servants that have been waiting patiently for centuries. Graveyards, morgues, and battlefields can all serve this purpose.
With a success, the dead remain animated for 1 hour. With a raise, they remain animated for 1d6 hours. With two raises, they remain animated for an entire day.
Certain powerful necromancers may have improved versions of this power that are cheaper to cast and create permanent undead.
!!Zombie
These walking dead are typical groaning fiends looking for fresh meat.
''Attributes'': Agility d6, Smarts d4, Spirit d4, Strength d6, Vigor d6
''Skills'': Fighting d6, Intimidation d6, Notice d4, Shooting d6
''Pace'': 4; ''Parry'': 5; ''Toughness'': 7
''Special Abilities''
* ''Claws'': Str.
* ''Fearless'': Zombies are immune to Fear and Intimidation.
* ''Undead'': +2 Toughness; +2 to recover from being Shaken; called shots do no extra damage (except to the head).
* ''Weakness (Head)'': Shots to a zombie’s head are +2 damage.