\define again()
<ul class="breadcrumb">
<$list filter=<<First>>><li><$link to=<<currentTiddler>>><$view field='title'/></$link></li></$list>
<$list filter=<<Extra>> emptyMessage=''><li>...</li></$list>
<$list filter=<<End>>><li><$link to=<<currentTiddler>>><$view field='title'/></$link></li></$list>
</ul>
\end

\define finalFilter()
<$set name=First filter='$(TheFilter)$ +[last[]]'>
<$set name=End filter='$(TheFilter)$ +[butlast[]]  +[butfirst[]] +[first[3]] +[reverse[]]'>
<$set name=Extra filter='$(TheFilter)$ +[butlast[]] +[butfirst[]] +[butfirst[3]] +[limit[1]]' emptyValue='[is[system]!is[system]]'>
<<again>>
</$set>
</$set>
</$set>
\end

\define breadcrumbs()
<$list filter='[is[current]tags[]limit[6]]-[[$:/tags/SideBar]]' emptyMessage='<br><<finalFilter>>'>
<$set name=TheFilter filter='$(TheFilter)$ [<currentTiddler>]'>
<<breadcrumbs>>
</$set>
</$list>
\end

<$set name=TheFilter filter=<<currentTiddler>>>
<<breadcrumbs>>
</$set>
\define toc-path()
<ul class="breadcrumb">
   <$macrocall $name="toc-path-body" here=<<currentTiddler>>/>
</ul>
\end

\define toc-path-body(here,exclude)
   <$list filter="""[title[$here$]tags[]] $exclude$ -[[$here$]] -[[$:/tags/SideBar]] +[limit[1]]""">
      <$macrocall $name="toc-path-body" here=<<currentTiddler>> exclude="""$exclude$ -[[$here$]]"""/>
      <li><$link><$text text=<<currentTiddler>>/></$link></li>
   </$list>
\end

<small><<toc-path>></small>
/*\
title: $:/_Macros/DaysToDate.js
type: application/javascript
module-type: macro
author: Hegart Dmishiv

Macro to return an integer for the number of days between the
current date and a specified date. 

Based on the TiddlyWiki core module $:/core/modules/macros/now.js
and  https://blog.grade.net/how-to-create-a-simple-javascript-countdown-timer

\*/
(function(){

/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";

/*
Information about this macro
*/

exports.name = "DaysToDate";

exports.params = [
	{name: "target_date"}
];

/*
Run the macro
*/
exports.run = function(target_date) {
 
    // convert param to a date (contributed by BJ)
    var end_date = new Date(target_date).getTime();
 
    // find the amount of seconds between now and target date
    var current_date = new Date().getTime();
    var seconds_left = (end_date - current_date) / 1000;
 
    // calculate days left, based on 86,400 seconds per day
    var DaysToDate = parseInt(seconds_left / 86400);

return DaysToDate;
};

})();
\define defn-link(target)
<$link to="""$target$"""><abbr title={{$target$!!defn}}>$target$</abbr></$link>
\end
.breadcrumb {
    list-style: none;
    overflow: hidden;
    margin-left: -35px;
    margin-top: -10px;
}
.breadcrumb li {
    background: #F6F6F6;
    padding: 2px 0 2px 36px;
    background: #F6F6F6;
    position: relative;
    display: block;
    float: left;
}
.breadcrumb li:before {
    content:" ";
    display: block;
    width: 0;
    height: 0;
    border-top: 11px solid transparent;
    border-bottom: 11px solid transparent;
    border-left: 20px solid #ffffff;
    position: absolute;
    top: 110%;
    margin-top: -25px;
    margin-left: 2px;
    left: 100%;
    z-index: 1;
}
.breadcrumb li:after {
    content:" ";
    display: block;
    width: 0;
    height: 0;
    border-top: 11px solid transparent;
    border-bottom: 11px solid transparent;
    border-left: 20px solid #F6F6F6;
    position: absolute;
    top: 110%;
    margin-top: -25px;
    left: 100%;
    z-index: 2;
}
Contents
{
    "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-2016\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 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></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 128 128\">\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 128 128\" 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 128 128\" 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 128 128\">\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 128 128\" 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 128 128\">\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 128 128\">\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 128 128\">\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 128 128\">\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 128 128\" 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 128 128\">\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 128 128\" 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 128 128\" 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 128 128\" 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 128 128\"><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 128 128\" 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 128 128\">\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/file": {
            "title": "$:/core/images/file",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-file tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"nonzero\">\n        <path d=\"M111.96811,30.5 L112,30.5 L112,119.999079 C112,124.417866 108.419113,128 104.000754,128 L23.9992458,128 C19.5813843,128 16,124.417687 16,119.999079 L16,8.00092105 C16,3.58213437 19.5808867,0 23.9992458,0 L81,0 L81,0.0201838424 C83.1589869,-0.071534047 85.3482153,0.707077645 86.9982489,2.35711116 L109.625176,24.9840387 C111.151676,26.510538 111.932942,28.4998414 111.96811,30.5 L111.96811,30.5 Z M81,8 L24,8 L24,120 L104,120 L104,30.5 L89.0003461,30.5 C84.5818769,30.5 81,26.9216269 81,22.4996539 L81,8 Z\"></path>\n        <rect x=\"32\" y=\"36\" width=\"64\" height=\"8\" rx=\"8\"></rect>\n        <rect x=\"32\" y=\"52\" width=\"64\" height=\"8\" rx=\"8\"></rect>\n        <rect x=\"32\" y=\"68\" width=\"64\" height=\"8\" rx=\"8\"></rect>\n        <rect x=\"32\" y=\"84\" width=\"64\" height=\"8\" rx=\"8\"></rect>\n        <rect x=\"32\" y=\"100\" width=\"64\" height=\"8\" rx=\"8\"></rect>\n        <rect x=\"32\" y=\"20\" width=\"40\" height=\"8\" rx=\"8\"></rect>\n    </g>\n</svg>"
        },
        "$:/core/images/fold-all-button": {
            "title": "$:/core/images/fold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-fold-all tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n        <rect x=\"0\" y=\"64\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n        <path d=\"M64.0292774,58.6235628 C61.9791013,58.6242848 59.9275217,57.8435723 58.3632024,56.279253 L35.7458219,33.6618725 C32.6211696,30.5372202 32.6166093,25.4673401 35.7408036,22.3431458 C38.8586409,19.2253085 43.9325646,19.2211982 47.0595304,22.348164 L64.0250749,39.3137085 L80.9906194,22.348164 C84.1152717,19.2235117 89.1851518,19.2189514 92.3093461,22.3431458 C95.4271834,25.460983 95.4312937,30.5349067 92.3043279,33.6618725 L69.6869474,56.279253 C68.1237851,57.8424153 66.0737951,58.6247195 64.0241231,58.6250809 Z\" transform=\"translate(64.024316, 39.313708) scale(1, -1) translate(-64.024316, -39.313708) \"></path>\n        <path d=\"M64.0292774,123.621227 C61.9791013,123.621949 59.9275217,122.841236 58.3632024,121.276917 L35.7458219,98.6595365 C32.6211696,95.5348842 32.6166093,90.4650041 35.7408036,87.3408098 C38.8586409,84.2229725 43.9325646,84.2188622 47.0595304,87.345828 L64.0250749,104.311373 L80.9906194,87.345828 C84.1152717,84.2211757 89.1851518,84.2166154 92.3093461,87.3408098 C95.4271834,90.458647 95.4312937,95.5325707 92.3043279,98.6595365 L69.6869474,121.276917 C68.1237851,122.840079 66.0737951,123.622383 64.0241231,123.622745 Z\" transform=\"translate(64.024316, 104.311372) scale(1, -1) translate(-64.024316, -104.311372) \"></path>\n    </g>\n</svg>"
        },
        "$:/core/images/fold-button": {
            "title": "$:/core/images/fold-button",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-fold tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n        <path d=\"M64.0292774,63.6235628 C61.9791013,63.6242848 59.9275217,62.8435723 58.3632024,61.279253 L35.7458219,38.6618725 C32.6211696,35.5372202 32.6166093,30.4673401 35.7408036,27.3431458 C38.8586409,24.2253085 43.9325646,24.2211982 47.0595304,27.348164 L64.0250749,44.3137085 L80.9906194,27.348164 C84.1152717,24.2235117 89.1851518,24.2189514 92.3093461,27.3431458 C95.4271834,30.460983 95.4312937,35.5349067 92.3043279,38.6618725 L69.6869474,61.279253 C68.1237851,62.8424153 66.0737951,63.6247195 64.0241231,63.6250809 Z\" transform=\"translate(64.024316, 44.313708) scale(1, -1) translate(-64.024316, -44.313708) \"></path>\n        <path d=\"M64.0049614,105.998482 C61.9547853,105.999204 59.9032057,105.218491 58.3388864,103.654172 L35.7215059,81.0367916 C32.5968535,77.9121393 32.5922933,72.8422592 35.7164876,69.7180649 C38.8343248,66.6002276 43.9082485,66.5961173 47.0352144,69.7230831 L64.0007589,86.6886276 L80.9663034,69.7230831 C84.0909557,66.5984308 89.1608358,66.5938705 92.2850301,69.7180649 C95.4028673,72.8359021 95.4069777,77.9098258 92.2800119,81.0367916 L69.6626314,103.654172 C68.099469,105.217334 66.0494791,105.999639 63.999807,106 Z\" transform=\"translate(64.000000, 86.688628) scale(1, -1) translate(-64.000000, -86.688628) \"></path>\n    </g>\n</svg>"
        },
        "$:/core/images/fold-others-button": {
            "title": "$:/core/images/fold-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-fold-others tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <rect x=\"0\" y=\"56.0314331\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n        <path d=\"M101.657101,104.948818 C100.207918,103.498614 98.2051847,102.599976 95.9929031,102.599976 L72,102.599976 L72,78.6070725 C72,76.3964271 71.1036108,74.3936927 69.6545293,72.9441002 L69.6571005,72.9488183 C68.2079177,71.4986143 66.2051847,70.5999756 63.9929031,70.5999756 L32.0070969,70.5999756 C27.5881712,70.5999756 24,74.1816976 24,78.5999756 C24,83.0092633 27.5848994,86.5999756 32.0070969,86.5999756 L56,86.5999756 L56,110.592879 C56,112.803524 56.8963895,114.806259 58.3454713,116.255852 L58.3429,116.251133 C59.7920828,117.701337 61.7948156,118.599976 64.0070969,118.599976 L88,118.599976 L88,142.592879 C88,147.011804 91.581722,150.599976 96,150.599976 C100.409288,150.599976 104,147.015076 104,142.592879 L104,110.607072 C104,108.396427 103.103611,106.393693 101.654529,104.9441 Z\" transform=\"translate(64.000000, 110.599976) rotate(-45.000000) translate(-64.000000, -110.599976) \"></path>\n        <path d=\"M101.725643,11.7488671 C100.27646,10.2986632 98.2737272,9.40002441 96.0614456,9.40002441 L72.0685425,9.40002441 L72.0685425,-14.5928787 C72.0685425,-16.8035241 71.1721533,-18.8062584 69.7230718,-20.255851 L69.725643,-20.2511329 C68.2764602,-21.7013368 66.2737272,-22.5999756 64.0614456,-22.5999756 L32.0756394,-22.5999756 C27.6567137,-22.5999756 24.0685425,-19.0182536 24.0685425,-14.5999756 C24.0685425,-10.1906879 27.6534419,-6.59997559 32.0756394,-6.59997559 L56.0685425,-6.59997559 L56.0685425,17.3929275 C56.0685425,19.6035732 56.964932,21.6063078 58.4140138,23.0559004 L58.4114425,23.0511823 C59.8606253,24.5013859 61.8633581,25.4000244 64.0756394,25.4000244 L88.0685425,25.4000244 L88.0685425,49.3929275 C88.0685425,53.8118532 91.6502645,57.4000244 96.0685425,57.4000244 C100.47783,57.4000244 104.068542,53.815125 104.068542,49.3929275 L104.068542,17.4071213 C104.068542,15.1964759 103.172153,13.1937416 101.723072,11.744149 Z\" transform=\"translate(64.068542, 17.400024) scale(1, -1) rotate(-45.000000) translate(-64.068542, -17.400024) \"></path>\n    </g>\n</svg>"
        },
        "$:/core/images/folder": {
            "title": "$:/core/images/folder",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-folder tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <path d=\"M55.6943257,128.000004 L7.99859666,128.000004 C3.5810937,128.000004 0,124.413822 0,119.996384 L0,48.0036243 C0,43.5833471 3.58387508,40.0000044 7.99859666,40.0000044 L16,40.0000044 L16,31.9999914 C16,27.5817181 19.5783731,24 24.0003461,24 L55.9996539,24 C60.4181231,24 64,27.5800761 64,31.9999914 L64,40.0000044 L104.001403,40.0000044 C108.418906,40.0000044 112,43.5861868 112,48.0036243 L112,59.8298353 L104,59.7475921 L104,51.9994189 C104,49.7887607 102.207895,48.0000044 99.9972215,48.0000044 L56,48.0000044 L56,36.0000255 C56,33.7898932 54.2072328,32 51.9957423,32 L28.0042577,32 C25.7890275,32 24,33.7908724 24,36.0000255 L24,48.0000044 L12.0027785,48.0000044 C9.78987688,48.0000044 8,49.7906032 8,51.9994189 L8,116.00059 C8,118.211248 9.79210499,120.000004 12.0027785,120.000004 L58.7630167,120.000004 L55.6943257,128.000004 L55.6943257,128.000004 Z\"></path>\n        <path d=\"M23.8728955,55.5 L119.875702,55.5 C124.293205,55.5 126.87957,59.5532655 125.650111,64.5630007 L112.305967,118.936999 C111.077582,123.942356 106.497904,128 102.083183,128 L6.08037597,128 C1.66287302,128 -0.923492342,123.946735 0.305967145,118.936999 L13.650111,64.5630007 C14.878496,59.5576436 19.4581739,55.5 23.8728955,55.5 L23.8728955,55.5 L23.8728955,55.5 Z M25.6530124,64 L113.647455,64 C115.858129,64 117.151473,66.0930612 116.538306,68.6662267 L105.417772,115.333773 C104.803671,117.910859 102.515967,120 100.303066,120 L12.3086228,120 C10.0979492,120 8.8046054,117.906939 9.41777189,115.333773 L20.5383062,68.6662267 C21.1524069,66.0891409 23.4401107,64 25.6530124,64 L25.6530124,64 L25.6530124,64 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 128 128\">\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/github": {
            "title": "$:/core/images/github",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-github tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n        <g fill-rule=\"evenodd\">\n            <path d=\"M63.9383506,1.60695328 C28.6017227,1.60695328 -0.055756057,30.2970814 -0.055756057,65.6906208 C-0.055756057,94.003092 18.2804728,118.019715 43.7123154,126.493393 C46.9143781,127.083482 48.0812647,125.104717 48.0812647,123.405261 C48.0812647,121.886765 48.02626,117.85449 47.9948287,112.508284 C30.1929317,116.379268 26.4368926,103.916587 26.4368926,103.916587 C23.5255693,96.5129372 19.3294921,94.5420399 19.3294921,94.5420399 C13.5186324,90.5687739 19.7695302,90.6474524 19.7695302,90.6474524 C26.1933001,91.099854 29.5721638,97.2525155 29.5721638,97.2525155 C35.2808718,107.044059 44.5531024,104.215566 48.1991321,102.575118 C48.7806109,98.4366275 50.4346826,95.612068 52.2616263,94.0109598 C38.0507543,92.3941159 23.1091047,86.8944862 23.1091047,62.3389152 C23.1091047,55.3443933 25.6039634,49.6205298 29.6978889,45.1437211 C29.0378318,43.5229433 26.8415704,37.0044266 30.3265147,28.1845627 C30.3265147,28.1845627 35.6973364,26.4615028 47.9241083,34.7542205 C53.027764,33.330139 58.5046663,32.6220321 63.9462084,32.5944947 C69.3838216,32.6220321 74.856795,33.330139 79.9683085,34.7542205 C92.1872225,26.4615028 97.5501864,28.1845627 97.5501864,28.1845627 C101.042989,37.0044266 98.8467271,43.5229433 98.190599,45.1437211 C102.292382,49.6205298 104.767596,55.3443933 104.767596,62.3389152 C104.767596,86.9574291 89.8023734,92.3744463 75.5482834,93.9598188 C77.8427675,95.9385839 79.8897303,99.8489072 79.8897303,105.828476 C79.8897303,114.392635 79.8111521,121.304544 79.8111521,123.405261 C79.8111521,125.120453 80.966252,127.114954 84.2115327,126.489459 C109.623731,117.996111 127.944244,93.9952241 127.944244,65.6906208 C127.944244,30.2970814 99.2867652,1.60695328 63.9383506,1.60695328\"></path>\n        </g>\n    </svg>\n"
        },
        "$:/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 128 128\">\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 128 128\">\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 128 128\" 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 128 128\">\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 128 128\" 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/left-arrow": {
            "created": "20150315234410875",
            "modified": "20150315235324760",
            "tags": "$:/tags/Image",
            "title": "$:/core/images/left-arrow",
            "text": "<svg class=\"tc-image-left-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <path transform=\"rotate(135, 63.8945, 64.1752)\" d=\"m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25075c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056z\"/>\n</svg>\n"
        },
        "$:/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 128 128\">\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/mail": {
            "title": "$:/core/images/mail",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-mail tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <path d=\"M122.826782,104.894066 C121.945525,105.22777 120.990324,105.41043 119.993027,105.41043 L8.00697327,105.41043 C7.19458381,105.41043 6.41045219,105.289614 5.67161357,105.064967 L5.67161357,105.064967 L39.8346483,70.9019325 L60.6765759,91.7438601 C61.6118278,92.679112 62.8865166,93.0560851 64.0946097,92.8783815 C65.2975108,93.0473238 66.5641085,92.6696979 67.4899463,91.7438601 L88.5941459,70.6396605 C88.6693095,70.7292352 88.7490098,70.8162939 88.8332479,70.9005321 L122.826782,104.894066 Z M127.903244,98.6568194 C127.966933,98.2506602 128,97.8343714 128,97.4103789 L128,33.410481 C128,32.7414504 127.917877,32.0916738 127.763157,31.4706493 L94.2292399,65.0045665 C94.3188145,65.0797417 94.4058701,65.1594458 94.4901021,65.2436778 L127.903244,98.6568194 Z M0.205060636,99.2178117 C0.0709009529,98.6370366 0,98.0320192 0,97.4103789 L0,33.410481 C0,32.694007 0.0944223363,31.9995312 0.27147538,31.3387595 L0.27147538,31.3387595 L34.1777941,65.2450783 L0.205060636,99.2178117 L0.205060636,99.2178117 Z M5.92934613,25.6829218 C6.59211333,25.5051988 7.28862283,25.4104299 8.00697327,25.4104299 L119.993027,25.4104299 C120.759109,25.4104299 121.500064,25.5178649 122.201605,25.7184927 L122.201605,25.7184927 L64.0832611,83.8368368 L5.92934613,25.6829218 L5.92934613,25.6829218 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 128 128\" 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 128 128\" 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 128 128\">\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 128 128\">\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/open-window": {
            "title": "$:/core/images/open-window",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-open-window tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <path d=\"M16,112 L104.993898,112 C108.863261,112 112,115.590712 112,120 C112,124.418278 108.858091,128 104.993898,128 L7.00610161,128 C3.13673853,128 0,124.409288 0,120 C0,119.998364 4.30952878e-07,119.996727 1.29273572e-06,119.995091 C4.89579306e-07,119.993456 0,119.99182 0,119.990183 L0,24.0098166 C0,19.586117 3.59071231,16 8,16 C12.418278,16 16,19.5838751 16,24.0098166 L16,112 Z\"></path>\n        <path d=\"M96,43.1959595 L96,56 C96,60.418278 99.581722,64 104,64 C108.418278,64 112,60.418278 112,56 L112,24 C112,19.5907123 108.415101,16 103.992903,16 L72.0070969,16 C67.5881712,16 64,19.581722 64,24 C64,28.4092877 67.5848994,32 72.0070969,32 L84.5685425,32 L48.2698369,68.2987056 C45.1421332,71.4264093 45.1434327,76.4904296 48.267627,79.614624 C51.3854642,82.7324612 56.4581306,82.7378289 59.5835454,79.6124141 L96,43.1959595 Z M32,7.9992458 C32,3.58138434 35.5881049,0 39.9992458,0 L120.000754,0 C124.418616,0 128,3.5881049 128,7.9992458 L128,88.0007542 C128,92.4186157 124.411895,96 120.000754,96 L39.9992458,96 C35.5813843,96 32,92.4118951 32,88.0007542 L32,7.9992458 Z\"></path>\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 128 128\">\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/palette": {
            "title": "$:/core/images/palette",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-palette tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <path d=\"M80.2470434,39.1821571 C75.0645698,38.2680897 69.6261555,37.7814854 64.0193999,37.7814854 C28.6624616,37.7814854 0,57.1324214 0,81.0030106 C0,90.644534 4.67604329,99.5487133 12.5805659,106.738252 C23.5031767,91.1899067 26.3405471,72.3946229 36.8885698,63.5622337 C52.0716764,50.8486559 63.4268694,55.7343343 63.4268694,55.7343343 L80.2470434,39.1821571 Z M106.781666,48.8370714 C119.830962,56.749628 128.0388,68.229191 128.0388,81.0030106 C128.0388,90.3534932 128.557501,98.4142085 116.165191,106.082518 C105.367708,112.763955 112.341384,99.546808 104.321443,95.1851533 C96.3015017,90.8234987 84.3749007,96.492742 86.1084305,103.091059 C89.3087234,115.272303 105.529892,114.54645 92.4224435,119.748569 C79.3149955,124.950687 74.2201582,124.224536 64.0193999,124.224536 C56.1979176,124.224536 48.7040365,123.277578 41.7755684,121.544216 C51.620343,117.347916 69.6563669,109.006202 75.129737,102.088562 C82.7876655,92.4099199 87.3713218,80.0000002 83.3235694,72.4837191 C83.1303943,72.1250117 94.5392656,60.81569 106.781666,48.8370714 Z M1.13430476,123.866563 C0.914084026,123.867944 0.693884185,123.868637 0.473712455,123.868637 C33.9526848,108.928928 22.6351223,59.642592 59.2924543,59.6425917 C59.6085574,61.0606542 59.9358353,62.5865065 60.3541977,64.1372318 C34.4465025,59.9707319 36.7873124,112.168427 1.13429588,123.866563 L1.13430476,123.866563 Z M1.84669213,123.859694 C40.7185279,123.354338 79.9985412,101.513051 79.9985401,79.0466836 C70.7284906,79.0466835 65.9257264,75.5670082 63.1833375,71.1051511 C46.585768,64.1019718 32.81846,116.819636 1.84665952,123.859695 L1.84669213,123.859694 Z M67.1980193,59.8524981 C62.748213,63.9666823 72.0838429,76.2846822 78.5155805,71.1700593 C89.8331416,59.8524993 112.468264,37.2173758 123.785825,25.8998146 C135.103386,14.5822535 123.785825,3.26469247 112.468264,14.5822535 C101.150703,25.8998144 78.9500931,48.9868127 67.1980193,59.8524981 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 128 128\">\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 128 128\">\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 128 128\">\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 128 128\">\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 128 128\">\n    <g fill-rule=\"evenodd\">\n        <path d=\"M29.4078519,91.4716406 L51.4693474,69.4101451 L51.4646675,69.4054652 C50.5969502,68.5377479 50.5929779,67.1348725 51.4693474,66.2585029 C52.3396494,65.3882009 53.7499654,65.3874786 54.6163097,66.2538229 L64.0805963,75.7181095 C64.9483136,76.5858268 64.9522859,77.9887022 64.0759163,78.8650718 C63.2056143,79.7353737 61.7952984,79.736096 60.9289541,78.8697517 L60.9242741,78.8650718 L60.9242741,78.8650718 L38.8627786,100.926567 C36.2518727,103.537473 32.0187578,103.537473 29.4078519,100.926567 C26.796946,98.3156614 26.796946,94.0825465 29.4078519,91.4716406 Z M60.8017407,66.3810363 C58.3659178,63.6765806 56.3370667,61.2899536 54.9851735,59.5123615 C48.1295381,50.4979488 44.671561,55.2444054 40.7586738,59.5123614 C36.8457866,63.7803174 41.789473,67.2384487 38.0759896,70.2532832 C34.3625062,73.2681177 34.5917646,74.3131575 28.3243876,68.7977024 C22.0570105,63.2822473 21.6235306,61.7636888 24.5005999,58.6166112 C27.3776691,55.4695337 29.7823103,60.4247912 35.6595047,54.8320442 C41.5366991,49.2392972 36.5996215,44.2825646 36.5996215,44.2825646 C36.5996215,44.2825646 48.8365511,19.267683 65.1880231,21.1152173 C81.5394952,22.9627517 59.0022276,18.7228947 53.3962199,38.3410355 C50.9960082,46.7405407 53.8429162,44.7613399 58.3941742,48.3090467 C59.7875202,49.3951602 64.4244828,52.7100463 70.1884353,56.9943417 L90.8648751,36.3179019 L92.4795866,31.5515482 L100.319802,26.8629752 L103.471444,30.0146174 L98.782871,37.8548326 L94.0165173,39.4695441 L73.7934912,59.6925702 C86.4558549,69.2403631 102.104532,81.8392557 102.104532,86.4016913 C102.104533,93.6189834 99.0337832,97.9277545 92.5695848,95.5655717 C87.8765989,93.8506351 73.8015497,80.3744087 63.8173444,69.668717 L60.9242741,72.5617873 L57.7726319,69.4101451 L60.8017407,66.3810363 L60.8017407,66.3810363 Z M63.9533761,1.42108547e-13 L118.512977,32 L118.512977,96 L63.9533761,128 L9.39377563,96 L9.39377563,32 L63.9533761,1.42108547e-13 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 128 128\">\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 128 128\">\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 128 128\" 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/spiral": {
            "title": "$:/core/images/spiral",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-spiral tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"nonzero\">\n        <path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074.14-2.64-1.89-4.89-4.52-5.03-2.64-.14-4.89 1.88-5.03 4.52-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01-.02-.015-.054-.045-.094-.088-.06-.064-.12-.145-.17-.244-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"></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 128 128\">\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 128 128\">\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 128 128\">\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 128 128\">\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 128 128\">\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 128 128\">\n    <g fill-rule=\"evenodd\">\n        <path d=\"M55.854113,66.9453198 C54.3299482,65.1432292 53.0133883,63.518995 51.9542746,62.1263761 C40.8899947,47.578055 35.3091807,55.2383404 28.9941893,62.1263758 C22.6791979,69.0144112 30.6577916,74.5954741 24.6646171,79.4611023 C18.6714426,84.3267304 19.0414417,86.0133155 8.92654943,77.1119468 C-1.18834284,68.2105781 -1.88793412,65.7597832 2.7553553,60.6807286 C7.39864472,55.601674 11.2794845,63.5989423 20.7646627,54.5728325 C30.2498409,45.5467226 22.2819131,37.5470737 22.2819131,37.5470737 C22.2819131,37.5470737 42.0310399,-2.82433362 68.4206088,0.157393922 C94.8101776,3.13912147 58.4373806,-3.70356506 49.3898693,27.958066 C45.5161782,41.5139906 50.1107906,38.3197672 57.4560458,44.0453955 C59.1625767,45.3756367 63.8839488,48.777453 70.127165,53.3625321 C63.9980513,59.2416709 58.9704753,64.0315459 55.854113,66.9453198 Z M67.4952439,79.8919946 C83.5082212,96.9282402 105.237121,117.617674 112.611591,120.312493 C123.044132,124.12481 128.000001,117.170903 128,105.522947 C127.999999,98.3705516 104.170675,78.980486 84.0760493,63.7529565 C76.6683337,70.9090328 70.7000957,76.7055226 67.4952439,79.8919946 Z\"></path>\n        <path d=\"M58.2852966,138.232794 L58.2852966,88.3943645 C56.318874,88.3923153 54.7254089,86.7952906 54.7254089,84.8344788 C54.7254089,82.8684071 56.3175932,81.2745911 58.2890859,81.2745911 L79.6408336,81.2745911 C81.608998,81.2745911 83.2045105,82.8724076 83.2045105,84.8344788 C83.2045105,86.7992907 81.614366,88.3923238 79.6446228,88.3943645 L79.6446228,88.3943646 L79.6446228,138.232794 C79.6446228,144.131009 74.8631748,148.912457 68.9649597,148.912457 C63.0667446,148.912457 58.2852966,144.131009 58.2852966,138.232794 Z M65.405072,-14.8423767 L72.5248474,-14.8423767 L76.0847351,-0.690681892 L72.5248474,6.51694947 L72.5248474,81.2745911 L65.405072,81.2745911 L65.405072,6.51694947 L61.8451843,-0.690681892 L65.405072,-14.8423767 Z\" transform=\"translate(68.964960, 67.035040) rotate(45.000000) translate(-68.964960, -67.035040) \"></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 128 128\">\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/twitter": {
            "title": "$:/core/images/twitter",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-twitter tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <path d=\"M41.6263422,115.803477 C27.0279663,115.803477 13.4398394,111.540813 1.99987456,104.234833 C4.02221627,104.472643 6.08004574,104.594302 8.16644978,104.594302 C20.277456,104.594302 31.4238403,100.47763 40.270894,93.5715185 C28.9590538,93.3635501 19.4123842,85.9189246 16.1230832,75.6885328 C17.7011365,75.9892376 19.320669,76.1503787 20.9862896,76.1503787 C23.344152,76.1503787 25.6278127,75.8359011 27.7971751,75.247346 C15.9709927,72.8821073 7.06079851,62.4745062 7.06079851,49.9982394 C7.06079851,49.8898938 7.06079851,49.7820074 7.06264203,49.67458 C10.5482779,51.6032228 14.5339687,52.7615103 18.7717609,52.8951059 C11.8355159,48.277565 7.2714207,40.3958845 7.2714207,31.4624258 C7.2714207,26.7434257 8.54621495,22.3200804 10.7713439,18.5169676 C23.5211299,34.0957738 42.568842,44.3472839 64.0532269,45.4210985 C63.6126256,43.5365285 63.3835682,41.5711584 63.3835682,39.5529928 C63.3835682,25.3326379 74.95811,13.8034766 89.2347917,13.8034766 C96.6697089,13.8034766 103.387958,16.930807 108.103682,21.9353619 C113.991886,20.780288 119.52429,18.6372496 124.518847,15.6866694 C122.588682,21.6993889 118.490075,26.7457211 113.152623,29.9327334 C118.381769,29.3102055 123.363882,27.926045 127.999875,25.8780385 C124.534056,31.0418981 120.151087,35.5772616 115.100763,39.2077561 C115.150538,40.3118708 115.175426,41.4224128 115.175426,42.538923 C115.175426,76.5663154 89.1744164,115.803477 41.6263422,115.803477\"></path>\n    </g>\n</svg>\n"
        },
        "$:/core/images/unfold-all-button": {
            "title": "$:/core/images/unfold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-unfold-all tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n        <rect x=\"0\" y=\"64\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n        <path d=\"M85.598226,8.34884273 C84.1490432,6.89863875 82.1463102,6 79.9340286,6 L47.9482224,6 C43.5292967,6 39.9411255,9.581722 39.9411255,14 C39.9411255,18.4092877 43.5260249,22 47.9482224,22 L71.9411255,22 L71.9411255,45.9929031 C71.9411255,50.4118288 75.5228475,54 79.9411255,54 C84.3504132,54 87.9411255,50.4151006 87.9411255,45.9929031 L87.9411255,14.0070969 C87.9411255,11.7964515 87.0447363,9.79371715 85.5956548,8.34412458 Z\" transform=\"translate(63.941125, 30.000000) scale(1, -1) rotate(-45.000000) translate(-63.941125, -30.000000) \"></path>\n        <path d=\"M85.6571005,72.2899682 C84.2079177,70.8397642 82.2051847,69.9411255 79.9929031,69.9411255 L48.0070969,69.9411255 C43.5881712,69.9411255 40,73.5228475 40,77.9411255 C40,82.3504132 43.5848994,85.9411255 48.0070969,85.9411255 L72,85.9411255 L72,109.934029 C72,114.352954 75.581722,117.941125 80,117.941125 C84.4092877,117.941125 88,114.356226 88,109.934029 L88,77.9482224 C88,75.737577 87.1036108,73.7348426 85.6545293,72.2852501 Z\" transform=\"translate(64.000000, 93.941125) scale(1, -1) rotate(-45.000000) translate(-64.000000, -93.941125) \"></path>\n    </g>\n</svg>"
        },
        "$:/core/images/unfold-button": {
            "title": "$:/core/images/unfold-button",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-unfold tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n    <g fill-rule=\"evenodd\">\n        <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n        <path d=\"M85.598226,11.3488427 C84.1490432,9.89863875 82.1463102,9 79.9340286,9 L47.9482224,9 C43.5292967,9 39.9411255,12.581722 39.9411255,17 C39.9411255,21.4092877 43.5260249,25 47.9482224,25 L71.9411255,25 L71.9411255,48.9929031 C71.9411255,53.4118288 75.5228475,57 79.9411255,57 C84.3504132,57 87.9411255,53.4151006 87.9411255,48.9929031 L87.9411255,17.0070969 C87.9411255,14.7964515 87.0447363,12.7937171 85.5956548,11.3441246 Z\" transform=\"translate(63.941125, 33.000000) scale(1, -1) rotate(-45.000000) translate(-63.941125, -33.000000) \"></path>\n        <path d=\"M85.6571005,53.4077172 C84.2079177,51.9575133 82.2051847,51.0588745 79.9929031,51.0588745 L48.0070969,51.0588745 C43.5881712,51.0588745 40,54.6405965 40,59.0588745 C40,63.4681622 43.5848994,67.0588745 48.0070969,67.0588745 L72,67.0588745 L72,91.0517776 C72,95.4707033 75.581722,99.0588745 80,99.0588745 C84.4092877,99.0588745 88,95.4739751 88,91.0517776 L88,59.0659714 C88,56.855326 87.1036108,54.8525917 85.6545293,53.4029991 Z\" transform=\"translate(64.000000, 75.058875) scale(1, -1) rotate(-45.000000) translate(-64.000000, -75.058875) \"></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 128 128\">\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/up-arrow": {
            "created": "20150316000544368",
            "modified": "20150316000831867",
            "tags": "$:/tags/Image",
            "title": "$:/core/images/up-arrow",
            "text": "<svg class=\"tc-image-up-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n<path transform=\"rotate(-135, 63.8945, 64.1752)\" d=\"m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25074c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056l0.00001,-0.00001z\" />\n</svg>\n \n"
        },
        "$:/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 128 128\">\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 128 128\">\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/Fold/Caption": {
            "title": "$:/language/Buttons/Fold/Caption",
            "text": "fold tiddler"
        },
        "$:/language/Buttons/Fold/Hint": {
            "title": "$:/language/Buttons/Fold/Hint",
            "text": "Fold the body of this tiddler"
        },
        "$:/language/Buttons/Fold/FoldBar/Caption": {
            "title": "$:/language/Buttons/Fold/FoldBar/Caption",
            "text": "fold-bar"
        },
        "$:/language/Buttons/Fold/FoldBar/Hint": {
            "title": "$:/language/Buttons/Fold/FoldBar/Hint",
            "text": "Optional bars to fold and unfold tiddlers"
        },
        "$:/language/Buttons/Unfold/Caption": {
            "title": "$:/language/Buttons/Unfold/Caption",
            "text": "unfold tiddler"
        },
        "$:/language/Buttons/Unfold/Hint": {
            "title": "$:/language/Buttons/Unfold/Hint",
            "text": "Unfold the body of this tiddler"
        },
        "$:/language/Buttons/FoldOthers/Caption": {
            "title": "$:/language/Buttons/FoldOthers/Caption",
            "text": "fold other tiddlers"
        },
        "$:/language/Buttons/FoldOthers/Hint": {
            "title": "$:/language/Buttons/FoldOthers/Hint",
            "text": "Fold the bodies of other opened tiddlers"
        },
        "$:/language/Buttons/FoldAll/Caption": {
            "title": "$:/language/Buttons/FoldAll/Caption",
            "text": "fold all tiddlers"
        },
        "$:/language/Buttons/FoldAll/Hint": {
            "title": "$:/language/Buttons/FoldAll/Hint",
            "text": "Fold the bodies of all opened tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Caption": {
            "title": "$:/language/Buttons/UnfoldAll/Caption",
            "text": "unfold all tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Hint": {
            "title": "$:/language/Buttons/UnfoldAll/Hint",
            "text": "Unfold the bodies of all opened 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 many types of file including text, image, TiddlyWiki or JSON"
        },
        "$:/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/OpenWindow/Caption": {
            "title": "$:/language/Buttons/OpenWindow/Caption",
            "text": "open in new window"
        },
        "$:/language/Buttons/OpenWindow/Hint": {
            "title": "$:/language/Buttons/OpenWindow/Hint",
            "text": "Open tiddler in new window"
        },
        "$:/language/Buttons/Palette/Caption": {
            "title": "$:/language/Buttons/Palette/Caption",
            "text": "palette"
        },
        "$:/language/Buttons/Palette/Hint": {
            "title": "$:/language/Buttons/Palette/Hint",
            "text": "Choose the colour palette"
        },
        "$:/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": "Confirm 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 &#91;&#91;double square brackets&#93;&#93; 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/Parsing/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Caption",
            "text": "Parsing"
        },
        "$:/language/ControlPanel/Parsing/Hint": {
            "title": "$:/language/ControlPanel/Parsing/Hint",
            "text": "Here you can globally disable individual wiki parser rules. Take care as disabling some parser rules can prevent ~TiddlyWiki functioning correctly (you can restore normal operation with [[safe mode|http://tiddlywiki.com/#SafeMode]] )"
        },
        "$:/language/ControlPanel/Parsing/Block/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Block/Caption",
            "text": "Block Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Inline/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Inline/Caption",
            "text": "Inline Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Pragma/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
            "text": "Pragma Parse Rules"
        },
        "$:/language/ControlPanel/Plugins/Add/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Add/Hint",
            "text": "Install plugins from the official library"
        },
        "$:/language/ControlPanel/Plugins/Add/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Add/Caption",
            "text": "Get more plugins"
        },
        "$:/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/Install": {
            "title": "$:/language/ControlPanel/Plugins/Install",
            "text": "install"
        },
        "$:/language/ControlPanel/Plugins/Installed/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Installed/Hint",
            "text": "Currently installed plugins:"
        },
        "$:/language/ControlPanel/Plugins/Languages/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Caption",
            "text": "Languages"
        },
        "$:/language/ControlPanel/Plugins/Languages/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Hint",
            "text": "Language pack plugins"
        },
        "$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
            "text": "open plugin library"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Reinstall": {
            "title": "$:/language/ControlPanel/Plugins/Reinstall",
            "text": "reinstall"
        },
        "$:/language/ControlPanel/Plugins/Themes/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Caption",
            "text": "Themes"
        },
        "$:/language/ControlPanel/Plugins/Themes/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Hint",
            "text": "Theme plugins"
        },
        "$:/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/CamelCase/Caption": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
            "text": "Camel Case Wiki Links"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Hint": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
            "text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Description": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Description",
            "text": "Enable automatic ~CamelCase linking"
        },
        "$:/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/PerformanceInstrumentation/Caption": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
            "text": "Performance Instrumentation"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
            "text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
            "text": "Enable performance instrumentation"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
            "text": "Toolbar Button Style"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
            "text": "Choose the style for toolbar buttons:"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
            "text": "Borderless"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
            "text": "Boxed"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
            "text": "Rounded"
        },
        "$:/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/Settings/LinkToBehaviour/Caption": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
            "text": "Tiddler Opening Behaviour"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
            "text": "Navigation from //within// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
            "text": "Navigation from //outside// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
            "text": "Open above the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
            "text": "Open below the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
            "text": "Open at the top of the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
            "text": "Open at the bottom of the story river"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
            "text": "Tiddler Titles"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
            "text": "Optionally display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
            "text": "Do not display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
            "text": "Display tiddler titles as links"
        },
        "$:/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/button-background": {
            "title": "$:/language/Docs/PaletteColours/button-background",
            "text": "Default button background"
        },
        "$:/language/Docs/PaletteColours/button-border": {
            "title": "$:/language/Docs/PaletteColours/button-border",
            "text": "Default button border"
        },
        "$:/language/Docs/PaletteColours/button-foreground": {
            "title": "$:/language/Docs/PaletteColours/button-foreground",
            "text": "Default button foreground"
        },
        "$:/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/site-title-foreground": {
            "title": "$:/language/Docs/PaletteColours/site-title-foreground",
            "text": "Site title 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/Fields/Add/Dropdown/System": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
            "text": "System fields"
        },
        "$:/language/EditTemplate/Fields/Add/Dropdown/User": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
            "text": "User fields"
        },
        "$:/language/EditTemplate/Shadow/Warning": {
            "title": "$:/language/EditTemplate/Shadow/Warning",
            "text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
        },
        "$:/language/EditTemplate/Shadow/OverriddenWarning": {
            "title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
            "text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> 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": "Static HTML"
        },
        "$:/language/Exporters/JsonFile": {
            "title": "$:/language/Exporters/JsonFile",
            "text": "JSON file"
        },
        "$:/language/Exporters/CsvFile": {
            "title": "$:/language/Exporters/CsvFile",
            "text": "CSV file"
        },
        "$:/language/Exporters/TidFile": {
            "title": "$:/language/Exporters/TidFile",
            "text": "\".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''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\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, defaulting to `text/html` and save it to the specified filename. Optionally a template can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>]\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'' flag 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> [\"noclean\"]\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\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\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* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\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/Imported": {
            "title": "$:/language/Import/Imported",
            "text": "The following tiddlers were imported:"
        },
        "$:/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/AboveStory/ClassicPlugin/Warning": {
            "title": "$:/language/AboveStory/ClassicPlugin/Warning",
            "text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|http://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
        },
        "$:/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/Cancel": {
            "title": "$:/language/Encryption/Cancel",
            "text": "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/Encryption/Username": {
            "title": "$:/language/Encryption/Username",
            "text": "Username"
        },
        "$:/language/Encryption/Password": {
            "title": "$:/language/Encryption/Password",
            "text": "Password"
        },
        "$:/language/Encryption/RepeatPassword": {
            "title": "$:/language/Encryption/RepeatPassword",
            "text": "Repeat password"
        },
        "$:/language/Encryption/PasswordNoMatch": {
            "title": "$:/language/Encryption/PasswordNoMatch",
            "text": "Passwords do not match"
        },
        "$:/language/Encryption/SetPassword": {
            "title": "$:/language/Encryption/SetPassword",
            "text": "Set password"
        },
        "$:/language/InternalJavaScriptError/Title": {
            "title": "$:/language/InternalJavaScriptError/Title",
            "text": "Internal JavaScript Error"
        },
        "$:/language/InternalJavaScriptError/Hint": {
            "title": "$:/language/InternalJavaScriptError/Hint",
            "text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
        },
        "$:/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/LazyLoadingWarning": {
            "title": "$:/language/LazyLoadingWarning",
            "text": "<p>Loading external text from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear you may be using a browser that doesn't support external text in this configuration. See http://tiddlywiki.com/#ExternalText</p>"
        },
        "$:/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/OfficialPluginLibrary/Hint": {
            "title": "$:/language/OfficialPluginLibrary/Hint",
            "text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
        },
        "$:/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/Count/Heading": {
            "title": "$:/language/TagManager/Count/Heading",
            "text": "Count"
        },
        "$:/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/Tiddler/DateFormat": {
            "title": "$:/language/Tiddler/DateFormat",
            "text": "DDth MMM YYYY at hh12:0mmam"
        },
        "$:/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/Matches/All": {
            "title": "$:/language/Search/Matches/All",
            "text": "All matches:"
        },
        "$:/language/Search/Matches/Title": {
            "title": "$:/language/Search/Matches/Title",
            "text": "Title matches:"
        },
        "$:/language/Search/Search": {
            "title": "$:/language/Search/Search",
            "text": "Search"
        },
        "$:/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\ttemplate = this.params[3],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"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] || \"\").toLowerCase() !== \"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\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\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\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{text: undefined, readme: readmeContent, icon: iconContent}));\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\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\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.node) {\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},state.wiki.getModificationFields()));\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\t// Warn if required plugins are missing\n\tif(!$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\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.getTiddlerDataCached(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/days.js": {
            "text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\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.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\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\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\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/days.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.\nWith suffix \"list\", selects all tiddlers that are values in a specified list 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\tvalue,values = {},\n\t\tfield = operator.operand || \"title\";\n\tif(operator.suffix !== \"list-item\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvalue = (field === \"title\") ? title : tiddler.getFieldString(field);\n\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\tvalues[value] = true;\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\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\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\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($tw.utils.parseDate(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.getTiddlerDataCached(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.getTiddlerDataCached(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($tw.utils.parseDate(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 tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\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/wikiparserrules.js": {
            "text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules 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.wikiparserrules = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(exp.types[operator.operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "title": "$:/core/modules/filters/wikiparserrules.js",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/x-listops.js": {
            "text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n    /*jslint node: true, browser: true */\n    /*global $tw: false */\n    \"use strict\";\n\n    /*\n    Fetch titles from the current list\n    */\n    var prepare_results = function (source) {\n    var results = [];\n        source(function (tiddler, title) {\n            results.push(title);\n        });\n        return results;\n    };\n\n    /*\n    Moves a number of items from the tail of the current list before the item named in the operand\n    */\n    exports.putbefore = function (source, operator) {\n        var results = prepare_results(source),\n            index = results.indexOf(operator.operand),\n            count = parseInt(operator.suffix) || 1;\n        return (index === -1) ?\n            results.slice(0, -1) :\n            results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n    };\n\n    /*\n    Moves a number of items from the tail of the current list after the item named in the operand\n    */\n    exports.putafter = function (source, operator) {\n        var results = prepare_results(source),\n            index = results.indexOf(operator.operand),\n            count = parseInt(operator.suffix) || 1;\n        return (index === -1) ?\n            results.slice(0, -1) :\n            results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n    };\n\n    /*\n    Replaces the item named in the operand with a number of items from the tail of the current list\n    */\n    exports.replace = function (source, operator) {\n        var results = prepare_results(source),\n            index = results.indexOf(operator.operand),\n            count = parseInt(operator.suffix) || 1;\n        return (index === -1) ?\n            results.slice(0, -count) :\n            results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n    };\n\n    /*\n    Moves a number of items from the tail of the current list to the head of the list\n    */\n    exports.putfirst = function (source, operator) {\n        var results = prepare_results(source),\n            count = parseInt(operator.suffix) || 1;\n        return results.slice(-count).concat(results.slice(0, -count));\n    };\n\n    /*\n    Moves a number of items from the head of the current list to the tail of the list\n    */\n    exports.putlast = function (source, operator) {\n        var results = prepare_results(source),\n            count = parseInt(operator.suffix) || 1;\n        return results.slice(count).concat(results.slice(0, count));\n    };\n\n    /*\n    Moves the item named in the operand a number of places forward or backward in the list\n    */\n    exports.move = function (source, operator) {\n        var results = prepare_results(source),\n            index = results.indexOf(operator.operand),\n            count = parseInt(operator.suffix) || 1,\n            marker = results.splice(index, 1);\n        return results.slice(0, index + count).concat(marker).concat(results.slice(index + count));\n    };\n\n    /*\n    Returns the items from the current list that are after the item named in the operand\n    */\n    exports.allafter = function (source, operator) {\n        var results = prepare_results(source),\n            index = results.indexOf(operator.operand);\n        return (index === -1 || index > (results.length - 2)) ? [] :\n            (operator.suffix) ? results.slice(index) :\n            results.slice(index + 1);\n    };\n\n    /*\n    Returns the items from the current list that are before the item named in the operand\n    */\n    exports.allbefore = function (source, operator) {\n        var results = prepare_results(source),\n            index = results.indexOf(operator.operand);\n        return (index <= 0) ? [] :\n            (operator.suffix) ? results.slice(0, index + 1) :\n            results.slice(0, index);\n    };\n\n    /*\n    Appends the items listed in the operand array to the tail of the current list\n    */\n    exports.append = function (source, operator) {\n        var append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n            results = prepare_results(source),\n            count = parseInt(operator.suffix) || append.length;\n        return (append.length === 0) ? results :\n            (operator.prefix) ? results.concat(append.slice(-count)) :\n            results.concat(append.slice(0, count));\n    };\n\n    /*\n    Prepends the items listed in the operand array to the head of the current list\n    */\n    exports.prepend = function (source, operator) {\n        var prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n            results = prepare_results(source),\n            count = parseInt(operator.suffix) || prepend.length;\n        return (prepend.length === 0) ? results :\n            (operator.prefix) ? prepend.slice(-count).concat(results) :\n            prepend.slice(0, count).concat(results);\n    };\n\n    /*\n    Returns all items from the current list except the items listed in the operand array\n    */\n    exports.remove = function (source, operator) {\n        var array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n            results = prepare_results(source),\n            count = parseInt(operator.suffix) || array.length,\n            p,\n            len,\n            index;\n        len = array.length - 1;\n        for (p = 0; p < count; ++p) {\n            if (operator.prefix) {\n                index = results.indexOf(array[len - p]);\n            } else {\n                index = results.indexOf(array[p]);\n            }\n            if (index !== -1) {\n                results.splice(index, 1);\n            }\n        }\n        return results;\n    };\n\n    /*\n    Returns all items from the current list sorted in the order of the items in the operand array\n    */\n    exports.sortby = function (source, operator) {\n        var results = prepare_results(source);\n        if (!results || results.length < 2) {\n            return results;\n        }\n        var lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n        results.sort(function (a, b) {\n            return lookup.indexOf(a) - lookup.indexOf(b);\n        });\n        return results;\n    };\n\n    /*\n    Removes all duplicate items from the current list\n    */\n    exports.unique = function (source, operator) {\n        var results = prepare_results(source);\n        var set = results.reduce(function (a, b) {\n            if (a.indexOf(b) < 0) {\n                a.push(b);\n            }\n            return a;\n        }, []);\n        return set;\n    };\n})();\n",
            "title": "$:/core/modules/filters/x-listops.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 wikified 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\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\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\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = 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\treturn $tw.utils.makeDataUri(text,type);\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 p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\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/videoparser.js": {
            "text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video 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: \"video\",\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[\"video/mp4\"] = AudioParser;\n\n})();\n\n",
            "title": "$:/core/modules/parsers/videoparser.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 ? \"&ndash;\" : \"&mdash;\";\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: &copy;\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: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params\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 = /~?\\$:\\/[a-zA-Z0-9/.\\-_]+/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\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\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\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\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 = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\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 currentTreeBranch = this.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\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\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\t$tw.addUnloadTask(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/library/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/library/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: $tw.language.getString(\"Encryption/SetPassword\"),\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_TITLE = \"$:/config/Drafts/TypingTimeout\";\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\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = DRAFT_TIDDLER_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,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_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\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($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\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 want to 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/startup/windows.js": {
            "text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\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 = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\nvar windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\twindows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = title;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{document: $tw.fakeDocument, variables: variables}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each(windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
            "title": "$:/core/modules/startup/windows.js",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/story.js": {
            "text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
            "title": "$:/core/modules/story.js",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/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.getTiddlerDataCached(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// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\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})();\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\t$tw.addUnloadTask(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.getTiddlerDataCached(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($tw.browser && 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\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e);\n\t}\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\trefreshHandler,\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\tmode: \"inline\",\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\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\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\tmode: \"inline\",\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\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\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 self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\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// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{parentWidget: $tw.rootWidget, document: document, variables: variables});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\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// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\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 = this.findPopup(options.title);\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.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\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 if not already there\n\tif(this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode\n\t\t});\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 above/left of the current view, then scroll to it's top/left\n\t\t\tif(targetPos <= currentPos) {\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 big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\tnewPos = targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\tnewPos = currentPos;\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, \"nodeType\", {\n\tget: function() {\n\t\treturn 3;\n\t}\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\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\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, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\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, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\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// Create alert tiddlers in the browser\n\tif($tw.browser) {\n\t\t// Check if there is an existing alert with the same text and the same component\n\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\talertFields,\n\t\t\texistingCount,\n\t\t\tself = this;\n\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t}\n\t\t});\n\t\tif(alertFields) {\n\t\t\texistingCount = alertFields.count || 1;\n\t\t} else {\n\t\t\talertFields = {\n\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\ttext: text,\n\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\tcomponent: this.componentName\n\t\t\t};\n\t\t\texistingCount = 0;\n\t\t}\n\t\talertFields.modified = new Date();\n\t\tif(++existingCount > 1) {\n\t\t\talertFields.count = existingCount;\n\t\t} else {\n\t\t\talertFields.count = undefined;\n\t\t}\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t// Log the alert as well\n\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t} else {\n\t\t// Print an orange message to the console if not in the browser\n\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t}\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/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\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).toFixed(2) + \"ms\");\n\t\t\tfor(var m in self.measures) {\n\t\t\t\tself.logger.log(\"+\" + m + \": \" + self.measures[m].toFixed(2) + \"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\treturn Object.keys(object || {}).length;\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.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tObject.freeze(object);\n\tfor(key in object) {\n\t\tproperty = object[key];\n\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\tdeepFreeze(property);\n\t\t}\n\t}\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 \"&amp;\", < to \"&lt;\", > to \"&gt;\", \" to \"&quot;\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&amp;\").replace(/</mg,\"&lt;\").replace(/>/mg,\"&gt;\").replace(/\\\"/mg,\"&quot;\");\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/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = 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/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\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(this.wiki.getModificationFields(),tiddler,removeFields,this.wiki.getCreationFields()));\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-listops.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags;\n\t\tthis.wiki.setText(this.target, \"tags\", undefined, $tw.utils.stringifyList(\n\t\t\tthis.wiki.filterTiddlers(tagfilter, this)));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
            "title": "$:/core/modules/widgets/action-listops.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\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\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(Object.keys(changedAttributes).length) {\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// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\")\n\t});\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\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\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\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\")  || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\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,options);\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\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Nw.js supports \"webkitdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\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\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\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 tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\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(this,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\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n    return this.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === 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\tthis.buttonTag = this.getAttribute(\"tag\");\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\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\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\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag);\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\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(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && 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(this.wiki.getCreationFields(),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\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\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.invertTag || 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})();",
            "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(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\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\tif(this.editRows) {\n\t\tdomNode.setAttribute(\"rows\",this.editRows);\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();\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.editRows = this.getAttribute(\"rows\");\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 ||  changedAttributes.rows) {\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\t// Fix the height anyway in case there has been a reflow\n\tthis.fixHeight();\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/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nEditTextWidget.prototype.getScrollContainer = function(el) {\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn this.document.body;\n};\n\n/*\nFix the height of textareas to fit their content\n*/\nEditTextWidget.prototype.fixHeight = function() {\n\tvar domNode = 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\t// Get the scroll container and register the current scroll position\n\t\tvar container = this.getScrollContainer(domNode),\n\t\t\tscrollTop = container.scrollTop;\n                // Measure the specified minimum height\n\t\tdomNode.style.height = this.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// Set the container to the position we registered at the beginning\n\t\t\tcontainer.scrollTop = 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} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler({title: this.mangleTitle, tags: tag});\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.invokeActions(this,event);\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);\n\t}\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\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}\n\tevent.stopPropagation();\n\treturn false;\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.getTiddlerDataCached(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\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\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.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\t// Quit if we cannot get hold of the story list\n\tif(!storyList) {\n\t\treturn;\n\t}\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(title);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(fromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(this.getAttribute(\"openLinkFromInsideRiver\",\"below\")) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,title);\n\t// Save the story\n\tthis.saveStoryList(storyList);\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// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\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// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = 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\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\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\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\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(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\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.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/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: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\t$tw.wiki.renameTiddler(from,to);\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(this.wiki.getCreationFields(),{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\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\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.style = this.getAttribute(\"style\",\"\");\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\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\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\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tif(values.indexOf(select.children[i].value) != -1) {\n\t\t\t\tselect.children[i].selected = true;\n\t\t\t}\n\t\t}\n\t\t\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\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// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\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\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\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\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\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\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\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\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\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} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value;\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   (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\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/vars.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n  <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\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 VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.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*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
            "title": "$:/core/modules/widgets/vars.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 \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified();\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.getValueAsHtmlEncodedPlainWikified = function() {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"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\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\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\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\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 the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction && child.invokeAction(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
            "title": "$:/core/modules/widgets/widget.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/wiki-bulkops.js": {
            "text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nexports.renameTiddler = function(fromTitle,toTitle) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar tiddler = this.getTiddler(fromTitle);\n\t\tthis.addTiddler(new $tw.Tiddler(tiddler,{title: toTitle},this.getModificationFields()));\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar tags = (tiddler.fields.tags || []).slice(0),\n\t\t\t\tlist = (tiddler.fields.list || []).slice(0),\n\t\t\t\tisModified = false;\n\t\t\t// Rename tags\n\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\tif(title === fromTitle) {\n\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\tisModified = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// Rename lists\n\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\tif(title === fromTitle) {\n\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\tisModified = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(isModified) {\n\t\t\t\tself.addTiddler(new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields()));\n\t\t\t}\n\t\t});\n\t}\n}\n\n})();\n",
            "title": "$:/core/modules/wiki-bulkops.js",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/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,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\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\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\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(creationFields,tiddler,fields,modificationFields));\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 && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && 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 titles = [], t, title;\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// Then place any remaining entries\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\ttitles.push(title);\n\t\t\t}\n\t\t}\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.getTiddlerDataCached(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\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,defaultData);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t});\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\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\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, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\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.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.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\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.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\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.mode: transclusion mode \"inline\" or \"block\"\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.mode) {\n\t\tparseTree.tree[0].children[0].attributes.mode = {type: \"string\", value: options.mode};\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\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\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>>\nbutton-background:\nbutton-foreground:\nbutton-border:\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\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\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>>\nbutton-background:\nbutton-foreground:\nbutton-border:\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\nsite-title-foreground: <<colour tiddler-title-foreground>>\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>>\nbutton-background:\nbutton-foreground:\nbutton-border:\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\nsite-title-foreground: <<colour tiddler-title-foreground>>\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/ContrastLight": {
            "title": "$:/palettes/ContrastLight",
            "name": "Contrast (Light)",
            "description": "High contrast and unambiguous (light version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\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: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\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: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour 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: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\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: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/ContrastDark": {
            "title": "$:/palettes/ContrastDark",
            "name": "Contrast (Dark)",
            "description": "High contrast and unambiguous (dark version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\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: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\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: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour 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: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\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: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/DarkPhotos": {
            "created": "20150402111612188",
            "description": "Good with dark photo backgrounds",
            "modified": "20150402112344080",
            "name": "DarkPhotos",
            "tags": "$:/tags/Palette",
            "title": "$:/palettes/DarkPhotos",
            "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>>\nbutton-background: \nbutton-foreground: \nbutton-border: \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: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\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"
        },
        "$:/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>>\nbutton-background:\nbutton-foreground:\nbutton-border:\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\nsite-title-foreground: <<colour tiddler-title-foreground>>\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/SolarFlare": {
            "title": "$:/palettes/SolarFlare",
            "name": "Solar Flare",
            "description": "Warm, relaxing earth colours",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n    download-foreground: <<colour background>>\n    dragger-foreground: <<colour background>>\n    dropdown-background: <<colour background>>\n    modal-background: <<colour background>>\n    sidebar-foreground-shadow: <<colour background>>\n    tiddler-background: <<colour background>>\n    tiddler-border: <<colour background>>\n    tiddler-link-background: <<colour background>>\n    tab-background-selected: <<colour background>>\n        dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n    dragger-background: <<colour foreground>>\n    tab-foreground: <<colour foreground>>\n        tab-foreground-selected: <<colour tab-foreground>>\n            sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n        sidebar-tab-foreground: <<colour tab-foreground>>\n    sidebar-button-foreground: <<colour foreground>>\n    sidebar-controls-foreground: <<colour foreground>>\n    sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n    alert-muted-foreground: <<colour base01>>\n: base00\n    code-foreground: <<colour base00>>\n    message-foreground: <<colour base00>>\n    tag-foreground: <<colour base00>>\n: base0\n    sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n    muted-foreground: <<colour base1>>\n        blockquote-bar: <<colour muted-foreground>>\n        dropdown-border: <<colour muted-foreground>>\n        sidebar-muted-foreground: <<colour muted-foreground>>\n        tiddler-title-foreground: <<colour muted-foreground>>\n            site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n    modal-footer-background: <<colour base2>>\n    page-background: <<colour base2>>\n        modal-backdrop: <<colour page-background>>\n        notification-background: <<colour page-background>>\n        code-background: <<colour page-background>>\n            code-border: <<colour code-background>>\n        pre-background: <<colour page-background>>\n            pre-border: <<colour pre-background>>\n        sidebar-tab-background-selected: <<colour page-background>>\n    table-header-background: <<colour base2>>\n    tag-background: <<colour base2>>\n    tiddler-editor-background: <<colour base2>>\n    tiddler-info-background: <<colour base2>>\n    tiddler-info-tab-background: <<colour base2>>\n    tab-background: <<colour base2>>\n        dropdown-tab-background: <<colour tab-background>>\n: base3\n    alert-background: <<colour base3>>\n    message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n    alert-highlight: <<colour magenta>>\n: violet\n    external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n    tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n    external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n    primary: <<colour blue-muted>>\n        download-background: <<colour primary>>\n        tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\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\nmessage-border: #cfd6e6\nmodal-border: #999999\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n    modal-footer-border: <<colour tab-border>>\n    modal-header-border: <<colour tab-border>>\n    notification-border: <<colour tab-border>>\n    sidebar-tab-border: <<colour tab-border>>\n    tab-border-selected: <<colour tab-border>>\n        sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n    sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\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>>\nbutton-background:\nbutton-foreground:\nbutton-border:\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: #f4f4f4\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: #f4f4f4\nsidebar-tab-background: #e0e0e0\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\nsite-title-foreground: <<colour tiddler-title-foreground>>\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 -->&#13;&#10;"
        },
        "$:/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/canonical-uri-external-text": {
            "title": "$:/core/templates/canonical-uri-external-text",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
        },
        "$:/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]] $(publishFilter)$\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-all": {
            "title": "$:/core/save/lazy-all",
            "text": "\\define saveTiddlerFilter()\n[is[system]] -[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/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/single.tiddler.window": {
            "title": "$:/core/templates/single.tiddler.window",
            "text": "<$set name=\"themeTitle\" value={{$:/view}}>\n\n<$set name=\"tempCurrentTiddler\" value=<<currentTiddler>>>\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$set name=\"currentTiddler\" value=<<tempCurrentTiddler>>>\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</$importvariables>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\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>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/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/AboveStory/tw2-plugin-check": {
            "title": "$:/core/ui/AboveStory/tw2-plugin-check",
            "tags": "$:/tags/AboveStory",
            "text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
        },
        "$:/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 class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/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/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/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/Modals/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
            "subtitle": "{{$:/core/images/download-button}} {{$:/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=\"\"\"{{$:/language/ControlPanel/Plugins/Install}}\"\"\">\n{{$:/language/ControlPanel/Plugins/Reinstall}}\n</$list>\n</$button>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-small-icon\">\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<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<h1><$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<<install-plugin-button>>\n</div>\n</div>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\" emptyMessage=\"\"\"This plugin is not currently installed\"\"\">\n<em>\nThis plugin is already installed at version <$text text=<<installedVersion>>/>\n</em>\n</$list>\n</div>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[description]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\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\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\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<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<div>\n<<plugin-library-listing>>\n</div>\n\n</$importvariables>\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/Parsing": {
            "title": "$:/core/ui/ControlPanel/Parsing",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define parsing-inner(typeCap)\n<li>\n<$checkbox tiddler=\"\"\"$:/config/WikiParserRules/$typeCap$/$(currentTiddler)$\"\"\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> ''<$text text=<<currentTiddler>>/>'': </$checkbox>\n</li>\n\\end\n\n\\define parsing-outer(typeLower,typeCap)\n<ul>\n<$list filter=\"[wikiparserrules[$typeLower$]]\">\n<<parsing-inner typeCap:\"$typeCap$\">>\n</$list>\n</ul>\n\\end\n\n<<lingo Hint>>\n\n! <<lingo Pragma/Caption>>\n\n<<parsing-outer typeLower:\"pragma\" typeCap:\"Pragma\">>\n\n! <<lingo Inline/Caption>>\n\n<<parsing-outer typeLower:\"inline\" typeCap:\"Inline\">>\n\n! <<lingo Block/Caption>>\n\n<<parsing-outer typeLower:\"block\" typeCap:\"Block\">>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
            "text": "<<display-server-assets language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
            "text": "<<display-server-assets plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
            "text": "<<display-server-assets theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green\" style=\"background:blue;\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
            "text": "<<plugin-table language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
            "text": "<<plugin-table plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
            "text": "<<plugin-table theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage)\n<div class=\"tc-plugin-info-chunk tc-small-icon\">\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<h1>\n''<$view field=\"description\"><$view field=\"title\"/></$view>'' $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\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<div class=\"tc-plugin-info-dropdown-body\">\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</div>\n</$reveal>\n</$set>\n</$list>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\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/buttonstyles/Borderless": {
            "title": "$:/core/buttonstyles/Borderless",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
            "text": "tc-btn-invisible"
        },
        "$:/core/buttonstyles/Boxed": {
            "title": "$:/core/buttonstyles/Boxed",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
            "text": "tc-btn-boxed"
        },
        "$:/core/buttonstyles/Rounded": {
            "title": "$:/core/buttonstyles/Rounded",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
            "text": "tc-btn-rounded"
        },
        "$:/core/ui/ControlPanel/Settings/CamelCase": {
            "title": "$:/core/ui/ControlPanel/Settings/CamelCase",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\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/LinkToBehaviour": {
            "title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n  <option value=\"above\"><<lingo \"OpenAbove\">></option>\n  <option value=\"below\"><<lingo \"OpenBelow\">></option>\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\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/PerformanceInstrumentation": {
            "title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/TitleLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
            "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\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//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\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<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\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-inner()\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button>\n<$action-sendmessage $message=\"tm-add-field\" $name=<<name>> $value=<<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\\define new-field()\n<$set name=\"name\" value={{$:/temp/newfieldname}}>\n<$set name=\"value\" value={{$:/temp/newfieldvalue}}>\n<<new-field-inner>>\n</$set>\n</$set>\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}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n</span>\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"$:/temp/newfieldname\">\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$list filter=\"[!is[shadow]!is[system]fields[]sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\"  variable=\"currentField\">\n<$link to=<<currentField>>>\n<<currentField>>\n</$link>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<<currentField>>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\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\"/>\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\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
        },
        "$:/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\">&times;</$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={{$:/config/shortcuts/cancel-edit-tiddler}} message=\"tm-cancel-tiddler\">\n<$keyboard key={{$:/config/shortcuts/save-tiddler}} 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 $:/tags/ViewToolbar",
            "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": "<$fieldmangler>\n<$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param={{$:/temp/NewTagName}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/NewTagName\"/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{$:/temp/newfieldname}} $value={{$:/temp/newfieldvalue}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\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>\n</$fieldmangler>\n"
        },
        "$:/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}}&nbsp;<$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}}&nbsp;<$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\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\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": "\\define control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $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>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/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": "\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $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>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/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/fold-all": {
            "title": "$:/core/ui/Buttons/fold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
            "description": "{{$:/language/Buttons/FoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/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&bull;\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/language\" text=<<currentTiddler>>>\n&nbsp;\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><$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/palette": {
            "title": "$:/core/ui/Buttons/palette",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
            "description": "{{$:/language/Buttons/Palette/Hint}}",
            "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>"
        },
        "$:/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&bull;\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/view\" text=<<storyview>>>\n&nbsp;\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": "\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $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>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/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&bull;\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/theme\" text=<<themeTitle>>>\n&nbsp;\n</$reveal>\n</span>\n<$view tiddler=<<themeTitle>> field=\"name\"/>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>"
        },
        "$:/core/ui/Buttons/unfold-all": {
            "title": "$:/core/ui/Buttons/unfold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
            "description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/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\" animate=\"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={{$:/config/Toolbar/ButtonClass}}>\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\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}}>\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\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n\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\">&times;</$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<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-popup-handle\"/>\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<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search{$(searchTiddler)$}]\"/>\"\"\">\n{{$:/core/images/down-arrow}} {{$:/language/Search/Matches}}\n</$set>\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 tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n{{$:/core/ui/SearchResults}}\n\n</$reveal>\n\n</$reveal>\n\n</$set>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" />\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 Count/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><$count filter=\"[all[current]tagging[]]\"/></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 colspan=\"4\">\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</tr>\n</$list>\n<tr>\n<td></td>\n<td>\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\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}}/>"
        },
        "$:/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": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" state=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\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</$reveal>\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<$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{{||$:/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": "<$reveal type=\"nomatch\" state=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/tags": {
            "title": "$:/core/ui/ViewTemplate/tags",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal type=\"nomatch\" state=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>"
        },
        "$:/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=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\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</$link>\n</$set>\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/unfold": {
            "title": "$:/core/ui/ViewTemplate/unfold",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" state=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" state=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
        },
        "$:/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\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n<$set name=\"storyTiddler\" value=<<currentTiddler>>><$set name=\"tiddlerInfoState\" value=<<qualify \"$:/state/popup/tiddler-info\">>><$tiddler tiddler=<<currentTiddler>>><div class=<<frame-classes>>><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\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/fold-bar": {
            "title": "$:/core/ui/Buttons/fold-bar",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/language/Buttons/Fold/FoldBar/Caption}}",
            "description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
            "text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
        },
        "$:/core/ui/Buttons/fold-others": {
            "title": "$:/core/ui/Buttons/fold-others",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
            "description": "{{$:/language/Buttons/FoldOthers/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldOthers/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/fold": {
            "title": "$:/core/ui/Buttons/fold",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
            "description": "{{$:/language/Buttons/Fold/Hint}}",
            "text": "<$reveal type=\"nomatch\" state=<<folded-state>> text=\"hide\" default=\"show\"><$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button></$reveal><$reveal type=\"match\" state=<<folded-state>> text=\"hide\" default=\"show\"><$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button></$reveal>"
        },
        "$:/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\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/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-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-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/open-window": {
            "title": "$:/core/ui/Buttons/open-window",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
            "description": "{{$:/language/Buttons/OpenWindow/Hint}}",
            "text": "<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/OpenWindow/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/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/Drafts/TypingTimeout": {
            "title": "$:/config/Drafts/TypingTimeout",
            "text": "400"
        },
        "$:/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/v5.1.11/index.html",
            "caption": "{{$:/language/OfficialPluginLibrary}}",
            "text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
        },
        "$:/config/Navigation/openLinkFromInsideRiver": {
            "title": "$:/config/Navigation/openLinkFromInsideRiver",
            "text": "below"
        },
        "$:/config/Navigation/openLinkFromOutsideRiver": {
            "title": "$:/config/Navigation/openLinkFromOutsideRiver",
            "text": "top"
        },
        "$:/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/fold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
            "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/palette": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
            "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/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
            "text": "hide"
        },
        "$:/config/Performance/Instrumentation": {
            "title": "$:/config/Performance/Instrumentation",
            "text": "no"
        },
        "$:/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/Search/AutoFocus": {
            "title": "$:/config/Search/AutoFocus",
            "text": "true"
        },
        "$:/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/Tiddlers/TitleLinks": {
            "title": "$:/config/Tiddlers/TitleLinks",
            "text": "no"
        },
        "$:/config/Toolbar/ButtonClass": {
            "title": "$:/config/Toolbar/ButtonClass",
            "text": "tc-btn-invisible"
        },
        "$:/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/open-window": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
            "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"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
            "text": "hide"
        },
        "$:/config/shortcuts/cancel-edit-tiddler": {
            "title": "$:/config/shortcuts/cancel-edit-tiddler",
            "text": "escape"
        },
        "$:/config/shortcuts/save-tiddler": {
            "title": "$:/config/shortcuts/save-tiddler",
            "text": "ctrl+enter"
        },
        "$:/config/WikiParserRules/Inline/wikilink": {
            "title": "$:/config/WikiParserRules/Inline/wikilink",
            "text": "enable"
        },
        "$:/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\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$set></$tiddler></$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<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/thumbnails": {
            "title": "$:/core/macros/thumbnails",
            "tags": "$:/tags/Macro",
            "text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\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${!!$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<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\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<div class=\"tc-prompt\">\n<<lingo Prompt>> <$view tiddler={{$:/palette}} field=\"name\"/>\n</div>\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}}>&bull;</$reveal><$reveal state=\"$:/palette\" type=\"nomatch\" text={{!!title}}>&nbsp;</$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/fold-all]] [[$:/core/ui/Buttons/unfold-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/palette]] [[$:/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/unfold]] [[$:/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/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
        },
        "$:/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}}>&bull;</$reveal><$reveal state=\"$:/theme\" type=\"nomatch\" text={{!!title}}>&nbsp;</$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>"
        }
    }
}
{{$:/SiteTitle}} — {{$:/HistoryList!!current-tiddler}}
About
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
no
$:/languages/en-GB
{
    "tiddlers": {
        "$:/plugins/inmysocks/TiddlerTool/Batch Actions": {
            "title": "$:/plugins/inmysocks/TiddlerTool/Batch Actions",
            "text": "\\define thisHelpButton(label)\n^^(<$button popup=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\" class='tc-btn-invisible'>?</$button>)<$reveal type='popup' state=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\"><div class='tc-drop-down tc-popup-keep' style='max-width:75vw;text-overflow:ellipsis'><span style='margin-left:10px;margin-right:10px;'><$view field=\"\"\"$label$\"\"\" mode=block/></span></div></$reveal>^^\n\\end\n\n\\define thisButtonAction()\n<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_tag]]'>\n\t<$list filter='$(IncludeSystem)$$(IncludeEmptyTiddlers)$$(IncludeSearchTiddler)$+[regexp[$(CaseSensitiveTitle)$$(TitleSearchString)$]regexp:tags[$(CaseSensitiveTags)$$(TagsSearchString)$]limit<TiddlerLimit>]+[sort[title]]' variable=MatchingTitle>\n\t\t<<thisInnerButtonAction>>\n\t</$list>\n</$list>\n<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_tag]]'>\n\t<$list filter='$(IncludeSystem)$$(IncludeEmptyTiddlers)$$(IncludeSearchTiddler)$+[regexp[$(CaseSensitiveTitle)$$(TitleSearchString)$]limit<TiddlerLimit>]+[sort[title]]' variable=MatchingTitle>\n\t\t<<thisInnerButtonAction>>\n\t</$list>\n</$list>\n\\end\n\n\\define thisInnerButtonAction()\n<$list filter='[[$:/temp/Generic Search and Replace/Search]has[field_name_search_text]]'>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields>\n\t\t\t<$list filter='[<MatchingTitle>has<MatchingFields>get<MatchingFields>]+[sort[title]]' variable=MatchingFieldContents>\t\t\t\t\t\n\t\t\t\t<<thisAction>>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields>\n\t\t\t<<thisAction>>\n\t\t</$list>\n\t</$list>\n</$list>\n<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[field_name_search_text]]'>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields>\n\t\t\t<$list filter='[<MatchingTitle>has<MatchingFields>get<MatchingFields>]+[sort[title]]' variable=MatchingFieldContents>\t\t\t\t\t\n\t\t\t\t<<thisAction>>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields emptyMessage=<<thisAction>>>\n\t\t\t\t<<thisAction>>\n\t\t</$list>\n\t</$list>\n</$list>\n\\end\n\n\\define thisAction()\n$(ListStart)$\n<$fieldmangler tiddler=<<MatchingTitle>>>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Add Tags'>\n\t\t<$action-sendmessage $message='tm-add-tag' $param={{$:/temp/Generic Search and Replace/Add Tags!!tag_to_add}}/>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Remove Tags'>\n\t\t<$action-sendmessage $message='tm-remove-tag' $param={{$:/temp/Generic Search and Replace/Remove Tags!!tag_to_remove}}/>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Replace Tags'>\n\t\t<$action-sendmessage $message='tm-remove-tag' $param={{$:/temp/Generic Search and Replace/Replace Tags!!tag_to_replace}}/>\n\t\t<$action-sendmessage $message='tm-add-tag' $param={{$:/temp/Generic Search and Replace/Replace Tags!!replacement_tag}}/>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Add Fields'>\n\t\t<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Add Field!!field_contents' text=''>\n\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field={{$:/temp/Generic Search and Replace/Add Field!!field_name}} $value={{$:/temp/Generic Search and Replace/Add Field!!field_contents}}/>\n\t\t</$reveal>\n\t\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Add Field!!field_contents' text=''>\n\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field={{$:/temp/Generic Search and Replace/Add Field!!field_name}} $value=''/>\n\t\t</$reveal>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Remove Fields'>\n\t\t<$action-sendmessage $message='tm-remove-field' $param={{$:/temp/Generic Search and Replace/Remove Field!!field_name}}/>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Rename Fields'>\n\t\t<$set name=FieldValue filter='[<MatchingTitle>get{$:/temp/Generic Search and Replace/Rename Field!!old_field_name}]' emptyValue=''>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Selected Action' $field='temp_field' $value=\n\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field={{$:/temp/Generic Search and Replace/Rename Field!!new_field_name}} $value=<<FieldValue>>/>\n\t\t\t<$action-sendmessage $message='tm-remove-field' $param={{$:/temp/Generic Search and Replace/Rename Field!!old_field_name}}/>\n\t\t</$set>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingTitle>> $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t</$reveal>\n</$fieldmangler>\n$(ListEnd)$\n\\end\n\n<$vars SearchTiddler='$:/plugins/inmysocks/TiddlerTool/TiddlerTool' IncludeSearchTiddler={{$:/temp/Generic Search and Replace/Search!!include_this_tiddler}} ShowFields={{$:/temp/Generic Search and Replace/Search!!show_fields}} IncludeSystem={{$:/temp/Generic Search and Replace/Search!!include_system_tiddlers}} IncludeTags={{$:/temp/Generic Search and Replace/Search!!include_tags}} IncludeText={{$:/temp/Generic Search and Replace/Search!!include_text}} IncludeCreated={{$:/temp/Generic Search and Replace/Search!!include_created}} IncludeModified={{$:/temp/Generic Search and Replace/Search!!include_modified}} IncludeType={{$:/temp/Generic Search and Replace/Search!!include_type}} CaseSensitiveTitle={{$:/temp/Generic Search and Replace/Search!!case_sensitive_title}} CaseSensitiveTags={{$:/temp/Generic Search and Replace/Search!!case_sensitive_tags}} CaseSensitiveFields={{$:/temp/Generic Search and Replace/Search!!case_sensitive_fields}} CaseSensitiveContents={{$:/temp/Generic Search and Replace/Search!!case_sensitive_contents}} TitleSearchString={{$:/temp/Generic Search and Replace/Search!!tiddler_search_text}} TagsSearchString={{$:/temp/Generic Search and Replace/Search!!search_tag}} FieldSearchString={{$:/temp/Generic Search and Replace/Search!!field_name_search_text}} ContentsSearchString={{$:/temp/Generic Search and Replace/Search!!search_text}} TiddlerLimit=100>\n\tPick Action<<thisHelpButton pick_bulk_action_help>>:\n\t<$select tiddler='$:/state/Generic Search and Replace/Selected Action'>\n\t\t<option value=''>\n\t\t\t--\n\t\t</option>\n\t\t<option>\n\t\t\tAdd Tags\n\t\t</option>\n\t\t<option>\n\t\t\tRemove Tags\n\t\t</option>\n\t\t<option>\n\t\t\tReplace Tags\n\t\t</option>\n\t\t<option>\n\t\t\tAdd Fields\n\t\t</option>\n\t\t<option>\n\t\t\tRemove Fields\n\t\t</option>\n\t\t<option>\n\t\t\tRename Fields\n\t\t</option>\n\t</$select>\n\t<br>\n\t''Instructions:''\n\t<br>\n\t<$list filter='[[$:/state/Generic Search and Replace/Selected Action]!has[text]'>\n\t\tSelect an action from the menu above to see instructions.\n\t</$list>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Add Tags'>\n\t\tThis can be used to add a tag to multiple tiddlers at the same time. Enter the tag you wish to add in the `Tag to Add` text box and click one of the buttons. If you click `Add Tag to all Results` than the tag is added to every tiddler returned by the search. If you click on `Add Tag to Selected Tiddlers` the tag is added to all tiddlers that are selected from the search results. If you add a tag to a tiddler that already has that tag the tiddler is unaffected.\n\t\t<br>\n\t\t<br>\n\t\t__Tag to add__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Add Tags' field='tag_to_add' placeholder='Tag to Add'/>\n\t\t<br>\n\t\t<$button>\n\t\t\tAdd Tag to all Results\n\t\t\t<<thisButtonAction>>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Add Tags' $field='tag_to_add' $value=''/>\n\t\t</$button>\n\t\t<$button>\n\t\t\tAdd Tag to Selected Results\n\t\t\t<$vars ListStart=\"\"\"<$list filter='[[$:/state/Generic Search and Replace/Selected Tiddlers]getindex<MatchingTitle>prefix[true]]'>\"\"\" ListEnd=\"\"\"</$list>\"\"\">\n\t\t\t\t<<thisButtonAction>>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Add Tags' $field='tag_to_add' $value=''/>\n\t\t\t</$vars>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Remove Tags'>\n\t\tThis can be used to remove a tag from multiple tiddlers at the same time. Enter the tag you wish to remove in the `Tag to Remove` text box and click one of the buttons. If you click `Remove Tag from all Results` than the tag is removed from every tiddler returned by the search. If you click on `Remove Tag from Selected Tiddlers` the tag is removed from all tiddlers that are selected from the search results. If you try to remove a tag from a tiddler that doesn't have the tag the tiddler is unaffected.\n\t\t<br>\n\t\t<br>\n\t\t__Tag to remove__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Remove Tags' field='tag_to_remove' placeholder='Tag to Remove'/>\n\t\t<br>\n\t\t<$button>\n\t\t\tRemove Tag from all Results\n\t\t\t<<thisButtonAction>>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Remove Tags' $field='tag_to_remove' $value=''/>\n\t\t</$button>\n\t\t<$button>\n\t\t\tRemove Tag from Selected Results\n\t\t\t<$vars ListStart=\"\"\"<$list filter='[[$:/state/Generic Search and Replace/Selected Tiddlers]getindex<MatchingTitle>prefix[true]]'>\"\"\" ListEnd=\"\"\"</$list>\"\"\">\n\t\t\t\t<<thisButtonAction>>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Remove Tags' $field='tag_to_remove' $value=''/>\n\t\t\t</$vars>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Replace Tags'>\n\t\tThis can be used to replace one tag with another tag on multiple tiddlers at the same time. Enter the tag you wish to replace in the `Old Tag` text box and what you wish to replace it with in the `New Tag` text box then click one of the buttons. If you click `Replace Tag in all Results` than the tag is replaced on every tiddler returned by the search. If you click on `Replace Tag in Selected Tiddlers` the tag is replaced in all tiddlers that are selected from the search results. If you select a tiddler that doesn't have the original tag the new tag is still added to the tiddler.\n\t\t<br>\n\t\t<br>\n\t\t__Old tag__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Replace Tags' field='tag_to_replace' placeholder='Tag to Replace'/>\n\t\t<br>\n\t\t__New tag__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Replace Tags' field='replacement_tag' placeholder='New Tag'/>\n\t\t<br>\n\t\t<$button>\n\t\t\tReplace Tag in all Results\n\t\t\t<<thisButtonAction>>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Replace Tags' $field='tag_to_replace' $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Replace Tags' $field='replacement_tag' $value=''/>\n\t\t</$button>\n\t\t<$button>\n\t\t\tReplace Tag in Selected Results\n\t\t\t<$vars ListStart=\"\"\"<$list filter='[[$:/state/Generic Search and Replace/Selected Tiddlers]getindex<MatchingTitle>prefix[true]]'>\"\"\" ListEnd=\"\"\"</$list>\"\"\">\n\t\t\t\t<<thisButtonAction>>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Replace Tags' $field='tag_to_replace' $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Replace Tags' $field='replacement_tag' $value=''/>\n\t\t\t</$vars>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Add Fields'>\n\t\tThis can be used to add a field to multiple tiddlers at the same time. Enter the field name in the `Field Name` text box and the field contents, if any, in the `Field Contents` text box then click one of the buttons. If you click on `Add Field to all Results` the field is added to every tiddler returned by the search. If you click on `Add Field to Selected Results` the field is added to all tiddlers that are selected from the search results. If you add a field to a tiddler that already has a field with that name than the old field is overwritten. (I will add an option to leave existing fields alone later)\n\t\t<br>\n\t\t<br>\n\t\t__Field to Add__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Add Field' field='field_name' placeholder='Field to Add'/>\n\t\t<br>\n\t\t__Field contents__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Add Field' field='field_contents' placeholder='Field Contents'/>\n\t\t<br>\n\t\t<$button>\n\t\t\tAdd Field to all Results\n\t\t\t<<thisButtonAction>>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Add Field' $field='field_name' $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Add Field' $field='field_contents' $value=''/>\n\t\t</$button>\n\t\t<$button>\n\t\t\tAdd Field to Selected Results\n\t\t\t<$vars ListStart=\"\"\"<$list filter='[[$:/state/Generic Search and Replace/Selected Tiddlers]getindex<MatchingTitle>prefix[true]]'>\"\"\" ListEnd=\"\"\"</$list>\"\"\">\n\t\t\t\t<<thisButtonAction>>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Add Field' $field='field_name' $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Add Field' $field='field_contents' $value=''/>\n\t\t\t</$vars>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Remove Fields'>\n\t\tThis can be used to remove a field from multiple tiddlers at the same time. Enter the field name in the `Field Name` text box and click one of the buttons. If you click on `Remove Field from all Results` the field is removed from every tiddler returned by the search. If you click on `Remove Field from Selected Results` the field is removed from all tiddlers that are selected from the search results. If you remove a field from a tiddler that doesn't have a field with that name than the tiddler is unaffected.\n\t\t<br>\n\t\t<br>\n\t\t__Field to Remove__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Remove Field' field='field_name' placeholder='Field to Remove'/>\n\t\t<br>\n\t\t<$button>\n\t\t\tRemove Field from all Results\n\t\t\t<<thisButtonAction>>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Remove Field' $field='field_name' $value=''/>\n\t\t</$button>\n\t\t<$button>\n\t\t\tRemove Field from Selected Results\n\t\t\t<$vars ListStart=\"\"\"<$list filter='[[$:/state/Generic Search and Replace/Selected Tiddlers]getindex<MatchingTitle>prefix[true]]'>\"\"\" ListEnd=\"\"\"</$list>\"\"\">\n\t\t\t\t<<thisButtonAction>>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Remove Field' $field='field_name' $value=''/>\n\t\t\t</$vars>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Rename Fields'>\n\t\tThis can be used to rename existing fields in multiple tiddlers at the same time. If you click on `Rename Field in all Results` the field is renamed in every tiddlers returned by the search. If you click `Rename Field in Selected Results` the field is renamed in the tiddlers selected from the search results.\n\t\t<br>\n\t\t<br>\n\t\t__Old Field name__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Rename Field' field='old_field_name' placeholder='Field to Rename'/>\n\t\t<br>\n\t\t__New Field name__:\n\t\t<br>\n\t\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Rename Field' field='new_field_name' placeholder='New Name'/>\n\t\t<br>\n\t\t<$button>\n\t\t\tRename Field in all Results\n\t\t\t<<thisButtonAction>>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Rename Field' $field='old_field_name' $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Rename Field' $field='new_field_name' $value=''/>\n\t\t</$button>\n\t\t<$button>\n\t\t\tRename Field in Selected Results\n\t\t\t<$vars ListStart=\"\"\"<$list filter='[[$:/state/Generic Search and Replace/Selected Tiddlers]getindex<MatchingTitle>prefix[true]]'>\"\"\" ListEnd=\"\"\"</$list>\"\"\">\n\t\t\t\t<<thisButtonAction>>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Rename Field' $field='old_field_name' $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Rename Field' $field='new_field_name' $value=''/>\n\t\t\t</$vars>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action' text='Change Field Contents'>\n\t</$reveal>\n</$vars>"
        },
        "$:/plugins/inmysocks/TiddlerTool/Search Results": {
            "title": "$:/plugins/inmysocks/TiddlerTool/Search Results",
            "caption": "Search Results",
            "text": "\\define thisHelpButton(label)\n^^(<$button popup=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\" class='tc-btn-invisible'>?</$button>)<$reveal type='popup' state=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\"><div class='tc-drop-down tc-popup-keep' style='max-width:75vw;text-overflow:ellipsis'><span style='margin-left:10px;margin-right:10px;'><$view field=\"\"\"$label$\"\"\" mode=block/></span></div></$reveal>^^\n\\end\n\n\\define thisEditTags()\n<$fieldmangler tiddler=<<MatchingTitle>>>\n\t<$list filter='[title<MatchingTitle>tags[]]+[sort[title]]'>\n\t\t<$set name=\"backgroundColor\" value={{!!color}}>\n\t\t\t<span style=<<tag-styles>> class=\"tc-tag-label\">\n\t\t\t\t<$view field=\"title\" format=\"text\" />\n\t\t\t\t<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">\n\t\t\t\t\t&times;\n\t\t\t\t</$button>\n\t\t\t</span>\n\t\t</$set>\n\t</$list>\n\t<div class=\"tc-edit-add-tag\">\n\t\t<span class=\"tc-add-tag-name\">\n\t\t\t<$edit-text tiddler=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"\"\"$:/state/popup/tags-auto-complete/$(MatchingTitle)$\"\"\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n\t\t</span>\n\t\t<$button popup=<<qualify \"\"\"$:/state/popup/tags-auto-complete/$(MatchingTitle)$\"\"\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</$button>\n\t\t<div class=\"tc-block-dropdown-wrapper\">\n\t\t\t<$reveal state=<<qualify \"\"\"$:/state/popup/tags-auto-complete/$(MatchingTitle)$\"\"\">> type=\"nomatch\" text=\"\" default=\"\">\n\t\t\t\t<div class=\"tc-block-dropdown\">\n\t\t\t\t\t<$linkcatcher set=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\" setTo=\"\" message=\"tm-add-tag\">\n\t\t\t\t\t\t<$list filter=\"[tags[]!is[system]search:title<TagState>sort[]]\">\n\t\t\t\t\t\t\t{{||$:/core/ui/Components/tag-link}}\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t<hr>\n\t\t\t\t\t\t<$list filter=\"[tags[]is[system]search:title<TagState>sort[]]\">\n\t\t\t\t\t\t\t{{||$:/core/ui/Components/tag-link}}\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t</$linkcatcher>\n\t\t\t\t</div>\n\t\t\t</$reveal>\n\t\t</div>\n\t\t<span class=\"tc-add-tag-button\">\n\t\t\t<$button message=\"tm-add-tag\" param={{$:/temp/$(MatchingTitle)$/NewTagName}} set=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\" setTo=\"\" class=\"\">\n\t\t\t\tadd\n\t\t\t</$button>\n\t\t</span>\n\t</div>\n</$fieldmangler>\n\\end\n\n\\define thisSelectTiddlerButton()\n<$reveal type='nomatch' state=\"\"\"$:/state/Generic Search and Replace/Selected Tiddlers##$(MatchingTitle)$\"\"\" text='true'>\n\t<$button class='tc-btn-invisible'>\n\t<input type='checkbox'/>\n\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Selected Tiddlers' $index=<<MatchingTitle>> $value=true/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Generic Search and Replace/Selected Tiddlers##$(MatchingTitle)$\"\"\" text='true'>\n\t<$button class='tc-btn-invisible'>\n\t<input type='checkbox' checked=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Selected Tiddlers' $index=<<MatchingTitle>> $value=false/>\n\t</$button>\n</$reveal>\n\\end\n\n\\define thisRemoveFieldButton()\n<$button class='tc-btn-invisible' tooltip='Remove Field'>\n\t{{$:/core/images/delete-button}}\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t<$action-sendmessage $message='tm-remove-field' $param=<<MatchingFields2>>/>\n</$button>\n\\end\n\n\\define thisSaveFieldButton()\n<$button class='tc-btn-invisible' tooltip='Store changes'>\n\t{{$:/core/images/done-button}}\n\t<$reveal type=nomatch state='$:/state/Generic Search/Edit State!!this_long_named_editing_field' text=''>\n\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field=<<MatchingFields2>> $value={{$:/state/Generic Search/Edit State!!this_long_named_editing_field}}/>\n\t</$reveal>\n\t<$reveal type=match state='$:/state/Generic Search/Edit State!!this_long_named_editing_field' text=''>\n\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field=<<MatchingFields2>> $value=''/>\n\t</$reveal>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=''/>\n</$button>\n\\end\n\n\\define thisEditFieldValueCancelButton()\n<$button class='tc-btn-invisible' tooltip='Discard changes'>\n\t{{$:/core/images/cancel-button}}\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=''/>\n</$button>\n\\end\n\n\\define thisEditFieldValueEmptyMessage()\n<$list filter='[<MatchingTitle>get<MatchingFields2>]' emptyMessage='' variable=ThisValue>\n\t<$button class='tc-btn-invisible' tooltip='Edit field value'>\n\t\t<$view tiddler=<<MatchingTitle>> field=<<MatchingFields2>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' text=<<MatchingTitle>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=true/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=<<ThisValue>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t</$button>\n</$list>\n\\end\n\n\\define thisAddFieldContentsButton()\n<$button class='tc-btn-invisible' tooltip='Add field contents'>\n\t{{$:/core/images/new-button}}\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' text=<<MatchingTitle>>/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n</$button>\n\\end\n\n\\define thisInnerEditFieldValueEmptyMessage()\n<$list filter='[[$:/state/Generic Search/Edit State]text<MatchingTitle>$(MatchingFields2)$[true]!edit_title[true]]' emptyMessage=<<thisAddFieldContentsButton>>>\n\t<<thisSaveFieldButton>>\n\t<<thisEditFieldValueCancelButton>>\n\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_editing_field'/>\n</$list>\n\\end\n\n\\define thisEditFieldValueButton()\n<$list filter='[<MatchingTitle>get<MatchingFields2>]' emptyMessage=<<thisInnerEditFieldValueEmptyMessage>> variable=ThisValue>\n\t<$list filter='[[$:/state/Generic Search/Edit State]text<MatchingTitle>$(MatchingFields2)$[true]!edit_title[true]]' emptyMessage=<<thisEditFieldValueEmptyMessage>>>\n\t\t<<thisSaveFieldButton>>\n\t\t<<thisEditFieldValueCancelButton>>\n\t\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_editing_field'/>\n\t</$list>\n</$list>\n\\end\n\n\\define thisEditFieldTitleButtonEmptyMessage()\n<$button class='tc-btn-invisible' tooltip='Edit field title'>\n\t<$view tiddler=<<MatchingFields2>> field='title'/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' text=<<MatchingTitle>>/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=<<MatchingFields2>>/>\n</$button>\n\\end\n\n\\define thisEditFieldTitleButton()\n<$fieldmangler tiddler=<<MatchingTitle>>>\n\t<$list filter='[[$:/state/Generic Search/Edit State]text<MatchingTitle>$(MatchingFields2)$[true]edit_title[true]]' emptyMessage=<<thisEditFieldTitleButtonEmptyMessage>>>\n\t\t<$button class='tc-btn-invisible' tooltip='Store changes'>\n\t\t\t{{$:/core/images/done-button}}\n\t\t\t<$action-sendmessage $message='tm-remove-field' $param=<<MatchingFields2>>/>\n\t\t\t<$list filter='[<MatchingTitle>get<MatchingFields2>]' emptyMessage=\"\"\"<$action-setfield $tiddler=<<MatchingTitle>> $field={{$:/state/Generic Search/Edit State!!this_long_named_editing_field}} $value=''/>\"\"\" variable=ThisValue>\n\t\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field={{$:/state/Generic Search/Edit State!!this_long_named_editing_field}} $value=<<ThisValue>>/>\n\t\t\t</$list>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t</$button>\n\t\t<<thisEditFieldValueCancelButton>>\n\t\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_editing_field'/>\n\t\t<<thisRemoveFieldButton>>\n\t</$list>\n</$fieldmangler>\n\\end\n\n\\define thisAddFieldButton()\n<$reveal type='nomatch' state=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text='add'>\n\t<$button class='tc-btn-invisible' tooltip='Add New Field'>\n\t\t{{$:/core/images/new-button}}\n\t\t<$action-setfield $tiddler=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text='add'/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text='add'>\n\t<$fieldmangler tiddler=<<MatchingTitle>>>\n\t\t<$edit-text tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field='field_name' placeholder='Field Name'/>\n\t\t<br>\n\t\t<$edit-text tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field='field_contents' placeholder='Contents'/>\n\t</$fieldmangler>\n\t<$button class='tc-btn-invisible' tooltip='Save Field'>\n\t\t{{$:/core/images/done-button}}\n\t\t<$reveal type='nomatch' state=\"\"\"$:/temp/Add Field/$(MatchingTitle)$!!field_contents\"\"\" text=''>\n\t\t\t<$action-setfield $tiddler=\"\"\"$(MatchingTitle)$\"\"\" $field={{$:/temp/Add Field/$(MatchingTitle)$!!field_name}} $value={{$:/temp/Add Field/$(MatchingTitle)$!!field_contents}}/>\n\t\t</$reveal>\n\t\t<$reveal type='match' state=\"\"\"$:/temp/Add Field/$(MatchingTitle)$!!field_contents\"\"\" text=''>\n\t\t\t<$action-setfield $tiddler=\"\"\"$(MatchingTitle)$\"\"\" $field={{$:/temp/Add Field/$(MatchingTitle)$!!field_name}} $value=''/>\n\t\t</$reveal>\n\t\t<$action-setfield $tiddler=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text=''/>\n\t\t<$action-setfield $tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field_name='' field_contents=''/>\n\t</$button>\n\t<$button class='tc-btn-invisible' tooltip='Cancel'>\n\t\t{{$:/core/images/cancel-button}}\n\t\t<$action-setfield $tiddler=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text=''/>\n\t\t<$action-setfield $tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field_name='' field_contents=''/>\n\t</$button>\n</$reveal>\n\\end\n\n\\define thisRenameTiddlerButton()\n<$reveal type='nomatch' state='$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field' text=<<MatchingTitle>>>\n\t<$button class='tc-btn-invisible' tooltip='Edit Title'>\n\t\t{{$:/core/images/edit-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=<<MatchingTitle>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_field' $value=<<MatchingTitle>>/>\n\t</$button>\n\t<$link to=<<MatchingTitle>>>\n\t\t<<MatchingTitle>>\n\t</$link>\n</$reveal>\n<$reveal type='match' state='$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field' text=<<MatchingTitle>>>\n\t<$button class='tc-btn-invisible' tooltip='Store Change'>\n\t\t{{$:/core/images/done-button}}\n\t\t<$reveal type='nomatch' state='$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field' text={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_field}}>\n\t\t\t<$action-setfield $tiddler={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field}} $field='title' $value={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_field}}/>\n\t\t\t<$action-sendmessage $message='tm-delete-tiddler' $param={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field}}/>\n\t\t</$reveal>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=''/>\n\t</$button>\n\t<$button class='tc-btn-invisible' tooltip='Cancel Edit'>\n\t\t{{$:/core/images/cancel-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_field' $value=''/>\n\t</$button>\n\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_title_editing_field'/>\n\t<$button class='tc-btn-invisible' tooltip='Delete Tiddler'>\n\t\t{{$:/core/images/delete-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_field' $value=''/>\n\t\t<$action-sendmessage $message='tm-delete-tiddler' $param=<<MatchingTitle>>/>\n\t</$button>\n</$reveal>\n\\end\n\n\\define thisTable()\n<table>\n\t<tr>\n\t\t<th>\n\t\t\tSelected\n\t\t</th>\n\t\t<th>\n\t\t\tTiddler<<thisHelpButton tiddler_table_column_help>>\n\t\t</th>\n\t\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=th>\n\t\t\tTags<<thisHelpButton tags_table_column_help>>\n\t\t</$reveal>\n\t\t<$list filter='[[$:/temp/Generic Search and Replace/Search]show_fields[]]'>\n\t\t\t<th>\n\t\t\t\tField Name<<thisHelpButton field_name_column_help>>\n\t\t\t\t<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!show_field_contents' text=false>\n\t\t\t\t\t: Contents<<thisHelpButton field_contents_column_help>>\n\t\t\t\t</$reveal>\n\t\t\t</th>\n\t\t</$list>\n\t</tr>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_tag]]'>\n\t\t<$list filter='$(IncludeSystem)$$(IncludeEmptyTiddlers)$$(IncludeSearchTiddler)$+[regexp[$(CaseSensitiveTitle)$$(TitleSearchString)$]regexp:tags[$(CaseSensitiveTags)$$(TagsSearchString)$]limit<TiddlerLimit>]+[sort[title]]' variable=MatchingTitle>\n\t\t\t<<thisTableBody>>\n\t\t</$list>\n\t</$list>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_tag]]'>\n\t\t<$list filter='$(IncludeSystem)$$(IncludeEmptyTiddlers)$$(IncludeSearchTiddler)$+[regexp[$(CaseSensitiveTitle)$$(TitleSearchString)$]limit<TiddlerLimit>]+[sort[title]]' variable=MatchingTitle>\n\t\t\t<<thisTableBody>>\n\t\t</$list>\n\t</$list>\n</table>\n\\end\n\n\\define thisTableRowWithFields()\n<td>\n\t<<thisSelectTiddlerButton>>\n</td>\n<td>\n\t<<thisRenameTiddlerButton>>\n</td>\n<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t<<thisTableRowMatchingFields>>\n</$reveal>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t<<thisTableRowAllFields>>\n</$reveal>\n\\end\n\n\\define thisTableTiddlersWithNoFields()\n<tr>\n\t<td>\n\t\t<<thisSelectTiddlerButton>>\n\t</td>\n\t<td>\n\t\t<<thisRenameTiddlerButton>>\n\t</td>\n\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=td>\n\t\t<$set name=TagState value=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\">\n\t\t\t<<thisEditTags>>\n\t\t</$set>\n\t</$reveal>\n\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_fields' text='' tag=td>\n\t\t<<thisAddFieldButton>>\n\t</$reveal>\n</tr>\n\\end\n\n\\define thisTableRowMatchingFields()\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=td>\n\t<<thisEditTags>>\n</$reveal>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_fields' text='' tag=td>\n\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]' variable=MatchingFields2>\n\t\t<$list filter='[<MatchingTitle>has<MatchingFields2>get<MatchingFields2>]+[sort[title]]' variable=MatchingFieldContents>\n\t\t\t''<<thisEditFieldTitleButton>>''<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!show_field_contents' text=false>: <<thisEditFieldValueButton>></$reveal><br>\n\t\t\t<hr>\n\t\t</$list>\n\t</$list>\n\t<<thisAddFieldButton>>\n</$reveal>\n\\end\n\n\\define thisTableRowAllFields()\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=td>\n\t<<thisEditTags>>\n</$reveal>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_fields' text='' tag=td>\n\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]' variable=MatchingFields2>\n\t\t\t''<<thisEditFieldTitleButton>>''<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!show_field_contents' text=false>: <<thisEditFieldValueButton>></$reveal><br>\n\t\t\t<hr>\n\t\t</$list>\n\t<<thisAddFieldButton>>\n</$reveal>\n\\end\n\n\\define thisTableBody()\n<$list filter='[[$:/temp/Generic Search and Replace/Search]has[field_name_search_text]]'>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields>\n\t\t\t<$list filter='[<MatchingTitle>has<MatchingFields>get<MatchingFields>]+[sort[title]]' variable=MatchingFieldContents>\t\t\t\t\t\n\t\t\t\t<<thisTableRowWithFields>>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields>\n\t\t\t<<thisTableRowWithFields>>\n\t\t</$list>\n\t</$list>\n</$list>\n<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[field_name_search_text]]'>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields>\n\t\t\t<$list filter='[<MatchingTitle>has<MatchingFields>get<MatchingFields>]+[sort[title]]' variable=MatchingFieldContents>\t\t\t\t\t\n\t\t\t\t<<thisTableRowWithFields>>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_text]]'>\n\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields emptyMessage=<<thisTableTiddlersWithNoFields>>>\n\t\t\t<tr>\n\t\t\t\t<td>\n\t\t\t\t\t<<thisSelectTiddlerButton>>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<<thisRenameTiddlerButton>>\n\t\t\t\t</td>\n\t\t\t\t<<thisTableRowAllFields>>\n\t\t\t</tr>\n\t\t</$list>\n\t</$list>\n</$list>\n\\end\n\n<$vars SearchTiddler='$:/plugins/inmysocks/TiddlerTool/TiddlerTool' IncludeSearchTiddler={{$:/temp/Generic Search and Replace/Search!!include_this_tiddler}} ShowFields={{$:/temp/Generic Search and Replace/Search!!show_fields}} IncludeSystem={{$:/temp/Generic Search and Replace/Search!!include_system_tiddlers}} IncludeTags={{$:/temp/Generic Search and Replace/Search!!include_tags}} IncludeText=\"-[[text]]\" IncludeCreated={{$:/temp/Generic Search and Replace/Search!!include_created}} IncludeModified={{$:/temp/Generic Search and Replace/Search!!include_modified}} IncludeType={{$:/temp/Generic Search and Replace/Search!!include_type}} CaseSensitiveTitle={{$:/temp/Generic Search and Replace/Search!!case_sensitive_title}} CaseSensitiveTags={{$:/temp/Generic Search and Replace/Search!!case_sensitive_tags}} CaseSensitiveFields={{$:/temp/Generic Search and Replace/Search!!case_sensitive_fields}} CaseSensitiveContents={{$:/temp/Generic Search and Replace/Search!!case_sensitive_contents}} TitleSearchString={{$:/temp/Generic Search and Replace/Search!!tiddler_search_text}} TagsSearchString={{$:/temp/Generic Search and Replace/Search!!search_tag}} FieldSearchString={{$:/temp/Generic Search and Replace/Search!!field_name_search_text}} ContentsSearchString={{$:/temp/Generic Search and Replace/Search!!search_text}} TiddlerLimit=100>\n\t<<thisTable>>\n</$vars>"
        },
        "$:/plugins/inmysocks/TiddlerTool/Selected Tiddlers": {
            "title": "$:/plugins/inmysocks/TiddlerTool/Selected Tiddlers",
            "caption": "Selected Tiddlers",
            "text": "\\define thisHelpButton(label)\n^^(<$button popup=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\" class='tc-btn-invisible'>?</$button>)<$reveal type='popup' state=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\"><div class='tc-drop-down tc-popup-keep' style='max-width:75vw;text-overflow:ellipsis'><span style='margin-left:10px;margin-right:10px;'><$view field=\"\"\"$label$\"\"\" mode=block/></span></div></$reveal>^^\n\\end\n\n\\define thisEditTags()\n<$fieldmangler tiddler=<<MatchingTitle>>>\n\t<$list filter='[title<MatchingTitle>tags[]]+[sort[title]]'>\n\t\t<$set name=\"backgroundColor\" value={{!!color}}>\n\t\t\t<span style=<<tag-styles>> class=\"tc-tag-label\">\n\t\t\t\t<$view field=\"title\" format=\"text\" />\n\t\t\t\t<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">\n\t\t\t\t\t&times;\n\t\t\t\t</$button>\n\t\t\t</span>\n\t\t</$set>\n\t</$list>\n\t<div class=\"tc-edit-add-tag\">\n\t\t<span class=\"tc-add-tag-name\">\n\t\t\t<$edit-text tiddler=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"\"\"$:/state/popup/tags-auto-complete/$(MatchingTitle)$\"\"\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n\t\t</span>\n\t\t<$button popup=<<qualify \"\"\"$:/state/popup/tags-auto-complete/$(MatchingTitle)$\"\"\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</$button>\n\t\t<div class=\"tc-block-dropdown-wrapper\">\n\t\t\t<$reveal state=<<qualify \"\"\"$:/state/popup/tags-auto-complete/$(MatchingTitle)$\"\"\">> type=\"nomatch\" text=\"\" default=\"\">\n\t\t\t\t<div class=\"tc-block-dropdown\">\n\t\t\t\t\t<$linkcatcher set=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\" setTo=\"\" message=\"tm-add-tag\">\n\t\t\t\t\t\t<$list filter=\"[tags[]!is[system]search:title<TagState>sort[]]\">\n\t\t\t\t\t\t\t{{||$:/core/ui/Components/tag-link}}\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t<hr>\n\t\t\t\t\t\t<$list filter=\"[tags[]is[system]search:title<TagState>sort[]]\">\n\t\t\t\t\t\t\t{{||$:/core/ui/Components/tag-link}}\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t</$linkcatcher>\n\t\t\t\t</div>\n\t\t\t</$reveal>\n\t\t</div>\n\t\t<span class=\"tc-add-tag-button\">\n\t\t\t<$button message=\"tm-add-tag\" param={{$:/temp/$(MatchingTitle)$/NewTagName}} set=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\" setTo=\"\" class=\"\">\n\t\t\t\tadd\n\t\t\t</$button>\n\t\t</span>\n\t</div>\n</$fieldmangler>\n\\end\n\n\\define thisEditFieldValueEmptyMessage()\n<$list filter='[<MatchingTitle>get<MatchingFields2>]' emptyMessage='' variable=ThisValue>\n\t<$button class='tc-btn-invisible' tooltip='Edit field value'>\n\t\t<$view tiddler=<<MatchingTitle>> field=<<MatchingFields2>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' text=<<MatchingTitle>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=true/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=<<ThisValue>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t</$button>\n</$list>\n\\end\n\n\\define thisEditFieldValueEmptyMessage2()\n<$button class='tc-btn-invisible' tooltip='Add field contents'>\n\t{{$:/core/images/new-button}}\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' text=<<MatchingTitle>>/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=''/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n</$button>\n\\end\n\n\\define thisInnerEditFieldValueEmptyMessage()\n<$list filter='[[$:/state/Generic Search/Edit State]text<MatchingTitle>$(MatchingFields2)$[true]!edit_title[true]]' emptyMessage=<<thisEditFieldValueEmptyMessage2>>>\n\t<$reveal type=nomatch state='$:/state/Generic Search/Edit State!!this_long_named_editing_field' text=''>\n\t\t<$button class='tc-btn-invisible' tooltip='Store changes'>\n\t\t\t{{$:/core/images/done-button}}\n\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field=<<MatchingFields2>> $value={{$:/state/Generic Search/Edit State!!this_long_named_editing_field}}/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=''/>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type=match state='$:/state/Generic Search/Edit State!!this_long_named_editing_field' text=''>\n\t\t<$button class='tc-btn-invisible' tooltip='Store changes'>\n\t\t\t{{$:/core/images/done-button}}\n\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field=<<MatchingFields2>> $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=''/>\n\t\t</$button>\n\t</$reveal>\n\t<$button class='tc-btn-invisible' tooltip='Discard changes'>\n\t\t{{$:/core/images/cancel-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t</$button>\n\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_editing_field'/>\n</$list>\n\\end\n\n\\define thisEditFieldValueButton()\n<$list filter='[<MatchingTitle>get<MatchingFields2>]' emptyMessage=<<thisInnerEditFieldValueEmptyMessage>> variable=ThisValue>\n\t<$list filter='[[$:/state/Generic Search/Edit State]text<MatchingTitle>$(MatchingFields2)$[true]!edit_title[true]]' emptyMessage=<<thisEditFieldValueEmptyMessage>>>\n\t\t<$button class='tc-btn-invisible' tooltip='Store changes'>\n\t\t\t{{$:/core/images/done-button}}\n\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field=<<MatchingFields2>> $value={{$:/state/Generic Search/Edit State!!this_long_named_editing_field}}/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=''/>\n\t\t</$button>\n\t\t<$button class='tc-btn-invisible' tooltip='Discard changes'>\n\t\t\t{{$:/core/images/cancel-button}}\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t</$button>\n\t\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_editing_field'/>\n\t</$list>\n</$list>\n\\end\n\n\\define thisEditFieldTitleButtonEmptyMessage()\n<$list filter='[<MatchingTitle>get<MatchingFields2>]' emptyMessage=<<thisInnerEditFieldTitleButtonEmptyMessage>> variable=ThisValue>\n\t<$button class='tc-btn-invisible' tooltip='Edit field title'>\n\t\t<$view tiddler=<<MatchingFields2>> field='title'/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' text=<<MatchingTitle>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=true/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=true/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=<<MatchingFields2>>/>\n\t</$button>\n</$list>\n\\end\n\n\\define thisInnerEditFieldTitleButtonEmptyMessage()\n<$button class='tc-btn-invisible' tooltip='Edit field title'>\n\t<$view tiddler=<<MatchingFields2>> field='title'/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' text=<<MatchingTitle>>/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_editing_field' $value=<<MatchingFields2>>/>\n</$button>\n\\end\n\n\\define thisEditFieldTitleButton()\n<$fieldmangler tiddler=<<MatchingTitle>>>\n\t<$list filter='[<MatchingTitle>get<MatchingFields2>]' emptyMessage=<<thisInnerEditFieldTitleButton>> variable=ThisValue>\n\t\t<$list filter='[[$:/state/Generic Search/Edit State]text<MatchingTitle>$(MatchingFields2)$[true]edit_title[true]]' emptyMessage=<<thisEditFieldTitleButtonEmptyMessage>>>\n\t\t\t<$button class='tc-btn-invisible' tooltip='Store changes'>\n\t\t\t\t{{$:/core/images/done-button}}\n\t\t\t\t<$action-sendmessage $message='tm-remove-field' $param=<<MatchingFields2>>/>\n\t\t\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field={{$:/state/Generic Search/Edit State!!this_long_named_editing_field}} $value=<<ThisValue>>/>\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t\t</$button>\n\t\t\t<$button class='tc-btn-invisible' tooltip='Discard changes'>\n\t\t\t\t{{$:/core/images/cancel-button}}\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t\t</$button>\n\t\t\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_editing_field'/>\n\t\t\t<$button class='tc-btn-invisible' tooltip='Remove Field'>\n\t\t\t\t{{$:/core/images/delete-button}}\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t\t\t<$action-sendmessage $message='tm-remove-field' $param=<<MatchingFields2>>/>\n\t\t\t</$button>\n\t\t</$list>\n\t</$list>\n</$fieldmangler>\n\\end\n\n\\define thisInnerEditFieldTitleButton()\n<$list filter='[[$:/state/Generic Search/Edit State]text<MatchingTitle>$(MatchingFields2)$[true]edit_title[true]]' emptyMessage=<<thisEditFieldTitleButtonEmptyMessage>>>\n\t<$button class='tc-btn-invisible' tooltip='Store changes'>\n\t\t{{$:/core/images/done-button}}\n\t\t<$action-sendmessage $message='tm-remove-field' $param=<<MatchingFields2>>/>\n\t\t<$action-setfield $tiddler=<<MatchingTitle>> $field={{$:/state/Generic Search/Edit State!!this_long_named_editing_field}} $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t</$button>\n\t<$button class='tc-btn-invisible' tooltip='Discard changes'>\n\t\t{{$:/core/images/cancel-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t</$button>\n\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_editing_field'/>\n\t<$button class='tc-btn-invisible' tooltip='Remove Field'>\n\t\t{{$:/core/images/delete-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=text $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=<<MatchingFields2>> $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field=edit_title $value=false/>\n\t\t<$action-sendmessage $message='tm-remove-field' $param=<<MatchingFields2>>/>\n\t</$button>\n</$list>\n\\end\n\n\\define thisAddFieldButton()\n<$reveal type='nomatch' state=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text='add'>\n\t<$button class='tc-btn-invisible' tooltip='Add New Field'>\n\t\t{{$:/core/images/new-button}}\n\t\t<$action-setfield $tiddler=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text='add'/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text='add'>\n\t<$fieldmangler tiddler=<<MatchingTitle>>>\n\t\t<$edit-text tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field='field_name' placeholder='Field Name'/>\n\t\t<br>\n\t\t<$edit-text tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field='field_contents' placeholder='Contents'/>\n\t</$fieldmangler>\n\t<$button class='tc-btn-invisible' tooltip='Save Field'>\n\t\t{{$:/core/images/done-button}}\n\t\t<$reveal type='nomatch' state=\"\"\"$:/temp/Add Field/$(MatchingTitle)$!!field_contents\"\"\" text=''>\n\t\t\t<$action-setfield $tiddler=\"\"\"$(MatchingTitle)$\"\"\" $field={{$:/temp/Add Field/$(MatchingTitle)$!!field_name}} $value={{$:/temp/Add Field/$(MatchingTitle)$!!field_contents}}/>\n\t\t</$reveal>\n\t\t<$reveal type='match' state=\"\"\"$:/temp/Add Field/$(MatchingTitle)$!!field_contents\"\"\" text=''>\n\t\t\t<$action-setfield $tiddler=\"\"\"$(MatchingTitle)$\"\"\" $field={{$:/temp/Add Field/$(MatchingTitle)$!!field_name}} $value=''/>\n\t\t</$reveal>\n\t\t<$action-setfield $tiddler=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text=''/>\n\t\t<$action-setfield $tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field_name='' field_contents=''/>\n\t</$button>\n\t<$button class='tc-btn-invisible' tooltip='Cancel'>\n\t\t{{$:/core/images/cancel-button}}\n\t\t<$action-setfield $tiddler=\"\"\"$:/state/Add Field/$(MatchingTitle)$\"\"\" text=''/>\n\t\t<$action-setfield $tiddler=\"\"\"$:/temp/Add Field/$(MatchingTitle)$\"\"\" field_name='' field_contents=''/>\n\t</$button>\n</$reveal>\n\\end\n\n\\define thisTableTiddlersWithNoFields()\n<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[field_name_search_text]]'>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_text]]'>\n\t\t<<thisTableRowTiddlerNoFields>>\n\t</$list>\n</$list>\n\\end\n\n\\define thisRenameTiddlerButton()\n<$reveal type='nomatch' state='$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field' text=<<MatchingTitle>>>\n\t<$button class='tc-btn-invisible' tooltip='Edit Title'>\n\t\t{{$:/core/images/edit-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=<<MatchingTitle>>/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_field' $value=<<MatchingTitle>>/>\n\t</$button>\n\t<$link to=<<MatchingTitle>>>\n\t\t<<MatchingTitle>>\n\t</$link>\n</$reveal>\n<$reveal type='match' state='$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field' text=<<MatchingTitle>>>\n\t<$button class='tc-btn-invisible' tooltip='Store Change'>\n\t\t{{$:/core/images/done-button}}\n\t\t<$reveal type='nomatch' state='$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field' text={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_field}}>\n\t\t\t<$action-setfield $tiddler={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field}} $field='title' $value={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_field}}/>\n\t\t\t<$action-sendmessage $message='tm-delete-tiddler' $param={{$:/state/Generic Search/Edit State!!this_long_named_title_editing_state_field}}/>\n\t\t</$reveal>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=''/>\n\t</$button>\n\t<$button class='tc-btn-invisible' tooltip='Cancel Edit'>\n\t\t{{$:/core/images/cancel-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_field' $value=''/>\n\t</$button>\n\t<$edit-text tiddler='$:/state/Generic Search/Edit State' field='this_long_named_title_editing_field'/>\n\t<$button class='tc-btn-invisible' tooltip='Delete Tiddler'>\n\t\t{{$:/core/images/delete-button}}\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_state_field' $value=''/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search/Edit State' $field='this_long_named_title_editing_field' $value=''/>\n\t\t<$action-sendmessage $message='tm-delete-tiddler' $param=<<MatchingTitle>>/>\n\t</$button>\n</$reveal>\n\\end\n\n\\define thisTableRowTiddlerNoFields()\n<tr>\n\t<td>\n\t\t<<thisSelectTiddlerButton>>\n\t</td>\n\t<td>\n\t\t<<thisRenameTiddlerButton>>\n\t</td>\n\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=td>\n\t\t<$set name=TagState value=\"\"\"$:/temp/$(MatchingTitle)$/NewTagName\"\"\">\n\t\t\t<<thisEditTags>>\n\t\t</$set>\n\t</$reveal>\n\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_fields' text='' tag=td>\n\t\t<<thisAddFieldButton>>\n\t</$reveal>\n</tr>\n\\end\n\n\\define thisTable()\n<table>\n\t<tr>\n\t\t<th>\n\t\t\tSelected\n\t\t</th>\n\t\t<th>\n\t\t\tTiddler<<thisHelpButton tiddler_table_column_help>>\n\t\t</th>\n\t\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=th>\n\t\t\tTags<<thisHelpButton tags_table_column_help>>\n\t\t</$reveal>\n\t\t<$list filter='[[$:/temp/Generic Search and Replace/Search]show_fields[]]'>\n\t\t\t<th>\n\t\t\t\tField Name<<thisHelpButton field_name_column_help>>\n\t\t\t\t<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!show_field_contents' text=false>\n\t\t\t\t\t: Contents<<thisHelpButton field_contents_column_help>>\n\t\t\t\t</$reveal>\n\t\t\t</th>\n\t\t</$list>\n\t</tr>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_tag]]'>\n\t\t<$list filter='$(IncludeSystem)$$(IncludeEmptyTiddlers)$$(IncludeSearchTiddler)$+[regexp[$(CaseSensitiveTitle)$$(TitleSearchString)$]regexp:tags[$(CaseSensitiveTags)$$(TagsSearchString)$]limit<TiddlerLimit>]+[sort[title]]' variable=MatchingTitle>\n\t\t\t<<thisTableBody>>\n\t\t</$list>\n\t</$list>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_tag]]'>\n\t\t<$list filter='$(IncludeSystem)$$(IncludeEmptyTiddlers)$$(IncludeSearchTiddler)$+[regexp[$(CaseSensitiveTitle)$$(TitleSearchString)$]limit<TiddlerLimit>]+[sort[title]]' variable=MatchingTitle>\n\t\t\t<<thisTableBody>>\n\t\t</$list>\n\t</$list>\n</table>\n\\end\n\n\\define thisTableBody()\n<$list filter=\"\"\"[[$:/state/Generic Search and Replace/Selected Tiddlers]getindex<MatchingTitle>prefix[true]]\"\"\" variable=CurrentIndexValue>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[field_name_search_text]]'>\n\t\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_text]]'>\n\t\t\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields emptyMessage=<<thisTableTiddlersWithNoFields>>>\n\t\t\t\t<$list filter='[<MatchingTitle>has<MatchingFields>get<MatchingFields>]+[sort[title]]' variable=MatchingFieldContents>\t\t\t\t\t\n\t\t\t\t\t<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t\t<<thisTableRowMatchingFields>>\n\t\t\t\t\t</$reveal>\n\t\t\t\t\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t\t<<thisTableRowAllFields>>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</$list>\n\t\t\t</$list>\n\t\t</$list>\n\t\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_text]]'>\n\t\t\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields emptyMessage=<<thisTableTiddlersWithNoFields>>>\n\t\t\t\t<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t<<thisTableRowMatchingFields>>\n\t\t\t\t</$reveal>\n\t\t\t\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t<<thisTableRowAllFields>>\n\t\t\t\t</$reveal>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[field_name_search_text]]'>\n\t\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[search_text]]'>\n\t\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields emptyMessage=<<thisTableTiddlersWithNoFields>>>\n\t\t\t\t<$list filter='[<MatchingTitle>has<MatchingFields>get<MatchingFields>]+[sort[title]]' variable=MatchingFieldContents>\t\t\t\t\t\n\t\t\t\t\t<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t\t<<thisTableRowMatchingFields>>\n\t\t\t\t\t</$reveal>\n\t\t\t\t\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t\t<<thisTableRowAllFields>>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</$list>\n\t\t\t</$list>\n\t\t</$list>\n\t\t<$list filter='[[$:/temp/Generic Search and Replace/Search]!has[search_text]]'>\n\t\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]+[limit[1]]' variable=MatchingFields emptyMessage=<<thisTableTiddlersWithNoFields>>>\n\t\t\t\t<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t<$list filter='[[$:/temp/Generic Search and Replace/Search]has[field_name_search_text]]' emptyMessage=<<thisTableRowAllFields>>>\n\t\t\t\t\t\t<<thisTableRowMatchingFields>>\n\t\t\t\t\t</$list>\n\t\t\t\t</$reveal>\n\t\t\t\t<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!which_fields' text=all tag=tr>\n\t\t\t\t\t<<thisTableRowAllFields>>\n\t\t\t\t</$reveal>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n</$list>\n\\end\n\n\\define thisTableRowMatchingFields()\n<td>\n\t<<thisSelectTiddlerButton>>\n</td>\n<td>\n\t<<thisRenameTiddlerButton>>\n</td>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=td>\n\t<<thisEditTags>>\n</$reveal>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_fields' text='' tag=td>\n\t<$list filter='[title<MatchingTitle>fields[]regexp[$(CaseSensitiveFields)$$(FieldSearchString)$]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]' variable=MatchingFields2>\n\t\t<$list filter='[<MatchingTitle>has<MatchingFields2>get<MatchingFields2>]+[sort[title]]' variable=MatchingFieldContents>\n\t\t\t''<<thisEditFieldTitleButton>>''<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!show_field_contents' text=false>: <<thisEditFieldValueButton>></$reveal><br>\n\t\t\t<hr>\n\t\t</$list>\n\t</$list>\n\t<<thisAddFieldButton>>\n</$reveal>\n\\end\n\n\\define thisTableRowAllFields()\n<td>\n\t<<thisSelectTiddlerButton>>\n</td>\n<td>\n\t<<thisRenameTiddlerButton>>\n</td>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_tags' text='' tag=td>\n\t<<thisEditTags>>\n</$reveal>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_fields' text='' tag=td>\n\t\t<$list filter='[title<MatchingTitle>fields[]]$(IncludeText)$$(IncludeCreated)$$(IncludeModified)$$(IncludeType)$$(IncludeTags)$-[[title]]+[sort[title]]' variable=MatchingFields2>\n\t\t\t''<<thisEditFieldTitleButton>>''<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!show_field_contents' text=false>: <<thisEditFieldValueButton>></$reveal><br>\n\t\t\t<hr>\n\t\t</$list>\n\t<<thisAddFieldButton>>\n</$reveal>\n\\end\n\n\\define thisSelectTiddlerButton()\n<$reveal type='nomatch' state=\"\"\"$:/state/Generic Search and Replace/Selected Tiddlers##$(MatchingTitle)$\"\"\" text='true'>\n\t<$button class='tc-btn-invisible'>\n\t<input type='checkbox'/>\n\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Selected Tiddlers' $index=<<MatchingTitle>> $value=true/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Generic Search and Replace/Selected Tiddlers##$(MatchingTitle)$\"\"\" text='true'>\n\t<$button class='tc-btn-invisible'>\n\t<input type='checkbox' checked=true/>\n\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Selected Tiddlers' $index=<<MatchingTitle>> $value=false/>\n\t</$button>\n</$reveal>\n\\end\n\n<$vars SearchTiddler='$:/plugins/inmysocks/TiddlerTool/TiddlerTool' IncludeSearchTiddler={{$:/temp/Generic Search and Replace/Search!!include_this_tiddler}} ShowFields={{$:/temp/Generic Search and Replace/Search!!show_fields}} IncludeSystem={{$:/temp/Generic Search and Replace/Search!!include_system_tiddlers}} IncludeTags={{$:/temp/Generic Search and Replace/Search!!include_tags}} IncludeText='-[[text]]' IncludeCreated={{$:/temp/Generic Search and Replace/Search!!include_created}} IncludeModified={{$:/temp/Generic Search and Replace/Search!!include_modified}} IncludeType={{$:/temp/Generic Search and Replace/Search!!include_type}} CaseSensitiveTitle={{$:/temp/Generic Search and Replace/Search!!case_sensitive_title}} CaseSensitiveTags={{$:/temp/Generic Search and Replace/Search!!case_sensitive_tags}} CaseSensitiveFields={{$:/temp/Generic Search and Replace/Search!!case_sensitive_fields}} CaseSensitiveContents={{$:/temp/Generic Search and Replace/Search!!case_sensitive_contents}} TitleSearchString={{$:/temp/Generic Search and Replace/Search!!tiddler_search_text}} TagsSearchString={{$:/temp/Generic Search and Replace/Search!!search_tag}} FieldSearchString={{$:/temp/Generic Search and Replace/Search!!field_name_search_text}} ContentsSearchString={{$:/temp/Generic Search and Replace/Search!!search_text}} TiddlerLimit=100>\n\t<<thisTable>>\n</$vars>"
        },
        "$:/plugins/inmysocks/TiddlerTool/Settings": {
            "case_sensitive_help": "If this is checked than the search is case sensitive.",
            "field_contents_column_help": "This lists the contents of the fields returned by the search. Clicking on the field contents lets you edit it.",
            "field_name_column_help": "This lists the field names returned by the search. Clicking on a field name lets you rename the field in that tiddler. Clicking on the plus icon lets you add a new field to the tiddler. Currently empty fields are not shown.",
            "fix_things_help": "If no search results are showing up click this button to reset everything to default values. You may also have to click on this button in order to initialize everything the first time you import this tiddler.",
            "include_created_field_help": "If this is checked than the created field is included in the list and search.",
            "include_modified_field_help": "If this is checked than the modified field is included in the list and search.",
            "include_system_tiddlers_help": "If this is checked than system tiddlers are included in the list.",
            "include_this_tiddler_help": "Checking this includes the search tiddler in the search results. You probably want to uncheck this.",
            "include_type_field_help": "If this is checked than the type field is included in the list and search.",
            "list_tags_as_a_field": "If this is checked than the tags field is treated the same as other fields for searches and in the table. Be careful with this because if a tiddler doesn't have a tags field than it won't be displayed in the table. A tiddler with an empty tags field will be displayed.",
            "override_tiddler_limit_help": "If this is checked than you can override the default 100 result limit. If it is checked than the number of tiddlers displayed is capped at 100. If you display a large number of tiddlers your wiki may respond very slowly.",
            "search_by_field_name_help": "This searches tiddlers by field name. If a tiddler has a field that matches the search the tiddler is listed.",
            "search_by_name_help": "This is used to search through tiddlers by name. Tiddlers with titles that match the search are listed.",
            "search_by_tag_help": "This searches tiddlers by tag. If a tiddler has a tag that matches the search it is listed.",
            "show_all_or_matching_fields_help": "If `All Fields` is selected than all fields of the displayed tiddlers are shown in the table. If `Only Matching Fields` is selected than only the fields that match the search in `Search by field name` are displayed.",
            "show_field_contents_help": "If this is checked than a fields contents is displayed along with the field title in the results table.",
            "show_fields_column_help": "If this is checked the fields column is visibe in the results table. Uncheck it to hide the column.",
            "show_tags_column_help": "If this is checked the tags column is visible in the results table. Uncheck it to hide the colmun.",
            "tags": "",
            "tags_table_column_help": "This lists the tags for each listed tiddler. It acts the same as the tag editing does when editing a tiddler normally.",
            "tiddler_table_column_help": "This lists the names of the tiddlers that match your search. Clicking on the icon next to the name will let you edit the tiddler title.",
            "title": "$:/plugins/inmysocks/TiddlerTool/Settings",
            "caption": "Settings",
            "text": "\\define thisHelpButton(label)\n^^(<$button popup=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\" class='tc-btn-invisible'>?</$button>)<$reveal type='popup' state=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\"><div class='tc-drop-down tc-popup-keep' style='max-width:75vw;text-overflow:ellipsis'><span style='margin-left:10px;margin-right:10px;'><$view field=\"\"\"$label$\"\"\" mode=block/></span></div></$reveal>^^\n\\end\n\nNotes: \n\n*Renaming the tags field doesn't work and may never work.\n*Searching by field contents requires some updates to the list widget so it will have to come later\n\nThings to add:\n\n*Batch add field\n*Batch remove field\n*Batch add tag\n*Batch remove tag\n*Batch delete tiddler\n*Batch search and replace field name\n*Batch search and replace field contents (based on field name, doing this based on contents requires some edits to the list widget)\n*Batch search and replace tag\n\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=include_system_tiddlers checked=\"[all[]]\" unchecked=\"[!is[system]]\">\n\tInclude system tiddlers\n</$checkbox><<thisHelpButton include_system_tiddlers_help>>\n<br>\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=include_this_tiddler checked=\"\" unchecked=\"-[<SearchTiddler>]\">\n\tInclude this tiddler\n</$checkbox><<thisHelpButton include_this_tiddler_help>>\n<br>\n<!-- Until I can search by field contents this is pointless\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=include_text checked='' unchecked='-[[text]]'>\n\tInclude text field\n</$checkbox> - Be careful using this one\n<br>\n-->\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=include_created checked='' unchecked='-[[created]]'>\n\tInclude created field\n</$checkbox><<thisHelpButton include_created_field_help>>\n<br>\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=include_modified checked='' unchecked='-[[modified]]'>\n\tInclude modified field\n</$checkbox><<thisHelpButton include_modified_field_help>>\n<br>\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=include_type checked='' unchecked='-[[type]]'>\n\tInclude type field\n</$checkbox><<thisHelpButton include_type_field_help>>\n<br>\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=show_tags checked='' unchecked='+[limit[1]]'>\n\tShow tags column\n</$checkbox><<thisHelpButton show_tags_column_help>>\n<br>\n<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=show_fields checked='' unchecked='+[limit[1]]'>\n\tShow fields column\n</$checkbox><<thisHelpButton show_fields_column_help>>\n<br>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!show_fields' text=''>\n\t<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=include_tags checked='' unchecked='-[[tags]]'>\n\t\tList tags as a field\n\t</$checkbox><<thisHelpButton list_tags_as_a_field>> - May cause unexpected behavior!!\n\t<br>\n\t<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=show_field_contents checked='' unchecked='false'>\n\t\tShow field contents\n\t</$checkbox><<thisHelpButton show_field_contents_help>>\n\t<br><br>\n\tShow<<thisHelpButton show_all_or_matching_fields_help>>:\n\t<$radio tiddler='$:/temp/Generic Search and Replace/Search' field='which_fields' value='all'>\n\t\tAll Fields\n\t</$radio>\n\t<$radio tiddler='$:/temp/Generic Search and Replace/Search' field='which_fields' value='matching'>\n\t\tOnly Matching Fields\n\t</$radio>\n</$reveal>\n<br>\n<$checkbox tiddler='$:/state/Generic Search and Replace/Override Tiddler Limit' field='text' checked='true' unchecked=''>\n\tOverride tiddler limit\n</$checkbox><<thisHelpButton override_tiddler_limit_help>>\n<br>\n<$reveal type='match' state='$:/state/Generic Search and Replace/Override Tiddler Limit' text='true'>\n\tLimit the results to the first <$select tiddler='$:/state/Generic Search and Replace/Override Tiddler Limit' field='tiddler_limit'><$list filter='[[1]] [[2]] [[3]] [[4]] [[5]] [[6]] [[7]] [[8]] [[9]] [[10]] [[20]] [[30]] [[40]] [[50]] [[100]] [[1000]] [[2000]]'><option><<currentTiddler>></option></$list></$select> tiddlers\n</$reveal>"
        },
        "$:/plugins/inmysocks/TiddlerTool/TiddlerTool": {
            "caption": "TiddlerTool",
            "title": "$:/plugins/inmysocks/TiddlerTool/TiddlerTool",
            "case_sensitive_help": "If this is checked than the search is case sensitive.",
            "fix_things_help": "If no search results are showing up click this button to reset everything to default values. You may also have to click on this button in order to initialize everything the first time you import this tiddler.",
            "search_by_field_name_help": "This searches tiddlers by field name. If a tiddler has a field that matches the search the tiddler is listed.",
            "search_by_name_help": "This is used to search through tiddlers by name. Tiddlers with titles that match the search are listed.",
            "search_by_tag_help": "This searches tiddlers by tag. If a tiddler has a tag that matches the search it is listed.",
            "tags": "$:/tags/ControlPanel",
            "pick_bulk_action_help": "You can select one of these options to perform actions on all tiddlers returned by a search or the selected tiddlers instead of modifying them individually.",
            "text": "\\define thisHelpButton(label)\n^^(<$button popup=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\" class='tc-btn-invisible'>?</$button>)<$reveal type='popup' state=\"\"\"$:/temp/popup/$(currentTiddler)$/$label$\"\"\"><div class='tc-drop-down tc-popup-keep' style='max-width:75vw;text-overflow:ellipsis'><span style='margin-left:10px;margin-right:10px;'><$view field=\"\"\"$label$\"\"\" mode=block/></span></div></$reveal>^^\n\\end\n\n<$reveal type='nomatch' state='$:/temp/Generic Search and Replace/Search!!initialized' text=true>\n\tIt looks like this is the first time you are using this tool, or you have just upgraded your wiki. Some default values need to be set before the wiki will work correctly. These options can be changed later by clicking on the `Advanced Settings` button later.\n\n\t<$button>\n\t\tClick me to get started!\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=initialized $value=true/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field='include_system_tiddlers' $value='[!is[system]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field='include_this_tiddler' $value=\"-[<SearchTiddler>]\"/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_created $value='-[[created]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_modified $value='-[[modified]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_type $value='-[[type]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=show_tags $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=show_fields $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_tags $value='-[[tags]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=show_field_contents $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=which_fields $value='all'/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Override Tiddler Limit' $field='text' $value=''/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state='$:/temp/Generic Search and Replace/Search!!initialized' text=true>\n\tSearch by tiddler name<<thisHelpButton search_by_name_help>> (<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=case_sensitive_title checked='' unchecked='(?i)'>Case sensitive</$checkbox><<thisHelpButton case_sensitive_help>>):\n\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Search' placeholder='Search Tiddlers by Title' field=tiddler_search_text class='tc-edit-texteditor'/><br>\n\tSearch by field name<<thisHelpButton search_by_field_name_help>> (<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=case_sensitive_fields checked='' unchecked='(?i)'>Case sensitive</$checkbox><<thisHelpButton case_sensitive_help>>):\n\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Search' placeholder='Search Field Names' field=field_name_search_text class='tc-edit-texteditor'/><br>\n\tSearch by tag<<thisHelpButton search_by_tag_help>> (<$checkbox tiddler='$:/temp/Generic Search and Replace/Search' field=case_sensitive_tags checked='' unchecked='(?i)'>Case sensitive</$checkbox><<thisHelpButton case_sensitive_help>>):\n\t<$edit-text tiddler='$:/temp/Generic Search and Replace/Search' placeholder='Search by Tag' field=search_tag class='tc-edit-texteditor'/><br>\n\n\t<$reveal type='nomatch' state='$:/state/Generic Search and Replace/Selected Action!!show' text=show>\n\t\t<$button>\n\t\t\tShow Batch Actions\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Selected Action' $field='show' $value='show'/>\n\t\t</$button>\n\t</$reveal>\n\t<$reveal type='match' state='$:/state/Generic Search and Replace/Selected Action!!show' text=show>\n\t\t<$button>\n\t\t\tHide Batch Actions\n\t\t\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Selection Action' $field='show' $value='hide'/>\n\t\t</$button>\n\t\t<$transclude tiddler='$:/plugins/inmysocks/TiddlerTool/Batch Actions' mode=block/>\n\t</$reveal>\n\n\t<<tabs tabsList:\"[[$:/plugins/inmysocks/TiddlerTool/Search Results]][[$:/plugins/inmysocks/TiddlerTool/Selected Tiddlers]][[$:/plugins/inmysocks/TiddlerTool/Settings]]\" default:\"$:/plugins/inmysocks/TiddlerTool/Search Results\">>\n\n\t<$button>\n\t\tFix Things\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=initialized $value=true/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field='include_system_tiddlers' $value='[!is[system]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field='include_this_tiddler' $value=\"-[<SearchTiddler>]\"/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_created $value='-[[created]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_modified $value='-[[modified]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_type $value='-[[type]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=show_tags $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=show_fields $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=include_tags $value='-[[tags]]'/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=show_field_contents $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Generic Search and Replace/Search' $field=which_fields $value='all'/>\n\t\t<$action-setfield $tiddler='$:/state/Generic Search and Replace/Override Tiddler Limit' $field='text' $value=''/>\n\t</$button><<thisHelpButton fix_things_help>>\n</$reveal>"
        }
    }
}
{
    "tiddlers": {
        "$:/config/EditorTypeMappings/application/javascript": {
            "title": "$:/config/EditorTypeMappings/application/javascript",
            "text": "codemirror"
        },
        "$:/config/EditorTypeMappings/application/json": {
            "title": "$:/config/EditorTypeMappings/application/json",
            "text": "codemirror"
        },
        "$:/config/EditorTypeMappings/application/x-tiddler-dictionary": {
            "title": "$:/config/EditorTypeMappings/application/x-tiddler-dictionary",
            "text": "codemirror"
        },
        "$:/config/EditorTypeMappings/text/css": {
            "title": "$:/config/EditorTypeMappings/text/css",
            "text": "codemirror"
        },
        "$:/config/EditorTypeMappings/text/html": {
            "title": "$:/config/EditorTypeMappings/text/html",
            "text": "codemirror"
        },
        "$:/config/EditorTypeMappings/text/plain": {
            "title": "$:/config/EditorTypeMappings/text/plain",
            "text": "codemirror"
        },
        "$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
            "title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
            "text": "codemirror"
        },
        "$:/config/EditorTypeMappings/text/x-tiddlywiki": {
            "title": "$:/config/EditorTypeMappings/text/x-tiddlywiki",
            "text": "codemirror"
        },
        "$:/core/modules/widgets/edit-codemirror.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-codemirror.js\ntype: application/javascript\nmodule-type: widget\n\nCodemirror-based text editor widget\n\nConfig options \"$:/config/CodeMirror\" e.g. to allow vim key bindings\n {\n\t\"require\": [\n\t\t\"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js\",\n\t\t\"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js\",\n\t\t\"$:/plugins/tiddlywiki/codemirror/keymap/vim.js\"\n\t],\n\t\"configuration\": {\n\t\t\t\"keyMap\": \"vim\",\n\t\t\t\"showCursorWhenSelecting\": true\n\t}\n}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CODEMIRROR_OPTIONS = \"$:/config/CodeMirror\";\n\n// Install CodeMirror\nif($tw.browser && !window.CodeMirror) {\n\twindow.CodeMirror = require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js\");\n\t// Install required CodeMirror plugins\n\tvar configOptions = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}),\n\t\treq = configOptions.require;\n\tif(req) {\n\t\tif($tw.utils.isArray(req)) {\n\t\t\tfor(var index=0; index<req.length; index++) {\n\t\t\t\trequire(req[index]);\n\t\t\t}\n\t\t} else {\n\t\t\trequire(req);\n\t\t}\n\t}\n}\n\nvar MIN_TEXT_AREA_HEIGHT = 100; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditCodeMirrorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditCodeMirrorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditCodeMirrorWidget.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// Get the configuration options for the CodeMirror object\n\tvar config = $tw.wiki.getTiddlerData(CODEMIRROR_OPTIONS,{}).configuration || {},\n\t\teditInfo = this.getEditInfo();\n\tif(!(\"lineWrapping\" in config)) {\n\t\tconfig.lineWrapping = true;\n\t}\n\tif(!(\"lineNumbers\" in config)) {\n\t\tconfig.lineNumbers = true;\n\t}\n\tconfig.mode = editInfo.type;\n\tconfig.value = editInfo.value;\n\t// Create the CodeMirror instance\n\tvar cm = window.CodeMirror(function(domNode) {\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tself.domNodes.push(domNode);\n\t},config);\n\t// Set up a change event handler\n\tcm.on(\"change\",function() {\n\t\tself.saveChanges(cm.getValue());\n\t});\n\tthis.codeMirrorInstance = cm;\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditCodeMirrorWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\ttype = \"text/plain\",\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\tif(this.editField === \"text\") {\n\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t}\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\ttype = \"text/vnd.tiddlywiki\";\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\tif(this.editType) {\n\t\ttype = this.editType;\n\t}\n\treturn {value: value || \"\", type: type, update: update};\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditCodeMirrorWidget.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.editType = this.getAttribute(\"type\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditCodeMirrorWidget.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) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.editTitle]) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text and type. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditCodeMirrorWidget.prototype.updateEditor = function(text,type) {\n\tthis.updateEditorDomNode(text);\n\tthis.codeMirrorInstance.setOption(\"mode\",type);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditCodeMirrorWidget.prototype.updateEditorDomNode = function(text) {\n\tif(this.codeMirrorInstance) {\n\t\tif(!this.codeMirrorInstance.hasFocus()) {\n\t\t\tthis.codeMirrorInstance.setValue(text);\n\t\t}\n\t}\n};\n\nEditCodeMirrorWidget.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-codemirror\"] = EditCodeMirrorWidget;\n\n})();\n",
            "title": "$:/core/modules/widgets/edit-codemirror.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/tiddlywiki/codemirror/lib/codemirror.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.js",
            "module-type": "library",
            "text": "// This is CodeMirror (http://codemirror.net), a code editor\n// implemented in JavaScript on top of the browser's DOM.\n//\n// You can find some technical background for some of the code below\n// at http://marijnhaverbeke.nl/blog/#cm-internals .\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    module.exports = mod();\n  else if (typeof define == \"function\" && define.amd) // AMD\n    return define([], mod);\n  else // Plain browser env\n    this.CodeMirror = mod();\n})(function() {\n  \"use strict\";\n\n  // BROWSER SNIFFING\n\n  // Kludges for bugs and behavior differences that can't be feature\n  // detected are enabled based on userAgent etc sniffing.\n\n  var gecko = /gecko\\/\\d/i.test(navigator.userAgent);\n  // ie_uptoN means Internet Explorer version N or lower\n  var ie_upto10 = /MSIE \\d/.test(navigator.userAgent);\n  var ie_upto7 = ie_upto10 && (document.documentMode == null || document.documentMode < 8);\n  var ie_upto8 = ie_upto10 && (document.documentMode == null || document.documentMode < 9);\n  var ie_upto9 = ie_upto10 && (document.documentMode == null || document.documentMode < 10);\n  var ie_11up = /Trident\\/([7-9]|\\d{2,})\\./.test(navigator.userAgent);\n  var ie = ie_upto10 || ie_11up;\n  var webkit = /WebKit\\//.test(navigator.userAgent);\n  var qtwebkit = webkit && /Qt\\/\\d+\\.\\d+/.test(navigator.userAgent);\n  var chrome = /Chrome\\//.test(navigator.userAgent);\n  var presto = /Opera\\//.test(navigator.userAgent);\n  var safari = /Apple Computer/.test(navigator.vendor);\n  var khtml = /KHTML\\//.test(navigator.userAgent);\n  var mac_geMountainLion = /Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(navigator.userAgent);\n  var phantom = /PhantomJS/.test(navigator.userAgent);\n\n  var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\\/\\w+/.test(navigator.userAgent);\n  // This is woefully incomplete. Suggestions for alternative methods welcome.\n  var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);\n  var mac = ios || /Mac/.test(navigator.platform);\n  var windows = /win/i.test(navigator.platform);\n\n  var presto_version = presto && navigator.userAgent.match(/Version\\/(\\d*\\.\\d*)/);\n  if (presto_version) presto_version = Number(presto_version[1]);\n  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }\n  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X\n  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));\n  var captureRightClick = gecko || (ie && !ie_upto8);\n\n  // Optimize some code when these features are not used.\n  var sawReadOnlySpans = false, sawCollapsedSpans = false;\n\n  // EDITOR CONSTRUCTOR\n\n  // A CodeMirror instance represents an editor. This is the object\n  // that user code is usually dealing with.\n\n  function CodeMirror(place, options) {\n    if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);\n\n    this.options = options = options || {};\n    // Determine effective options based on given values and defaults.\n    copyObj(defaults, options, false);\n    setGuttersForLineNumbers(options);\n\n    var doc = options.value;\n    if (typeof doc == \"string\") doc = new Doc(doc, options.mode);\n    this.doc = doc;\n\n    var display = this.display = new Display(place, doc);\n    display.wrapper.CodeMirror = this;\n    updateGutters(this);\n    themeChanged(this);\n    if (options.lineWrapping)\n      this.display.wrapper.className += \" CodeMirror-wrap\";\n    if (options.autofocus && !mobile) focusInput(this);\n\n    this.state = {\n      keyMaps: [],  // stores maps added by addKeyMap\n      overlays: [], // highlighting overlays, as added by addOverlay\n      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info\n      overwrite: false, focused: false,\n      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode\n      pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in readInput\n      draggingText: false,\n      highlight: new Delayed() // stores highlight worker timeout\n    };\n\n    // Override magic textarea content restore that IE sometimes does\n    // on our hidden textarea on reload\n    if (ie_upto10) setTimeout(bind(resetInput, this, true), 20);\n\n    registerEventHandlers(this);\n    ensureGlobalHandlers();\n\n    var cm = this;\n    runInOp(this, function() {\n      cm.curOp.forceUpdate = true;\n      attachDoc(cm, doc);\n\n      if ((options.autofocus && !mobile) || activeElt() == display.input)\n        setTimeout(bind(onFocus, cm), 20);\n      else\n        onBlur(cm);\n\n      for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))\n        optionHandlers[opt](cm, options[opt], Init);\n      for (var i = 0; i < initHooks.length; ++i) initHooks[i](cm);\n    });\n  }\n\n  // DISPLAY CONSTRUCTOR\n\n  // The display handles the DOM integration, both for input reading\n  // and content drawing. It holds references to DOM nodes and\n  // display-related state.\n\n  function Display(place, doc) {\n    var d = this;\n\n    // The semihidden textarea that is focused when the editor is\n    // focused, and receives input.\n    var input = d.input = elt(\"textarea\", null, null, \"position: absolute; padding: 0; width: 1px; height: 1em; outline: none\");\n    // The textarea is kept positioned near the cursor to prevent the\n    // fact that it'll be scrolled into view on input from scrolling\n    // our fake cursor out of view. On webkit, when wrap=off, paste is\n    // very slow. So make the area wide instead.\n    if (webkit) input.style.width = \"1000px\";\n    else input.setAttribute(\"wrap\", \"off\");\n    // If border: 0; -- iOS fails to open keyboard (issue #1287)\n    if (ios) input.style.border = \"1px solid black\";\n    input.setAttribute(\"autocorrect\", \"off\"); input.setAttribute(\"autocapitalize\", \"off\"); input.setAttribute(\"spellcheck\", \"false\");\n\n    // Wraps and hides input textarea\n    d.inputDiv = elt(\"div\", [input], null, \"overflow: hidden; position: relative; width: 3px; height: 0px;\");\n    // The fake scrollbar elements.\n    d.scrollbarH = elt(\"div\", [elt(\"div\", null, null, \"height: 100%; min-height: 1px\")], \"CodeMirror-hscrollbar\");\n    d.scrollbarV = elt(\"div\", [elt(\"div\", null, null, \"min-width: 1px\")], \"CodeMirror-vscrollbar\");\n    // Covers bottom-right square when both scrollbars are present.\n    d.scrollbarFiller = elt(\"div\", null, \"CodeMirror-scrollbar-filler\");\n    // Covers bottom of gutter when coverGutterNextToScrollbar is on\n    // and h scrollbar is present.\n    d.gutterFiller = elt(\"div\", null, \"CodeMirror-gutter-filler\");\n    // Will contain the actual code, positioned to cover the viewport.\n    d.lineDiv = elt(\"div\", null, \"CodeMirror-code\");\n    // Elements are added to these to represent selection and cursors.\n    d.selectionDiv = elt(\"div\", null, null, \"position: relative; z-index: 1\");\n    d.cursorDiv = elt(\"div\", null, \"CodeMirror-cursors\");\n    // A visibility: hidden element used to find the size of things.\n    d.measure = elt(\"div\", null, \"CodeMirror-measure\");\n    // When lines outside of the viewport are measured, they are drawn in this.\n    d.lineMeasure = elt(\"div\", null, \"CodeMirror-measure\");\n    // Wraps everything that needs to exist inside the vertically-padded coordinate system\n    d.lineSpace = elt(\"div\", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],\n                      null, \"position: relative; outline: none\");\n    // Moved around its parent to cover visible view.\n    d.mover = elt(\"div\", [elt(\"div\", [d.lineSpace], \"CodeMirror-lines\")], null, \"position: relative\");\n    // Set to the height of the document, allowing scrolling.\n    d.sizer = elt(\"div\", [d.mover], \"CodeMirror-sizer\");\n    // Behavior of elts with overflow: auto and padding is\n    // inconsistent across browsers. This is used to ensure the\n    // scrollable area is big enough.\n    d.heightForcer = elt(\"div\", null, null, \"position: absolute; height: \" + scrollerCutOff + \"px; width: 1px;\");\n    // Will contain the gutters, if any.\n    d.gutters = elt(\"div\", null, \"CodeMirror-gutters\");\n    d.lineGutter = null;\n    // Actual scrollable element.\n    d.scroller = elt(\"div\", [d.sizer, d.heightForcer, d.gutters], \"CodeMirror-scroll\");\n    d.scroller.setAttribute(\"tabIndex\", \"-1\");\n    // The element in which the editor lives.\n    d.wrapper = elt(\"div\", [d.inputDiv, d.scrollbarH, d.scrollbarV,\n                            d.scrollbarFiller, d.gutterFiller, d.scroller], \"CodeMirror\");\n\n    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)\n    if (ie_upto7) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }\n    // Needed to hide big blue blinking cursor on Mobile Safari\n    if (ios) input.style.width = \"0px\";\n    if (!webkit) d.scroller.draggable = true;\n    // Needed to handle Tab key in KHTML\n    if (khtml) { d.inputDiv.style.height = \"1px\"; d.inputDiv.style.position = \"absolute\"; }\n    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).\n    if (ie_upto7) d.scrollbarH.style.minHeight = d.scrollbarV.style.minWidth = \"18px\";\n\n    if (place.appendChild) place.appendChild(d.wrapper);\n    else place(d.wrapper);\n\n    // Current rendered range (may be bigger than the view window).\n    d.viewFrom = d.viewTo = doc.first;\n    // Information about the rendered lines.\n    d.view = [];\n    // Holds info about a single rendered line when it was rendered\n    // for measurement, while not in view.\n    d.externalMeasured = null;\n    // Empty space (in pixels) above the view\n    d.viewOffset = 0;\n    d.lastSizeC = 0;\n    d.updateLineNumbers = null;\n\n    // Used to only resize the line number gutter when necessary (when\n    // the amount of lines crosses a boundary that makes its width change)\n    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;\n    // See readInput and resetInput\n    d.prevInput = \"\";\n    // Set to true when a non-horizontal-scrolling line widget is\n    // added. As an optimization, line widget aligning is skipped when\n    // this is false.\n    d.alignWidgets = false;\n    // Flag that indicates whether we expect input to appear real soon\n    // now (after some event like 'keypress' or 'input') and are\n    // polling intensively.\n    d.pollingFast = false;\n    // Self-resetting timeout for the poller\n    d.poll = new Delayed();\n\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n\n    // Tracks when resetInput has punted to just putting a short\n    // string into the textarea instead of the full selection.\n    d.inaccurateSelection = false;\n\n    // Tracks the maximum line length so that the horizontal scrollbar\n    // can be kept static when scrolling.\n    d.maxLine = null;\n    d.maxLineLength = 0;\n    d.maxLineChanged = false;\n\n    // Used for measuring wheel scrolling granularity\n    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;\n\n    // True when shift is held down.\n    d.shift = false;\n\n    // Used to track whether anything happened since the context menu\n    // was opened.\n    d.selForContextMenu = null;\n  }\n\n  // STATE UPDATES\n\n  // Used to get the editor into a consistent state again when options change.\n\n  function loadMode(cm) {\n    cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);\n    resetModeState(cm);\n  }\n\n  function resetModeState(cm) {\n    cm.doc.iter(function(line) {\n      if (line.stateAfter) line.stateAfter = null;\n      if (line.styles) line.styles = null;\n    });\n    cm.doc.frontier = cm.doc.first;\n    startWorker(cm, 100);\n    cm.state.modeGen++;\n    if (cm.curOp) regChange(cm);\n  }\n\n  function wrappingChanged(cm) {\n    if (cm.options.lineWrapping) {\n      addClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      cm.display.sizer.style.minWidth = \"\";\n    } else {\n      rmClass(cm.display.wrapper, \"CodeMirror-wrap\");\n      findMaxLine(cm);\n    }\n    estimateLineHeights(cm);\n    regChange(cm);\n    clearCaches(cm);\n    setTimeout(function(){updateScrollbars(cm);}, 100);\n  }\n\n  // Returns a function that estimates the height of a line, to use as\n  // first approximation until the line becomes visible (and is thus\n  // properly measurable).\n  function estimateHeight(cm) {\n    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;\n    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);\n    return function(line) {\n      if (lineIsHidden(cm.doc, line)) return 0;\n\n      var widgetsHeight = 0;\n      if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {\n        if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;\n      }\n\n      if (wrapping)\n        return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;\n      else\n        return widgetsHeight + th;\n    };\n  }\n\n  function estimateLineHeights(cm) {\n    var doc = cm.doc, est = estimateHeight(cm);\n    doc.iter(function(line) {\n      var estHeight = est(line);\n      if (estHeight != line.height) updateLineHeight(line, estHeight);\n    });\n  }\n\n  function keyMapChanged(cm) {\n    var map = keyMap[cm.options.keyMap], style = map.style;\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-keymap-\\S+/g, \"\") +\n      (style ? \" cm-keymap-\" + style : \"\");\n  }\n\n  function themeChanged(cm) {\n    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\\s*cm-s-\\S+/g, \"\") +\n      cm.options.theme.replace(/(^|\\s)\\s*/g, \" cm-s-\");\n    clearCaches(cm);\n  }\n\n  function guttersChanged(cm) {\n    updateGutters(cm);\n    regChange(cm);\n    setTimeout(function(){alignHorizontally(cm);}, 20);\n  }\n\n  // Rebuild the gutter elements, ensure the margin to the left of the\n  // code matches their width.\n  function updateGutters(cm) {\n    var gutters = cm.display.gutters, specs = cm.options.gutters;\n    removeChildren(gutters);\n    for (var i = 0; i < specs.length; ++i) {\n      var gutterClass = specs[i];\n      var gElt = gutters.appendChild(elt(\"div\", null, \"CodeMirror-gutter \" + gutterClass));\n      if (gutterClass == \"CodeMirror-linenumbers\") {\n        cm.display.lineGutter = gElt;\n        gElt.style.width = (cm.display.lineNumWidth || 1) + \"px\";\n      }\n    }\n    gutters.style.display = i ? \"\" : \"none\";\n    updateGutterSpace(cm);\n  }\n\n  function updateGutterSpace(cm) {\n    var width = cm.display.gutters.offsetWidth;\n    cm.display.sizer.style.marginLeft = width + \"px\";\n    cm.display.scrollbarH.style.left = cm.options.fixedGutter ? width + \"px\" : 0;\n  }\n\n  // Compute the character length of a line, taking into account\n  // collapsed ranges (see markText) that might hide parts, and join\n  // other lines onto it.\n  function lineLength(line) {\n    if (line.height == 0) return 0;\n    var len = line.text.length, merged, cur = line;\n    while (merged = collapsedSpanAtStart(cur)) {\n      var found = merged.find(0, true);\n      cur = found.from.line;\n      len += found.from.ch - found.to.ch;\n    }\n    cur = line;\n    while (merged = collapsedSpanAtEnd(cur)) {\n      var found = merged.find(0, true);\n      len -= cur.text.length - found.from.ch;\n      cur = found.to.line;\n      len += cur.text.length - found.to.ch;\n    }\n    return len;\n  }\n\n  // Find the longest line in the document.\n  function findMaxLine(cm) {\n    var d = cm.display, doc = cm.doc;\n    d.maxLine = getLine(doc, doc.first);\n    d.maxLineLength = lineLength(d.maxLine);\n    d.maxLineChanged = true;\n    doc.iter(function(line) {\n      var len = lineLength(line);\n      if (len > d.maxLineLength) {\n        d.maxLineLength = len;\n        d.maxLine = line;\n      }\n    });\n  }\n\n  // Make sure the gutters options contains the element\n  // \"CodeMirror-linenumbers\" when the lineNumbers option is true.\n  function setGuttersForLineNumbers(options) {\n    var found = indexOf(options.gutters, \"CodeMirror-linenumbers\");\n    if (found == -1 && options.lineNumbers) {\n      options.gutters = options.gutters.concat([\"CodeMirror-linenumbers\"]);\n    } else if (found > -1 && !options.lineNumbers) {\n      options.gutters = options.gutters.slice(0);\n      options.gutters.splice(found, 1);\n    }\n  }\n\n  // SCROLLBARS\n\n  // Prepare DOM reads needed to update the scrollbars. Done in one\n  // shot to minimize update/measure roundtrips.\n  function measureForScrollbars(cm) {\n    var scroll = cm.display.scroller;\n    return {\n      clientHeight: scroll.clientHeight,\n      barHeight: cm.display.scrollbarV.clientHeight,\n      scrollWidth: scroll.scrollWidth, clientWidth: scroll.clientWidth,\n      barWidth: cm.display.scrollbarH.clientWidth,\n      docHeight: Math.round(cm.doc.height + paddingVert(cm.display))\n    };\n  }\n\n  // Re-synchronize the fake scrollbars with the actual size of the\n  // content.\n  function updateScrollbars(cm, measure) {\n    if (!measure) measure = measureForScrollbars(cm);\n    var d = cm.display;\n    var scrollHeight = measure.docHeight + scrollerCutOff;\n    var needsH = measure.scrollWidth > measure.clientWidth;\n    var needsV = scrollHeight > measure.clientHeight;\n    if (needsV) {\n      d.scrollbarV.style.display = \"block\";\n      d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + \"px\" : \"0\";\n      // A bug in IE8 can cause this value to be negative, so guard it.\n      d.scrollbarV.firstChild.style.height =\n        Math.max(0, scrollHeight - measure.clientHeight + (measure.barHeight || d.scrollbarV.clientHeight)) + \"px\";\n    } else {\n      d.scrollbarV.style.display = \"\";\n      d.scrollbarV.firstChild.style.height = \"0\";\n    }\n    if (needsH) {\n      d.scrollbarH.style.display = \"block\";\n      d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + \"px\" : \"0\";\n      d.scrollbarH.firstChild.style.width =\n        (measure.scrollWidth - measure.clientWidth + (measure.barWidth || d.scrollbarH.clientWidth)) + \"px\";\n    } else {\n      d.scrollbarH.style.display = \"\";\n      d.scrollbarH.firstChild.style.width = \"0\";\n    }\n    if (needsH && needsV) {\n      d.scrollbarFiller.style.display = \"block\";\n      d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + \"px\";\n    } else d.scrollbarFiller.style.display = \"\";\n    if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {\n      d.gutterFiller.style.display = \"block\";\n      d.gutterFiller.style.height = scrollbarWidth(d.measure) + \"px\";\n      d.gutterFiller.style.width = d.gutters.offsetWidth + \"px\";\n    } else d.gutterFiller.style.display = \"\";\n\n    if (!cm.state.checkedOverlayScrollbar && measure.clientHeight > 0) {\n      if (scrollbarWidth(d.measure) === 0) {\n        var w = mac && !mac_geMountainLion ? \"12px\" : \"18px\";\n        d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;\n        var barMouseDown = function(e) {\n          if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)\n            operation(cm, onMouseDown)(e);\n        };\n        on(d.scrollbarV, \"mousedown\", barMouseDown);\n        on(d.scrollbarH, \"mousedown\", barMouseDown);\n      }\n      cm.state.checkedOverlayScrollbar = true;\n    }\n  }\n\n  // Compute the lines that are visible in a given viewport (defaults\n  // the the current scroll position). viewPort may contain top,\n  // height, and ensure (see op.scrollToPos) properties.\n  function visibleLines(display, doc, viewPort) {\n    var top = viewPort && viewPort.top != null ? viewPort.top : display.scroller.scrollTop;\n    top = Math.floor(top - paddingTop(display));\n    var bottom = viewPort && viewPort.bottom != null ? viewPort.bottom : top + display.wrapper.clientHeight;\n\n    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);\n    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and\n    // forces those lines into the viewport (if possible).\n    if (viewPort && viewPort.ensure) {\n      var ensureFrom = viewPort.ensure.from.line, ensureTo = viewPort.ensure.to.line;\n      if (ensureFrom < from)\n        return {from: ensureFrom,\n                to: lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight)};\n      if (Math.min(ensureTo, doc.lastLine()) >= to)\n        return {from: lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight),\n                to: ensureTo};\n    }\n    return {from: from, to: to};\n  }\n\n  // LINE NUMBERS\n\n  // Re-align line numbers and gutter marks to compensate for\n  // horizontal scrolling.\n  function alignHorizontally(cm) {\n    var display = cm.display, view = display.view;\n    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;\n    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;\n    var gutterW = display.gutters.offsetWidth, left = comp + \"px\";\n    for (var i = 0; i < view.length; i++) if (!view[i].hidden) {\n      if (cm.options.fixedGutter && view[i].gutter)\n        view[i].gutter.style.left = left;\n      var align = view[i].alignable;\n      if (align) for (var j = 0; j < align.length; j++)\n        align[j].style.left = left;\n    }\n    if (cm.options.fixedGutter)\n      display.gutters.style.left = (comp + gutterW) + \"px\";\n  }\n\n  // Used to ensure that the line number gutter is still the right\n  // size for the current document size. Returns true when an update\n  // is needed.\n  function maybeUpdateLineNumberWidth(cm) {\n    if (!cm.options.lineNumbers) return false;\n    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;\n    if (last.length != display.lineNumChars) {\n      var test = display.measure.appendChild(elt(\"div\", [elt(\"div\", last)],\n                                                 \"CodeMirror-linenumber CodeMirror-gutter-elt\"));\n      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;\n      display.lineGutter.style.width = \"\";\n      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);\n      display.lineNumWidth = display.lineNumInnerWidth + padding;\n      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;\n      display.lineGutter.style.width = display.lineNumWidth + \"px\";\n      updateGutterSpace(cm);\n      return true;\n    }\n    return false;\n  }\n\n  function lineNumberFor(options, i) {\n    return String(options.lineNumberFormatter(i + options.firstLineNumber));\n  }\n\n  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,\n  // but using getBoundingClientRect to get a sub-pixel-accurate\n  // result.\n  function compensateForHScroll(display) {\n    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;\n  }\n\n  // DISPLAY DRAWING\n\n  // Updates the display, selection, and scrollbars, using the\n  // information in display.view to find out which nodes are no longer\n  // up-to-date. Tries to bail out early when no changes are needed,\n  // unless forced is true.\n  // Returns true if an actual update happened, false otherwise.\n  function updateDisplay(cm, viewPort, forced) {\n    var oldFrom = cm.display.viewFrom, oldTo = cm.display.viewTo, updated;\n    var visible = visibleLines(cm.display, cm.doc, viewPort);\n    for (var first = true;; first = false) {\n      var oldWidth = cm.display.scroller.clientWidth;\n      if (!updateDisplayInner(cm, visible, forced)) break;\n      updated = true;\n\n      // If the max line changed since it was last measured, measure it,\n      // and ensure the document's width matches it.\n      if (cm.display.maxLineChanged && !cm.options.lineWrapping)\n        adjustContentWidth(cm);\n\n      var barMeasure = measureForScrollbars(cm);\n      updateSelection(cm);\n      setDocumentHeight(cm, barMeasure);\n      updateScrollbars(cm, barMeasure);\n      if (webkit && cm.options.lineWrapping)\n        checkForWebkitWidthBug(cm, barMeasure); // (Issue #2420)\n      if (first && cm.options.lineWrapping && oldWidth != cm.display.scroller.clientWidth) {\n        forced = true;\n        continue;\n      }\n      forced = false;\n\n      // Clip forced viewport to actual scrollable area.\n      if (viewPort && viewPort.top != null)\n        viewPort = {top: Math.min(barMeasure.docHeight - scrollerCutOff - barMeasure.clientHeight, viewPort.top)};\n      // Updated line heights might result in the drawn area not\n      // actually covering the viewport. Keep looping until it does.\n      visible = visibleLines(cm.display, cm.doc, viewPort);\n      if (visible.from >= cm.display.viewFrom && visible.to <= cm.display.viewTo)\n        break;\n    }\n\n    cm.display.updateLineNumbers = null;\n    if (updated) {\n      signalLater(cm, \"update\", cm);\n      if (cm.display.viewFrom != oldFrom || cm.display.viewTo != oldTo)\n        signalLater(cm, \"viewportChange\", cm, cm.display.viewFrom, cm.display.viewTo);\n    }\n    return updated;\n  }\n\n  // Does the actual updating of the line display. Bails out\n  // (returning false) when there is nothing to be done and forced is\n  // false.\n  function updateDisplayInner(cm, visible, forced) {\n    var display = cm.display, doc = cm.doc;\n    if (!display.wrapper.offsetWidth) {\n      resetView(cm);\n      return;\n    }\n\n    // Bail out if the visible area is already rendered and nothing changed.\n    if (!forced && visible.from >= display.viewFrom && visible.to <= display.viewTo &&\n        countDirtyView(cm) == 0)\n      return;\n\n    if (maybeUpdateLineNumberWidth(cm))\n      resetView(cm);\n    var dims = getDimensions(cm);\n\n    // Compute a suitable new viewport (from & to)\n    var end = doc.first + doc.size;\n    var from = Math.max(visible.from - cm.options.viewportMargin, doc.first);\n    var to = Math.min(end, visible.to + cm.options.viewportMargin);\n    if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);\n    if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);\n    if (sawCollapsedSpans) {\n      from = visualLineNo(cm.doc, from);\n      to = visualLineEndNo(cm.doc, to);\n    }\n\n    var different = from != display.viewFrom || to != display.viewTo ||\n      display.lastSizeC != display.wrapper.clientHeight;\n    adjustView(cm, from, to);\n\n    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));\n    // Position the mover div to align with the current scroll position\n    cm.display.mover.style.top = display.viewOffset + \"px\";\n\n    var toUpdate = countDirtyView(cm);\n    if (!different && toUpdate == 0 && !forced) return;\n\n    // For big changes, we hide the enclosing element during the\n    // update, since that speeds up the operations on most browsers.\n    var focused = activeElt();\n    if (toUpdate > 4) display.lineDiv.style.display = \"none\";\n    patchDisplay(cm, display.updateLineNumbers, dims);\n    if (toUpdate > 4) display.lineDiv.style.display = \"\";\n    // There might have been a widget with a focused element that got\n    // hidden or updated, if so re-focus it.\n    if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();\n\n    // Prevent selection and cursors from interfering with the scroll\n    // width.\n    removeChildren(display.cursorDiv);\n    removeChildren(display.selectionDiv);\n\n    if (different) {\n      display.lastSizeC = display.wrapper.clientHeight;\n      startWorker(cm, 400);\n    }\n\n    updateHeightsInViewport(cm);\n\n    return true;\n  }\n\n  function adjustContentWidth(cm) {\n    var display = cm.display;\n    var width = measureChar(cm, display.maxLine, display.maxLine.text.length).left;\n    display.maxLineChanged = false;\n    var minWidth = Math.max(0, width + 3);\n    var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + minWidth + scrollerCutOff - display.scroller.clientWidth);\n    display.sizer.style.minWidth = minWidth + \"px\";\n    if (maxScrollLeft < cm.doc.scrollLeft)\n      setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true);\n  }\n\n  function setDocumentHeight(cm, measure) {\n    cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = measure.docHeight + \"px\";\n    cm.display.gutters.style.height = Math.max(measure.docHeight, measure.clientHeight - scrollerCutOff) + \"px\";\n  }\n\n\n  function checkForWebkitWidthBug(cm, measure) {\n    // Work around Webkit bug where it sometimes reserves space for a\n    // non-existing phantom scrollbar in the scroller (Issue #2420)\n    if (cm.display.sizer.offsetWidth + cm.display.gutters.offsetWidth < cm.display.scroller.clientWidth - 1) {\n      cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = \"0px\";\n      cm.display.gutters.style.height = measure.docHeight + \"px\";\n    }\n  }\n\n  // Read the actual heights of the rendered lines, and update their\n  // stored heights to match.\n  function updateHeightsInViewport(cm) {\n    var display = cm.display;\n    var prevBottom = display.lineDiv.offsetTop;\n    for (var i = 0; i < display.view.length; i++) {\n      var cur = display.view[i], height;\n      if (cur.hidden) continue;\n      if (ie_upto7) {\n        var bot = cur.node.offsetTop + cur.node.offsetHeight;\n        height = bot - prevBottom;\n        prevBottom = bot;\n      } else {\n        var box = cur.node.getBoundingClientRect();\n        height = box.bottom - box.top;\n      }\n      var diff = cur.line.height - height;\n      if (height < 2) height = textHeight(display);\n      if (diff > .001 || diff < -.001) {\n        updateLineHeight(cur.line, height);\n        updateWidgetHeight(cur.line);\n        if (cur.rest) for (var j = 0; j < cur.rest.length; j++)\n          updateWidgetHeight(cur.rest[j]);\n      }\n    }\n  }\n\n  // Read and store the height of line widgets associated with the\n  // given line.\n  function updateWidgetHeight(line) {\n    if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)\n      line.widgets[i].height = line.widgets[i].node.offsetHeight;\n  }\n\n  // Do a bulk-read of the DOM positions and sizes needed to draw the\n  // view, so that we don't interleave reading and writing to the DOM.\n  function getDimensions(cm) {\n    var d = cm.display, left = {}, width = {};\n    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {\n      left[cm.options.gutters[i]] = n.offsetLeft;\n      width[cm.options.gutters[i]] = n.offsetWidth;\n    }\n    return {fixedPos: compensateForHScroll(d),\n            gutterTotalWidth: d.gutters.offsetWidth,\n            gutterLeft: left,\n            gutterWidth: width,\n            wrapperWidth: d.wrapper.clientWidth};\n  }\n\n  // Sync the actual display DOM structure with display.view, removing\n  // nodes for lines that are no longer in view, and creating the ones\n  // that are not there yet, and updating the ones that are out of\n  // date.\n  function patchDisplay(cm, updateNumbersFrom, dims) {\n    var display = cm.display, lineNumbers = cm.options.lineNumbers;\n    var container = display.lineDiv, cur = container.firstChild;\n\n    function rm(node) {\n      var next = node.nextSibling;\n      // Works around a throw-scroll bug in OS X Webkit\n      if (webkit && mac && cm.display.currentWheelTarget == node)\n        node.style.display = \"none\";\n      else\n        node.parentNode.removeChild(node);\n      return next;\n    }\n\n    var view = display.view, lineN = display.viewFrom;\n    // Loop over the elements in the view, syncing cur (the DOM nodes\n    // in display.lineDiv) with the view as we go.\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (lineView.hidden) {\n      } else if (!lineView.node) { // Not drawn yet\n        var node = buildLineElement(cm, lineView, lineN, dims);\n        container.insertBefore(node, cur);\n      } else { // Already drawn\n        while (cur != lineView.node) cur = rm(cur);\n        var updateNumber = lineNumbers && updateNumbersFrom != null &&\n          updateNumbersFrom <= lineN && lineView.lineNumber;\n        if (lineView.changes) {\n          if (indexOf(lineView.changes, \"gutter\") > -1) updateNumber = false;\n          updateLineForChanges(cm, lineView, lineN, dims);\n        }\n        if (updateNumber) {\n          removeChildren(lineView.lineNumber);\n          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));\n        }\n        cur = lineView.node.nextSibling;\n      }\n      lineN += lineView.size;\n    }\n    while (cur) cur = rm(cur);\n  }\n\n  // When an aspect of a line changes, a string is added to\n  // lineView.changes. This updates the relevant part of the line's\n  // DOM structure.\n  function updateLineForChanges(cm, lineView, lineN, dims) {\n    for (var j = 0; j < lineView.changes.length; j++) {\n      var type = lineView.changes[j];\n      if (type == \"text\") updateLineText(cm, lineView);\n      else if (type == \"gutter\") updateLineGutter(cm, lineView, lineN, dims);\n      else if (type == \"class\") updateLineClasses(lineView);\n      else if (type == \"widget\") updateLineWidgets(lineView, dims);\n    }\n    lineView.changes = null;\n  }\n\n  // Lines with gutter elements, widgets or a background class need to\n  // be wrapped, and have the extra elements added to the wrapper div\n  function ensureLineWrapped(lineView) {\n    if (lineView.node == lineView.text) {\n      lineView.node = elt(\"div\", null, null, \"position: relative\");\n      if (lineView.text.parentNode)\n        lineView.text.parentNode.replaceChild(lineView.node, lineView.text);\n      lineView.node.appendChild(lineView.text);\n      if (ie_upto7) lineView.node.style.zIndex = 2;\n    }\n    return lineView.node;\n  }\n\n  function updateLineBackground(lineView) {\n    var cls = lineView.bgClass ? lineView.bgClass + \" \" + (lineView.line.bgClass || \"\") : lineView.line.bgClass;\n    if (cls) cls += \" CodeMirror-linebackground\";\n    if (lineView.background) {\n      if (cls) lineView.background.className = cls;\n      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }\n    } else if (cls) {\n      var wrap = ensureLineWrapped(lineView);\n      lineView.background = wrap.insertBefore(elt(\"div\", null, cls), wrap.firstChild);\n    }\n  }\n\n  // Wrapper around buildLineContent which will reuse the structure\n  // in display.externalMeasured when possible.\n  function getLineContent(cm, lineView) {\n    var ext = cm.display.externalMeasured;\n    if (ext && ext.line == lineView.line) {\n      cm.display.externalMeasured = null;\n      lineView.measure = ext.measure;\n      return ext.built;\n    }\n    return buildLineContent(cm, lineView);\n  }\n\n  // Redraw the line's text. Interacts with the background and text\n  // classes because the mode may output tokens that influence these\n  // classes.\n  function updateLineText(cm, lineView) {\n    var cls = lineView.text.className;\n    var built = getLineContent(cm, lineView);\n    if (lineView.text == lineView.node) lineView.node = built.pre;\n    lineView.text.parentNode.replaceChild(built.pre, lineView.text);\n    lineView.text = built.pre;\n    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {\n      lineView.bgClass = built.bgClass;\n      lineView.textClass = built.textClass;\n      updateLineClasses(lineView);\n    } else if (cls) {\n      lineView.text.className = cls;\n    }\n  }\n\n  function updateLineClasses(lineView) {\n    updateLineBackground(lineView);\n    if (lineView.line.wrapClass)\n      ensureLineWrapped(lineView).className = lineView.line.wrapClass;\n    else if (lineView.node != lineView.text)\n      lineView.node.className = \"\";\n    var textClass = lineView.textClass ? lineView.textClass + \" \" + (lineView.line.textClass || \"\") : lineView.line.textClass;\n    lineView.text.className = textClass || \"\";\n  }\n\n  function updateLineGutter(cm, lineView, lineN, dims) {\n    if (lineView.gutter) {\n      lineView.node.removeChild(lineView.gutter);\n      lineView.gutter = null;\n    }\n    var markers = lineView.line.gutterMarkers;\n    if (cm.options.lineNumbers || markers) {\n      var wrap = ensureLineWrapped(lineView);\n      var gutterWrap = lineView.gutter =\n        wrap.insertBefore(elt(\"div\", null, \"CodeMirror-gutter-wrapper\", \"position: absolute; left: \" +\n                              (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + \"px\"),\n                          lineView.text);\n      if (cm.options.lineNumbers && (!markers || !markers[\"CodeMirror-linenumbers\"]))\n        lineView.lineNumber = gutterWrap.appendChild(\n          elt(\"div\", lineNumberFor(cm.options, lineN),\n              \"CodeMirror-linenumber CodeMirror-gutter-elt\",\n              \"left: \" + dims.gutterLeft[\"CodeMirror-linenumbers\"] + \"px; width: \"\n              + cm.display.lineNumInnerWidth + \"px\"));\n      if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {\n        var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];\n        if (found)\n          gutterWrap.appendChild(elt(\"div\", [found], \"CodeMirror-gutter-elt\", \"left: \" +\n                                     dims.gutterLeft[id] + \"px; width: \" + dims.gutterWidth[id] + \"px\"));\n      }\n    }\n  }\n\n  function updateLineWidgets(lineView, dims) {\n    if (lineView.alignable) lineView.alignable = null;\n    for (var node = lineView.node.firstChild, next; node; node = next) {\n      var next = node.nextSibling;\n      if (node.className == \"CodeMirror-linewidget\")\n        lineView.node.removeChild(node);\n    }\n    insertLineWidgets(lineView, dims);\n  }\n\n  // Build a line's DOM representation from scratch\n  function buildLineElement(cm, lineView, lineN, dims) {\n    var built = getLineContent(cm, lineView);\n    lineView.text = lineView.node = built.pre;\n    if (built.bgClass) lineView.bgClass = built.bgClass;\n    if (built.textClass) lineView.textClass = built.textClass;\n\n    updateLineClasses(lineView);\n    updateLineGutter(cm, lineView, lineN, dims);\n    insertLineWidgets(lineView, dims);\n    return lineView.node;\n  }\n\n  // A lineView may contain multiple logical lines (when merged by\n  // collapsed spans). The widgets for all of them need to be drawn.\n  function insertLineWidgets(lineView, dims) {\n    insertLineWidgetsFor(lineView.line, lineView, dims, true);\n    if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n      insertLineWidgetsFor(lineView.rest[i], lineView, dims, false);\n  }\n\n  function insertLineWidgetsFor(line, lineView, dims, allowAbove) {\n    if (!line.widgets) return;\n    var wrap = ensureLineWrapped(lineView);\n    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {\n      var widget = ws[i], node = elt(\"div\", [widget.node], \"CodeMirror-linewidget\");\n      if (!widget.handleMouseEvents) node.ignoreEvents = true;\n      positionLineWidget(widget, node, lineView, dims);\n      if (allowAbove && widget.above)\n        wrap.insertBefore(node, lineView.gutter || lineView.text);\n      else\n        wrap.appendChild(node);\n      signalLater(widget, \"redraw\");\n    }\n  }\n\n  function positionLineWidget(widget, node, lineView, dims) {\n    if (widget.noHScroll) {\n      (lineView.alignable || (lineView.alignable = [])).push(node);\n      var width = dims.wrapperWidth;\n      node.style.left = dims.fixedPos + \"px\";\n      if (!widget.coverGutter) {\n        width -= dims.gutterTotalWidth;\n        node.style.paddingLeft = dims.gutterTotalWidth + \"px\";\n      }\n      node.style.width = width + \"px\";\n    }\n    if (widget.coverGutter) {\n      node.style.zIndex = 5;\n      node.style.position = \"relative\";\n      if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + \"px\";\n    }\n  }\n\n  // POSITION OBJECT\n\n  // A Pos instance represents a position within the text.\n  var Pos = CodeMirror.Pos = function(line, ch) {\n    if (!(this instanceof Pos)) return new Pos(line, ch);\n    this.line = line; this.ch = ch;\n  };\n\n  // Compare two positions, return 0 if they are the same, a negative\n  // number when a is less, and a positive number otherwise.\n  var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };\n\n  function copyPos(x) {return Pos(x.line, x.ch);}\n  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }\n  function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }\n\n  // SELECTION / CURSOR\n\n  // Selection objects are immutable. A new one is created every time\n  // the selection changes. A selection is one or more non-overlapping\n  // (and non-touching) ranges, sorted, and an integer that indicates\n  // which one is the primary selection (the one that's scrolled into\n  // view, that getCursor returns, etc).\n  function Selection(ranges, primIndex) {\n    this.ranges = ranges;\n    this.primIndex = primIndex;\n  }\n\n  Selection.prototype = {\n    primary: function() { return this.ranges[this.primIndex]; },\n    equals: function(other) {\n      if (other == this) return true;\n      if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;\n      for (var i = 0; i < this.ranges.length; i++) {\n        var here = this.ranges[i], there = other.ranges[i];\n        if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;\n      }\n      return true;\n    },\n    deepCopy: function() {\n      for (var out = [], i = 0; i < this.ranges.length; i++)\n        out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));\n      return new Selection(out, this.primIndex);\n    },\n    somethingSelected: function() {\n      for (var i = 0; i < this.ranges.length; i++)\n        if (!this.ranges[i].empty()) return true;\n      return false;\n    },\n    contains: function(pos, end) {\n      if (!end) end = pos;\n      for (var i = 0; i < this.ranges.length; i++) {\n        var range = this.ranges[i];\n        if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)\n          return i;\n      }\n      return -1;\n    }\n  };\n\n  function Range(anchor, head) {\n    this.anchor = anchor; this.head = head;\n  }\n\n  Range.prototype = {\n    from: function() { return minPos(this.anchor, this.head); },\n    to: function() { return maxPos(this.anchor, this.head); },\n    empty: function() {\n      return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;\n    }\n  };\n\n  // Take an unsorted, potentially overlapping set of ranges, and\n  // build a selection out of it. 'Consumes' ranges array (modifying\n  // it).\n  function normalizeSelection(ranges, primIndex) {\n    var prim = ranges[primIndex];\n    ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });\n    primIndex = indexOf(ranges, prim);\n    for (var i = 1; i < ranges.length; i++) {\n      var cur = ranges[i], prev = ranges[i - 1];\n      if (cmp(prev.to(), cur.from()) >= 0) {\n        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());\n        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;\n        if (i <= primIndex) --primIndex;\n        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));\n      }\n    }\n    return new Selection(ranges, primIndex);\n  }\n\n  function simpleSelection(anchor, head) {\n    return new Selection([new Range(anchor, head || anchor)], 0);\n  }\n\n  // Most of the external API clips given positions to make sure they\n  // actually exist within the document.\n  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}\n  function clipPos(doc, pos) {\n    if (pos.line < doc.first) return Pos(doc.first, 0);\n    var last = doc.first + doc.size - 1;\n    if (pos.line > last) return Pos(last, getLine(doc, last).text.length);\n    return clipToLen(pos, getLine(doc, pos.line).text.length);\n  }\n  function clipToLen(pos, linelen) {\n    var ch = pos.ch;\n    if (ch == null || ch > linelen) return Pos(pos.line, linelen);\n    else if (ch < 0) return Pos(pos.line, 0);\n    else return pos;\n  }\n  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}\n  function clipPosArray(doc, array) {\n    for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);\n    return out;\n  }\n\n  // SELECTION UPDATES\n\n  // The 'scroll' parameter given to many of these indicated whether\n  // the new cursor position should be scrolled into view after\n  // modifying the selection.\n\n  // If shift is held or the extend flag is set, extends a range to\n  // include a given position (and optionally a second position).\n  // Otherwise, simply returns the range between the given positions.\n  // Used for cursor motion and such.\n  function extendRange(doc, range, head, other) {\n    if (doc.cm && doc.cm.display.shift || doc.extend) {\n      var anchor = range.anchor;\n      if (other) {\n        var posBefore = cmp(head, anchor) < 0;\n        if (posBefore != (cmp(other, anchor) < 0)) {\n          anchor = head;\n          head = other;\n        } else if (posBefore != (cmp(head, other) < 0)) {\n          head = other;\n        }\n      }\n      return new Range(anchor, head);\n    } else {\n      return new Range(other || head, head);\n    }\n  }\n\n  // Extend the primary selection range, discard the rest.\n  function extendSelection(doc, head, other, options) {\n    setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);\n  }\n\n  // Extend all selections (pos is an array of selections with length\n  // equal the number of selections)\n  function extendSelections(doc, heads, options) {\n    for (var out = [], i = 0; i < doc.sel.ranges.length; i++)\n      out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);\n    var newSel = normalizeSelection(out, doc.sel.primIndex);\n    setSelection(doc, newSel, options);\n  }\n\n  // Updates a single range in the selection.\n  function replaceOneSelection(doc, i, range, options) {\n    var ranges = doc.sel.ranges.slice(0);\n    ranges[i] = range;\n    setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);\n  }\n\n  // Reset the selection to a single range.\n  function setSimpleSelection(doc, anchor, head, options) {\n    setSelection(doc, simpleSelection(anchor, head), options);\n  }\n\n  // Give beforeSelectionChange handlers a change to influence a\n  // selection update.\n  function filterSelectionChange(doc, sel) {\n    var obj = {\n      ranges: sel.ranges,\n      update: function(ranges) {\n        this.ranges = [];\n        for (var i = 0; i < ranges.length; i++)\n          this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),\n                                     clipPos(doc, ranges[i].head));\n      }\n    };\n    signal(doc, \"beforeSelectionChange\", doc, obj);\n    if (doc.cm) signal(doc.cm, \"beforeSelectionChange\", doc.cm, obj);\n    if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);\n    else return sel;\n  }\n\n  function setSelectionReplaceHistory(doc, sel, options) {\n    var done = doc.history.done, last = lst(done);\n    if (last && last.ranges) {\n      done[done.length - 1] = sel;\n      setSelectionNoUndo(doc, sel, options);\n    } else {\n      setSelection(doc, sel, options);\n    }\n  }\n\n  // Set a new selection.\n  function setSelection(doc, sel, options) {\n    setSelectionNoUndo(doc, sel, options);\n    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);\n  }\n\n  function setSelectionNoUndo(doc, sel, options) {\n    if (hasHandler(doc, \"beforeSelectionChange\") || doc.cm && hasHandler(doc.cm, \"beforeSelectionChange\"))\n      sel = filterSelectionChange(doc, sel);\n\n    var bias = cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1;\n    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));\n\n    if (!(options && options.scroll === false) && doc.cm)\n      ensureCursorVisible(doc.cm);\n  }\n\n  function setSelectionInner(doc, sel) {\n    if (sel.equals(doc.sel)) return;\n\n    doc.sel = sel;\n\n    if (doc.cm) {\n      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;\n      signalCursorActivity(doc.cm);\n    }\n    signalLater(doc, \"cursorActivity\", doc);\n  }\n\n  // Verify that the selection does not partially select any atomic\n  // marked ranges.\n  function reCheckSelection(doc) {\n    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);\n  }\n\n  // Return a selection that does not partially select any atomic\n  // ranges.\n  function skipAtomicInSelection(doc, sel, bias, mayClear) {\n    var out;\n    for (var i = 0; i < sel.ranges.length; i++) {\n      var range = sel.ranges[i];\n      var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear);\n      var newHead = skipAtomic(doc, range.head, bias, mayClear);\n      if (out || newAnchor != range.anchor || newHead != range.head) {\n        if (!out) out = sel.ranges.slice(0, i);\n        out[i] = new Range(newAnchor, newHead);\n      }\n    }\n    return out ? normalizeSelection(out, sel.primIndex) : sel;\n  }\n\n  // Ensure a given position is not inside an atomic range.\n  function skipAtomic(doc, pos, bias, mayClear) {\n    var flipped = false, curPos = pos;\n    var dir = bias || 1;\n    doc.cantEdit = false;\n    search: for (;;) {\n      var line = getLine(doc, curPos.line);\n      if (line.markedSpans) {\n        for (var i = 0; i < line.markedSpans.length; ++i) {\n          var sp = line.markedSpans[i], m = sp.marker;\n          if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&\n              (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {\n            if (mayClear) {\n              signal(m, \"beforeCursorEnter\");\n              if (m.explicitlyCleared) {\n                if (!line.markedSpans) break;\n                else {--i; continue;}\n              }\n            }\n            if (!m.atomic) continue;\n            var newPos = m.find(dir < 0 ? -1 : 1);\n            if (cmp(newPos, curPos) == 0) {\n              newPos.ch += dir;\n              if (newPos.ch < 0) {\n                if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));\n                else newPos = null;\n              } else if (newPos.ch > line.text.length) {\n                if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);\n                else newPos = null;\n              }\n              if (!newPos) {\n                if (flipped) {\n                  // Driven in a corner -- no valid cursor position found at all\n                  // -- try again *with* clearing, if we didn't already\n                  if (!mayClear) return skipAtomic(doc, pos, bias, true);\n                  // Otherwise, turn off editing until further notice, and return the start of the doc\n                  doc.cantEdit = true;\n                  return Pos(doc.first, 0);\n                }\n                flipped = true; newPos = pos; dir = -dir;\n              }\n            }\n            curPos = newPos;\n            continue search;\n          }\n        }\n      }\n      return curPos;\n    }\n  }\n\n  // SELECTION DRAWING\n\n  // Redraw the selection and/or cursor\n  function updateSelection(cm) {\n    var display = cm.display, doc = cm.doc;\n    var curFragment = document.createDocumentFragment();\n    var selFragment = document.createDocumentFragment();\n\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      var collapsed = range.empty();\n      if (collapsed || cm.options.showCursorWhenSelecting)\n        drawSelectionCursor(cm, range, curFragment);\n      if (!collapsed)\n        drawSelectionRange(cm, range, selFragment);\n    }\n\n    // Move the hidden textarea near the cursor to prevent scrolling artifacts\n    if (cm.options.moveInputWithCursor) {\n      var headPos = cursorCoords(cm, doc.sel.primary().head, \"div\");\n      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();\n      var top = Math.max(0, Math.min(display.wrapper.clientHeight - 10,\n                                     headPos.top + lineOff.top - wrapOff.top));\n      var left = Math.max(0, Math.min(display.wrapper.clientWidth - 10,\n                                      headPos.left + lineOff.left - wrapOff.left));\n      display.inputDiv.style.top = top + \"px\";\n      display.inputDiv.style.left = left + \"px\";\n    }\n\n    removeChildrenAndAdd(display.cursorDiv, curFragment);\n    removeChildrenAndAdd(display.selectionDiv, selFragment);\n  }\n\n  // Draws a cursor for the given range\n  function drawSelectionCursor(cm, range, output) {\n    var pos = cursorCoords(cm, range.head, \"div\");\n\n    var cursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor\"));\n    cursor.style.left = pos.left + \"px\";\n    cursor.style.top = pos.top + \"px\";\n    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + \"px\";\n\n    if (pos.other) {\n      // Secondary cursor, shown when on a 'jump' in bi-directional text\n      var otherCursor = output.appendChild(elt(\"div\", \"\\u00a0\", \"CodeMirror-cursor CodeMirror-secondarycursor\"));\n      otherCursor.style.display = \"\";\n      otherCursor.style.left = pos.other.left + \"px\";\n      otherCursor.style.top = pos.other.top + \"px\";\n      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + \"px\";\n    }\n  }\n\n  // Draws the given range as a highlighted selection\n  function drawSelectionRange(cm, range, output) {\n    var display = cm.display, doc = cm.doc;\n    var fragment = document.createDocumentFragment();\n    var padding = paddingH(cm.display), leftSide = padding.left, rightSide = display.lineSpace.offsetWidth - padding.right;\n\n    function add(left, top, width, bottom) {\n      if (top < 0) top = 0;\n      top = Math.round(top);\n      bottom = Math.round(bottom);\n      fragment.appendChild(elt(\"div\", null, \"CodeMirror-selected\", \"position: absolute; left: \" + left +\n                               \"px; top: \" + top + \"px; width: \" + (width == null ? rightSide - left : width) +\n                               \"px; height: \" + (bottom - top) + \"px\"));\n    }\n\n    function drawForLine(line, fromArg, toArg) {\n      var lineObj = getLine(doc, line);\n      var lineLen = lineObj.text.length;\n      var start, end;\n      function coords(ch, bias) {\n        return charCoords(cm, Pos(line, ch), \"div\", lineObj, bias);\n      }\n\n      iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {\n        var leftPos = coords(from, \"left\"), rightPos, left, right;\n        if (from == to) {\n          rightPos = leftPos;\n          left = right = leftPos.left;\n        } else {\n          rightPos = coords(to - 1, \"right\");\n          if (dir == \"rtl\") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }\n          left = leftPos.left;\n          right = rightPos.right;\n        }\n        if (fromArg == null && from == 0) left = leftSide;\n        if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part\n          add(left, leftPos.top, null, leftPos.bottom);\n          left = leftSide;\n          if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);\n        }\n        if (toArg == null && to == lineLen) right = rightSide;\n        if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)\n          start = leftPos;\n        if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)\n          end = rightPos;\n        if (left < leftSide + 1) left = leftSide;\n        add(left, rightPos.top, right - left, rightPos.bottom);\n      });\n      return {start: start, end: end};\n    }\n\n    var sFrom = range.from(), sTo = range.to();\n    if (sFrom.line == sTo.line) {\n      drawForLine(sFrom.line, sFrom.ch, sTo.ch);\n    } else {\n      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);\n      var singleVLine = visualLine(fromLine) == visualLine(toLine);\n      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;\n      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;\n      if (singleVLine) {\n        if (leftEnd.top < rightStart.top - 2) {\n          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);\n          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);\n        } else {\n          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);\n        }\n      }\n      if (leftEnd.bottom < rightStart.top)\n        add(leftSide, leftEnd.bottom, null, rightStart.top);\n    }\n\n    output.appendChild(fragment);\n  }\n\n  // Cursor-blinking\n  function restartBlink(cm) {\n    if (!cm.state.focused) return;\n    var display = cm.display;\n    clearInterval(display.blinker);\n    var on = true;\n    display.cursorDiv.style.visibility = \"\";\n    if (cm.options.cursorBlinkRate > 0)\n      display.blinker = setInterval(function() {\n        display.cursorDiv.style.visibility = (on = !on) ? \"\" : \"hidden\";\n      }, cm.options.cursorBlinkRate);\n  }\n\n  // HIGHLIGHT WORKER\n\n  function startWorker(cm, time) {\n    if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)\n      cm.state.highlight.set(time, bind(highlightWorker, cm));\n  }\n\n  function highlightWorker(cm) {\n    var doc = cm.doc;\n    if (doc.frontier < doc.first) doc.frontier = doc.first;\n    if (doc.frontier >= cm.display.viewTo) return;\n    var end = +new Date + cm.options.workTime;\n    var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));\n\n    runInOp(cm, function() {\n    doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {\n      if (doc.frontier >= cm.display.viewFrom) { // Visible\n        var oldStyles = line.styles;\n        var highlighted = highlightLine(cm, line, state, true);\n        line.styles = highlighted.styles;\n        if (highlighted.classes) line.styleClasses = highlighted.classes;\n        else if (line.styleClasses) line.styleClasses = null;\n        var ischange = !oldStyles || oldStyles.length != line.styles.length;\n        for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];\n        if (ischange) regLineChange(cm, doc.frontier, \"text\");\n        line.stateAfter = copyState(doc.mode, state);\n      } else {\n        processLine(cm, line.text, state);\n        line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;\n      }\n      ++doc.frontier;\n      if (+new Date > end) {\n        startWorker(cm, cm.options.workDelay);\n        return true;\n      }\n    });\n    });\n  }\n\n  // Finds the line to start with when starting a parse. Tries to\n  // find a line with a stateAfter, so that it can start with a\n  // valid state. If that fails, it returns the line with the\n  // smallest indentation, which tends to need the least context to\n  // parse correctly.\n  function findStartLine(cm, n, precise) {\n    var minindent, minline, doc = cm.doc;\n    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);\n    for (var search = n; search > lim; --search) {\n      if (search <= doc.first) return doc.first;\n      var line = getLine(doc, search - 1);\n      if (line.stateAfter && (!precise || search <= doc.frontier)) return search;\n      var indented = countColumn(line.text, null, cm.options.tabSize);\n      if (minline == null || minindent > indented) {\n        minline = search - 1;\n        minindent = indented;\n      }\n    }\n    return minline;\n  }\n\n  function getStateBefore(cm, n, precise) {\n    var doc = cm.doc, display = cm.display;\n    if (!doc.mode.startState) return true;\n    var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;\n    if (!state) state = startState(doc.mode);\n    else state = copyState(doc.mode, state);\n    doc.iter(pos, n, function(line) {\n      processLine(cm, line.text, state);\n      var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;\n      line.stateAfter = save ? copyState(doc.mode, state) : null;\n      ++pos;\n    });\n    if (precise) doc.frontier = pos;\n    return state;\n  }\n\n  // POSITION MEASUREMENT\n\n  function paddingTop(display) {return display.lineSpace.offsetTop;}\n  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}\n  function paddingH(display) {\n    if (display.cachedPaddingH) return display.cachedPaddingH;\n    var e = removeChildrenAndAdd(display.measure, elt(\"pre\", \"x\"));\n    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;\n    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};\n    if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;\n    return data;\n  }\n\n  // Ensure the lineView.wrapping.heights array is populated. This is\n  // an array of bottom offsets for the lines that make up a drawn\n  // line. When lineWrapping is on, there might be more than one\n  // height.\n  function ensureLineHeights(cm, lineView, rect) {\n    var wrapping = cm.options.lineWrapping;\n    var curWidth = wrapping && cm.display.scroller.clientWidth;\n    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {\n      var heights = lineView.measure.heights = [];\n      if (wrapping) {\n        lineView.measure.width = curWidth;\n        var rects = lineView.text.firstChild.getClientRects();\n        for (var i = 0; i < rects.length - 1; i++) {\n          var cur = rects[i], next = rects[i + 1];\n          if (Math.abs(cur.bottom - next.bottom) > 2)\n            heights.push((cur.bottom + next.top) / 2 - rect.top);\n        }\n      }\n      heights.push(rect.bottom - rect.top);\n    }\n  }\n\n  // Find a line map (mapping character offsets to text nodes) and a\n  // measurement cache for the given line number. (A line view might\n  // contain multiple lines when collapsed ranges are present.)\n  function mapFromLineView(lineView, line, lineN) {\n    if (lineView.line == line)\n      return {map: lineView.measure.map, cache: lineView.measure.cache};\n    for (var i = 0; i < lineView.rest.length; i++)\n      if (lineView.rest[i] == line)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};\n    for (var i = 0; i < lineView.rest.length; i++)\n      if (lineNo(lineView.rest[i]) > lineN)\n        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};\n  }\n\n  // Render a line into the hidden node display.externalMeasured. Used\n  // when measurement is needed for a line that's not in the viewport.\n  function updateExternalMeasurement(cm, line) {\n    line = visualLine(line);\n    var lineN = lineNo(line);\n    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);\n    view.lineN = lineN;\n    var built = view.built = buildLineContent(cm, view);\n    view.text = built.pre;\n    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);\n    return view;\n  }\n\n  // Get a {top, bottom, left, right} box (in line-local coordinates)\n  // for a given character.\n  function measureChar(cm, line, ch, bias) {\n    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);\n  }\n\n  // Find a line view that corresponds to the given line number.\n  function findViewForLine(cm, lineN) {\n    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)\n      return cm.display.view[findViewIndex(cm, lineN)];\n    var ext = cm.display.externalMeasured;\n    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)\n      return ext;\n  }\n\n  // Measurement can be split in two steps, the set-up work that\n  // applies to the whole line, and the measurement of the actual\n  // character. Functions like coordsChar, that need to do a lot of\n  // measurements in a row, can thus ensure that the set-up work is\n  // only done once.\n  function prepareMeasureForLine(cm, line) {\n    var lineN = lineNo(line);\n    var view = findViewForLine(cm, lineN);\n    if (view && !view.text)\n      view = null;\n    else if (view && view.changes)\n      updateLineForChanges(cm, view, lineN, getDimensions(cm));\n    if (!view)\n      view = updateExternalMeasurement(cm, line);\n\n    var info = mapFromLineView(view, line, lineN);\n    return {\n      line: line, view: view, rect: null,\n      map: info.map, cache: info.cache, before: info.before,\n      hasHeights: false\n    };\n  }\n\n  // Given a prepared measurement object, measures the position of an\n  // actual character (or fetches it from the cache).\n  function measureCharPrepared(cm, prepared, ch, bias) {\n    if (prepared.before) ch = -1;\n    var key = ch + (bias || \"\"), found;\n    if (prepared.cache.hasOwnProperty(key)) {\n      found = prepared.cache[key];\n    } else {\n      if (!prepared.rect)\n        prepared.rect = prepared.view.text.getBoundingClientRect();\n      if (!prepared.hasHeights) {\n        ensureLineHeights(cm, prepared.view, prepared.rect);\n        prepared.hasHeights = true;\n      }\n      found = measureCharInner(cm, prepared, ch, bias);\n      if (!found.bogus) prepared.cache[key] = found;\n    }\n    return {left: found.left, right: found.right, top: found.top, bottom: found.bottom};\n  }\n\n  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};\n\n  function measureCharInner(cm, prepared, ch, bias) {\n    var map = prepared.map;\n\n    var node, start, end, collapse;\n    // First, search the line map for the text node corresponding to,\n    // or closest to, the target character.\n    for (var i = 0; i < map.length; i += 3) {\n      var mStart = map[i], mEnd = map[i + 1];\n      if (ch < mStart) {\n        start = 0; end = 1;\n        collapse = \"left\";\n      } else if (ch < mEnd) {\n        start = ch - mStart;\n        end = start + 1;\n      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {\n        end = mEnd - mStart;\n        start = end - 1;\n        if (ch >= mEnd) collapse = \"right\";\n      }\n      if (start != null) {\n        node = map[i + 2];\n        if (mStart == mEnd && bias == (node.insertLeft ? \"left\" : \"right\"))\n          collapse = bias;\n        if (bias == \"left\" && start == 0)\n          while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {\n            node = map[(i -= 3) + 2];\n            collapse = \"left\";\n          }\n        if (bias == \"right\" && start == mEnd - mStart)\n          while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {\n            node = map[(i += 3) + 2];\n            collapse = \"right\";\n          }\n        break;\n      }\n    }\n\n    var rect;\n    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.\n      while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;\n      while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;\n      if (ie_upto8 && start == 0 && end == mEnd - mStart) {\n        rect = node.parentNode.getBoundingClientRect();\n      } else if (ie && cm.options.lineWrapping) {\n        var rects = range(node, start, end).getClientRects();\n        if (rects.length)\n          rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n        else\n          rect = nullRect;\n      } else {\n        rect = range(node, start, end).getBoundingClientRect() || nullRect;\n      }\n    } else { // If it is a widget, simply get the box for the whole widget.\n      if (start > 0) collapse = bias = \"right\";\n      var rects;\n      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)\n        rect = rects[bias == \"right\" ? rects.length - 1 : 0];\n      else\n        rect = node.getBoundingClientRect();\n    }\n    if (ie_upto8 && !start && (!rect || !rect.left && !rect.right)) {\n      var rSpan = node.parentNode.getClientRects()[0];\n      if (rSpan)\n        rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};\n      else\n        rect = nullRect;\n    }\n\n    var top, bot = (rect.bottom + rect.top) / 2 - prepared.rect.top;\n    var heights = prepared.view.measure.heights;\n    for (var i = 0; i < heights.length - 1; i++)\n      if (bot < heights[i]) break;\n    top = i ? heights[i - 1] : 0; bot = heights[i];\n    var result = {left: (collapse == \"right\" ? rect.right : rect.left) - prepared.rect.left,\n                  right: (collapse == \"left\" ? rect.left : rect.right) - prepared.rect.left,\n                  top: top, bottom: bot};\n    if (!rect.left && !rect.right) result.bogus = true;\n    return result;\n  }\n\n  function clearLineMeasurementCacheFor(lineView) {\n    if (lineView.measure) {\n      lineView.measure.cache = {};\n      lineView.measure.heights = null;\n      if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)\n        lineView.measure.caches[i] = {};\n    }\n  }\n\n  function clearLineMeasurementCache(cm) {\n    cm.display.externalMeasure = null;\n    removeChildren(cm.display.lineMeasure);\n    for (var i = 0; i < cm.display.view.length; i++)\n      clearLineMeasurementCacheFor(cm.display.view[i]);\n  }\n\n  function clearCaches(cm) {\n    clearLineMeasurementCache(cm);\n    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;\n    if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;\n    cm.display.lineNumChars = null;\n  }\n\n  function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }\n  function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }\n\n  // Converts a {top, bottom, left, right} box from line-local\n  // coordinates into another coordinate system. Context may be one of\n  // \"line\", \"div\" (display.lineDiv), \"local\"/null (editor), or \"page\".\n  function intoCoordSystem(cm, lineObj, rect, context) {\n    if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {\n      var size = widgetHeight(lineObj.widgets[i]);\n      rect.top += size; rect.bottom += size;\n    }\n    if (context == \"line\") return rect;\n    if (!context) context = \"local\";\n    var yOff = heightAtLine(lineObj);\n    if (context == \"local\") yOff += paddingTop(cm.display);\n    else yOff -= cm.display.viewOffset;\n    if (context == \"page\" || context == \"window\") {\n      var lOff = cm.display.lineSpace.getBoundingClientRect();\n      yOff += lOff.top + (context == \"window\" ? 0 : pageScrollY());\n      var xOff = lOff.left + (context == \"window\" ? 0 : pageScrollX());\n      rect.left += xOff; rect.right += xOff;\n    }\n    rect.top += yOff; rect.bottom += yOff;\n    return rect;\n  }\n\n  // Coverts a box from \"div\" coords to another coordinate system.\n  // Context may be \"window\", \"page\", \"div\", or \"local\"/null.\n  function fromCoordSystem(cm, coords, context) {\n    if (context == \"div\") return coords;\n    var left = coords.left, top = coords.top;\n    // First move into \"page\" coordinate system\n    if (context == \"page\") {\n      left -= pageScrollX();\n      top -= pageScrollY();\n    } else if (context == \"local\" || !context) {\n      var localBox = cm.display.sizer.getBoundingClientRect();\n      left += localBox.left;\n      top += localBox.top;\n    }\n\n    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();\n    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};\n  }\n\n  function charCoords(cm, pos, context, lineObj, bias) {\n    if (!lineObj) lineObj = getLine(cm.doc, pos.line);\n    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);\n  }\n\n  // Returns a box for a given cursor position, which may have an\n  // 'other' property containing the position of the secondary cursor\n  // on a bidi boundary.\n  function cursorCoords(cm, pos, context, lineObj, preparedMeasure) {\n    lineObj = lineObj || getLine(cm.doc, pos.line);\n    if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);\n    function get(ch, right) {\n      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? \"right\" : \"left\");\n      if (right) m.left = m.right; else m.right = m.left;\n      return intoCoordSystem(cm, lineObj, m, context);\n    }\n    function getBidi(ch, partPos) {\n      var part = order[partPos], right = part.level % 2;\n      if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {\n        part = order[--partPos];\n        ch = bidiRight(part) - (part.level % 2 ? 0 : 1);\n        right = true;\n      } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {\n        part = order[++partPos];\n        ch = bidiLeft(part) - part.level % 2;\n        right = false;\n      }\n      if (right && ch == part.to && ch > part.from) return get(ch - 1);\n      return get(ch, right);\n    }\n    var order = getOrder(lineObj), ch = pos.ch;\n    if (!order) return get(ch);\n    var partPos = getBidiPartAt(order, ch);\n    var val = getBidi(ch, partPos);\n    if (bidiOther != null) val.other = getBidi(ch, bidiOther);\n    return val;\n  }\n\n  // Used to cheaply estimate the coordinates for a position. Used for\n  // intermediate scroll updates.\n  function estimateCoords(cm, pos) {\n    var left = 0, pos = clipPos(cm.doc, pos);\n    if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;\n    var lineObj = getLine(cm.doc, pos.line);\n    var top = heightAtLine(lineObj) + paddingTop(cm.display);\n    return {left: left, right: left, top: top, bottom: top + lineObj.height};\n  }\n\n  // Positions returned by coordsChar contain some extra information.\n  // xRel is the relative x position of the input coordinates compared\n  // to the found position (so xRel > 0 means the coordinates are to\n  // the right of the character position, for example). When outside\n  // is true, that means the coordinates lie outside the line's\n  // vertical range.\n  function PosWithInfo(line, ch, outside, xRel) {\n    var pos = Pos(line, ch);\n    pos.xRel = xRel;\n    if (outside) pos.outside = true;\n    return pos;\n  }\n\n  // Compute the character position closest to the given coordinates.\n  // Input must be lineSpace-local (\"div\" coordinate system).\n  function coordsChar(cm, x, y) {\n    var doc = cm.doc;\n    y += cm.display.viewOffset;\n    if (y < 0) return PosWithInfo(doc.first, 0, true, -1);\n    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;\n    if (lineN > last)\n      return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);\n    if (x < 0) x = 0;\n\n    var lineObj = getLine(doc, lineN);\n    for (;;) {\n      var found = coordsCharInner(cm, lineObj, lineN, x, y);\n      var merged = collapsedSpanAtEnd(lineObj);\n      var mergedPos = merged && merged.find(0, true);\n      if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))\n        lineN = lineNo(lineObj = mergedPos.to.line);\n      else\n        return found;\n    }\n  }\n\n  function coordsCharInner(cm, lineObj, lineNo, x, y) {\n    var innerOff = y - heightAtLine(lineObj);\n    var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;\n    var preparedMeasure = prepareMeasureForLine(cm, lineObj);\n\n    function getX(ch) {\n      var sp = cursorCoords(cm, Pos(lineNo, ch), \"line\", lineObj, preparedMeasure);\n      wrongLine = true;\n      if (innerOff > sp.bottom) return sp.left - adjust;\n      else if (innerOff < sp.top) return sp.left + adjust;\n      else wrongLine = false;\n      return sp.left;\n    }\n\n    var bidi = getOrder(lineObj), dist = lineObj.text.length;\n    var from = lineLeft(lineObj), to = lineRight(lineObj);\n    var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;\n\n    if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);\n    // Do a binary search between these bounds.\n    for (;;) {\n      if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {\n        var ch = x < fromX || x - fromX <= toX - x ? from : to;\n        var xDiff = x - (ch == from ? fromX : toX);\n        while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;\n        var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,\n                              xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);\n        return pos;\n      }\n      var step = Math.ceil(dist / 2), middle = from + step;\n      if (bidi) {\n        middle = from;\n        for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);\n      }\n      var middleX = getX(middle);\n      if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}\n      else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}\n    }\n  }\n\n  var measureText;\n  // Compute the default text height.\n  function textHeight(display) {\n    if (display.cachedTextHeight != null) return display.cachedTextHeight;\n    if (measureText == null) {\n      measureText = elt(\"pre\");\n      // Measure a bunch of lines, for browsers that compute\n      // fractional heights.\n      for (var i = 0; i < 49; ++i) {\n        measureText.appendChild(document.createTextNode(\"x\"));\n        measureText.appendChild(elt(\"br\"));\n      }\n      measureText.appendChild(document.createTextNode(\"x\"));\n    }\n    removeChildrenAndAdd(display.measure, measureText);\n    var height = measureText.offsetHeight / 50;\n    if (height > 3) display.cachedTextHeight = height;\n    removeChildren(display.measure);\n    return height || 1;\n  }\n\n  // Compute the default character width.\n  function charWidth(display) {\n    if (display.cachedCharWidth != null) return display.cachedCharWidth;\n    var anchor = elt(\"span\", \"xxxxxxxxxx\");\n    var pre = elt(\"pre\", [anchor]);\n    removeChildrenAndAdd(display.measure, pre);\n    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;\n    if (width > 2) display.cachedCharWidth = width;\n    return width || 10;\n  }\n\n  // OPERATIONS\n\n  // Operations are used to wrap a series of changes to the editor\n  // state in such a way that each change won't have to update the\n  // cursor and display (which would be awkward, slow, and\n  // error-prone). Instead, display updates are batched and then all\n  // combined and executed at once.\n\n  var nextOpId = 0;\n  // Start a new operation.\n  function startOperation(cm) {\n    cm.curOp = {\n      viewChanged: false,      // Flag that indicates that lines might need to be redrawn\n      startHeight: cm.doc.height, // Used to detect need to update scrollbar\n      forceUpdate: false,      // Used to force a redraw\n      updateInput: null,       // Whether to reset the input textarea\n      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)\n      changeObjs: null,        // Accumulated changes, for firing change events\n      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on\n      selectionChanged: false, // Whether the selection needs to be redrawn\n      updateMaxLine: false,    // Set when the widest line needs to be determined anew\n      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet\n      scrollToPos: null,       // Used to scroll to a specific position\n      id: ++nextOpId           // Unique ID\n    };\n    if (!delayedCallbackDepth++) delayedCallbacks = [];\n  }\n\n  // Finish an operation, updating the display and signalling delayed events\n  function endOperation(cm) {\n    var op = cm.curOp, doc = cm.doc, display = cm.display;\n    cm.curOp = null;\n\n    if (op.updateMaxLine) findMaxLine(cm);\n\n    // If it looks like an update might be needed, call updateDisplay\n    if (op.viewChanged || op.forceUpdate || op.scrollTop != null ||\n        op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||\n                           op.scrollToPos.to.line >= display.viewTo) ||\n        display.maxLineChanged && cm.options.lineWrapping) {\n      var updated = updateDisplay(cm, {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);\n      if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;\n    }\n    // If no update was run, but the selection changed, redraw that.\n    if (!updated && op.selectionChanged) updateSelection(cm);\n    if (!updated && op.startHeight != cm.doc.height) updateScrollbars(cm);\n\n    // Propagate the scroll position to the actual DOM scroller\n    if (op.scrollTop != null && display.scroller.scrollTop != op.scrollTop) {\n      var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));\n      display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top;\n    }\n    if (op.scrollLeft != null && display.scroller.scrollLeft != op.scrollLeft) {\n      var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));\n      display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left;\n      alignHorizontally(cm);\n    }\n    // If we need to scroll a specific position into view, do so.\n    if (op.scrollToPos) {\n      var coords = scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos.from),\n                                     clipPos(cm.doc, op.scrollToPos.to), op.scrollToPos.margin);\n      if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);\n    }\n\n    if (op.selectionChanged) restartBlink(cm);\n\n    if (cm.state.focused && op.updateInput)\n      resetInput(cm, op.typing);\n\n    // Fire events for markers that are hidden/unidden by editing or\n    // undoing\n    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;\n    if (hidden) for (var i = 0; i < hidden.length; ++i)\n      if (!hidden[i].lines.length) signal(hidden[i], \"hide\");\n    if (unhidden) for (var i = 0; i < unhidden.length; ++i)\n      if (unhidden[i].lines.length) signal(unhidden[i], \"unhide\");\n\n    var delayed;\n    if (!--delayedCallbackDepth) {\n      delayed = delayedCallbacks;\n      delayedCallbacks = null;\n    }\n    // Fire change events, and delayed event handlers\n    if (op.changeObjs)\n      signal(cm, \"changes\", cm, op.changeObjs);\n    if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();\n    if (op.cursorActivityHandlers)\n      for (var i = 0; i < op.cursorActivityHandlers.length; i++)\n        op.cursorActivityHandlers[i](cm);\n  }\n\n  // Run the given function in an operation\n  function runInOp(cm, f) {\n    if (cm.curOp) return f();\n    startOperation(cm);\n    try { return f(); }\n    finally { endOperation(cm); }\n  }\n  // Wraps a function in an operation. Returns the wrapped function.\n  function operation(cm, f) {\n    return function() {\n      if (cm.curOp) return f.apply(cm, arguments);\n      startOperation(cm);\n      try { return f.apply(cm, arguments); }\n      finally { endOperation(cm); }\n    };\n  }\n  // Used to add methods to editor and doc instances, wrapping them in\n  // operations.\n  function methodOp(f) {\n    return function() {\n      if (this.curOp) return f.apply(this, arguments);\n      startOperation(this);\n      try { return f.apply(this, arguments); }\n      finally { endOperation(this); }\n    };\n  }\n  function docMethodOp(f) {\n    return function() {\n      var cm = this.cm;\n      if (!cm || cm.curOp) return f.apply(this, arguments);\n      startOperation(cm);\n      try { return f.apply(this, arguments); }\n      finally { endOperation(cm); }\n    };\n  }\n\n  // VIEW TRACKING\n\n  // These objects are used to represent the visible (currently drawn)\n  // part of the document. A LineView may correspond to multiple\n  // logical lines, if those are connected by collapsed ranges.\n  function LineView(doc, line, lineN) {\n    // The starting line\n    this.line = line;\n    // Continuing lines, if any\n    this.rest = visualLineContinued(line);\n    // Number of logical lines in this visual line\n    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;\n    this.node = this.text = null;\n    this.hidden = lineIsHidden(doc, line);\n  }\n\n  // Create a range of LineView objects for the given lines.\n  function buildViewArray(cm, from, to) {\n    var array = [], nextPos;\n    for (var pos = from; pos < to; pos = nextPos) {\n      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);\n      nextPos = pos + view.size;\n      array.push(view);\n    }\n    return array;\n  }\n\n  // Updates the display.view data structure for a given change to the\n  // document. From and to are in pre-change coordinates. Lendiff is\n  // the amount of lines added or subtracted by the change. This is\n  // used for changes that span multiple lines, or change the way\n  // lines are divided into visual lines. regLineChange (below)\n  // registers single-line changes.\n  function regChange(cm, from, to, lendiff) {\n    if (from == null) from = cm.doc.first;\n    if (to == null) to = cm.doc.first + cm.doc.size;\n    if (!lendiff) lendiff = 0;\n\n    var display = cm.display;\n    if (lendiff && to < display.viewTo &&\n        (display.updateLineNumbers == null || display.updateLineNumbers > from))\n      display.updateLineNumbers = from;\n\n    cm.curOp.viewChanged = true;\n\n    if (from >= display.viewTo) { // Change after\n      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)\n        resetView(cm);\n    } else if (to <= display.viewFrom) { // Change before\n      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {\n        resetView(cm);\n      } else {\n        display.viewFrom += lendiff;\n        display.viewTo += lendiff;\n      }\n    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap\n      resetView(cm);\n    } else if (from <= display.viewFrom) { // Top overlap\n      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cut) {\n        display.view = display.view.slice(cut.index);\n        display.viewFrom = cut.lineN;\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    } else if (to >= display.viewTo) { // Bottom overlap\n      var cut = viewCuttingPoint(cm, from, from, -1);\n      if (cut) {\n        display.view = display.view.slice(0, cut.index);\n        display.viewTo = cut.lineN;\n      } else {\n        resetView(cm);\n      }\n    } else { // Gap in the middle\n      var cutTop = viewCuttingPoint(cm, from, from, -1);\n      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);\n      if (cutTop && cutBot) {\n        display.view = display.view.slice(0, cutTop.index)\n          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))\n          .concat(display.view.slice(cutBot.index));\n        display.viewTo += lendiff;\n      } else {\n        resetView(cm);\n      }\n    }\n\n    var ext = display.externalMeasured;\n    if (ext) {\n      if (to < ext.lineN)\n        ext.lineN += lendiff;\n      else if (from < ext.lineN + ext.size)\n        display.externalMeasured = null;\n    }\n  }\n\n  // Register a change to a single line. Type must be one of \"text\",\n  // \"gutter\", \"class\", \"widget\"\n  function regLineChange(cm, line, type) {\n    cm.curOp.viewChanged = true;\n    var display = cm.display, ext = cm.display.externalMeasured;\n    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)\n      display.externalMeasured = null;\n\n    if (line < display.viewFrom || line >= display.viewTo) return;\n    var lineView = display.view[findViewIndex(cm, line)];\n    if (lineView.node == null) return;\n    var arr = lineView.changes || (lineView.changes = []);\n    if (indexOf(arr, type) == -1) arr.push(type);\n  }\n\n  // Clear the view.\n  function resetView(cm) {\n    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;\n    cm.display.view = [];\n    cm.display.viewOffset = 0;\n  }\n\n  // Find the view element corresponding to a given line. Return null\n  // when the line isn't visible.\n  function findViewIndex(cm, n) {\n    if (n >= cm.display.viewTo) return null;\n    n -= cm.display.viewFrom;\n    if (n < 0) return null;\n    var view = cm.display.view;\n    for (var i = 0; i < view.length; i++) {\n      n -= view[i].size;\n      if (n < 0) return i;\n    }\n  }\n\n  function viewCuttingPoint(cm, oldN, newN, dir) {\n    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;\n    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)\n      return {index: index, lineN: newN};\n    for (var i = 0, n = cm.display.viewFrom; i < index; i++)\n      n += view[i].size;\n    if (n != oldN) {\n      if (dir > 0) {\n        if (index == view.length - 1) return null;\n        diff = (n + view[index].size) - oldN;\n        index++;\n      } else {\n        diff = n - oldN;\n      }\n      oldN += diff; newN += diff;\n    }\n    while (visualLineNo(cm.doc, newN) != newN) {\n      if (index == (dir < 0 ? 0 : view.length - 1)) return null;\n      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;\n      index += dir;\n    }\n    return {index: index, lineN: newN};\n  }\n\n  // Force the view to cover a given range, adding empty view element\n  // or clipping off existing ones as needed.\n  function adjustView(cm, from, to) {\n    var display = cm.display, view = display.view;\n    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {\n      display.view = buildViewArray(cm, from, to);\n      display.viewFrom = from;\n    } else {\n      if (display.viewFrom > from)\n        display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);\n      else if (display.viewFrom < from)\n        display.view = display.view.slice(findViewIndex(cm, from));\n      display.viewFrom = from;\n      if (display.viewTo < to)\n        display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));\n      else if (display.viewTo > to)\n        display.view = display.view.slice(0, findViewIndex(cm, to));\n    }\n    display.viewTo = to;\n  }\n\n  // Count the number of lines in the view whose DOM representation is\n  // out of date (or nonexistent).\n  function countDirtyView(cm) {\n    var view = cm.display.view, dirty = 0;\n    for (var i = 0; i < view.length; i++) {\n      var lineView = view[i];\n      if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;\n    }\n    return dirty;\n  }\n\n  // INPUT HANDLING\n\n  // Poll for input changes, using the normal rate of polling. This\n  // runs as long as the editor is focused.\n  function slowPoll(cm) {\n    if (cm.display.pollingFast) return;\n    cm.display.poll.set(cm.options.pollInterval, function() {\n      readInput(cm);\n      if (cm.state.focused) slowPoll(cm);\n    });\n  }\n\n  // When an event has just come in that is likely to add or change\n  // something in the input textarea, we poll faster, to ensure that\n  // the change appears on the screen quickly.\n  function fastPoll(cm) {\n    var missed = false;\n    cm.display.pollingFast = true;\n    function p() {\n      var changed = readInput(cm);\n      if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}\n      else {cm.display.pollingFast = false; slowPoll(cm);}\n    }\n    cm.display.poll.set(20, p);\n  }\n\n  // Read input from the textarea, and update the document to match.\n  // When something is selected, it is present in the textarea, and\n  // selected (unless it is huge, in which case a placeholder is\n  // used). When nothing is selected, the cursor sits after previously\n  // seen text (can be empty), which is stored in prevInput (we must\n  // not reset the textarea when typing, because that breaks IME).\n  function readInput(cm) {\n    var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc;\n    // Since this is called a *lot*, try to bail out as cheaply as\n    // possible when it is clear that nothing happened. hasSelection\n    // will be the case when there is a lot of text in the textarea,\n    // in which case reading its value would be expensive.\n    if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput)\n      return false;\n    // See paste handler for more on the fakedLastChar kludge\n    if (cm.state.pasteIncoming && cm.state.fakedLastChar) {\n      input.value = input.value.substring(0, input.value.length - 1);\n      cm.state.fakedLastChar = false;\n    }\n    var text = input.value;\n    // If nothing changed, bail.\n    if (text == prevInput && !cm.somethingSelected()) return false;\n    // Work around nonsensical selection resetting in IE9/10\n    if (ie && !ie_upto8 && cm.display.inputHasSelection === text) {\n      resetInput(cm);\n      return false;\n    }\n\n    var withOp = !cm.curOp;\n    if (withOp) startOperation(cm);\n    cm.display.shift = false;\n\n    if (text.charCodeAt(0) == 0x200b && doc.sel == cm.display.selForContextMenu && !prevInput)\n      prevInput = \"\\u200b\";\n    // Find the part of the input that is actually new\n    var same = 0, l = Math.min(prevInput.length, text.length);\n    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;\n    var inserted = text.slice(same), textLines = splitLines(inserted);\n\n    // When pasing N lines into N selections, insert one line per selection\n    var multiPaste = cm.state.pasteIncoming && textLines.length > 1 && doc.sel.ranges.length == textLines.length;\n\n    // Normal behavior is to insert the new text into every selection\n    for (var i = doc.sel.ranges.length - 1; i >= 0; i--) {\n      var range = doc.sel.ranges[i];\n      var from = range.from(), to = range.to();\n      // Handle deletion\n      if (same < prevInput.length)\n        from = Pos(from.line, from.ch - (prevInput.length - same));\n      // Handle overwrite\n      else if (cm.state.overwrite && range.empty() && !cm.state.pasteIncoming)\n        to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));\n      var updateInput = cm.curOp.updateInput;\n      var changeEvent = {from: from, to: to, text: multiPaste ? [textLines[i]] : textLines,\n                         origin: cm.state.pasteIncoming ? \"paste\" : cm.state.cutIncoming ? \"cut\" : \"+input\"};\n      makeChange(cm.doc, changeEvent);\n      signalLater(cm, \"inputRead\", cm, changeEvent);\n      // When an 'electric' character is inserted, immediately trigger a reindent\n      if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&\n          cm.options.smartIndent && range.head.ch < 100 &&\n          (!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {\n        var mode = cm.getModeAt(range.head);\n        if (mode.electricChars) {\n          for (var j = 0; j < mode.electricChars.length; j++)\n            if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {\n              indentLine(cm, range.head.line, \"smart\");\n              break;\n            }\n        } else if (mode.electricInput) {\n          var end = changeEnd(changeEvent);\n          if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))\n            indentLine(cm, range.head.line, \"smart\");\n        }\n      }\n    }\n    ensureCursorVisible(cm);\n    cm.curOp.updateInput = updateInput;\n    cm.curOp.typing = true;\n\n    // Don't leave long text in the textarea, since it makes further polling slow\n    if (text.length > 1000 || text.indexOf(\"\\n\") > -1) input.value = cm.display.prevInput = \"\";\n    else cm.display.prevInput = text;\n    if (withOp) endOperation(cm);\n    cm.state.pasteIncoming = cm.state.cutIncoming = false;\n    return true;\n  }\n\n  // Reset the input to correspond to the selection (or to be empty,\n  // when not typing and nothing is selected)\n  function resetInput(cm, typing) {\n    var minimal, selected, doc = cm.doc;\n    if (cm.somethingSelected()) {\n      cm.display.prevInput = \"\";\n      var range = doc.sel.primary();\n      minimal = hasCopyEvent &&\n        (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);\n      var content = minimal ? \"-\" : selected || cm.getSelection();\n      cm.display.input.value = content;\n      if (cm.state.focused) selectInput(cm.display.input);\n      if (ie && !ie_upto8) cm.display.inputHasSelection = content;\n    } else if (!typing) {\n      cm.display.prevInput = cm.display.input.value = \"\";\n      if (ie && !ie_upto8) cm.display.inputHasSelection = null;\n    }\n    cm.display.inaccurateSelection = minimal;\n  }\n\n  function focusInput(cm) {\n    if (cm.options.readOnly != \"nocursor\" && (!mobile || activeElt() != cm.display.input))\n      cm.display.input.focus();\n  }\n\n  function ensureFocus(cm) {\n    if (!cm.state.focused) { focusInput(cm); onFocus(cm); }\n  }\n\n  function isReadOnly(cm) {\n    return cm.options.readOnly || cm.doc.cantEdit;\n  }\n\n  // EVENT HANDLERS\n\n  // Attach the necessary event handlers when initializing the editor\n  function registerEventHandlers(cm) {\n    var d = cm.display;\n    on(d.scroller, \"mousedown\", operation(cm, onMouseDown));\n    // Older IE's will not fire a second mousedown for a double click\n    if (ie_upto10)\n      on(d.scroller, \"dblclick\", operation(cm, function(e) {\n        if (signalDOMEvent(cm, e)) return;\n        var pos = posFromMouse(cm, e);\n        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;\n        e_preventDefault(e);\n        var word = findWordAt(cm, pos);\n        extendSelection(cm.doc, word.anchor, word.head);\n      }));\n    else\n      on(d.scroller, \"dblclick\", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });\n    // Prevent normal selection in the editor (we handle our own)\n    on(d.lineSpace, \"selectstart\", function(e) {\n      if (!eventInWidget(d, e)) e_preventDefault(e);\n    });\n    // Some browsers fire contextmenu *after* opening the menu, at\n    // which point we can't mess with it anymore. Context menu is\n    // handled in onMouseDown for these browsers.\n    if (!captureRightClick) on(d.scroller, \"contextmenu\", function(e) {onContextMenu(cm, e);});\n\n    // Sync scrolling between fake scrollbars and real scrollable\n    // area, ensure viewport is updated when scrolling.\n    on(d.scroller, \"scroll\", function() {\n      if (d.scroller.clientHeight) {\n        setScrollTop(cm, d.scroller.scrollTop);\n        setScrollLeft(cm, d.scroller.scrollLeft, true);\n        signal(cm, \"scroll\", cm);\n      }\n    });\n    on(d.scrollbarV, \"scroll\", function() {\n      if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);\n    });\n    on(d.scrollbarH, \"scroll\", function() {\n      if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);\n    });\n\n    // Listen to wheel events in order to try and update the viewport on time.\n    on(d.scroller, \"mousewheel\", function(e){onScrollWheel(cm, e);});\n    on(d.scroller, \"DOMMouseScroll\", function(e){onScrollWheel(cm, e);});\n\n    // Prevent clicks in the scrollbars from killing focus\n    function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }\n    on(d.scrollbarH, \"mousedown\", reFocus);\n    on(d.scrollbarV, \"mousedown\", reFocus);\n    // Prevent wrapper from ever scrolling\n    on(d.wrapper, \"scroll\", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });\n\n    on(d.input, \"keyup\", operation(cm, onKeyUp));\n    on(d.input, \"input\", function() {\n      if (ie && !ie_upto8 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;\n      fastPoll(cm);\n    });\n    on(d.input, \"keydown\", operation(cm, onKeyDown));\n    on(d.input, \"keypress\", operation(cm, onKeyPress));\n    on(d.input, \"focus\", bind(onFocus, cm));\n    on(d.input, \"blur\", bind(onBlur, cm));\n\n    function drag_(e) {\n      if (!signalDOMEvent(cm, e)) e_stop(e);\n    }\n    if (cm.options.dragDrop) {\n      on(d.scroller, \"dragstart\", function(e){onDragStart(cm, e);});\n      on(d.scroller, \"dragenter\", drag_);\n      on(d.scroller, \"dragover\", drag_);\n      on(d.scroller, \"drop\", operation(cm, onDrop));\n    }\n    on(d.scroller, \"paste\", function(e) {\n      if (eventInWidget(d, e)) return;\n      cm.state.pasteIncoming = true;\n      focusInput(cm);\n      fastPoll(cm);\n    });\n    on(d.input, \"paste\", function() {\n      // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206\n      // Add a char to the end of textarea before paste occur so that\n      // selection doesn't span to the end of textarea.\n      if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {\n        var start = d.input.selectionStart, end = d.input.selectionEnd;\n        d.input.value += \"$\";\n        d.input.selectionStart = start;\n        d.input.selectionEnd = end;\n        cm.state.fakedLastChar = true;\n      }\n      cm.state.pasteIncoming = true;\n      fastPoll(cm);\n    });\n\n    function prepareCopyCut(e) {\n      if (cm.somethingSelected()) {\n        if (d.inaccurateSelection) {\n          d.prevInput = \"\";\n          d.inaccurateSelection = false;\n          d.input.value = cm.getSelection();\n          selectInput(d.input);\n        }\n      } else {\n        var text = \"\", ranges = [];\n        for (var i = 0; i < cm.doc.sel.ranges.length; i++) {\n          var line = cm.doc.sel.ranges[i].head.line;\n          var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};\n          ranges.push(lineRange);\n          text += cm.getRange(lineRange.anchor, lineRange.head);\n        }\n        if (e.type == \"cut\") {\n          cm.setSelections(ranges, null, sel_dontScroll);\n        } else {\n          d.prevInput = \"\";\n          d.input.value = text;\n          selectInput(d.input);\n        }\n      }\n      if (e.type == \"cut\") cm.state.cutIncoming = true;\n    }\n    on(d.input, \"cut\", prepareCopyCut);\n    on(d.input, \"copy\", prepareCopyCut);\n\n    // Needed to handle Tab key in KHTML\n    if (khtml) on(d.sizer, \"mouseup\", function() {\n      if (activeElt() == d.input) d.input.blur();\n      focusInput(cm);\n    });\n  }\n\n  // Called when the window resizes\n  function onResize(cm) {\n    // Might be a text scaling operation, clear size caches.\n    var d = cm.display;\n    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;\n    cm.setSize();\n  }\n\n  // MOUSE EVENTS\n\n  // Return true when the given mouse event happened in a widget\n  function eventInWidget(display, e) {\n    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {\n      if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;\n    }\n  }\n\n  // Given a mouse event, find the corresponding position. If liberal\n  // is false, it checks whether a gutter or scrollbar was clicked,\n  // and returns null if it was. forRect is used by rectangular\n  // selections, and tries to estimate a character position even for\n  // coordinates beyond the right of the text.\n  function posFromMouse(cm, e, liberal, forRect) {\n    var display = cm.display;\n    if (!liberal) {\n      var target = e_target(e);\n      if (target == display.scrollbarH || target == display.scrollbarV ||\n          target == display.scrollbarFiller || target == display.gutterFiller) return null;\n    }\n    var x, y, space = display.lineSpace.getBoundingClientRect();\n    // Fails unpredictably on IE[67] when mouse is dragged around quickly.\n    try { x = e.clientX - space.left; y = e.clientY - space.top; }\n    catch (e) { return null; }\n    var coords = coordsChar(cm, x, y), line;\n    if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {\n      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;\n      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));\n    }\n    return coords;\n  }\n\n  // A mouse down can be a single click, double click, triple click,\n  // start of selection drag, start of text drag, new cursor\n  // (ctrl-click), rectangle drag (alt-drag), or xwin\n  // middle-click-paste. Or it might be a click on something we should\n  // not interfere with, such as a scrollbar or widget.\n  function onMouseDown(e) {\n    if (signalDOMEvent(this, e)) return;\n    var cm = this, display = cm.display;\n    display.shift = e.shiftKey;\n\n    if (eventInWidget(display, e)) {\n      if (!webkit) {\n        // Briefly turn off draggability, to allow widgets to do\n        // normal dragging things.\n        display.scroller.draggable = false;\n        setTimeout(function(){display.scroller.draggable = true;}, 100);\n      }\n      return;\n    }\n    if (clickInGutter(cm, e)) return;\n    var start = posFromMouse(cm, e);\n    window.focus();\n\n    switch (e_button(e)) {\n    case 1:\n      if (start)\n        leftButtonDown(cm, e, start);\n      else if (e_target(e) == display.scroller)\n        e_preventDefault(e);\n      break;\n    case 2:\n      if (webkit) cm.state.lastMiddleDown = +new Date;\n      if (start) extendSelection(cm.doc, start);\n      setTimeout(bind(focusInput, cm), 20);\n      e_preventDefault(e);\n      break;\n    case 3:\n      if (captureRightClick) onContextMenu(cm, e);\n      break;\n    }\n  }\n\n  var lastClick, lastDoubleClick;\n  function leftButtonDown(cm, e, start) {\n    setTimeout(bind(ensureFocus, cm), 0);\n\n    var now = +new Date, type;\n    if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {\n      type = \"triple\";\n    } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {\n      type = \"double\";\n      lastDoubleClick = {time: now, pos: start};\n    } else {\n      type = \"single\";\n      lastClick = {time: now, pos: start};\n    }\n\n    var sel = cm.doc.sel, addNew = mac ? e.metaKey : e.ctrlKey;\n    if (cm.options.dragDrop && dragAndDrop && !addNew && !isReadOnly(cm) &&\n        type == \"single\" && sel.contains(start) > -1 && sel.somethingSelected())\n      leftButtonStartDrag(cm, e, start);\n    else\n      leftButtonSelect(cm, e, start, type, addNew);\n  }\n\n  // Start a text drag. When it ends, see if any dragging actually\n  // happen, and treat as a click if it didn't.\n  function leftButtonStartDrag(cm, e, start) {\n    var display = cm.display;\n    var dragEnd = operation(cm, function(e2) {\n      if (webkit) display.scroller.draggable = false;\n      cm.state.draggingText = false;\n      off(document, \"mouseup\", dragEnd);\n      off(display.scroller, \"drop\", dragEnd);\n      if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {\n        e_preventDefault(e2);\n        extendSelection(cm.doc, start);\n        focusInput(cm);\n        // Work around unexplainable focus problem in IE9 (#2127)\n        if (ie_upto10 && !ie_upto8)\n          setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);\n      }\n    });\n    // Let the drag handler handle this.\n    if (webkit) display.scroller.draggable = true;\n    cm.state.draggingText = dragEnd;\n    // IE's approach to draggable\n    if (display.scroller.dragDrop) display.scroller.dragDrop();\n    on(document, \"mouseup\", dragEnd);\n    on(display.scroller, \"drop\", dragEnd);\n  }\n\n  // Normal selection, as opposed to text dragging.\n  function leftButtonSelect(cm, e, start, type, addNew) {\n    var display = cm.display, doc = cm.doc;\n    e_preventDefault(e);\n\n    var ourRange, ourIndex, startSel = doc.sel;\n    if (addNew && !e.shiftKey) {\n      ourIndex = doc.sel.contains(start);\n      if (ourIndex > -1)\n        ourRange = doc.sel.ranges[ourIndex];\n      else\n        ourRange = new Range(start, start);\n    } else {\n      ourRange = doc.sel.primary();\n    }\n\n    if (e.altKey) {\n      type = \"rect\";\n      if (!addNew) ourRange = new Range(start, start);\n      start = posFromMouse(cm, e, true, true);\n      ourIndex = -1;\n    } else if (type == \"double\") {\n      var word = findWordAt(cm, start);\n      if (cm.display.shift || doc.extend)\n        ourRange = extendRange(doc, ourRange, word.anchor, word.head);\n      else\n        ourRange = word;\n    } else if (type == \"triple\") {\n      var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));\n      if (cm.display.shift || doc.extend)\n        ourRange = extendRange(doc, ourRange, line.anchor, line.head);\n      else\n        ourRange = line;\n    } else {\n      ourRange = extendRange(doc, ourRange, start);\n    }\n\n    if (!addNew) {\n      ourIndex = 0;\n      setSelection(doc, new Selection([ourRange], 0), sel_mouse);\n      startSel = doc.sel;\n    } else if (ourIndex > -1) {\n      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);\n    } else {\n      ourIndex = doc.sel.ranges.length;\n      setSelection(doc, normalizeSelection(doc.sel.ranges.concat([ourRange]), ourIndex),\n                   {scroll: false, origin: \"*mouse\"});\n    }\n\n    var lastPos = start;\n    function extendTo(pos) {\n      if (cmp(lastPos, pos) == 0) return;\n      lastPos = pos;\n\n      if (type == \"rect\") {\n        var ranges = [], tabSize = cm.options.tabSize;\n        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);\n        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);\n        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);\n        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));\n             line <= end; line++) {\n          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);\n          if (left == right)\n            ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));\n          else if (text.length > leftPos)\n            ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));\n        }\n        if (!ranges.length) ranges.push(new Range(start, start));\n        setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),\n                     {origin: \"*mouse\", scroll: false});\n        cm.scrollIntoView(pos);\n      } else {\n        var oldRange = ourRange;\n        var anchor = oldRange.anchor, head = pos;\n        if (type != \"single\") {\n          if (type == \"double\")\n            var range = findWordAt(cm, pos);\n          else\n            var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));\n          if (cmp(range.anchor, anchor) > 0) {\n            head = range.head;\n            anchor = minPos(oldRange.from(), range.anchor);\n          } else {\n            head = range.anchor;\n            anchor = maxPos(oldRange.to(), range.head);\n          }\n        }\n        var ranges = startSel.ranges.slice(0);\n        ranges[ourIndex] = new Range(clipPos(doc, anchor), head);\n        setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);\n      }\n    }\n\n    var editorSize = display.wrapper.getBoundingClientRect();\n    // Used to ensure timeout re-tries don't fire when another extend\n    // happened in the meantime (clearTimeout isn't reliable -- at\n    // least on Chrome, the timeouts still happen even when cleared,\n    // if the clear happens after their scheduled firing time).\n    var counter = 0;\n\n    function extend(e) {\n      var curCount = ++counter;\n      var cur = posFromMouse(cm, e, true, type == \"rect\");\n      if (!cur) return;\n      if (cmp(cur, lastPos) != 0) {\n        ensureFocus(cm);\n        extendTo(cur);\n        var visible = visibleLines(display, doc);\n        if (cur.line >= visible.to || cur.line < visible.from)\n          setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);\n      } else {\n        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;\n        if (outside) setTimeout(operation(cm, function() {\n          if (counter != curCount) return;\n          display.scroller.scrollTop += outside;\n          extend(e);\n        }), 50);\n      }\n    }\n\n    function done(e) {\n      counter = Infinity;\n      e_preventDefault(e);\n      focusInput(cm);\n      off(document, \"mousemove\", move);\n      off(document, \"mouseup\", up);\n      doc.history.lastSelOrigin = null;\n    }\n\n    var move = operation(cm, function(e) {\n      if ((ie && !ie_upto9) ?  !e.buttons : !e_button(e)) done(e);\n      else extend(e);\n    });\n    var up = operation(cm, done);\n    on(document, \"mousemove\", move);\n    on(document, \"mouseup\", up);\n  }\n\n  // Determines whether an event happened in the gutter, and fires the\n  // handlers for the corresponding event.\n  function gutterEvent(cm, e, type, prevent, signalfn) {\n    try { var mX = e.clientX, mY = e.clientY; }\n    catch(e) { return false; }\n    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;\n    if (prevent) e_preventDefault(e);\n\n    var display = cm.display;\n    var lineBox = display.lineDiv.getBoundingClientRect();\n\n    if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);\n    mY -= lineBox.top - display.viewOffset;\n\n    for (var i = 0; i < cm.options.gutters.length; ++i) {\n      var g = display.gutters.childNodes[i];\n      if (g && g.getBoundingClientRect().right >= mX) {\n        var line = lineAtHeight(cm.doc, mY);\n        var gutter = cm.options.gutters[i];\n        signalfn(cm, type, cm, line, gutter, e);\n        return e_defaultPrevented(e);\n      }\n    }\n  }\n\n  function clickInGutter(cm, e) {\n    return gutterEvent(cm, e, \"gutterClick\", true, signalLater);\n  }\n\n  // Kludge to work around strange IE behavior where it'll sometimes\n  // re-fire a series of drag-related events right after the drop (#1551)\n  var lastDrop = 0;\n\n  function onDrop(e) {\n    var cm = this;\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))\n      return;\n    e_preventDefault(e);\n    if (ie) lastDrop = +new Date;\n    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;\n    if (!pos || isReadOnly(cm)) return;\n    // Might be a file drop, in which case we simply extract the text\n    // and insert it.\n    if (files && files.length && window.FileReader && window.File) {\n      var n = files.length, text = Array(n), read = 0;\n      var loadFile = function(file, i) {\n        var reader = new FileReader;\n        reader.onload = operation(cm, function() {\n          text[i] = reader.result;\n          if (++read == n) {\n            pos = clipPos(cm.doc, pos);\n            var change = {from: pos, to: pos, text: splitLines(text.join(\"\\n\")), origin: \"paste\"};\n            makeChange(cm.doc, change);\n            setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));\n          }\n        });\n        reader.readAsText(file);\n      };\n      for (var i = 0; i < n; ++i) loadFile(files[i], i);\n    } else { // Normal drop\n      // Don't do a replace if the drop happened inside of the selected text.\n      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {\n        cm.state.draggingText(e);\n        // Ensure the editor is re-focused\n        setTimeout(bind(focusInput, cm), 20);\n        return;\n      }\n      try {\n        var text = e.dataTransfer.getData(\"Text\");\n        if (text) {\n          var selected = cm.state.draggingText && cm.listSelections();\n          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));\n          if (selected) for (var i = 0; i < selected.length; ++i)\n            replaceRange(cm.doc, \"\", selected[i].anchor, selected[i].head, \"drag\");\n          cm.replaceSelection(text, \"around\", \"paste\");\n          focusInput(cm);\n        }\n      }\n      catch(e){}\n    }\n  }\n\n  function onDragStart(cm, e) {\n    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }\n    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;\n\n    e.dataTransfer.setData(\"Text\", cm.getSelection());\n\n    // Use dummy image instead of default browsers image.\n    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.\n    if (e.dataTransfer.setDragImage && !safari) {\n      var img = elt(\"img\", null, null, \"position: fixed; left: 0; top: 0;\");\n      img.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n      if (presto) {\n        img.width = img.height = 1;\n        cm.display.wrapper.appendChild(img);\n        // Force a relayout, or Opera won't use our image for some obscure reason\n        img._top = img.offsetTop;\n      }\n      e.dataTransfer.setDragImage(img, 0, 0);\n      if (presto) img.parentNode.removeChild(img);\n    }\n  }\n\n  // SCROLL EVENTS\n\n  // Sync the scrollable area and scrollbars, ensure the viewport\n  // covers the visible area.\n  function setScrollTop(cm, val) {\n    if (Math.abs(cm.doc.scrollTop - val) < 2) return;\n    cm.doc.scrollTop = val;\n    if (!gecko) updateDisplay(cm, {top: val});\n    if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;\n    if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;\n    if (gecko) updateDisplay(cm);\n    startWorker(cm, 100);\n  }\n  // Sync scroller and scrollbar, ensure the gutter elements are\n  // aligned.\n  function setScrollLeft(cm, val, isScroller) {\n    if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;\n    val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);\n    cm.doc.scrollLeft = val;\n    alignHorizontally(cm);\n    if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;\n    if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;\n  }\n\n  // Since the delta values reported on mouse wheel events are\n  // unstandardized between browsers and even browser versions, and\n  // generally horribly unpredictable, this code starts by measuring\n  // the scroll effect that the first few mouse wheel events have,\n  // and, from that, detects the way it can convert deltas to pixel\n  // offsets afterwards.\n  //\n  // The reason we want to know the amount a wheel event will scroll\n  // is that it gives us a chance to update the display before the\n  // actual scrolling happens, reducing flickering.\n\n  var wheelSamples = 0, wheelPixelsPerUnit = null;\n  // Fill in a browser-detected starting value on browsers where we\n  // know one. These don't have to be accurate -- the result of them\n  // being wrong would just be a slight flicker on the first wheel\n  // scroll (if it is large enough).\n  if (ie) wheelPixelsPerUnit = -.53;\n  else if (gecko) wheelPixelsPerUnit = 15;\n  else if (chrome) wheelPixelsPerUnit = -.7;\n  else if (safari) wheelPixelsPerUnit = -1/3;\n\n  function onScrollWheel(cm, e) {\n    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;\n    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;\n    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;\n    else if (dy == null) dy = e.wheelDelta;\n\n    var display = cm.display, scroll = display.scroller;\n    // Quit if there's nothing to scroll here\n    if (!(dx && scroll.scrollWidth > scroll.clientWidth ||\n          dy && scroll.scrollHeight > scroll.clientHeight)) return;\n\n    // Webkit browsers on OS X abort momentum scrolls when the target\n    // of the scroll event is removed from the scrollable element.\n    // This hack (see related code in patchDisplay) makes sure the\n    // element is kept around.\n    if (dy && mac && webkit) {\n      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {\n        for (var i = 0; i < view.length; i++) {\n          if (view[i].node == cur) {\n            cm.display.currentWheelTarget = cur;\n            break outer;\n          }\n        }\n      }\n    }\n\n    // On some browsers, horizontal scrolling will cause redraws to\n    // happen before the gutter has been realigned, causing it to\n    // wriggle around in a most unseemly way. When we have an\n    // estimated pixels/delta value, we just handle horizontal\n    // scrolling entirely here. It'll be slightly off from native, but\n    // better than glitching out.\n    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {\n      if (dy)\n        setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));\n      setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));\n      e_preventDefault(e);\n      display.wheelStartX = null; // Abort measurement, if in progress\n      return;\n    }\n\n    // 'Project' the visible viewport to cover the area that is being\n    // scrolled into view (if we know enough to estimate it).\n    if (dy && wheelPixelsPerUnit != null) {\n      var pixels = dy * wheelPixelsPerUnit;\n      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;\n      if (pixels < 0) top = Math.max(0, top + pixels - 50);\n      else bot = Math.min(cm.doc.height, bot + pixels + 50);\n      updateDisplay(cm, {top: top, bottom: bot});\n    }\n\n    if (wheelSamples < 20) {\n      if (display.wheelStartX == null) {\n        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;\n        display.wheelDX = dx; display.wheelDY = dy;\n        setTimeout(function() {\n          if (display.wheelStartX == null) return;\n          var movedX = scroll.scrollLeft - display.wheelStartX;\n          var movedY = scroll.scrollTop - display.wheelStartY;\n          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||\n            (movedX && display.wheelDX && movedX / display.wheelDX);\n          display.wheelStartX = display.wheelStartY = null;\n          if (!sample) return;\n          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);\n          ++wheelSamples;\n        }, 200);\n      } else {\n        display.wheelDX += dx; display.wheelDY += dy;\n      }\n    }\n  }\n\n  // KEY EVENTS\n\n  // Run a handler that was bound to a key.\n  function doHandleBinding(cm, bound, dropShift) {\n    if (typeof bound == \"string\") {\n      bound = commands[bound];\n      if (!bound) return false;\n    }\n    // Ensure previous input has been read, so that the handler sees a\n    // consistent view of the document\n    if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;\n    var prevShift = cm.display.shift, done = false;\n    try {\n      if (isReadOnly(cm)) cm.state.suppressEdits = true;\n      if (dropShift) cm.display.shift = false;\n      done = bound(cm) != Pass;\n    } finally {\n      cm.display.shift = prevShift;\n      cm.state.suppressEdits = false;\n    }\n    return done;\n  }\n\n  // Collect the currently active keymaps.\n  function allKeyMaps(cm) {\n    var maps = cm.state.keyMaps.slice(0);\n    if (cm.options.extraKeys) maps.push(cm.options.extraKeys);\n    maps.push(cm.options.keyMap);\n    return maps;\n  }\n\n  var maybeTransition;\n  // Handle a key from the keydown event.\n  function handleKeyBinding(cm, e) {\n    // Handle automatic keymap transitions\n    var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;\n    clearTimeout(maybeTransition);\n    if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {\n      if (getKeyMap(cm.options.keyMap) == startMap) {\n        cm.options.keyMap = (next.call ? next.call(null, cm) : next);\n        keyMapChanged(cm);\n      }\n    }, 50);\n\n    var name = keyName(e, true), handled = false;\n    if (!name) return false;\n    var keymaps = allKeyMaps(cm);\n\n    if (e.shiftKey) {\n      // First try to resolve full name (including 'Shift-'). Failing\n      // that, see if there is a cursor-motion command (starting with\n      // 'go') bound to the keyname without 'Shift-'.\n      handled = lookupKey(\"Shift-\" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})\n             || lookupKey(name, keymaps, function(b) {\n                  if (typeof b == \"string\" ? /^go[A-Z]/.test(b) : b.motion)\n                    return doHandleBinding(cm, b);\n                });\n    } else {\n      handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });\n    }\n\n    if (handled) {\n      e_preventDefault(e);\n      restartBlink(cm);\n      signalLater(cm, \"keyHandled\", cm, name, e);\n    }\n    return handled;\n  }\n\n  // Handle a key from the keypress event\n  function handleCharBinding(cm, e, ch) {\n    var handled = lookupKey(\"'\" + ch + \"'\", allKeyMaps(cm),\n                            function(b) { return doHandleBinding(cm, b, true); });\n    if (handled) {\n      e_preventDefault(e);\n      restartBlink(cm);\n      signalLater(cm, \"keyHandled\", cm, \"'\" + ch + \"'\", e);\n    }\n    return handled;\n  }\n\n  var lastStoppedKey = null;\n  function onKeyDown(e) {\n    var cm = this;\n    ensureFocus(cm);\n    if (signalDOMEvent(cm, e)) return;\n    // IE does strange things with escape.\n    if (ie_upto10 && e.keyCode == 27) e.returnValue = false;\n    var code = e.keyCode;\n    cm.display.shift = code == 16 || e.shiftKey;\n    var handled = handleKeyBinding(cm, e);\n    if (presto) {\n      lastStoppedKey = handled ? code : null;\n      // Opera has no cut event... we try to at least catch the key combo\n      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))\n        cm.replaceSelection(\"\", null, \"cut\");\n    }\n\n    // Turn mouse into crosshair when Alt is held on Mac.\n    if (code == 18 && !/\\bCodeMirror-crosshair\\b/.test(cm.display.lineDiv.className))\n      showCrossHair(cm);\n  }\n\n  function showCrossHair(cm) {\n    var lineDiv = cm.display.lineDiv;\n    addClass(lineDiv, \"CodeMirror-crosshair\");\n\n    function up(e) {\n      if (e.keyCode == 18 || !e.altKey) {\n        rmClass(lineDiv, \"CodeMirror-crosshair\");\n        off(document, \"keyup\", up);\n        off(document, \"mouseover\", up);\n      }\n    }\n    on(document, \"keyup\", up);\n    on(document, \"mouseover\", up);\n  }\n\n  function onKeyUp(e) {\n    if (signalDOMEvent(this, e)) return;\n    if (e.keyCode == 16) this.doc.sel.shift = false;\n  }\n\n  function onKeyPress(e) {\n    var cm = this;\n    if (signalDOMEvent(cm, e)) return;\n    var keyCode = e.keyCode, charCode = e.charCode;\n    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}\n    if (((presto && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;\n    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);\n    if (handleCharBinding(cm, e, ch)) return;\n    if (ie && !ie_upto8) cm.display.inputHasSelection = null;\n    fastPoll(cm);\n  }\n\n  // FOCUS/BLUR EVENTS\n\n  function onFocus(cm) {\n    if (cm.options.readOnly == \"nocursor\") return;\n    if (!cm.state.focused) {\n      signal(cm, \"focus\", cm);\n      cm.state.focused = true;\n      addClass(cm.display.wrapper, \"CodeMirror-focused\");\n      // The prevInput test prevents this from firing when a context\n      // menu is closed (since the resetInput would kill the\n      // select-all detection hack)\n      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {\n        resetInput(cm);\n        if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730\n      }\n    }\n    slowPoll(cm);\n    restartBlink(cm);\n  }\n  function onBlur(cm) {\n    if (cm.state.focused) {\n      signal(cm, \"blur\", cm);\n      cm.state.focused = false;\n      rmClass(cm.display.wrapper, \"CodeMirror-focused\");\n    }\n    clearInterval(cm.display.blinker);\n    setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);\n  }\n\n  // CONTEXT MENU HANDLING\n\n  // To make the context menu work, we need to briefly unhide the\n  // textarea (making it as unobtrusive as possible) to let the\n  // right-click take effect on it.\n  function onContextMenu(cm, e) {\n    if (signalDOMEvent(cm, e, \"contextmenu\")) return;\n    var display = cm.display;\n    if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return;\n\n    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;\n    if (!pos || presto) return; // Opera is difficult.\n\n    // Reset the current text selection only if the click is done outside of the selection\n    // and 'resetSelectionOnContextMenu' option is true.\n    var reset = cm.options.resetSelectionOnContextMenu;\n    if (reset && cm.doc.sel.contains(pos) == -1)\n      operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);\n\n    var oldCSS = display.input.style.cssText;\n    display.inputDiv.style.position = \"absolute\";\n    display.input.style.cssText = \"position: fixed; width: 30px; height: 30px; top: \" + (e.clientY - 5) +\n      \"px; left: \" + (e.clientX - 5) + \"px; z-index: 1000; background: \" +\n      (ie ? \"rgba(255, 255, 255, .05)\" : \"transparent\") +\n      \"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";\n    focusInput(cm);\n    resetInput(cm);\n    // Adds \"Select all\" to context menu in FF\n    if (!cm.somethingSelected()) display.input.value = display.prevInput = \" \";\n    display.selForContextMenu = cm.doc.sel;\n    clearTimeout(display.detectingSelectAll);\n\n    // Select-all will be greyed out if there's nothing to select, so\n    // this adds a zero-width space so that we can later check whether\n    // it got selected.\n    function prepareSelectAllHack() {\n      if (display.input.selectionStart != null) {\n        var selected = cm.somethingSelected();\n        var extval = display.input.value = \"\\u200b\" + (selected ? display.input.value : \"\");\n        display.prevInput = selected ? \"\" : \"\\u200b\";\n        display.input.selectionStart = 1; display.input.selectionEnd = extval.length;\n      }\n    }\n    function rehide() {\n      display.inputDiv.style.position = \"relative\";\n      display.input.style.cssText = oldCSS;\n      if (ie_upto8) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos;\n      slowPoll(cm);\n\n      // Try to detect the user choosing select-all\n      if (display.input.selectionStart != null) {\n        if (!ie || ie_upto8) prepareSelectAllHack();\n        var i = 0, poll = function() {\n          if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)\n            operation(cm, commands.selectAll)(cm);\n          else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);\n          else resetInput(cm);\n        };\n        display.detectingSelectAll = setTimeout(poll, 200);\n      }\n    }\n\n    if (ie && !ie_upto8) prepareSelectAllHack();\n    if (captureRightClick) {\n      e_stop(e);\n      var mouseup = function() {\n        off(window, \"mouseup\", mouseup);\n        setTimeout(rehide, 20);\n      };\n      on(window, \"mouseup\", mouseup);\n    } else {\n      setTimeout(rehide, 50);\n    }\n  }\n\n  function contextMenuInGutter(cm, e) {\n    if (!hasHandler(cm, \"gutterContextMenu\")) return false;\n    return gutterEvent(cm, e, \"gutterContextMenu\", false, signal);\n  }\n\n  // UPDATING\n\n  // Compute the position of the end of a change (its 'to' property\n  // refers to the pre-change end).\n  var changeEnd = CodeMirror.changeEnd = function(change) {\n    if (!change.text) return change.to;\n    return Pos(change.from.line + change.text.length - 1,\n               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));\n  };\n\n  // Adjust a position to refer to the post-change position of the\n  // same text, or the end of the change if the change covers it.\n  function adjustForChange(pos, change) {\n    if (cmp(pos, change.from) < 0) return pos;\n    if (cmp(pos, change.to) <= 0) return changeEnd(change);\n\n    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;\n    if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;\n    return Pos(line, ch);\n  }\n\n  function computeSelAfterChange(doc, change) {\n    var out = [];\n    for (var i = 0; i < doc.sel.ranges.length; i++) {\n      var range = doc.sel.ranges[i];\n      out.push(new Range(adjustForChange(range.anchor, change),\n                         adjustForChange(range.head, change)));\n    }\n    return normalizeSelection(out, doc.sel.primIndex);\n  }\n\n  function offsetPos(pos, old, nw) {\n    if (pos.line == old.line)\n      return Pos(nw.line, pos.ch - old.ch + nw.ch);\n    else\n      return Pos(nw.line + (pos.line - old.line), pos.ch);\n  }\n\n  // Used by replaceSelections to allow moving the selection to the\n  // start or around the replaced test. Hint may be \"start\" or \"around\".\n  function computeReplacedSel(doc, changes, hint) {\n    var out = [];\n    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;\n    for (var i = 0; i < changes.length; i++) {\n      var change = changes[i];\n      var from = offsetPos(change.from, oldPrev, newPrev);\n      var to = offsetPos(changeEnd(change), oldPrev, newPrev);\n      oldPrev = change.to;\n      newPrev = to;\n      if (hint == \"around\") {\n        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;\n        out[i] = new Range(inv ? to : from, inv ? from : to);\n      } else {\n        out[i] = new Range(from, from);\n      }\n    }\n    return new Selection(out, doc.sel.primIndex);\n  }\n\n  // Allow \"beforeChange\" event handlers to influence a change\n  function filterChange(doc, change, update) {\n    var obj = {\n      canceled: false,\n      from: change.from,\n      to: change.to,\n      text: change.text,\n      origin: change.origin,\n      cancel: function() { this.canceled = true; }\n    };\n    if (update) obj.update = function(from, to, text, origin) {\n      if (from) this.from = clipPos(doc, from);\n      if (to) this.to = clipPos(doc, to);\n      if (text) this.text = text;\n      if (origin !== undefined) this.origin = origin;\n    };\n    signal(doc, \"beforeChange\", doc, obj);\n    if (doc.cm) signal(doc.cm, \"beforeChange\", doc.cm, obj);\n\n    if (obj.canceled) return null;\n    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};\n  }\n\n  // Apply a change to a document, and add it to the document's\n  // history, and propagating it to all linked documents.\n  function makeChange(doc, change, ignoreReadOnly) {\n    if (doc.cm) {\n      if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);\n      if (doc.cm.state.suppressEdits) return;\n    }\n\n    if (hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\")) {\n      change = filterChange(doc, change, true);\n      if (!change) return;\n    }\n\n    // Possibly split or suppress the update based on the presence\n    // of read-only spans in its range.\n    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);\n    if (split) {\n      for (var i = split.length - 1; i >= 0; --i)\n        makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [\"\"] : change.text});\n    } else {\n      makeChangeInner(doc, change);\n    }\n  }\n\n  function makeChangeInner(doc, change) {\n    if (change.text.length == 1 && change.text[0] == \"\" && cmp(change.from, change.to) == 0) return;\n    var selAfter = computeSelAfterChange(doc, change);\n    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);\n\n    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));\n    var rebased = [];\n\n    linkedDocs(doc, function(doc, sharedHist) {\n      if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n        rebaseHist(doc.history, change);\n        rebased.push(doc.history);\n      }\n      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));\n    });\n  }\n\n  // Revert a change stored in a document's history.\n  function makeChangeFromHistory(doc, type, allowSelectionOnly) {\n    if (doc.cm && doc.cm.state.suppressEdits) return;\n\n    var hist = doc.history, event, selAfter = doc.sel;\n    var source = type == \"undo\" ? hist.done : hist.undone, dest = type == \"undo\" ? hist.undone : hist.done;\n\n    // Verify that there is a useable event (so that ctrl-z won't\n    // needlessly clear selection events)\n    for (var i = 0; i < source.length; i++) {\n      event = source[i];\n      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)\n        break;\n    }\n    if (i == source.length) return;\n    hist.lastOrigin = hist.lastSelOrigin = null;\n\n    for (;;) {\n      event = source.pop();\n      if (event.ranges) {\n        pushSelectionToHistory(event, dest);\n        if (allowSelectionOnly && !event.equals(doc.sel)) {\n          setSelection(doc, event, {clearRedo: false});\n          return;\n        }\n        selAfter = event;\n      }\n      else break;\n    }\n\n    // Build up a reverse change object to add to the opposite history\n    // stack (redo when undoing, and vice versa).\n    var antiChanges = [];\n    pushSelectionToHistory(selAfter, dest);\n    dest.push({changes: antiChanges, generation: hist.generation});\n    hist.generation = event.generation || ++hist.maxGeneration;\n\n    var filter = hasHandler(doc, \"beforeChange\") || doc.cm && hasHandler(doc.cm, \"beforeChange\");\n\n    for (var i = event.changes.length - 1; i >= 0; --i) {\n      var change = event.changes[i];\n      change.origin = type;\n      if (filter && !filterChange(doc, change, false)) {\n        source.length = 0;\n        return;\n      }\n\n      antiChanges.push(historyChangeFromChange(doc, change));\n\n      var after = i ? computeSelAfterChange(doc, change, null) : lst(source);\n      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));\n      if (!i && doc.cm) doc.cm.scrollIntoView(change);\n      var rebased = [];\n\n      // Propagate to the linked documents\n      linkedDocs(doc, function(doc, sharedHist) {\n        if (!sharedHist && indexOf(rebased, doc.history) == -1) {\n          rebaseHist(doc.history, change);\n          rebased.push(doc.history);\n        }\n        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));\n      });\n    }\n  }\n\n  // Sub-views need their line numbers shifted when text is added\n  // above or below them in the parent document.\n  function shiftDoc(doc, distance) {\n    if (distance == 0) return;\n    doc.first += distance;\n    doc.sel = new Selection(map(doc.sel.ranges, function(range) {\n      return new Range(Pos(range.anchor.line + distance, range.anchor.ch),\n                       Pos(range.head.line + distance, range.head.ch));\n    }), doc.sel.primIndex);\n    if (doc.cm) {\n      regChange(doc.cm, doc.first, doc.first - distance, distance);\n      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)\n        regLineChange(doc.cm, l, \"gutter\");\n    }\n  }\n\n  // More lower-level change function, handling only a single document\n  // (not linked ones).\n  function makeChangeSingleDoc(doc, change, selAfter, spans) {\n    if (doc.cm && !doc.cm.curOp)\n      return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);\n\n    if (change.to.line < doc.first) {\n      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));\n      return;\n    }\n    if (change.from.line > doc.lastLine()) return;\n\n    // Clip the change to the size of this doc\n    if (change.from.line < doc.first) {\n      var shift = change.text.length - 1 - (doc.first - change.from.line);\n      shiftDoc(doc, shift);\n      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),\n                text: [lst(change.text)], origin: change.origin};\n    }\n    var last = doc.lastLine();\n    if (change.to.line > last) {\n      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),\n                text: [change.text[0]], origin: change.origin};\n    }\n\n    change.removed = getBetween(doc, change.from, change.to);\n\n    if (!selAfter) selAfter = computeSelAfterChange(doc, change, null);\n    if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);\n    else updateDoc(doc, change, spans);\n    setSelectionNoUndo(doc, selAfter, sel_dontScroll);\n  }\n\n  // Handle the interaction of a change to a document with the editor\n  // that this document is part of.\n  function makeChangeSingleDocInEditor(cm, change, spans) {\n    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;\n\n    var recomputeMaxLength = false, checkWidthStart = from.line;\n    if (!cm.options.lineWrapping) {\n      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));\n      doc.iter(checkWidthStart, to.line + 1, function(line) {\n        if (line == display.maxLine) {\n          recomputeMaxLength = true;\n          return true;\n        }\n      });\n    }\n\n    if (doc.sel.contains(change.from, change.to) > -1)\n      signalCursorActivity(cm);\n\n    updateDoc(doc, change, spans, estimateHeight(cm));\n\n    if (!cm.options.lineWrapping) {\n      doc.iter(checkWidthStart, from.line + change.text.length, function(line) {\n        var len = lineLength(line);\n        if (len > display.maxLineLength) {\n          display.maxLine = line;\n          display.maxLineLength = len;\n          display.maxLineChanged = true;\n          recomputeMaxLength = false;\n        }\n      });\n      if (recomputeMaxLength) cm.curOp.updateMaxLine = true;\n    }\n\n    // Adjust frontier, schedule worker\n    doc.frontier = Math.min(doc.frontier, from.line);\n    startWorker(cm, 400);\n\n    var lendiff = change.text.length - (to.line - from.line) - 1;\n    // Remember that these lines changed, for updating the display\n    if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))\n      regLineChange(cm, from.line, \"text\");\n    else\n      regChange(cm, from.line, to.line + 1, lendiff);\n\n    var changesHandler = hasHandler(cm, \"changes\"), changeHandler = hasHandler(cm, \"change\");\n    if (changeHandler || changesHandler) {\n      var obj = {\n        from: from, to: to,\n        text: change.text,\n        removed: change.removed,\n        origin: change.origin\n      };\n      if (changeHandler) signalLater(cm, \"change\", cm, obj);\n      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);\n    }\n    cm.display.selForContextMenu = null;\n  }\n\n  function replaceRange(doc, code, from, to, origin) {\n    if (!to) to = from;\n    if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }\n    if (typeof code == \"string\") code = splitLines(code);\n    makeChange(doc, {from: from, to: to, text: code, origin: origin});\n  }\n\n  // SCROLLING THINGS INTO VIEW\n\n  // If an editor sits on the top or bottom of the window, partially\n  // scrolled out of view, this ensures that the cursor is visible.\n  function maybeScrollWindow(cm, coords) {\n    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;\n    if (coords.top + box.top < 0) doScroll = true;\n    else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;\n    if (doScroll != null && !phantom) {\n      var scrollNode = elt(\"div\", \"\\u200b\", null, \"position: absolute; top: \" +\n                           (coords.top - display.viewOffset - paddingTop(cm.display)) + \"px; height: \" +\n                           (coords.bottom - coords.top + scrollerCutOff) + \"px; left: \" +\n                           coords.left + \"px; width: 2px;\");\n      cm.display.lineSpace.appendChild(scrollNode);\n      scrollNode.scrollIntoView(doScroll);\n      cm.display.lineSpace.removeChild(scrollNode);\n    }\n  }\n\n  // Scroll a given position into view (immediately), verifying that\n  // it actually became visible (as line heights are accurately\n  // measured, the position of something may 'drift' during drawing).\n  function scrollPosIntoView(cm, pos, end, margin) {\n    if (margin == null) margin = 0;\n    for (;;) {\n      var changed = false, coords = cursorCoords(cm, pos);\n      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);\n      var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),\n                                         Math.min(coords.top, endCoords.top) - margin,\n                                         Math.max(coords.left, endCoords.left),\n                                         Math.max(coords.bottom, endCoords.bottom) + margin);\n      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;\n      if (scrollPos.scrollTop != null) {\n        setScrollTop(cm, scrollPos.scrollTop);\n        if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;\n      }\n      if (scrollPos.scrollLeft != null) {\n        setScrollLeft(cm, scrollPos.scrollLeft);\n        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;\n      }\n      if (!changed) return coords;\n    }\n  }\n\n  // Scroll a given set of coordinates into view (immediately).\n  function scrollIntoView(cm, x1, y1, x2, y2) {\n    var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);\n    if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);\n    if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);\n  }\n\n  // Calculate a new scroll position needed to scroll the given\n  // rectangle into view. Returns an object with scrollTop and\n  // scrollLeft properties. When these are undefined, the\n  // vertical/horizontal position does not need to be adjusted.\n  function calculateScrollPos(cm, x1, y1, x2, y2) {\n    var display = cm.display, snapMargin = textHeight(cm.display);\n    if (y1 < 0) y1 = 0;\n    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;\n    var screen = display.scroller.clientHeight - scrollerCutOff, result = {};\n    var docBottom = cm.doc.height + paddingVert(display);\n    var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;\n    if (y1 < screentop) {\n      result.scrollTop = atTop ? 0 : y1;\n    } else if (y2 > screentop + screen) {\n      var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);\n      if (newTop != screentop) result.scrollTop = newTop;\n    }\n\n    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;\n    var screenw = display.scroller.clientWidth - scrollerCutOff;\n    x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth;\n    var gutterw = display.gutters.offsetWidth;\n    var atLeft = x1 < gutterw + 10;\n    if (x1 < screenleft + gutterw || atLeft) {\n      if (atLeft) x1 = 0;\n      result.scrollLeft = Math.max(0, x1 - 10 - gutterw);\n    } else if (x2 > screenw + screenleft - 3) {\n      result.scrollLeft = x2 + 10 - screenw;\n    }\n    return result;\n  }\n\n  // Store a relative adjustment to the scroll position in the current\n  // operation (to be applied when the operation finishes).\n  function addToScrollPos(cm, left, top) {\n    if (left != null || top != null) resolveScrollToPos(cm);\n    if (left != null)\n      cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;\n    if (top != null)\n      cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;\n  }\n\n  // Make sure that at the end of the operation the current cursor is\n  // shown.\n  function ensureCursorVisible(cm) {\n    resolveScrollToPos(cm);\n    var cur = cm.getCursor(), from = cur, to = cur;\n    if (!cm.options.lineWrapping) {\n      from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;\n      to = Pos(cur.line, cur.ch + 1);\n    }\n    cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};\n  }\n\n  // When an operation has its scrollToPos property set, and another\n  // scroll action is applied before the end of the operation, this\n  // 'simulates' scrolling that position into view in a cheap way, so\n  // that the effect of intermediate scroll commands is not ignored.\n  function resolveScrollToPos(cm) {\n    var range = cm.curOp.scrollToPos;\n    if (range) {\n      cm.curOp.scrollToPos = null;\n      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);\n      var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),\n                                    Math.min(from.top, to.top) - range.margin,\n                                    Math.max(from.right, to.right),\n                                    Math.max(from.bottom, to.bottom) + range.margin);\n      cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n    }\n  }\n\n  // API UTILITIES\n\n  // Indent the given line. The how parameter can be \"smart\",\n  // \"add\"/null, \"subtract\", or \"prev\". When aggressive is false\n  // (typically set to true for forced single-line indents), empty\n  // lines are not indented, and places where the mode returns Pass\n  // are left alone.\n  function indentLine(cm, n, how, aggressive) {\n    var doc = cm.doc, state;\n    if (how == null) how = \"add\";\n    if (how == \"smart\") {\n      // Fall back to \"prev\" when the mode doesn't have an indentation\n      // method.\n      if (!cm.doc.mode.indent) how = \"prev\";\n      else state = getStateBefore(cm, n);\n    }\n\n    var tabSize = cm.options.tabSize;\n    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);\n    if (line.stateAfter) line.stateAfter = null;\n    var curSpaceString = line.text.match(/^\\s*/)[0], indentation;\n    if (!aggressive && !/\\S/.test(line.text)) {\n      indentation = 0;\n      how = \"not\";\n    } else if (how == \"smart\") {\n      indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);\n      if (indentation == Pass) {\n        if (!aggressive) return;\n        how = \"prev\";\n      }\n    }\n    if (how == \"prev\") {\n      if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);\n      else indentation = 0;\n    } else if (how == \"add\") {\n      indentation = curSpace + cm.options.indentUnit;\n    } else if (how == \"subtract\") {\n      indentation = curSpace - cm.options.indentUnit;\n    } else if (typeof how == \"number\") {\n      indentation = curSpace + how;\n    }\n    indentation = Math.max(0, indentation);\n\n    var indentString = \"\", pos = 0;\n    if (cm.options.indentWithTabs)\n      for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += \"\\t\";}\n    if (pos < indentation) indentString += spaceStr(indentation - pos);\n\n    if (indentString != curSpaceString) {\n      replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), \"+input\");\n    } else {\n      // Ensure that, if the cursor was in the whitespace at the start\n      // of the line, it is moved to the end of that space.\n      for (var i = 0; i < doc.sel.ranges.length; i++) {\n        var range = doc.sel.ranges[i];\n        if (range.head.line == n && range.head.ch < curSpaceString.length) {\n          var pos = Pos(n, curSpaceString.length);\n          replaceOneSelection(doc, i, new Range(pos, pos));\n          break;\n        }\n      }\n    }\n    line.stateAfter = null;\n  }\n\n  // Utility for applying a change to a line by handle or number,\n  // returning the number and optionally registering the line as\n  // changed.\n  function changeLine(cm, handle, changeType, op) {\n    var no = handle, line = handle, doc = cm.doc;\n    if (typeof handle == \"number\") line = getLine(doc, clipLine(doc, handle));\n    else no = lineNo(handle);\n    if (no == null) return null;\n    if (op(line, no)) regLineChange(cm, no, changeType);\n    return line;\n  }\n\n  // Helper for deleting text near the selection(s), used to implement\n  // backspace, delete, and similar functionality.\n  function deleteNearSelection(cm, compute) {\n    var ranges = cm.doc.sel.ranges, kill = [];\n    // Build up a set of ranges to kill first, merging overlapping\n    // ranges.\n    for (var i = 0; i < ranges.length; i++) {\n      var toKill = compute(ranges[i]);\n      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {\n        var replaced = kill.pop();\n        if (cmp(replaced.from, toKill.from) < 0) {\n          toKill.from = replaced.from;\n          break;\n        }\n      }\n      kill.push(toKill);\n    }\n    // Next, remove those actual ranges.\n    runInOp(cm, function() {\n      for (var i = kill.length - 1; i >= 0; i--)\n        replaceRange(cm.doc, \"\", kill[i].from, kill[i].to, \"+delete\");\n      ensureCursorVisible(cm);\n    });\n  }\n\n  // Used for horizontal relative motion. Dir is -1 or 1 (left or\n  // right), unit can be \"char\", \"column\" (like char, but doesn't\n  // cross line boundaries), \"word\" (across next word), or \"group\" (to\n  // the start of next group of word or non-word-non-whitespace\n  // chars). The visually param controls whether, in right-to-left\n  // text, direction 1 means to move towards the next index in the\n  // string, or towards the character to the right of the current\n  // position. The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosH(doc, pos, dir, unit, visually) {\n    var line = pos.line, ch = pos.ch, origDir = dir;\n    var lineObj = getLine(doc, line);\n    var possible = true;\n    function findNextLine() {\n      var l = line + dir;\n      if (l < doc.first || l >= doc.first + doc.size) return (possible = false);\n      line = l;\n      return lineObj = getLine(doc, l);\n    }\n    function moveOnce(boundToLine) {\n      var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);\n      if (next == null) {\n        if (!boundToLine && findNextLine()) {\n          if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);\n          else ch = dir < 0 ? lineObj.text.length : 0;\n        } else return (possible = false);\n      } else ch = next;\n      return true;\n    }\n\n    if (unit == \"char\") moveOnce();\n    else if (unit == \"column\") moveOnce(true);\n    else if (unit == \"word\" || unit == \"group\") {\n      var sawType = null, group = unit == \"group\";\n      var helper = doc.cm && doc.cm.getHelper(pos, \"wordChars\");\n      for (var first = true;; first = false) {\n        if (dir < 0 && !moveOnce(!first)) break;\n        var cur = lineObj.text.charAt(ch) || \"\\n\";\n        var type = isWordChar(cur, helper) ? \"w\"\n          : group && cur == \"\\n\" ? \"n\"\n          : !group || /\\s/.test(cur) ? null\n          : \"p\";\n        if (group && !first && !type) type = \"s\";\n        if (sawType && sawType != type) {\n          if (dir < 0) {dir = 1; moveOnce();}\n          break;\n        }\n\n        if (type) sawType = type;\n        if (dir > 0 && !moveOnce(!first)) break;\n      }\n    }\n    var result = skipAtomic(doc, Pos(line, ch), origDir, true);\n    if (!possible) result.hitSide = true;\n    return result;\n  }\n\n  // For relative vertical movement. Dir may be -1 or 1. Unit can be\n  // \"page\" or \"line\". The resulting position will have a hitSide=true\n  // property if it reached the end of the document.\n  function findPosV(cm, pos, dir, unit) {\n    var doc = cm.doc, x = pos.left, y;\n    if (unit == \"page\") {\n      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);\n      y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));\n    } else if (unit == \"line\") {\n      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;\n    }\n    for (;;) {\n      var target = coordsChar(cm, x, y);\n      if (!target.outside) break;\n      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }\n      y += dir * 5;\n    }\n    return target;\n  }\n\n  // Find the word at the given position (as returned by coordsChar).\n  function findWordAt(cm, pos) {\n    var doc = cm.doc, line = getLine(doc, pos.line).text;\n    var start = pos.ch, end = pos.ch;\n    if (line) {\n      var helper = cm.getHelper(pos, \"wordChars\");\n      if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;\n      var startChar = line.charAt(start);\n      var check = isWordChar(startChar, helper)\n        ? function(ch) { return isWordChar(ch, helper); }\n        : /\\s/.test(startChar) ? function(ch) {return /\\s/.test(ch);}\n        : function(ch) {return !/\\s/.test(ch) && !isWordChar(ch);};\n      while (start > 0 && check(line.charAt(start - 1))) --start;\n      while (end < line.length && check(line.charAt(end))) ++end;\n    }\n    return new Range(Pos(pos.line, start), Pos(pos.line, end));\n  }\n\n  // EDITOR METHODS\n\n  // The publicly visible API. Note that methodOp(f) means\n  // 'wrap f in an operation, performed on its `this` parameter'.\n\n  // This is not the complete set of editor methods. Most of the\n  // methods defined on the Doc type are also injected into\n  // CodeMirror.prototype, for backwards compatibility and\n  // convenience.\n\n  CodeMirror.prototype = {\n    constructor: CodeMirror,\n    focus: function(){window.focus(); focusInput(this); fastPoll(this);},\n\n    setOption: function(option, value) {\n      var options = this.options, old = options[option];\n      if (options[option] == value && option != \"mode\") return;\n      options[option] = value;\n      if (optionHandlers.hasOwnProperty(option))\n        operation(this, optionHandlers[option])(this, value, old);\n    },\n\n    getOption: function(option) {return this.options[option];},\n    getDoc: function() {return this.doc;},\n\n    addKeyMap: function(map, bottom) {\n      this.state.keyMaps[bottom ? \"push\" : \"unshift\"](map);\n    },\n    removeKeyMap: function(map) {\n      var maps = this.state.keyMaps;\n      for (var i = 0; i < maps.length; ++i)\n        if (maps[i] == map || (typeof maps[i] != \"string\" && maps[i].name == map)) {\n          maps.splice(i, 1);\n          return true;\n        }\n    },\n\n    addOverlay: methodOp(function(spec, options) {\n      var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);\n      if (mode.startState) throw new Error(\"Overlays may not be stateful.\");\n      this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});\n      this.state.modeGen++;\n      regChange(this);\n    }),\n    removeOverlay: methodOp(function(spec) {\n      var overlays = this.state.overlays;\n      for (var i = 0; i < overlays.length; ++i) {\n        var cur = overlays[i].modeSpec;\n        if (cur == spec || typeof spec == \"string\" && cur.name == spec) {\n          overlays.splice(i, 1);\n          this.state.modeGen++;\n          regChange(this);\n          return;\n        }\n      }\n    }),\n\n    indentLine: methodOp(function(n, dir, aggressive) {\n      if (typeof dir != \"string\" && typeof dir != \"number\") {\n        if (dir == null) dir = this.options.smartIndent ? \"smart\" : \"prev\";\n        else dir = dir ? \"add\" : \"subtract\";\n      }\n      if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);\n    }),\n    indentSelection: methodOp(function(how) {\n      var ranges = this.doc.sel.ranges, end = -1;\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        if (!range.empty()) {\n          var start = Math.max(end, range.from().line);\n          var to = range.to();\n          end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;\n          for (var j = start; j < end; ++j)\n            indentLine(this, j, how);\n        } else if (range.head.line > end) {\n          indentLine(this, range.head.line, how, true);\n          end = range.head.line;\n          if (i == this.doc.sel.primIndex) ensureCursorVisible(this);\n        }\n      }\n    }),\n\n    // Fetch the parser token for a given character. Useful for hacks\n    // that want to inspect the mode state (say, for completion).\n    getTokenAt: function(pos, precise) {\n      var doc = this.doc;\n      pos = clipPos(doc, pos);\n      var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;\n      var line = getLine(doc, pos.line);\n      var stream = new StringStream(line.text, this.options.tabSize);\n      while (stream.pos < pos.ch && !stream.eol()) {\n        stream.start = stream.pos;\n        var style = readToken(mode, stream, state);\n      }\n      return {start: stream.start,\n              end: stream.pos,\n              string: stream.current(),\n              type: style || null,\n              state: state};\n    },\n\n    getTokenTypeAt: function(pos) {\n      pos = clipPos(this.doc, pos);\n      var styles = getLineStyles(this, getLine(this.doc, pos.line));\n      var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;\n      var type;\n      if (ch == 0) type = styles[2];\n      else for (;;) {\n        var mid = (before + after) >> 1;\n        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;\n        else if (styles[mid * 2 + 1] < ch) before = mid + 1;\n        else { type = styles[mid * 2 + 2]; break; }\n      }\n      var cut = type ? type.indexOf(\"cm-overlay \") : -1;\n      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);\n    },\n\n    getModeAt: function(pos) {\n      var mode = this.doc.mode;\n      if (!mode.innerMode) return mode;\n      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;\n    },\n\n    getHelper: function(pos, type) {\n      return this.getHelpers(pos, type)[0];\n    },\n\n    getHelpers: function(pos, type) {\n      var found = [];\n      if (!helpers.hasOwnProperty(type)) return helpers;\n      var help = helpers[type], mode = this.getModeAt(pos);\n      if (typeof mode[type] == \"string\") {\n        if (help[mode[type]]) found.push(help[mode[type]]);\n      } else if (mode[type]) {\n        for (var i = 0; i < mode[type].length; i++) {\n          var val = help[mode[type][i]];\n          if (val) found.push(val);\n        }\n      } else if (mode.helperType && help[mode.helperType]) {\n        found.push(help[mode.helperType]);\n      } else if (help[mode.name]) {\n        found.push(help[mode.name]);\n      }\n      for (var i = 0; i < help._global.length; i++) {\n        var cur = help._global[i];\n        if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)\n          found.push(cur.val);\n      }\n      return found;\n    },\n\n    getStateAfter: function(line, precise) {\n      var doc = this.doc;\n      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);\n      return getStateBefore(this, line + 1, precise);\n    },\n\n    cursorCoords: function(start, mode) {\n      var pos, range = this.doc.sel.primary();\n      if (start == null) pos = range.head;\n      else if (typeof start == \"object\") pos = clipPos(this.doc, start);\n      else pos = start ? range.from() : range.to();\n      return cursorCoords(this, pos, mode || \"page\");\n    },\n\n    charCoords: function(pos, mode) {\n      return charCoords(this, clipPos(this.doc, pos), mode || \"page\");\n    },\n\n    coordsChar: function(coords, mode) {\n      coords = fromCoordSystem(this, coords, mode || \"page\");\n      return coordsChar(this, coords.left, coords.top);\n    },\n\n    lineAtHeight: function(height, mode) {\n      height = fromCoordSystem(this, {top: height, left: 0}, mode || \"page\").top;\n      return lineAtHeight(this.doc, height + this.display.viewOffset);\n    },\n    heightAtLine: function(line, mode) {\n      var end = false, last = this.doc.first + this.doc.size - 1;\n      if (line < this.doc.first) line = this.doc.first;\n      else if (line > last) { line = last; end = true; }\n      var lineObj = getLine(this.doc, line);\n      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || \"page\").top +\n        (end ? this.doc.height - heightAtLine(lineObj) : 0);\n    },\n\n    defaultTextHeight: function() { return textHeight(this.display); },\n    defaultCharWidth: function() { return charWidth(this.display); },\n\n    setGutterMarker: methodOp(function(line, gutterID, value) {\n      return changeLine(this, line, \"gutter\", function(line) {\n        var markers = line.gutterMarkers || (line.gutterMarkers = {});\n        markers[gutterID] = value;\n        if (!value && isEmpty(markers)) line.gutterMarkers = null;\n        return true;\n      });\n    }),\n\n    clearGutter: methodOp(function(gutterID) {\n      var cm = this, doc = cm.doc, i = doc.first;\n      doc.iter(function(line) {\n        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {\n          line.gutterMarkers[gutterID] = null;\n          regLineChange(cm, i, \"gutter\");\n          if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;\n        }\n        ++i;\n      });\n    }),\n\n    addLineClass: methodOp(function(handle, where, cls) {\n      return changeLine(this, handle, \"class\", function(line) {\n        var prop = where == \"text\" ? \"textClass\" : where == \"background\" ? \"bgClass\" : \"wrapClass\";\n        if (!line[prop]) line[prop] = cls;\n        else if (new RegExp(\"(?:^|\\\\s)\" + cls + \"(?:$|\\\\s)\").test(line[prop])) return false;\n        else line[prop] += \" \" + cls;\n        return true;\n      });\n    }),\n\n    removeLineClass: methodOp(function(handle, where, cls) {\n      return changeLine(this, handle, \"class\", function(line) {\n        var prop = where == \"text\" ? \"textClass\" : where == \"background\" ? \"bgClass\" : \"wrapClass\";\n        var cur = line[prop];\n        if (!cur) return false;\n        else if (cls == null) line[prop] = null;\n        else {\n          var found = cur.match(new RegExp(\"(?:^|\\\\s+)\" + cls + \"(?:$|\\\\s+)\"));\n          if (!found) return false;\n          var end = found.index + found[0].length;\n          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? \"\" : \" \") + cur.slice(end) || null;\n        }\n        return true;\n      });\n    }),\n\n    addLineWidget: methodOp(function(handle, node, options) {\n      return addLineWidget(this, handle, node, options);\n    }),\n\n    removeLineWidget: function(widget) { widget.clear(); },\n\n    lineInfo: function(line) {\n      if (typeof line == \"number\") {\n        if (!isLine(this.doc, line)) return null;\n        var n = line;\n        line = getLine(this.doc, line);\n        if (!line) return null;\n      } else {\n        var n = lineNo(line);\n        if (n == null) return null;\n      }\n      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,\n              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,\n              widgets: line.widgets};\n    },\n\n    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},\n\n    addWidget: function(pos, node, scroll, vert, horiz) {\n      var display = this.display;\n      pos = cursorCoords(this, clipPos(this.doc, pos));\n      var top = pos.bottom, left = pos.left;\n      node.style.position = \"absolute\";\n      display.sizer.appendChild(node);\n      if (vert == \"over\") {\n        top = pos.top;\n      } else if (vert == \"above\" || vert == \"near\") {\n        var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),\n        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);\n        // Default to positioning above (if specified and possible); otherwise default to positioning below\n        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)\n          top = pos.top - node.offsetHeight;\n        else if (pos.bottom + node.offsetHeight <= vspace)\n          top = pos.bottom;\n        if (left + node.offsetWidth > hspace)\n          left = hspace - node.offsetWidth;\n      }\n      node.style.top = top + \"px\";\n      node.style.left = node.style.right = \"\";\n      if (horiz == \"right\") {\n        left = display.sizer.clientWidth - node.offsetWidth;\n        node.style.right = \"0px\";\n      } else {\n        if (horiz == \"left\") left = 0;\n        else if (horiz == \"middle\") left = (display.sizer.clientWidth - node.offsetWidth) / 2;\n        node.style.left = left + \"px\";\n      }\n      if (scroll)\n        scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);\n    },\n\n    triggerOnKeyDown: methodOp(onKeyDown),\n    triggerOnKeyPress: methodOp(onKeyPress),\n    triggerOnKeyUp: methodOp(onKeyUp),\n\n    execCommand: function(cmd) {\n      if (commands.hasOwnProperty(cmd))\n        return commands[cmd](this);\n    },\n\n    findPosH: function(from, amount, unit, visually) {\n      var dir = 1;\n      if (amount < 0) { dir = -1; amount = -amount; }\n      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n        cur = findPosH(this.doc, cur, dir, unit, visually);\n        if (cur.hitSide) break;\n      }\n      return cur;\n    },\n\n    moveH: methodOp(function(dir, unit) {\n      var cm = this;\n      cm.extendSelectionsBy(function(range) {\n        if (cm.display.shift || cm.doc.extend || range.empty())\n          return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);\n        else\n          return dir < 0 ? range.from() : range.to();\n      }, sel_move);\n    }),\n\n    deleteH: methodOp(function(dir, unit) {\n      var sel = this.doc.sel, doc = this.doc;\n      if (sel.somethingSelected())\n        doc.replaceSelection(\"\", null, \"+delete\");\n      else\n        deleteNearSelection(this, function(range) {\n          var other = findPosH(doc, range.head, dir, unit, false);\n          return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};\n        });\n    }),\n\n    findPosV: function(from, amount, unit, goalColumn) {\n      var dir = 1, x = goalColumn;\n      if (amount < 0) { dir = -1; amount = -amount; }\n      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {\n        var coords = cursorCoords(this, cur, \"div\");\n        if (x == null) x = coords.left;\n        else coords.left = x;\n        cur = findPosV(this, coords, dir, unit);\n        if (cur.hitSide) break;\n      }\n      return cur;\n    },\n\n    moveV: methodOp(function(dir, unit) {\n      var cm = this, doc = this.doc, goals = [];\n      var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();\n      doc.extendSelectionsBy(function(range) {\n        if (collapse)\n          return dir < 0 ? range.from() : range.to();\n        var headPos = cursorCoords(cm, range.head, \"div\");\n        if (range.goalColumn != null) headPos.left = range.goalColumn;\n        goals.push(headPos.left);\n        var pos = findPosV(cm, headPos, dir, unit);\n        if (unit == \"page\" && range == doc.sel.primary())\n          addToScrollPos(cm, null, charCoords(cm, pos, \"div\").top - headPos.top);\n        return pos;\n      }, sel_move);\n      if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)\n        doc.sel.ranges[i].goalColumn = goals[i];\n    }),\n\n    toggleOverwrite: function(value) {\n      if (value != null && value == this.state.overwrite) return;\n      if (this.state.overwrite = !this.state.overwrite)\n        addClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n      else\n        rmClass(this.display.cursorDiv, \"CodeMirror-overwrite\");\n\n      signal(this, \"overwriteToggle\", this, this.state.overwrite);\n    },\n    hasFocus: function() { return activeElt() == this.display.input; },\n\n    scrollTo: methodOp(function(x, y) {\n      if (x != null || y != null) resolveScrollToPos(this);\n      if (x != null) this.curOp.scrollLeft = x;\n      if (y != null) this.curOp.scrollTop = y;\n    }),\n    getScrollInfo: function() {\n      var scroller = this.display.scroller, co = scrollerCutOff;\n      return {left: scroller.scrollLeft, top: scroller.scrollTop,\n              height: scroller.scrollHeight - co, width: scroller.scrollWidth - co,\n              clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};\n    },\n\n    scrollIntoView: methodOp(function(range, margin) {\n      if (range == null) {\n        range = {from: this.doc.sel.primary().head, to: null};\n        if (margin == null) margin = this.options.cursorScrollMargin;\n      } else if (typeof range == \"number\") {\n        range = {from: Pos(range, 0), to: null};\n      } else if (range.from == null) {\n        range = {from: range, to: null};\n      }\n      if (!range.to) range.to = range.from;\n      range.margin = margin || 0;\n\n      if (range.from.line != null) {\n        resolveScrollToPos(this);\n        this.curOp.scrollToPos = range;\n      } else {\n        var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),\n                                      Math.min(range.from.top, range.to.top) - range.margin,\n                                      Math.max(range.from.right, range.to.right),\n                                      Math.max(range.from.bottom, range.to.bottom) + range.margin);\n        this.scrollTo(sPos.scrollLeft, sPos.scrollTop);\n      }\n    }),\n\n    setSize: methodOp(function(width, height) {\n      function interpret(val) {\n        return typeof val == \"number\" || /^\\d+$/.test(String(val)) ? val + \"px\" : val;\n      }\n      if (width != null) this.display.wrapper.style.width = interpret(width);\n      if (height != null) this.display.wrapper.style.height = interpret(height);\n      if (this.options.lineWrapping) clearLineMeasurementCache(this);\n      this.curOp.forceUpdate = true;\n      signal(this, \"refresh\", this);\n    }),\n\n    operation: function(f){return runInOp(this, f);},\n\n    refresh: methodOp(function() {\n      var oldHeight = this.display.cachedTextHeight;\n      regChange(this);\n      this.curOp.forceUpdate = true;\n      clearCaches(this);\n      this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);\n      updateGutterSpace(this);\n      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)\n        estimateLineHeights(this);\n      signal(this, \"refresh\", this);\n    }),\n\n    swapDoc: methodOp(function(doc) {\n      var old = this.doc;\n      old.cm = null;\n      attachDoc(this, doc);\n      clearCaches(this);\n      resetInput(this);\n      this.scrollTo(doc.scrollLeft, doc.scrollTop);\n      signalLater(this, \"swapDoc\", this, old);\n      return old;\n    }),\n\n    getInputField: function(){return this.display.input;},\n    getWrapperElement: function(){return this.display.wrapper;},\n    getScrollerElement: function(){return this.display.scroller;},\n    getGutterElement: function(){return this.display.gutters;}\n  };\n  eventMixin(CodeMirror);\n\n  // OPTION DEFAULTS\n\n  // The default configuration options.\n  var defaults = CodeMirror.defaults = {};\n  // Functions to run when options are changed.\n  var optionHandlers = CodeMirror.optionHandlers = {};\n\n  function option(name, deflt, handle, notOnInit) {\n    CodeMirror.defaults[name] = deflt;\n    if (handle) optionHandlers[name] =\n      notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;\n  }\n\n  // Passed to option handlers when there is no old value.\n  var Init = CodeMirror.Init = {toString: function(){return \"CodeMirror.Init\";}};\n\n  // These two are, on init, called from the constructor because they\n  // have to be initialized before the editor can start at all.\n  option(\"value\", \"\", function(cm, val) {\n    cm.setValue(val);\n  }, true);\n  option(\"mode\", null, function(cm, val) {\n    cm.doc.modeOption = val;\n    loadMode(cm);\n  }, true);\n\n  option(\"indentUnit\", 2, loadMode, true);\n  option(\"indentWithTabs\", false);\n  option(\"smartIndent\", true);\n  option(\"tabSize\", 4, function(cm) {\n    resetModeState(cm);\n    clearCaches(cm);\n    regChange(cm);\n  }, true);\n  option(\"specialChars\", /[\\t\\u0000-\\u0019\\u00ad\\u200b\\u2028\\u2029\\ufeff]/g, function(cm, val) {\n    cm.options.specialChars = new RegExp(val.source + (val.test(\"\\t\") ? \"\" : \"|\\t\"), \"g\");\n    cm.refresh();\n  }, true);\n  option(\"specialCharPlaceholder\", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);\n  option(\"electricChars\", true);\n  option(\"rtlMoveVisually\", !windows);\n  option(\"wholeLineUpdateBefore\", true);\n\n  option(\"theme\", \"default\", function(cm) {\n    themeChanged(cm);\n    guttersChanged(cm);\n  }, true);\n  option(\"keyMap\", \"default\", keyMapChanged);\n  option(\"extraKeys\", null);\n\n  option(\"lineWrapping\", false, wrappingChanged, true);\n  option(\"gutters\", [], function(cm) {\n    setGuttersForLineNumbers(cm.options);\n    guttersChanged(cm);\n  }, true);\n  option(\"fixedGutter\", true, function(cm, val) {\n    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + \"px\" : \"0\";\n    cm.refresh();\n  }, true);\n  option(\"coverGutterNextToScrollbar\", false, updateScrollbars, true);\n  option(\"lineNumbers\", false, function(cm) {\n    setGuttersForLineNumbers(cm.options);\n    guttersChanged(cm);\n  }, true);\n  option(\"firstLineNumber\", 1, guttersChanged, true);\n  option(\"lineNumberFormatter\", function(integer) {return integer;}, guttersChanged, true);\n  option(\"showCursorWhenSelecting\", false, updateSelection, true);\n\n  option(\"resetSelectionOnContextMenu\", true);\n\n  option(\"readOnly\", false, function(cm, val) {\n    if (val == \"nocursor\") {\n      onBlur(cm);\n      cm.display.input.blur();\n      cm.display.disabled = true;\n    } else {\n      cm.display.disabled = false;\n      if (!val) resetInput(cm);\n    }\n  });\n  option(\"disableInput\", false, function(cm, val) {if (!val) resetInput(cm);}, true);\n  option(\"dragDrop\", true);\n\n  option(\"cursorBlinkRate\", 530);\n  option(\"cursorScrollMargin\", 0);\n  option(\"cursorHeight\", 1);\n  option(\"workTime\", 100);\n  option(\"workDelay\", 100);\n  option(\"flattenSpans\", true, resetModeState, true);\n  option(\"addModeClass\", false, resetModeState, true);\n  option(\"pollInterval\", 100);\n  option(\"undoDepth\", 200, function(cm, val){cm.doc.history.undoDepth = val;});\n  option(\"historyEventDelay\", 1250);\n  option(\"viewportMargin\", 10, function(cm){cm.refresh();}, true);\n  option(\"maxHighlightLength\", 10000, resetModeState, true);\n  option(\"moveInputWithCursor\", true, function(cm, val) {\n    if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;\n  });\n\n  option(\"tabindex\", null, function(cm, val) {\n    cm.display.input.tabIndex = val || \"\";\n  });\n  option(\"autofocus\", null);\n\n  // MODE DEFINITION AND QUERYING\n\n  // Known modes, by name and by MIME\n  var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};\n\n  // Extra arguments are stored as the mode's dependencies, which is\n  // used by (legacy) mechanisms like loadmode.js to automatically\n  // load a mode. (Preferred mechanism is the require/define calls.)\n  CodeMirror.defineMode = function(name, mode) {\n    if (!CodeMirror.defaults.mode && name != \"null\") CodeMirror.defaults.mode = name;\n    if (arguments.length > 2) {\n      mode.dependencies = [];\n      for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);\n    }\n    modes[name] = mode;\n  };\n\n  CodeMirror.defineMIME = function(mime, spec) {\n    mimeModes[mime] = spec;\n  };\n\n  // Given a MIME type, a {name, ...options} config object, or a name\n  // string, return a mode config object.\n  CodeMirror.resolveMode = function(spec) {\n    if (typeof spec == \"string\" && mimeModes.hasOwnProperty(spec)) {\n      spec = mimeModes[spec];\n    } else if (spec && typeof spec.name == \"string\" && mimeModes.hasOwnProperty(spec.name)) {\n      var found = mimeModes[spec.name];\n      if (typeof found == \"string\") found = {name: found};\n      spec = createObj(found, spec);\n      spec.name = found.name;\n    } else if (typeof spec == \"string\" && /^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(spec)) {\n      return CodeMirror.resolveMode(\"application/xml\");\n    }\n    if (typeof spec == \"string\") return {name: spec};\n    else return spec || {name: \"null\"};\n  };\n\n  // Given a mode spec (anything that resolveMode accepts), find and\n  // initialize an actual mode object.\n  CodeMirror.getMode = function(options, spec) {\n    var spec = CodeMirror.resolveMode(spec);\n    var mfactory = modes[spec.name];\n    if (!mfactory) return CodeMirror.getMode(options, \"text/plain\");\n    var modeObj = mfactory(options, spec);\n    if (modeExtensions.hasOwnProperty(spec.name)) {\n      var exts = modeExtensions[spec.name];\n      for (var prop in exts) {\n        if (!exts.hasOwnProperty(prop)) continue;\n        if (modeObj.hasOwnProperty(prop)) modeObj[\"_\" + prop] = modeObj[prop];\n        modeObj[prop] = exts[prop];\n      }\n    }\n    modeObj.name = spec.name;\n    if (spec.helperType) modeObj.helperType = spec.helperType;\n    if (spec.modeProps) for (var prop in spec.modeProps)\n      modeObj[prop] = spec.modeProps[prop];\n\n    return modeObj;\n  };\n\n  // Minimal default mode.\n  CodeMirror.defineMode(\"null\", function() {\n    return {token: function(stream) {stream.skipToEnd();}};\n  });\n  CodeMirror.defineMIME(\"text/plain\", \"null\");\n\n  // This can be used to attach properties to mode objects from\n  // outside the actual mode definition.\n  var modeExtensions = CodeMirror.modeExtensions = {};\n  CodeMirror.extendMode = function(mode, properties) {\n    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});\n    copyObj(properties, exts);\n  };\n\n  // EXTENSIONS\n\n  CodeMirror.defineExtension = function(name, func) {\n    CodeMirror.prototype[name] = func;\n  };\n  CodeMirror.defineDocExtension = function(name, func) {\n    Doc.prototype[name] = func;\n  };\n  CodeMirror.defineOption = option;\n\n  var initHooks = [];\n  CodeMirror.defineInitHook = function(f) {initHooks.push(f);};\n\n  var helpers = CodeMirror.helpers = {};\n  CodeMirror.registerHelper = function(type, name, value) {\n    if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};\n    helpers[type][name] = value;\n  };\n  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {\n    CodeMirror.registerHelper(type, name, value);\n    helpers[type]._global.push({pred: predicate, val: value});\n  };\n\n  // MODE STATE HANDLING\n\n  // Utility functions for working with state. Exported because nested\n  // modes need to do this for their inner modes.\n\n  var copyState = CodeMirror.copyState = function(mode, state) {\n    if (state === true) return state;\n    if (mode.copyState) return mode.copyState(state);\n    var nstate = {};\n    for (var n in state) {\n      var val = state[n];\n      if (val instanceof Array) val = val.concat([]);\n      nstate[n] = val;\n    }\n    return nstate;\n  };\n\n  var startState = CodeMirror.startState = function(mode, a1, a2) {\n    return mode.startState ? mode.startState(a1, a2) : true;\n  };\n\n  // Given a mode and a state (for that mode), find the inner mode and\n  // state at the position that the state refers to.\n  CodeMirror.innerMode = function(mode, state) {\n    while (mode.innerMode) {\n      var info = mode.innerMode(state);\n      if (!info || info.mode == mode) break;\n      state = info.state;\n      mode = info.mode;\n    }\n    return info || {mode: mode, state: state};\n  };\n\n  // STANDARD COMMANDS\n\n  // Commands are parameter-less actions that can be performed on an\n  // editor, mostly used for keybindings.\n  var commands = CodeMirror.commands = {\n    selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},\n    singleSelection: function(cm) {\n      cm.setSelection(cm.getCursor(\"anchor\"), cm.getCursor(\"head\"), sel_dontScroll);\n    },\n    killLine: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        if (range.empty()) {\n          var len = getLine(cm.doc, range.head.line).text.length;\n          if (range.head.ch == len && range.head.line < cm.lastLine())\n            return {from: range.head, to: Pos(range.head.line + 1, 0)};\n          else\n            return {from: range.head, to: Pos(range.head.line, len)};\n        } else {\n          return {from: range.from(), to: range.to()};\n        }\n      });\n    },\n    deleteLine: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        return {from: Pos(range.from().line, 0),\n                to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};\n      });\n    },\n    delLineLeft: function(cm) {\n      deleteNearSelection(cm, function(range) {\n        return {from: Pos(range.from().line, 0), to: range.from()};\n      });\n    },\n    undo: function(cm) {cm.undo();},\n    redo: function(cm) {cm.redo();},\n    undoSelection: function(cm) {cm.undoSelection();},\n    redoSelection: function(cm) {cm.redoSelection();},\n    goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},\n    goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},\n    goLineStart: function(cm) {\n      cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); }, sel_move);\n    },\n    goLineStartSmart: function(cm) {\n      cm.extendSelectionsBy(function(range) {\n        var start = lineStart(cm, range.head.line);\n        var line = cm.getLineHandle(start.line);\n        var order = getOrder(line);\n        if (!order || order[0].level == 0) {\n          var firstNonWS = Math.max(0, line.text.search(/\\S/));\n          var inWS = range.head.line == start.line && range.head.ch <= firstNonWS && range.head.ch;\n          return Pos(start.line, inWS ? 0 : firstNonWS);\n        }\n        return start;\n      }, sel_move);\n    },\n    goLineEnd: function(cm) {\n      cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); }, sel_move);\n    },\n    goLineRight: function(cm) {\n      cm.extendSelectionsBy(function(range) {\n        var top = cm.charCoords(range.head, \"div\").top + 5;\n        return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, \"div\");\n      }, sel_move);\n    },\n    goLineLeft: function(cm) {\n      cm.extendSelectionsBy(function(range) {\n        var top = cm.charCoords(range.head, \"div\").top + 5;\n        return cm.coordsChar({left: 0, top: top}, \"div\");\n      }, sel_move);\n    },\n    goLineUp: function(cm) {cm.moveV(-1, \"line\");},\n    goLineDown: function(cm) {cm.moveV(1, \"line\");},\n    goPageUp: function(cm) {cm.moveV(-1, \"page\");},\n    goPageDown: function(cm) {cm.moveV(1, \"page\");},\n    goCharLeft: function(cm) {cm.moveH(-1, \"char\");},\n    goCharRight: function(cm) {cm.moveH(1, \"char\");},\n    goColumnLeft: function(cm) {cm.moveH(-1, \"column\");},\n    goColumnRight: function(cm) {cm.moveH(1, \"column\");},\n    goWordLeft: function(cm) {cm.moveH(-1, \"word\");},\n    goGroupRight: function(cm) {cm.moveH(1, \"group\");},\n    goGroupLeft: function(cm) {cm.moveH(-1, \"group\");},\n    goWordRight: function(cm) {cm.moveH(1, \"word\");},\n    delCharBefore: function(cm) {cm.deleteH(-1, \"char\");},\n    delCharAfter: function(cm) {cm.deleteH(1, \"char\");},\n    delWordBefore: function(cm) {cm.deleteH(-1, \"word\");},\n    delWordAfter: function(cm) {cm.deleteH(1, \"word\");},\n    delGroupBefore: function(cm) {cm.deleteH(-1, \"group\");},\n    delGroupAfter: function(cm) {cm.deleteH(1, \"group\");},\n    indentAuto: function(cm) {cm.indentSelection(\"smart\");},\n    indentMore: function(cm) {cm.indentSelection(\"add\");},\n    indentLess: function(cm) {cm.indentSelection(\"subtract\");},\n    insertTab: function(cm) {cm.replaceSelection(\"\\t\");},\n    insertSoftTab: function(cm) {\n      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;\n      for (var i = 0; i < ranges.length; i++) {\n        var pos = ranges[i].from();\n        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);\n        spaces.push(new Array(tabSize - col % tabSize + 1).join(\" \"));\n      }\n      cm.replaceSelections(spaces);\n    },\n    defaultTab: function(cm) {\n      if (cm.somethingSelected()) cm.indentSelection(\"add\");\n      else cm.execCommand(\"insertTab\");\n    },\n    transposeChars: function(cm) {\n      runInOp(cm, function() {\n        var ranges = cm.listSelections(), newSel = [];\n        for (var i = 0; i < ranges.length; i++) {\n          var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;\n          if (line) {\n            if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);\n            if (cur.ch > 0) {\n              cur = new Pos(cur.line, cur.ch + 1);\n              cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),\n                              Pos(cur.line, cur.ch - 2), cur, \"+transpose\");\n            } else if (cur.line > cm.doc.first) {\n              var prev = getLine(cm.doc, cur.line - 1).text;\n              if (prev)\n                cm.replaceRange(line.charAt(0) + \"\\n\" + prev.charAt(prev.length - 1),\n                                Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), \"+transpose\");\n            }\n          }\n          newSel.push(new Range(cur, cur));\n        }\n        cm.setSelections(newSel);\n      });\n    },\n    newlineAndIndent: function(cm) {\n      runInOp(cm, function() {\n        var len = cm.listSelections().length;\n        for (var i = 0; i < len; i++) {\n          var range = cm.listSelections()[i];\n          cm.replaceRange(\"\\n\", range.anchor, range.head, \"+input\");\n          cm.indentLine(range.from().line + 1, null, true);\n          ensureCursorVisible(cm);\n        }\n      });\n    },\n    toggleOverwrite: function(cm) {cm.toggleOverwrite();}\n  };\n\n  // STANDARD KEYMAPS\n\n  var keyMap = CodeMirror.keyMap = {};\n  keyMap.basic = {\n    \"Left\": \"goCharLeft\", \"Right\": \"goCharRight\", \"Up\": \"goLineUp\", \"Down\": \"goLineDown\",\n    \"End\": \"goLineEnd\", \"Home\": \"goLineStartSmart\", \"PageUp\": \"goPageUp\", \"PageDown\": \"goPageDown\",\n    \"Delete\": \"delCharAfter\", \"Backspace\": \"delCharBefore\", \"Shift-Backspace\": \"delCharBefore\",\n    \"Tab\": \"defaultTab\", \"Shift-Tab\": \"indentAuto\",\n    \"Enter\": \"newlineAndIndent\", \"Insert\": \"toggleOverwrite\",\n    \"Esc\": \"singleSelection\"\n  };\n  // Note that the save and find-related commands aren't defined by\n  // default. User code or addons can define them. Unknown commands\n  // are simply ignored.\n  keyMap.pcDefault = {\n    \"Ctrl-A\": \"selectAll\", \"Ctrl-D\": \"deleteLine\", \"Ctrl-Z\": \"undo\", \"Shift-Ctrl-Z\": \"redo\", \"Ctrl-Y\": \"redo\",\n    \"Ctrl-Home\": \"goDocStart\", \"Ctrl-Up\": \"goDocStart\", \"Ctrl-End\": \"goDocEnd\", \"Ctrl-Down\": \"goDocEnd\",\n    \"Ctrl-Left\": \"goGroupLeft\", \"Ctrl-Right\": \"goGroupRight\", \"Alt-Left\": \"goLineStart\", \"Alt-Right\": \"goLineEnd\",\n    \"Ctrl-Backspace\": \"delGroupBefore\", \"Ctrl-Delete\": \"delGroupAfter\", \"Ctrl-S\": \"save\", \"Ctrl-F\": \"find\",\n    \"Ctrl-G\": \"findNext\", \"Shift-Ctrl-G\": \"findPrev\", \"Shift-Ctrl-F\": \"replace\", \"Shift-Ctrl-R\": \"replaceAll\",\n    \"Ctrl-[\": \"indentLess\", \"Ctrl-]\": \"indentMore\",\n    \"Ctrl-U\": \"undoSelection\", \"Shift-Ctrl-U\": \"redoSelection\", \"Alt-U\": \"redoSelection\",\n    fallthrough: \"basic\"\n  };\n  keyMap.macDefault = {\n    \"Cmd-A\": \"selectAll\", \"Cmd-D\": \"deleteLine\", \"Cmd-Z\": \"undo\", \"Shift-Cmd-Z\": \"redo\", \"Cmd-Y\": \"redo\",\n    \"Cmd-Up\": \"goDocStart\", \"Cmd-End\": \"goDocEnd\", \"Cmd-Down\": \"goDocEnd\", \"Alt-Left\": \"goGroupLeft\",\n    \"Alt-Right\": \"goGroupRight\", \"Cmd-Left\": \"goLineStart\", \"Cmd-Right\": \"goLineEnd\", \"Alt-Backspace\": \"delGroupBefore\",\n    \"Ctrl-Alt-Backspace\": \"delGroupAfter\", \"Alt-Delete\": \"delGroupAfter\", \"Cmd-S\": \"save\", \"Cmd-F\": \"find\",\n    \"Cmd-G\": \"findNext\", \"Shift-Cmd-G\": \"findPrev\", \"Cmd-Alt-F\": \"replace\", \"Shift-Cmd-Alt-F\": \"replaceAll\",\n    \"Cmd-[\": \"indentLess\", \"Cmd-]\": \"indentMore\", \"Cmd-Backspace\": \"delLineLeft\",\n    \"Cmd-U\": \"undoSelection\", \"Shift-Cmd-U\": \"redoSelection\",\n    fallthrough: [\"basic\", \"emacsy\"]\n  };\n  // Very basic readline/emacs-style bindings, which are standard on Mac.\n  keyMap.emacsy = {\n    \"Ctrl-F\": \"goCharRight\", \"Ctrl-B\": \"goCharLeft\", \"Ctrl-P\": \"goLineUp\", \"Ctrl-N\": \"goLineDown\",\n    \"Alt-F\": \"goWordRight\", \"Alt-B\": \"goWordLeft\", \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n    \"Ctrl-V\": \"goPageDown\", \"Shift-Ctrl-V\": \"goPageUp\", \"Ctrl-D\": \"delCharAfter\", \"Ctrl-H\": \"delCharBefore\",\n    \"Alt-D\": \"delWordAfter\", \"Alt-Backspace\": \"delWordBefore\", \"Ctrl-K\": \"killLine\", \"Ctrl-T\": \"transposeChars\"\n  };\n  keyMap[\"default\"] = mac ? keyMap.macDefault : keyMap.pcDefault;\n\n  // KEYMAP DISPATCH\n\n  function getKeyMap(val) {\n    if (typeof val == \"string\") return keyMap[val];\n    else return val;\n  }\n\n  // Given an array of keymaps and a key name, call handle on any\n  // bindings found, until that returns a truthy value, at which point\n  // we consider the key handled. Implements things like binding a key\n  // to false stopping further handling and keymap fallthrough.\n  var lookupKey = CodeMirror.lookupKey = function(name, maps, handle) {\n    function lookup(map) {\n      map = getKeyMap(map);\n      var found = map[name];\n      if (found === false) return \"stop\";\n      if (found != null && handle(found)) return true;\n      if (map.nofallthrough) return \"stop\";\n\n      var fallthrough = map.fallthrough;\n      if (fallthrough == null) return false;\n      if (Object.prototype.toString.call(fallthrough) != \"[object Array]\")\n        return lookup(fallthrough);\n      for (var i = 0; i < fallthrough.length; ++i) {\n        var done = lookup(fallthrough[i]);\n        if (done) return done;\n      }\n      return false;\n    }\n\n    for (var i = 0; i < maps.length; ++i) {\n      var done = lookup(maps[i]);\n      if (done) return done != \"stop\";\n    }\n  };\n\n  // Modifier key presses don't count as 'real' key presses for the\n  // purpose of keymap fallthrough.\n  var isModifierKey = CodeMirror.isModifierKey = function(event) {\n    var name = keyNames[event.keyCode];\n    return name == \"Ctrl\" || name == \"Alt\" || name == \"Shift\" || name == \"Mod\";\n  };\n\n  // Look up the name of a key as indicated by an event object.\n  var keyName = CodeMirror.keyName = function(event, noShift) {\n    if (presto && event.keyCode == 34 && event[\"char\"]) return false;\n    var name = keyNames[event.keyCode];\n    if (name == null || event.altGraphKey) return false;\n    if (event.altKey) name = \"Alt-\" + name;\n    if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = \"Ctrl-\" + name;\n    if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = \"Cmd-\" + name;\n    if (!noShift && event.shiftKey) name = \"Shift-\" + name;\n    return name;\n  };\n\n  // FROMTEXTAREA\n\n  CodeMirror.fromTextArea = function(textarea, options) {\n    if (!options) options = {};\n    options.value = textarea.value;\n    if (!options.tabindex && textarea.tabindex)\n      options.tabindex = textarea.tabindex;\n    if (!options.placeholder && textarea.placeholder)\n      options.placeholder = textarea.placeholder;\n    // Set autofocus to true if this textarea is focused, or if it has\n    // autofocus and no other element is focused.\n    if (options.autofocus == null) {\n      var hasFocus = activeElt();\n      options.autofocus = hasFocus == textarea ||\n        textarea.getAttribute(\"autofocus\") != null && hasFocus == document.body;\n    }\n\n    function save() {textarea.value = cm.getValue();}\n    if (textarea.form) {\n      on(textarea.form, \"submit\", save);\n      // Deplorable hack to make the submit method do the right thing.\n      if (!options.leaveSubmitMethodAlone) {\n        var form = textarea.form, realSubmit = form.submit;\n        try {\n          var wrappedSubmit = form.submit = function() {\n            save();\n            form.submit = realSubmit;\n            form.submit();\n            form.submit = wrappedSubmit;\n          };\n        } catch(e) {}\n      }\n    }\n\n    textarea.style.display = \"none\";\n    var cm = CodeMirror(function(node) {\n      textarea.parentNode.insertBefore(node, textarea.nextSibling);\n    }, options);\n    cm.save = save;\n    cm.getTextArea = function() { return textarea; };\n    cm.toTextArea = function() {\n      save();\n      textarea.parentNode.removeChild(cm.getWrapperElement());\n      textarea.style.display = \"\";\n      if (textarea.form) {\n        off(textarea.form, \"submit\", save);\n        if (typeof textarea.form.submit == \"function\")\n          textarea.form.submit = realSubmit;\n      }\n    };\n    return cm;\n  };\n\n  // STRING STREAM\n\n  // Fed to the mode parsers, provides helper functions to make\n  // parsers more succinct.\n\n  var StringStream = CodeMirror.StringStream = function(string, tabSize) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n  };\n\n  StringStream.prototype = {\n    eol: function() {return this.pos >= this.string.length;},\n    sol: function() {return this.pos == this.lineStart;},\n    peek: function() {return this.string.charAt(this.pos) || undefined;},\n    next: function() {\n      if (this.pos < this.string.length)\n        return this.string.charAt(this.pos++);\n    },\n    eat: function(match) {\n      var ch = this.string.charAt(this.pos);\n      if (typeof match == \"string\") var ok = ch == match;\n      else var ok = ch && (match.test ? match.test(ch) : match(ch));\n      if (ok) {++this.pos; return ch;}\n    },\n    eatWhile: function(match) {\n      var start = this.pos;\n      while (this.eat(match)){}\n      return this.pos > start;\n    },\n    eatSpace: function() {\n      var start = this.pos;\n      while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;\n      return this.pos > start;\n    },\n    skipToEnd: function() {this.pos = this.string.length;},\n    skipTo: function(ch) {\n      var found = this.string.indexOf(ch, this.pos);\n      if (found > -1) {this.pos = found; return true;}\n    },\n    backUp: function(n) {this.pos -= n;},\n    column: function() {\n      if (this.lastColumnPos < this.start) {\n        this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);\n        this.lastColumnPos = this.start;\n      }\n      return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n    },\n    indentation: function() {\n      return countColumn(this.string, null, this.tabSize) -\n        (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);\n    },\n    match: function(pattern, consume, caseInsensitive) {\n      if (typeof pattern == \"string\") {\n        var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};\n        var substr = this.string.substr(this.pos, pattern.length);\n        if (cased(substr) == cased(pattern)) {\n          if (consume !== false) this.pos += pattern.length;\n          return true;\n        }\n      } else {\n        var match = this.string.slice(this.pos).match(pattern);\n        if (match && match.index > 0) return null;\n        if (match && consume !== false) this.pos += match[0].length;\n        return match;\n      }\n    },\n    current: function(){return this.string.slice(this.start, this.pos);},\n    hideFirstChars: function(n, inner) {\n      this.lineStart += n;\n      try { return inner(); }\n      finally { this.lineStart -= n; }\n    }\n  };\n\n  // TEXTMARKERS\n\n  // Created with markText and setBookmark methods. A TextMarker is a\n  // handle that can be used to clear or find a marked position in the\n  // document. Line objects hold arrays (markedSpans) containing\n  // {from, to, marker} object pointing to such marker objects, and\n  // indicating that such a marker is present on that line. Multiple\n  // lines may point to the same marker when it spans across lines.\n  // The spans will have null for their from/to properties when the\n  // marker continues beyond the start/end of the line. Markers have\n  // links back to the lines they currently touch.\n\n  var TextMarker = CodeMirror.TextMarker = function(doc, type) {\n    this.lines = [];\n    this.type = type;\n    this.doc = doc;\n  };\n  eventMixin(TextMarker);\n\n  // Clear the marker.\n  TextMarker.prototype.clear = function() {\n    if (this.explicitlyCleared) return;\n    var cm = this.doc.cm, withOp = cm && !cm.curOp;\n    if (withOp) startOperation(cm);\n    if (hasHandler(this, \"clear\")) {\n      var found = this.find();\n      if (found) signalLater(this, \"clear\", found.from, found.to);\n    }\n    var min = null, max = null;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (cm && !this.collapsed) regLineChange(cm, lineNo(line), \"text\");\n      else if (cm) {\n        if (span.to != null) max = lineNo(line);\n        if (span.from != null) min = lineNo(line);\n      }\n      line.markedSpans = removeMarkedSpan(line.markedSpans, span);\n      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)\n        updateLineHeight(line, textHeight(cm.display));\n    }\n    if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {\n      var visual = visualLine(this.lines[i]), len = lineLength(visual);\n      if (len > cm.display.maxLineLength) {\n        cm.display.maxLine = visual;\n        cm.display.maxLineLength = len;\n        cm.display.maxLineChanged = true;\n      }\n    }\n\n    if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);\n    this.lines.length = 0;\n    this.explicitlyCleared = true;\n    if (this.atomic && this.doc.cantEdit) {\n      this.doc.cantEdit = false;\n      if (cm) reCheckSelection(cm.doc);\n    }\n    if (cm) signalLater(cm, \"markerCleared\", cm, this);\n    if (withOp) endOperation(cm);\n    if (this.parent) this.parent.clear();\n  };\n\n  // Find the position of the marker in the document. Returns a {from,\n  // to} object by default. Side can be passed to get a specific side\n  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the\n  // Pos objects returned contain a line object, rather than a line\n  // number (used to prevent looking up the same line twice).\n  TextMarker.prototype.find = function(side, lineObj) {\n    if (side == null && this.type == \"bookmark\") side = 1;\n    var from, to;\n    for (var i = 0; i < this.lines.length; ++i) {\n      var line = this.lines[i];\n      var span = getMarkedSpanFor(line.markedSpans, this);\n      if (span.from != null) {\n        from = Pos(lineObj ? line : lineNo(line), span.from);\n        if (side == -1) return from;\n      }\n      if (span.to != null) {\n        to = Pos(lineObj ? line : lineNo(line), span.to);\n        if (side == 1) return to;\n      }\n    }\n    return from && {from: from, to: to};\n  };\n\n  // Signals that the marker's widget changed, and surrounding layout\n  // should be recomputed.\n  TextMarker.prototype.changed = function() {\n    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;\n    if (!pos || !cm) return;\n    runInOp(cm, function() {\n      var line = pos.line, lineN = lineNo(pos.line);\n      var view = findViewForLine(cm, lineN);\n      if (view) {\n        clearLineMeasurementCacheFor(view);\n        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;\n      }\n      cm.curOp.updateMaxLine = true;\n      if (!lineIsHidden(widget.doc, line) && widget.height != null) {\n        var oldHeight = widget.height;\n        widget.height = null;\n        var dHeight = widgetHeight(widget) - oldHeight;\n        if (dHeight)\n          updateLineHeight(line, line.height + dHeight);\n      }\n    });\n  };\n\n  TextMarker.prototype.attachLine = function(line) {\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)\n        (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);\n    }\n    this.lines.push(line);\n  };\n  TextMarker.prototype.detachLine = function(line) {\n    this.lines.splice(indexOf(this.lines, line), 1);\n    if (!this.lines.length && this.doc.cm) {\n      var op = this.doc.cm.curOp;\n      (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);\n    }\n  };\n\n  // Collapsed markers have unique ids, in order to be able to order\n  // them, which is needed for uniquely determining an outer marker\n  // when they overlap (they may nest, but not partially overlap).\n  var nextMarkerId = 0;\n\n  // Create a marker, wire it up to the right lines, and\n  function markText(doc, from, to, options, type) {\n    // Shared markers (across linked documents) are handled separately\n    // (markTextShared will call out to this again, once per\n    // document).\n    if (options && options.shared) return markTextShared(doc, from, to, options, type);\n    // Ensure we are in an operation.\n    if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);\n\n    var marker = new TextMarker(doc, type), diff = cmp(from, to);\n    if (options) copyObj(options, marker, false);\n    // Don't connect empty markers unless clearWhenEmpty is false\n    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)\n      return marker;\n    if (marker.replacedWith) {\n      // Showing up as a widget implies collapsed (widget replaces text)\n      marker.collapsed = true;\n      marker.widgetNode = elt(\"span\", [marker.replacedWith], \"CodeMirror-widget\");\n      if (!options.handleMouseEvents) marker.widgetNode.ignoreEvents = true;\n      if (options.insertLeft) marker.widgetNode.insertLeft = true;\n    }\n    if (marker.collapsed) {\n      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||\n          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))\n        throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");\n      sawCollapsedSpans = true;\n    }\n\n    if (marker.addToHistory)\n      addChangeToHistory(doc, {from: from, to: to, origin: \"markText\"}, doc.sel, NaN);\n\n    var curLine = from.line, cm = doc.cm, updateMaxLine;\n    doc.iter(curLine, to.line + 1, function(line) {\n      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)\n        updateMaxLine = true;\n      if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);\n      addMarkedSpan(line, new MarkedSpan(marker,\n                                         curLine == from.line ? from.ch : null,\n                                         curLine == to.line ? to.ch : null));\n      ++curLine;\n    });\n    // lineIsHidden depends on the presence of the spans, so needs a second pass\n    if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {\n      if (lineIsHidden(doc, line)) updateLineHeight(line, 0);\n    });\n\n    if (marker.clearOnEnter) on(marker, \"beforeCursorEnter\", function() { marker.clear(); });\n\n    if (marker.readOnly) {\n      sawReadOnlySpans = true;\n      if (doc.history.done.length || doc.history.undone.length)\n        doc.clearHistory();\n    }\n    if (marker.collapsed) {\n      marker.id = ++nextMarkerId;\n      marker.atomic = true;\n    }\n    if (cm) {\n      // Sync editor state\n      if (updateMaxLine) cm.curOp.updateMaxLine = true;\n      if (marker.collapsed)\n        regChange(cm, from.line, to.line + 1);\n      else if (marker.className || marker.title || marker.startStyle || marker.endStyle)\n        for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, \"text\");\n      if (marker.atomic) reCheckSelection(cm.doc);\n      signalLater(cm, \"markerAdded\", cm, marker);\n    }\n    return marker;\n  }\n\n  // SHARED TEXTMARKERS\n\n  // A shared marker spans multiple linked documents. It is\n  // implemented as a meta-marker-object controlling multiple normal\n  // markers.\n  var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {\n    this.markers = markers;\n    this.primary = primary;\n    for (var i = 0; i < markers.length; ++i)\n      markers[i].parent = this;\n  };\n  eventMixin(SharedTextMarker);\n\n  SharedTextMarker.prototype.clear = function() {\n    if (this.explicitlyCleared) return;\n    this.explicitlyCleared = true;\n    for (var i = 0; i < this.markers.length; ++i)\n      this.markers[i].clear();\n    signalLater(this, \"clear\");\n  };\n  SharedTextMarker.prototype.find = function(side, lineObj) {\n    return this.primary.find(side, lineObj);\n  };\n\n  function markTextShared(doc, from, to, options, type) {\n    options = copyObj(options);\n    options.shared = false;\n    var markers = [markText(doc, from, to, options, type)], primary = markers[0];\n    var widget = options.widgetNode;\n    linkedDocs(doc, function(doc) {\n      if (widget) options.widgetNode = widget.cloneNode(true);\n      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));\n      for (var i = 0; i < doc.linked.length; ++i)\n        if (doc.linked[i].isParent) return;\n      primary = lst(markers);\n    });\n    return new SharedTextMarker(markers, primary);\n  }\n\n  function findSharedMarkers(doc) {\n    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),\n                         function(m) { return m.parent; });\n  }\n\n  function copySharedMarkers(doc, markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], pos = marker.find();\n      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);\n      if (cmp(mFrom, mTo)) {\n        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);\n        marker.markers.push(subMark);\n        subMark.parent = marker;\n      }\n    }\n  }\n\n  function detachSharedMarkers(markers) {\n    for (var i = 0; i < markers.length; i++) {\n      var marker = markers[i], linked = [marker.primary.doc];;\n      linkedDocs(marker.primary.doc, function(d) { linked.push(d); });\n      for (var j = 0; j < marker.markers.length; j++) {\n        var subMarker = marker.markers[j];\n        if (indexOf(linked, subMarker.doc) == -1) {\n          subMarker.parent = null;\n          marker.markers.splice(j--, 1);\n        }\n      }\n    }\n  }\n\n  // TEXTMARKER SPANS\n\n  function MarkedSpan(marker, from, to) {\n    this.marker = marker;\n    this.from = from; this.to = to;\n  }\n\n  // Search an array of spans for a span matching the given marker.\n  function getMarkedSpanFor(spans, marker) {\n    if (spans) for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.marker == marker) return span;\n    }\n  }\n  // Remove a span from an array, returning undefined if no spans are\n  // left (we don't store arrays for lines without spans).\n  function removeMarkedSpan(spans, span) {\n    for (var r, i = 0; i < spans.length; ++i)\n      if (spans[i] != span) (r || (r = [])).push(spans[i]);\n    return r;\n  }\n  // Add a span to a line.\n  function addMarkedSpan(line, span) {\n    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];\n    span.marker.attachLine(line);\n  }\n\n  // Used for the algorithm that adjusts markers for a change in the\n  // document. These functions cut an array of spans at a given\n  // character position, returning an array of remaining chunks (or\n  // undefined if nothing remains).\n  function markedSpansBefore(old, startCh, isInsert) {\n    if (old) for (var i = 0, nw; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);\n      if (startsBefore || span.from == startCh && marker.type == \"bookmark\" && (!isInsert || !span.marker.insertLeft)) {\n        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);\n        (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));\n      }\n    }\n    return nw;\n  }\n  function markedSpansAfter(old, endCh, isInsert) {\n    if (old) for (var i = 0, nw; i < old.length; ++i) {\n      var span = old[i], marker = span.marker;\n      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);\n      if (endsAfter || span.from == endCh && marker.type == \"bookmark\" && (!isInsert || span.marker.insertLeft)) {\n        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);\n        (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,\n                                              span.to == null ? null : span.to - endCh));\n      }\n    }\n    return nw;\n  }\n\n  // Given a change object, compute the new set of marker spans that\n  // cover the line in which the change took place. Removes spans\n  // entirely within the change, reconnects spans belonging to the\n  // same marker that appear on both sides of the change, and cuts off\n  // spans partially within the change. Returns an array of span\n  // arrays with one element for each line in (after) the change.\n  function stretchSpansOverChange(doc, change) {\n    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;\n    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;\n    if (!oldFirst && !oldLast) return null;\n\n    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;\n    // Get the spans that 'stick out' on both sides\n    var first = markedSpansBefore(oldFirst, startCh, isInsert);\n    var last = markedSpansAfter(oldLast, endCh, isInsert);\n\n    // Next, merge those two ends\n    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);\n    if (first) {\n      // Fix up .to properties of first\n      for (var i = 0; i < first.length; ++i) {\n        var span = first[i];\n        if (span.to == null) {\n          var found = getMarkedSpanFor(last, span.marker);\n          if (!found) span.to = startCh;\n          else if (sameLine) span.to = found.to == null ? null : found.to + offset;\n        }\n      }\n    }\n    if (last) {\n      // Fix up .from in last (or move them into first in case of sameLine)\n      for (var i = 0; i < last.length; ++i) {\n        var span = last[i];\n        if (span.to != null) span.to += offset;\n        if (span.from == null) {\n          var found = getMarkedSpanFor(first, span.marker);\n          if (!found) {\n            span.from = offset;\n            if (sameLine) (first || (first = [])).push(span);\n          }\n        } else {\n          span.from += offset;\n          if (sameLine) (first || (first = [])).push(span);\n        }\n      }\n    }\n    // Make sure we didn't create any zero-length spans\n    if (first) first = clearEmptySpans(first);\n    if (last && last != first) last = clearEmptySpans(last);\n\n    var newMarkers = [first];\n    if (!sameLine) {\n      // Fill gap with whole-line-spans\n      var gap = change.text.length - 2, gapMarkers;\n      if (gap > 0 && first)\n        for (var i = 0; i < first.length; ++i)\n          if (first[i].to == null)\n            (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));\n      for (var i = 0; i < gap; ++i)\n        newMarkers.push(gapMarkers);\n      newMarkers.push(last);\n    }\n    return newMarkers;\n  }\n\n  // Remove spans that are empty and don't have a clearWhenEmpty\n  // option of false.\n  function clearEmptySpans(spans) {\n    for (var i = 0; i < spans.length; ++i) {\n      var span = spans[i];\n      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)\n        spans.splice(i--, 1);\n    }\n    if (!spans.length) return null;\n    return spans;\n  }\n\n  // Used for un/re-doing changes from the history. Combines the\n  // result of computing the existing spans with the set of spans that\n  // existed in the history (so that deleting around a span and then\n  // undoing brings back the span).\n  function mergeOldSpans(doc, change) {\n    var old = getOldSpans(doc, change);\n    var stretched = stretchSpansOverChange(doc, change);\n    if (!old) return stretched;\n    if (!stretched) return old;\n\n    for (var i = 0; i < old.length; ++i) {\n      var oldCur = old[i], stretchCur = stretched[i];\n      if (oldCur && stretchCur) {\n        spans: for (var j = 0; j < stretchCur.length; ++j) {\n          var span = stretchCur[j];\n          for (var k = 0; k < oldCur.length; ++k)\n            if (oldCur[k].marker == span.marker) continue spans;\n          oldCur.push(span);\n        }\n      } else if (stretchCur) {\n        old[i] = stretchCur;\n      }\n    }\n    return old;\n  }\n\n  // Used to 'clip' out readOnly ranges when making a change.\n  function removeReadOnlyRanges(doc, from, to) {\n    var markers = null;\n    doc.iter(from.line, to.line + 1, function(line) {\n      if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {\n        var mark = line.markedSpans[i].marker;\n        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))\n          (markers || (markers = [])).push(mark);\n      }\n    });\n    if (!markers) return null;\n    var parts = [{from: from, to: to}];\n    for (var i = 0; i < markers.length; ++i) {\n      var mk = markers[i], m = mk.find(0);\n      for (var j = 0; j < parts.length; ++j) {\n        var p = parts[j];\n        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;\n        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);\n        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)\n          newParts.push({from: p.from, to: m.from});\n        if (dto > 0 || !mk.inclusiveRight && !dto)\n          newParts.push({from: m.to, to: p.to});\n        parts.splice.apply(parts, newParts);\n        j += newParts.length - 1;\n      }\n    }\n    return parts;\n  }\n\n  // Connect or disconnect spans from a line.\n  function detachMarkedSpans(line) {\n    var spans = line.markedSpans;\n    if (!spans) return;\n    for (var i = 0; i < spans.length; ++i)\n      spans[i].marker.detachLine(line);\n    line.markedSpans = null;\n  }\n  function attachMarkedSpans(line, spans) {\n    if (!spans) return;\n    for (var i = 0; i < spans.length; ++i)\n      spans[i].marker.attachLine(line);\n    line.markedSpans = spans;\n  }\n\n  // Helpers used when computing which overlapping collapsed span\n  // counts as the larger one.\n  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }\n  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }\n\n  // Returns a number indicating which of two overlapping collapsed\n  // spans is larger (and thus includes the other). Falls back to\n  // comparing ids when the spans cover exactly the same range.\n  function compareCollapsedMarkers(a, b) {\n    var lenDiff = a.lines.length - b.lines.length;\n    if (lenDiff != 0) return lenDiff;\n    var aPos = a.find(), bPos = b.find();\n    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);\n    if (fromCmp) return -fromCmp;\n    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);\n    if (toCmp) return toCmp;\n    return b.id - a.id;\n  }\n\n  // Find out whether a line ends or starts in a collapsed span. If\n  // so, return the marker for that span.\n  function collapsedSpanAtSide(line, start) {\n    var sps = sawCollapsedSpans && line.markedSpans, found;\n    if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&\n          (!found || compareCollapsedMarkers(found, sp.marker) < 0))\n        found = sp.marker;\n    }\n    return found;\n  }\n  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }\n  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }\n\n  // Test whether there exists a collapsed span that partially\n  // overlaps (covers the start or end, but not both) of a new span.\n  // Such overlap is not allowed.\n  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {\n    var line = getLine(doc, lineNo);\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) for (var i = 0; i < sps.length; ++i) {\n      var sp = sps[i];\n      if (!sp.marker.collapsed) continue;\n      var found = sp.marker.find(0);\n      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);\n      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);\n      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;\n      if (fromCmp <= 0 && (cmp(found.to, from) || extraRight(sp.marker) - extraLeft(marker)) > 0 ||\n          fromCmp >= 0 && (cmp(found.from, to) || extraLeft(sp.marker) - extraRight(marker)) < 0)\n        return true;\n    }\n  }\n\n  // A visual line is a line as drawn on the screen. Folding, for\n  // example, can cause multiple logical lines to appear on the same\n  // visual line. This finds the start of the visual line that the\n  // given line is part of (usually that is the line itself).\n  function visualLine(line) {\n    var merged;\n    while (merged = collapsedSpanAtStart(line))\n      line = merged.find(-1, true).line;\n    return line;\n  }\n\n  // Returns an array of logical lines that continue the visual line\n  // started by the argument, or undefined if there are no such lines.\n  function visualLineContinued(line) {\n    var merged, lines;\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line;\n      (lines || (lines = [])).push(line);\n    }\n    return lines;\n  }\n\n  // Get the line number of the start of the visual line that the\n  // given line number is part of.\n  function visualLineNo(doc, lineN) {\n    var line = getLine(doc, lineN), vis = visualLine(line);\n    if (line == vis) return lineN;\n    return lineNo(vis);\n  }\n  // Get the line number of the start of the next visual line after\n  // the given line.\n  function visualLineEndNo(doc, lineN) {\n    if (lineN > doc.lastLine()) return lineN;\n    var line = getLine(doc, lineN), merged;\n    if (!lineIsHidden(doc, line)) return lineN;\n    while (merged = collapsedSpanAtEnd(line))\n      line = merged.find(1, true).line;\n    return lineNo(line) + 1;\n  }\n\n  // Compute whether a line is hidden. Lines count as hidden when they\n  // are part of a visual line that starts with another line, or when\n  // they are entirely covered by collapsed, non-widget span.\n  function lineIsHidden(doc, line) {\n    var sps = sawCollapsedSpans && line.markedSpans;\n    if (sps) for (var sp, i = 0; i < sps.length; ++i) {\n      sp = sps[i];\n      if (!sp.marker.collapsed) continue;\n      if (sp.from == null) return true;\n      if (sp.marker.widgetNode) continue;\n      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))\n        return true;\n    }\n  }\n  function lineIsHiddenInner(doc, line, span) {\n    if (span.to == null) {\n      var end = span.marker.find(1, true);\n      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));\n    }\n    if (span.marker.inclusiveRight && span.to == line.text.length)\n      return true;\n    for (var sp, i = 0; i < line.markedSpans.length; ++i) {\n      sp = line.markedSpans[i];\n      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&\n          (sp.to == null || sp.to != span.from) &&\n          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&\n          lineIsHiddenInner(doc, line, sp)) return true;\n    }\n  }\n\n  // LINE WIDGETS\n\n  // Line widgets are block elements displayed above or below a line.\n\n  var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {\n    if (options) for (var opt in options) if (options.hasOwnProperty(opt))\n      this[opt] = options[opt];\n    this.cm = cm;\n    this.node = node;\n  };\n  eventMixin(LineWidget);\n\n  function adjustScrollWhenAboveVisible(cm, line, diff) {\n    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))\n      addToScrollPos(cm, null, diff);\n  }\n\n  LineWidget.prototype.clear = function() {\n    var cm = this.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);\n    if (no == null || !ws) return;\n    for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);\n    if (!ws.length) line.widgets = null;\n    var height = widgetHeight(this);\n    runInOp(cm, function() {\n      adjustScrollWhenAboveVisible(cm, line, -height);\n      regLineChange(cm, no, \"widget\");\n      updateLineHeight(line, Math.max(0, line.height - height));\n    });\n  };\n  LineWidget.prototype.changed = function() {\n    var oldH = this.height, cm = this.cm, line = this.line;\n    this.height = null;\n    var diff = widgetHeight(this) - oldH;\n    if (!diff) return;\n    runInOp(cm, function() {\n      cm.curOp.forceUpdate = true;\n      adjustScrollWhenAboveVisible(cm, line, diff);\n      updateLineHeight(line, line.height + diff);\n    });\n  };\n\n  function widgetHeight(widget) {\n    if (widget.height != null) return widget.height;\n    if (!contains(document.body, widget.node))\n      removeChildrenAndAdd(widget.cm.display.measure, elt(\"div\", [widget.node], null, \"position: relative\"));\n    return widget.height = widget.node.offsetHeight;\n  }\n\n  function addLineWidget(cm, handle, node, options) {\n    var widget = new LineWidget(cm, node, options);\n    if (widget.noHScroll) cm.display.alignWidgets = true;\n    changeLine(cm, handle, \"widget\", function(line) {\n      var widgets = line.widgets || (line.widgets = []);\n      if (widget.insertAt == null) widgets.push(widget);\n      else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);\n      widget.line = line;\n      if (!lineIsHidden(cm.doc, line)) {\n        var aboveVisible = heightAtLine(line) < cm.doc.scrollTop;\n        updateLineHeight(line, line.height + widgetHeight(widget));\n        if (aboveVisible) addToScrollPos(cm, null, widget.height);\n        cm.curOp.forceUpdate = true;\n      }\n      return true;\n    });\n    return widget;\n  }\n\n  // LINE DATA STRUCTURE\n\n  // Line objects. These hold state related to a line, including\n  // highlighting info (the styles array).\n  var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {\n    this.text = text;\n    attachMarkedSpans(this, markedSpans);\n    this.height = estimateHeight ? estimateHeight(this) : 1;\n  };\n  eventMixin(Line);\n  Line.prototype.lineNo = function() { return lineNo(this); };\n\n  // Change the content (text, markers) of a line. Automatically\n  // invalidates cached information and tries to re-estimate the\n  // line's height.\n  function updateLine(line, text, markedSpans, estimateHeight) {\n    line.text = text;\n    if (line.stateAfter) line.stateAfter = null;\n    if (line.styles) line.styles = null;\n    if (line.order != null) line.order = null;\n    detachMarkedSpans(line);\n    attachMarkedSpans(line, markedSpans);\n    var estHeight = estimateHeight ? estimateHeight(line) : 1;\n    if (estHeight != line.height) updateLineHeight(line, estHeight);\n  }\n\n  // Detach a line from the document tree and its markers.\n  function cleanUpLine(line) {\n    line.parent = null;\n    detachMarkedSpans(line);\n  }\n\n  function extractLineClasses(type, output) {\n    if (type) for (;;) {\n      var lineClass = type.match(/(?:^|\\s+)line-(background-)?(\\S+)/);\n      if (!lineClass) break;\n      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);\n      var prop = lineClass[1] ? \"bgClass\" : \"textClass\";\n      if (output[prop] == null)\n        output[prop] = lineClass[2];\n      else if (!(new RegExp(\"(?:^|\\s)\" + lineClass[2] + \"(?:$|\\s)\")).test(output[prop]))\n        output[prop] += \" \" + lineClass[2];\n    }\n    return type;\n  }\n\n  function callBlankLine(mode, state) {\n    if (mode.blankLine) return mode.blankLine(state);\n    if (!mode.innerMode) return;\n    var inner = CodeMirror.innerMode(mode, state);\n    if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);\n  }\n\n  function readToken(mode, stream, state) {\n    for (var i = 0; i < 10; i++) {\n      var style = mode.token(stream, state);\n      if (stream.pos > stream.start) return style;\n    }\n    throw new Error(\"Mode \" + mode.name + \" failed to advance stream.\");\n  }\n\n  // Run the given mode's parser over a line, calling f for each token.\n  function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {\n    var flattenSpans = mode.flattenSpans;\n    if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;\n    var curStart = 0, curStyle = null;\n    var stream = new StringStream(text, cm.options.tabSize), style;\n    if (text == \"\") extractLineClasses(callBlankLine(mode, state), lineClasses);\n    while (!stream.eol()) {\n      if (stream.pos > cm.options.maxHighlightLength) {\n        flattenSpans = false;\n        if (forceToEnd) processLine(cm, text, state, stream.pos);\n        stream.pos = text.length;\n        style = null;\n      } else {\n        style = extractLineClasses(readToken(mode, stream, state), lineClasses);\n      }\n      if (cm.options.addModeClass) {\n        var mName = CodeMirror.innerMode(mode, state).mode.name;\n        if (mName) style = \"m-\" + (style ? mName + \" \" + style : mName);\n      }\n      if (!flattenSpans || curStyle != style) {\n        if (curStart < stream.start) f(stream.start, curStyle);\n        curStart = stream.start; curStyle = style;\n      }\n      stream.start = stream.pos;\n    }\n    while (curStart < stream.pos) {\n      // Webkit seems to refuse to render text nodes longer than 57444 characters\n      var pos = Math.min(stream.pos, curStart + 50000);\n      f(pos, curStyle);\n      curStart = pos;\n    }\n  }\n\n  // Compute a style array (an array starting with a mode generation\n  // -- for invalidation -- followed by pairs of end positions and\n  // style strings), which is used to highlight the tokens on the\n  // line.\n  function highlightLine(cm, line, state, forceToEnd) {\n    // A styles array always starts with a number identifying the\n    // mode/overlays that it is based on (for easy invalidation).\n    var st = [cm.state.modeGen], lineClasses = {};\n    // Compute the base array of styles\n    runMode(cm, line.text, cm.doc.mode, state, function(end, style) {\n      st.push(end, style);\n    }, lineClasses, forceToEnd);\n\n    // Run overlays, adjust style array.\n    for (var o = 0; o < cm.state.overlays.length; ++o) {\n      var overlay = cm.state.overlays[o], i = 1, at = 0;\n      runMode(cm, line.text, overlay.mode, true, function(end, style) {\n        var start = i;\n        // Ensure there's a token end at the current position, and that i points at it\n        while (at < end) {\n          var i_end = st[i];\n          if (i_end > end)\n            st.splice(i, 1, end, st[i+1], i_end);\n          i += 2;\n          at = Math.min(end, i_end);\n        }\n        if (!style) return;\n        if (overlay.opaque) {\n          st.splice(start, i - start, end, \"cm-overlay \" + style);\n          i = start + 2;\n        } else {\n          for (; start < i; start += 2) {\n            var cur = st[start+1];\n            st[start+1] = (cur ? cur + \" \" : \"\") + \"cm-overlay \" + style;\n          }\n        }\n      }, lineClasses);\n    }\n\n    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};\n  }\n\n  function getLineStyles(cm, line) {\n    if (!line.styles || line.styles[0] != cm.state.modeGen) {\n      var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));\n      line.styles = result.styles;\n      if (result.classes) line.styleClasses = result.classes;\n      else if (line.styleClasses) line.styleClasses = null;\n    }\n    return line.styles;\n  }\n\n  // Lightweight form of highlight -- proceed over this line and\n  // update state, but don't save a style array. Used for lines that\n  // aren't currently visible.\n  function processLine(cm, text, state, startAt) {\n    var mode = cm.doc.mode;\n    var stream = new StringStream(text, cm.options.tabSize);\n    stream.start = stream.pos = startAt || 0;\n    if (text == \"\") callBlankLine(mode, state);\n    while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {\n      readToken(mode, stream, state);\n      stream.start = stream.pos;\n    }\n  }\n\n  // Convert a style as returned by a mode (either null, or a string\n  // containing one or more styles) to a CSS style. This is cached,\n  // and also looks for line-wide styles.\n  var styleToClassCache = {}, styleToClassCacheWithMode = {};\n  function interpretTokenStyle(style, options) {\n    if (!style || /^\\s*$/.test(style)) return null;\n    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;\n    return cache[style] ||\n      (cache[style] = style.replace(/\\S+/g, \"cm-$&\"));\n  }\n\n  // Render the DOM representation of the text of a line. Also builds\n  // up a 'line map', which points at the DOM nodes that represent\n  // specific stretches of text, and is used by the measuring code.\n  // The returned object contains the DOM node, this map, and\n  // information about line-wide styles that were set by the mode.\n  function buildLineContent(cm, lineView) {\n    // The padding-right forces the element to have a 'border', which\n    // is needed on Webkit to be able to get line-level bounding\n    // rectangles for it (in measureChar).\n    var content = elt(\"span\", null, null, webkit ? \"padding-right: .1px\" : null);\n    var builder = {pre: elt(\"pre\", [content]), content: content, col: 0, pos: 0, cm: cm};\n    lineView.measure = {};\n\n    // Iterate over the logical lines that make up this visual line.\n    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {\n      var line = i ? lineView.rest[i - 1] : lineView.line, order;\n      builder.pos = 0;\n      builder.addToken = buildToken;\n      // Optionally wire in some hacks into the token-rendering\n      // algorithm, to deal with browser quirks.\n      if ((ie || webkit) && cm.getOption(\"lineWrapping\"))\n        builder.addToken = buildTokenSplitSpaces(builder.addToken);\n      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))\n        builder.addToken = buildTokenBadBidi(builder.addToken, order);\n      builder.map = [];\n      insertLineContent(line, builder, getLineStyles(cm, line));\n      if (line.styleClasses) {\n        if (line.styleClasses.bgClass)\n          builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || \"\");\n        if (line.styleClasses.textClass)\n          builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || \"\");\n      }\n\n      // Ensure at least a single node is present, for measuring.\n      if (builder.map.length == 0)\n        builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));\n\n      // Store the map and a cache object for the current logical line\n      if (i == 0) {\n        lineView.measure.map = builder.map;\n        lineView.measure.cache = {};\n      } else {\n        (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);\n        (lineView.measure.caches || (lineView.measure.caches = [])).push({});\n      }\n    }\n\n    signal(cm, \"renderLine\", cm, lineView.line, builder.pre);\n    return builder;\n  }\n\n  function defaultSpecialCharPlaceholder(ch) {\n    var token = elt(\"span\", \"\\u2022\", \"cm-invalidchar\");\n    token.title = \"\\\\u\" + ch.charCodeAt(0).toString(16);\n    return token;\n  }\n\n  // Build up the DOM representation for a single token, and add it to\n  // the line map. Takes care to render special characters separately.\n  function buildToken(builder, text, style, startStyle, endStyle, title) {\n    if (!text) return;\n    var special = builder.cm.options.specialChars, mustWrap = false;\n    if (!special.test(text)) {\n      builder.col += text.length;\n      var content = document.createTextNode(text);\n      builder.map.push(builder.pos, builder.pos + text.length, content);\n      if (ie_upto8) mustWrap = true;\n      builder.pos += text.length;\n    } else {\n      var content = document.createDocumentFragment(), pos = 0;\n      while (true) {\n        special.lastIndex = pos;\n        var m = special.exec(text);\n        var skipped = m ? m.index - pos : text.length - pos;\n        if (skipped) {\n          var txt = document.createTextNode(text.slice(pos, pos + skipped));\n          if (ie_upto8) content.appendChild(elt(\"span\", [txt]));\n          else content.appendChild(txt);\n          builder.map.push(builder.pos, builder.pos + skipped, txt);\n          builder.col += skipped;\n          builder.pos += skipped;\n        }\n        if (!m) break;\n        pos += skipped + 1;\n        if (m[0] == \"\\t\") {\n          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;\n          var txt = content.appendChild(elt(\"span\", spaceStr(tabWidth), \"cm-tab\"));\n          builder.col += tabWidth;\n        } else {\n          var txt = builder.cm.options.specialCharPlaceholder(m[0]);\n          if (ie_upto8) content.appendChild(elt(\"span\", [txt]));\n          else content.appendChild(txt);\n          builder.col += 1;\n        }\n        builder.map.push(builder.pos, builder.pos + 1, txt);\n        builder.pos++;\n      }\n    }\n    if (style || startStyle || endStyle || mustWrap) {\n      var fullStyle = style || \"\";\n      if (startStyle) fullStyle += startStyle;\n      if (endStyle) fullStyle += endStyle;\n      var token = elt(\"span\", [content], fullStyle);\n      if (title) token.title = title;\n      return builder.content.appendChild(token);\n    }\n    builder.content.appendChild(content);\n  }\n\n  function buildTokenSplitSpaces(inner) {\n    function split(old) {\n      var out = \" \";\n      for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? \" \" : \"\\u00a0\";\n      out += \" \";\n      return out;\n    }\n    return function(builder, text, style, startStyle, endStyle, title) {\n      inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);\n    };\n  }\n\n  // Work around nonsense dimensions being reported for stretches of\n  // right-to-left text.\n  function buildTokenBadBidi(inner, order) {\n    return function(builder, text, style, startStyle, endStyle, title) {\n      style = style ? style + \" cm-force-border\" : \"cm-force-border\";\n      var start = builder.pos, end = start + text.length;\n      for (;;) {\n        // Find the part that overlaps with the start of this text\n        for (var i = 0; i < order.length; i++) {\n          var part = order[i];\n          if (part.to > start && part.from <= start) break;\n        }\n        if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title);\n        inner(builder, text.slice(0, part.to - start), style, startStyle, null, title);\n        startStyle = null;\n        text = text.slice(part.to - start);\n        start = part.to;\n      }\n    };\n  }\n\n  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {\n    var widget = !ignoreWidget && marker.widgetNode;\n    if (widget) {\n      builder.map.push(builder.pos, builder.pos + size, widget);\n      builder.content.appendChild(widget);\n    }\n    builder.pos += size;\n  }\n\n  // Outputs a number of spans to make up a line, taking highlighting\n  // and marked text into account.\n  function insertLineContent(line, builder, styles) {\n    var spans = line.markedSpans, allText = line.text, at = 0;\n    if (!spans) {\n      for (var i = 1; i < styles.length; i+=2)\n        builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));\n      return;\n    }\n\n    var len = allText.length, pos = 0, i = 1, text = \"\", style;\n    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;\n    for (;;) {\n      if (nextChange == pos) { // Update current marker set\n        spanStyle = spanEndStyle = spanStartStyle = title = \"\";\n        collapsed = null; nextChange = Infinity;\n        var foundBookmarks = [];\n        for (var j = 0; j < spans.length; ++j) {\n          var sp = spans[j], m = sp.marker;\n          if (sp.from <= pos && (sp.to == null || sp.to > pos)) {\n            if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = \"\"; }\n            if (m.className) spanStyle += \" \" + m.className;\n            if (m.startStyle && sp.from == pos) spanStartStyle += \" \" + m.startStyle;\n            if (m.endStyle && sp.to == nextChange) spanEndStyle += \" \" + m.endStyle;\n            if (m.title && !title) title = m.title;\n            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))\n              collapsed = sp;\n          } else if (sp.from > pos && nextChange > sp.from) {\n            nextChange = sp.from;\n          }\n          if (m.type == \"bookmark\" && sp.from == pos && m.widgetNode) foundBookmarks.push(m);\n        }\n        if (collapsed && (collapsed.from || 0) == pos) {\n          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,\n                             collapsed.marker, collapsed.from == null);\n          if (collapsed.to == null) return;\n        }\n        if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j)\n          buildCollapsedSpan(builder, 0, foundBookmarks[j]);\n      }\n      if (pos >= len) break;\n\n      var upto = Math.min(len, nextChange);\n      while (true) {\n        if (text) {\n          var end = pos + text.length;\n          if (!collapsed) {\n            var tokenText = end > upto ? text.slice(0, upto - pos) : text;\n            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,\n                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : \"\", title);\n          }\n          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}\n          pos = end;\n          spanStartStyle = \"\";\n        }\n        text = allText.slice(at, at = styles[i++]);\n        style = interpretTokenStyle(styles[i++], builder.cm.options);\n      }\n    }\n  }\n\n  // DOCUMENT DATA STRUCTURE\n\n  // By default, updates that start and end at the beginning of a line\n  // are treated specially, in order to make the association of line\n  // widgets and marker elements with the text behave more intuitive.\n  function isWholeLineUpdate(doc, change) {\n    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == \"\" &&\n      (!doc.cm || doc.cm.options.wholeLineUpdateBefore);\n  }\n\n  // Perform a change on the document data structure.\n  function updateDoc(doc, change, markedSpans, estimateHeight) {\n    function spansFor(n) {return markedSpans ? markedSpans[n] : null;}\n    function update(line, text, spans) {\n      updateLine(line, text, spans, estimateHeight);\n      signalLater(line, \"change\", line, change);\n    }\n\n    var from = change.from, to = change.to, text = change.text;\n    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);\n    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;\n\n    // Adjust the line structure\n    if (isWholeLineUpdate(doc, change)) {\n      // This is a whole-line replace. Treated specially to make\n      // sure line objects move the way they are supposed to.\n      for (var i = 0, added = []; i < text.length - 1; ++i)\n        added.push(new Line(text[i], spansFor(i), estimateHeight));\n      update(lastLine, lastLine.text, lastSpans);\n      if (nlines) doc.remove(from.line, nlines);\n      if (added.length) doc.insert(from.line, added);\n    } else if (firstLine == lastLine) {\n      if (text.length == 1) {\n        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);\n      } else {\n        for (var added = [], i = 1; i < text.length - 1; ++i)\n          added.push(new Line(text[i], spansFor(i), estimateHeight));\n        added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));\n        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n        doc.insert(from.line + 1, added);\n      }\n    } else if (text.length == 1) {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));\n      doc.remove(from.line + 1, nlines);\n    } else {\n      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));\n      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);\n      for (var i = 1, added = []; i < text.length - 1; ++i)\n        added.push(new Line(text[i], spansFor(i), estimateHeight));\n      if (nlines > 1) doc.remove(from.line + 1, nlines - 1);\n      doc.insert(from.line + 1, added);\n    }\n\n    signalLater(doc, \"change\", doc, change);\n  }\n\n  // The document is represented as a BTree consisting of leaves, with\n  // chunk of lines in them, and branches, with up to ten leaves or\n  // other branch nodes below them. The top node is always a branch\n  // node, and is the document object itself (meaning it has\n  // additional methods and properties).\n  //\n  // All nodes have parent links. The tree is used both to go from\n  // line numbers to line objects, and to go from objects to numbers.\n  // It also indexes by height, and is used to convert between height\n  // and line object, and to find the total height of the document.\n  //\n  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html\n\n  function LeafChunk(lines) {\n    this.lines = lines;\n    this.parent = null;\n    for (var i = 0, height = 0; i < lines.length; ++i) {\n      lines[i].parent = this;\n      height += lines[i].height;\n    }\n    this.height = height;\n  }\n\n  LeafChunk.prototype = {\n    chunkSize: function() { return this.lines.length; },\n    // Remove the n lines at offset 'at'.\n    removeInner: function(at, n) {\n      for (var i = at, e = at + n; i < e; ++i) {\n        var line = this.lines[i];\n        this.height -= line.height;\n        cleanUpLine(line);\n        signalLater(line, \"delete\");\n      }\n      this.lines.splice(at, n);\n    },\n    // Helper used to collapse a small branch into a single leaf.\n    collapse: function(lines) {\n      lines.push.apply(lines, this.lines);\n    },\n    // Insert the given array of lines at offset 'at', count them as\n    // having the given height.\n    insertInner: function(at, lines, height) {\n      this.height += height;\n      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));\n      for (var i = 0; i < lines.length; ++i) lines[i].parent = this;\n    },\n    // Used to iterate over a part of the tree.\n    iterN: function(at, n, op) {\n      for (var e = at + n; at < e; ++at)\n        if (op(this.lines[at])) return true;\n    }\n  };\n\n  function BranchChunk(children) {\n    this.children = children;\n    var size = 0, height = 0;\n    for (var i = 0; i < children.length; ++i) {\n      var ch = children[i];\n      size += ch.chunkSize(); height += ch.height;\n      ch.parent = this;\n    }\n    this.size = size;\n    this.height = height;\n    this.parent = null;\n  }\n\n  BranchChunk.prototype = {\n    chunkSize: function() { return this.size; },\n    removeInner: function(at, n) {\n      this.size -= n;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var rm = Math.min(n, sz - at), oldHeight = child.height;\n          child.removeInner(at, rm);\n          this.height -= oldHeight - child.height;\n          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }\n          if ((n -= rm) == 0) break;\n          at = 0;\n        } else at -= sz;\n      }\n      // If the result is smaller than 25 lines, ensure that it is a\n      // single leaf node.\n      if (this.size - n < 25 &&\n          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {\n        var lines = [];\n        this.collapse(lines);\n        this.children = [new LeafChunk(lines)];\n        this.children[0].parent = this;\n      }\n    },\n    collapse: function(lines) {\n      for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);\n    },\n    insertInner: function(at, lines, height) {\n      this.size += lines.length;\n      this.height += height;\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at <= sz) {\n          child.insertInner(at, lines, height);\n          if (child.lines && child.lines.length > 50) {\n            while (child.lines.length > 50) {\n              var spilled = child.lines.splice(child.lines.length - 25, 25);\n              var newleaf = new LeafChunk(spilled);\n              child.height -= newleaf.height;\n              this.children.splice(i + 1, 0, newleaf);\n              newleaf.parent = this;\n            }\n            this.maybeSpill();\n          }\n          break;\n        }\n        at -= sz;\n      }\n    },\n    // When a node has grown, check whether it should be split.\n    maybeSpill: function() {\n      if (this.children.length <= 10) return;\n      var me = this;\n      do {\n        var spilled = me.children.splice(me.children.length - 5, 5);\n        var sibling = new BranchChunk(spilled);\n        if (!me.parent) { // Become the parent node\n          var copy = new BranchChunk(me.children);\n          copy.parent = me;\n          me.children = [copy, sibling];\n          me = copy;\n        } else {\n          me.size -= sibling.size;\n          me.height -= sibling.height;\n          var myIndex = indexOf(me.parent.children, me);\n          me.parent.children.splice(myIndex + 1, 0, sibling);\n        }\n        sibling.parent = me.parent;\n      } while (me.children.length > 10);\n      me.parent.maybeSpill();\n    },\n    iterN: function(at, n, op) {\n      for (var i = 0; i < this.children.length; ++i) {\n        var child = this.children[i], sz = child.chunkSize();\n        if (at < sz) {\n          var used = Math.min(n, sz - at);\n          if (child.iterN(at, used, op)) return true;\n          if ((n -= used) == 0) break;\n          at = 0;\n        } else at -= sz;\n      }\n    }\n  };\n\n  var nextDocId = 0;\n  var Doc = CodeMirror.Doc = function(text, mode, firstLine) {\n    if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);\n    if (firstLine == null) firstLine = 0;\n\n    BranchChunk.call(this, [new LeafChunk([new Line(\"\", null)])]);\n    this.first = firstLine;\n    this.scrollTop = this.scrollLeft = 0;\n    this.cantEdit = false;\n    this.cleanGeneration = 1;\n    this.frontier = firstLine;\n    var start = Pos(firstLine, 0);\n    this.sel = simpleSelection(start);\n    this.history = new History(null);\n    this.id = ++nextDocId;\n    this.modeOption = mode;\n\n    if (typeof text == \"string\") text = splitLines(text);\n    updateDoc(this, {from: start, to: start, text: text});\n    setSelection(this, simpleSelection(start), sel_dontScroll);\n  };\n\n  Doc.prototype = createObj(BranchChunk.prototype, {\n    constructor: Doc,\n    // Iterate over the document. Supports two forms -- with only one\n    // argument, it calls that for each line in the document. With\n    // three, it iterates over the range given by the first two (with\n    // the second being non-inclusive).\n    iter: function(from, to, op) {\n      if (op) this.iterN(from - this.first, to - from, op);\n      else this.iterN(this.first, this.first + this.size, from);\n    },\n\n    // Non-public interface for adding and removing lines.\n    insert: function(at, lines) {\n      var height = 0;\n      for (var i = 0; i < lines.length; ++i) height += lines[i].height;\n      this.insertInner(at - this.first, lines, height);\n    },\n    remove: function(at, n) { this.removeInner(at - this.first, n); },\n\n    // From here, the methods are part of the public interface. Most\n    // are also available from CodeMirror (editor) instances.\n\n    getValue: function(lineSep) {\n      var lines = getLines(this, this.first, this.first + this.size);\n      if (lineSep === false) return lines;\n      return lines.join(lineSep || \"\\n\");\n    },\n    setValue: docMethodOp(function(code) {\n      var top = Pos(this.first, 0), last = this.first + this.size - 1;\n      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),\n                        text: splitLines(code), origin: \"setValue\"}, true);\n      setSelection(this, simpleSelection(top));\n    }),\n    replaceRange: function(code, from, to, origin) {\n      from = clipPos(this, from);\n      to = to ? clipPos(this, to) : from;\n      replaceRange(this, code, from, to, origin);\n    },\n    getRange: function(from, to, lineSep) {\n      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));\n      if (lineSep === false) return lines;\n      return lines.join(lineSep || \"\\n\");\n    },\n\n    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},\n\n    getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},\n    getLineNumber: function(line) {return lineNo(line);},\n\n    getLineHandleVisualStart: function(line) {\n      if (typeof line == \"number\") line = getLine(this, line);\n      return visualLine(line);\n    },\n\n    lineCount: function() {return this.size;},\n    firstLine: function() {return this.first;},\n    lastLine: function() {return this.first + this.size - 1;},\n\n    clipPos: function(pos) {return clipPos(this, pos);},\n\n    getCursor: function(start) {\n      var range = this.sel.primary(), pos;\n      if (start == null || start == \"head\") pos = range.head;\n      else if (start == \"anchor\") pos = range.anchor;\n      else if (start == \"end\" || start == \"to\" || start === false) pos = range.to();\n      else pos = range.from();\n      return pos;\n    },\n    listSelections: function() { return this.sel.ranges; },\n    somethingSelected: function() {return this.sel.somethingSelected();},\n\n    setCursor: docMethodOp(function(line, ch, options) {\n      setSimpleSelection(this, clipPos(this, typeof line == \"number\" ? Pos(line, ch || 0) : line), null, options);\n    }),\n    setSelection: docMethodOp(function(anchor, head, options) {\n      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);\n    }),\n    extendSelection: docMethodOp(function(head, other, options) {\n      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);\n    }),\n    extendSelections: docMethodOp(function(heads, options) {\n      extendSelections(this, clipPosArray(this, heads, options));\n    }),\n    extendSelectionsBy: docMethodOp(function(f, options) {\n      extendSelections(this, map(this.sel.ranges, f), options);\n    }),\n    setSelections: docMethodOp(function(ranges, primary, options) {\n      if (!ranges.length) return;\n      for (var i = 0, out = []; i < ranges.length; i++)\n        out[i] = new Range(clipPos(this, ranges[i].anchor),\n                           clipPos(this, ranges[i].head));\n      if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);\n      setSelection(this, normalizeSelection(out, primary), options);\n    }),\n    addSelection: docMethodOp(function(anchor, head, options) {\n      var ranges = this.sel.ranges.slice(0);\n      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));\n      setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);\n    }),\n\n    getSelection: function(lineSep) {\n      var ranges = this.sel.ranges, lines;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        lines = lines ? lines.concat(sel) : sel;\n      }\n      if (lineSep === false) return lines;\n      else return lines.join(lineSep || \"\\n\");\n    },\n    getSelections: function(lineSep) {\n      var parts = [], ranges = this.sel.ranges;\n      for (var i = 0; i < ranges.length; i++) {\n        var sel = getBetween(this, ranges[i].from(), ranges[i].to());\n        if (lineSep !== false) sel = sel.join(lineSep || \"\\n\");\n        parts[i] = sel;\n      }\n      return parts;\n    },\n    replaceSelection: function(code, collapse, origin) {\n      var dup = [];\n      for (var i = 0; i < this.sel.ranges.length; i++)\n        dup[i] = code;\n      this.replaceSelections(dup, collapse, origin || \"+input\");\n    },\n    replaceSelections: docMethodOp(function(code, collapse, origin) {\n      var changes = [], sel = this.sel;\n      for (var i = 0; i < sel.ranges.length; i++) {\n        var range = sel.ranges[i];\n        changes[i] = {from: range.from(), to: range.to(), text: splitLines(code[i]), origin: origin};\n      }\n      var newSel = collapse && collapse != \"end\" && computeReplacedSel(this, changes, collapse);\n      for (var i = changes.length - 1; i >= 0; i--)\n        makeChange(this, changes[i]);\n      if (newSel) setSelectionReplaceHistory(this, newSel);\n      else if (this.cm) ensureCursorVisible(this.cm);\n    }),\n    undo: docMethodOp(function() {makeChangeFromHistory(this, \"undo\");}),\n    redo: docMethodOp(function() {makeChangeFromHistory(this, \"redo\");}),\n    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"undo\", true);}),\n    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, \"redo\", true);}),\n\n    setExtending: function(val) {this.extend = val;},\n    getExtending: function() {return this.extend;},\n\n    historySize: function() {\n      var hist = this.history, done = 0, undone = 0;\n      for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;\n      for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;\n      return {undo: done, redo: undone};\n    },\n    clearHistory: function() {this.history = new History(this.history.maxGeneration);},\n\n    markClean: function() {\n      this.cleanGeneration = this.changeGeneration(true);\n    },\n    changeGeneration: function(forceSplit) {\n      if (forceSplit)\n        this.history.lastOp = this.history.lastOrigin = null;\n      return this.history.generation;\n    },\n    isClean: function (gen) {\n      return this.history.generation == (gen || this.cleanGeneration);\n    },\n\n    getHistory: function() {\n      return {done: copyHistoryArray(this.history.done),\n              undone: copyHistoryArray(this.history.undone)};\n    },\n    setHistory: function(histData) {\n      var hist = this.history = new History(this.history.maxGeneration);\n      hist.done = copyHistoryArray(histData.done.slice(0), null, true);\n      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);\n    },\n\n    markText: function(from, to, options) {\n      return markText(this, clipPos(this, from), clipPos(this, to), options, \"range\");\n    },\n    setBookmark: function(pos, options) {\n      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),\n                      insertLeft: options && options.insertLeft,\n                      clearWhenEmpty: false, shared: options && options.shared};\n      pos = clipPos(this, pos);\n      return markText(this, pos, pos, realOpts, \"bookmark\");\n    },\n    findMarksAt: function(pos) {\n      pos = clipPos(this, pos);\n      var markers = [], spans = getLine(this, pos.line).markedSpans;\n      if (spans) for (var i = 0; i < spans.length; ++i) {\n        var span = spans[i];\n        if ((span.from == null || span.from <= pos.ch) &&\n            (span.to == null || span.to >= pos.ch))\n          markers.push(span.marker.parent || span.marker);\n      }\n      return markers;\n    },\n    findMarks: function(from, to, filter) {\n      from = clipPos(this, from); to = clipPos(this, to);\n      var found = [], lineNo = from.line;\n      this.iter(from.line, to.line + 1, function(line) {\n        var spans = line.markedSpans;\n        if (spans) for (var i = 0; i < spans.length; i++) {\n          var span = spans[i];\n          if (!(lineNo == from.line && from.ch > span.to ||\n                span.from == null && lineNo != from.line||\n                lineNo == to.line && span.from > to.ch) &&\n              (!filter || filter(span.marker)))\n            found.push(span.marker.parent || span.marker);\n        }\n        ++lineNo;\n      });\n      return found;\n    },\n    getAllMarks: function() {\n      var markers = [];\n      this.iter(function(line) {\n        var sps = line.markedSpans;\n        if (sps) for (var i = 0; i < sps.length; ++i)\n          if (sps[i].from != null) markers.push(sps[i].marker);\n      });\n      return markers;\n    },\n\n    posFromIndex: function(off) {\n      var ch, lineNo = this.first;\n      this.iter(function(line) {\n        var sz = line.text.length + 1;\n        if (sz > off) { ch = off; return true; }\n        off -= sz;\n        ++lineNo;\n      });\n      return clipPos(this, Pos(lineNo, ch));\n    },\n    indexFromPos: function (coords) {\n      coords = clipPos(this, coords);\n      var index = coords.ch;\n      if (coords.line < this.first || coords.ch < 0) return 0;\n      this.iter(this.first, coords.line, function (line) {\n        index += line.text.length + 1;\n      });\n      return index;\n    },\n\n    copy: function(copyHistory) {\n      var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);\n      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;\n      doc.sel = this.sel;\n      doc.extend = false;\n      if (copyHistory) {\n        doc.history.undoDepth = this.history.undoDepth;\n        doc.setHistory(this.getHistory());\n      }\n      return doc;\n    },\n\n    linkedDoc: function(options) {\n      if (!options) options = {};\n      var from = this.first, to = this.first + this.size;\n      if (options.from != null && options.from > from) from = options.from;\n      if (options.to != null && options.to < to) to = options.to;\n      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);\n      if (options.sharedHist) copy.history = this.history;\n      (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});\n      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];\n      copySharedMarkers(copy, findSharedMarkers(this));\n      return copy;\n    },\n    unlinkDoc: function(other) {\n      if (other instanceof CodeMirror) other = other.doc;\n      if (this.linked) for (var i = 0; i < this.linked.length; ++i) {\n        var link = this.linked[i];\n        if (link.doc != other) continue;\n        this.linked.splice(i, 1);\n        other.unlinkDoc(this);\n        detachSharedMarkers(findSharedMarkers(this));\n        break;\n      }\n      // If the histories were shared, split them again\n      if (other.history == this.history) {\n        var splitIds = [other.id];\n        linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);\n        other.history = new History(null);\n        other.history.done = copyHistoryArray(this.history.done, splitIds);\n        other.history.undone = copyHistoryArray(this.history.undone, splitIds);\n      }\n    },\n    iterLinkedDocs: function(f) {linkedDocs(this, f);},\n\n    getMode: function() {return this.mode;},\n    getEditor: function() {return this.cm;}\n  });\n\n  // Public alias.\n  Doc.prototype.eachLine = Doc.prototype.iter;\n\n  // Set up methods on CodeMirror's prototype to redirect to the editor's document.\n  var dontDelegate = \"iter insert remove copy getEditor\".split(\" \");\n  for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)\n    CodeMirror.prototype[prop] = (function(method) {\n      return function() {return method.apply(this.doc, arguments);};\n    })(Doc.prototype[prop]);\n\n  eventMixin(Doc);\n\n  // Call f for all linked documents.\n  function linkedDocs(doc, f, sharedHistOnly) {\n    function propagate(doc, skip, sharedHist) {\n      if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {\n        var rel = doc.linked[i];\n        if (rel.doc == skip) continue;\n        var shared = sharedHist && rel.sharedHist;\n        if (sharedHistOnly && !shared) continue;\n        f(rel.doc, shared);\n        propagate(rel.doc, doc, shared);\n      }\n    }\n    propagate(doc, null, true);\n  }\n\n  // Attach a document to an editor.\n  function attachDoc(cm, doc) {\n    if (doc.cm) throw new Error(\"This document is already in use.\");\n    cm.doc = doc;\n    doc.cm = cm;\n    estimateLineHeights(cm);\n    loadMode(cm);\n    if (!cm.options.lineWrapping) findMaxLine(cm);\n    cm.options.mode = doc.modeOption;\n    regChange(cm);\n  }\n\n  // LINE UTILITIES\n\n  // Find the line object corresponding to the given line number.\n  function getLine(doc, n) {\n    n -= doc.first;\n    if (n < 0 || n >= doc.size) throw new Error(\"There is no line \" + (n + doc.first) + \" in the document.\");\n    for (var chunk = doc; !chunk.lines;) {\n      for (var i = 0;; ++i) {\n        var child = chunk.children[i], sz = child.chunkSize();\n        if (n < sz) { chunk = child; break; }\n        n -= sz;\n      }\n    }\n    return chunk.lines[n];\n  }\n\n  // Get the part of a document between two positions, as an array of\n  // strings.\n  function getBetween(doc, start, end) {\n    var out = [], n = start.line;\n    doc.iter(start.line, end.line + 1, function(line) {\n      var text = line.text;\n      if (n == end.line) text = text.slice(0, end.ch);\n      if (n == start.line) text = text.slice(start.ch);\n      out.push(text);\n      ++n;\n    });\n    return out;\n  }\n  // Get the lines between from and to, as array of strings.\n  function getLines(doc, from, to) {\n    var out = [];\n    doc.iter(from, to, function(line) { out.push(line.text); });\n    return out;\n  }\n\n  // Update the height of a line, propagating the height change\n  // upwards to parent nodes.\n  function updateLineHeight(line, height) {\n    var diff = height - line.height;\n    if (diff) for (var n = line; n; n = n.parent) n.height += diff;\n  }\n\n  // Given a line object, find its line number by walking up through\n  // its parent links.\n  function lineNo(line) {\n    if (line.parent == null) return null;\n    var cur = line.parent, no = indexOf(cur.lines, line);\n    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {\n      for (var i = 0;; ++i) {\n        if (chunk.children[i] == cur) break;\n        no += chunk.children[i].chunkSize();\n      }\n    }\n    return no + cur.first;\n  }\n\n  // Find the line at the given vertical position, using the height\n  // information in the document tree.\n  function lineAtHeight(chunk, h) {\n    var n = chunk.first;\n    outer: do {\n      for (var i = 0; i < chunk.children.length; ++i) {\n        var child = chunk.children[i], ch = child.height;\n        if (h < ch) { chunk = child; continue outer; }\n        h -= ch;\n        n += child.chunkSize();\n      }\n      return n;\n    } while (!chunk.lines);\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i], lh = line.height;\n      if (h < lh) break;\n      h -= lh;\n    }\n    return n + i;\n  }\n\n\n  // Find the height above the given line.\n  function heightAtLine(lineObj) {\n    lineObj = visualLine(lineObj);\n\n    var h = 0, chunk = lineObj.parent;\n    for (var i = 0; i < chunk.lines.length; ++i) {\n      var line = chunk.lines[i];\n      if (line == lineObj) break;\n      else h += line.height;\n    }\n    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {\n      for (var i = 0; i < p.children.length; ++i) {\n        var cur = p.children[i];\n        if (cur == chunk) break;\n        else h += cur.height;\n      }\n    }\n    return h;\n  }\n\n  // Get the bidi ordering for the given line (and cache it). Returns\n  // false for lines that are fully left-to-right, and an array of\n  // BidiSpan objects otherwise.\n  function getOrder(line) {\n    var order = line.order;\n    if (order == null) order = line.order = bidiOrdering(line.text);\n    return order;\n  }\n\n  // HISTORY\n\n  function History(startGen) {\n    // Arrays of change events and selections. Doing something adds an\n    // event to done and clears undo. Undoing moves events from done\n    // to undone, redoing moves them in the other direction.\n    this.done = []; this.undone = [];\n    this.undoDepth = Infinity;\n    // Used to track when changes can be merged into a single undo\n    // event\n    this.lastModTime = this.lastSelTime = 0;\n    this.lastOp = null;\n    this.lastOrigin = this.lastSelOrigin = null;\n    // Used by the isClean() method\n    this.generation = this.maxGeneration = startGen || 1;\n  }\n\n  // Create a history change event from an updateDoc-style change\n  // object.\n  function historyChangeFromChange(doc, change) {\n    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};\n    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);\n    linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);\n    return histChange;\n  }\n\n  // Pop all selection events off the end of a history array. Stop at\n  // a change event.\n  function clearSelectionEvents(array) {\n    while (array.length) {\n      var last = lst(array);\n      if (last.ranges) array.pop();\n      else break;\n    }\n  }\n\n  // Find the top change event in the history. Pop off selection\n  // events that are in the way.\n  function lastChangeEvent(hist, force) {\n    if (force) {\n      clearSelectionEvents(hist.done);\n      return lst(hist.done);\n    } else if (hist.done.length && !lst(hist.done).ranges) {\n      return lst(hist.done);\n    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {\n      hist.done.pop();\n      return lst(hist.done);\n    }\n  }\n\n  // Register a change in the history. Merges changes that are within\n  // a single operation, ore are close together with an origin that\n  // allows merging (starting with \"+\") into a single event.\n  function addChangeToHistory(doc, change, selAfter, opId) {\n    var hist = doc.history;\n    hist.undone.length = 0;\n    var time = +new Date, cur;\n\n    if ((hist.lastOp == opId ||\n         hist.lastOrigin == change.origin && change.origin &&\n         ((change.origin.charAt(0) == \"+\" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||\n          change.origin.charAt(0) == \"*\")) &&\n        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {\n      // Merge this change into the last event\n      var last = lst(cur.changes);\n      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {\n        // Optimized case for simple insertion -- don't want to add\n        // new changesets for every character typed\n        last.to = changeEnd(change);\n      } else {\n        // Add new sub-event\n        cur.changes.push(historyChangeFromChange(doc, change));\n      }\n    } else {\n      // Can not be merged, start a new event.\n      var before = lst(hist.done);\n      if (!before || !before.ranges)\n        pushSelectionToHistory(doc.sel, hist.done);\n      cur = {changes: [historyChangeFromChange(doc, change)],\n             generation: hist.generation};\n      hist.done.push(cur);\n      while (hist.done.length > hist.undoDepth) {\n        hist.done.shift();\n        if (!hist.done[0].ranges) hist.done.shift();\n      }\n    }\n    hist.done.push(selAfter);\n    hist.generation = ++hist.maxGeneration;\n    hist.lastModTime = hist.lastSelTime = time;\n    hist.lastOp = opId;\n    hist.lastOrigin = hist.lastSelOrigin = change.origin;\n\n    if (!last) signal(doc, \"historyAdded\");\n  }\n\n  function selectionEventCanBeMerged(doc, origin, prev, sel) {\n    var ch = origin.charAt(0);\n    return ch == \"*\" ||\n      ch == \"+\" &&\n      prev.ranges.length == sel.ranges.length &&\n      prev.somethingSelected() == sel.somethingSelected() &&\n      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);\n  }\n\n  // Called whenever the selection changes, sets the new selection as\n  // the pending selection in the history, and pushes the old pending\n  // selection into the 'done' array when it was significantly\n  // different (in number of selected ranges, emptiness, or time).\n  function addSelectionToHistory(doc, sel, opId, options) {\n    var hist = doc.history, origin = options && options.origin;\n\n    // A new event is started when the previous origin does not match\n    // the current, or the origins don't allow matching. Origins\n    // starting with * are always merged, those starting with + are\n    // merged when similar and close together in time.\n    if (opId == hist.lastOp ||\n        (origin && hist.lastSelOrigin == origin &&\n         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||\n          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))\n      hist.done[hist.done.length - 1] = sel;\n    else\n      pushSelectionToHistory(sel, hist.done);\n\n    hist.lastSelTime = +new Date;\n    hist.lastSelOrigin = origin;\n    hist.lastOp = opId;\n    if (options && options.clearRedo !== false)\n      clearSelectionEvents(hist.undone);\n  }\n\n  function pushSelectionToHistory(sel, dest) {\n    var top = lst(dest);\n    if (!(top && top.ranges && top.equals(sel)))\n      dest.push(sel);\n  }\n\n  // Used to store marked span information in the history.\n  function attachLocalSpans(doc, change, from, to) {\n    var existing = change[\"spans_\" + doc.id], n = 0;\n    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {\n      if (line.markedSpans)\n        (existing || (existing = change[\"spans_\" + doc.id] = {}))[n] = line.markedSpans;\n      ++n;\n    });\n  }\n\n  // When un/re-doing restores text containing marked spans, those\n  // that have been explicitly cleared should not be restored.\n  function removeClearedSpans(spans) {\n    if (!spans) return null;\n    for (var i = 0, out; i < spans.length; ++i) {\n      if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }\n      else if (out) out.push(spans[i]);\n    }\n    return !out ? spans : out.length ? out : null;\n  }\n\n  // Retrieve and filter the old marked spans stored in a change event.\n  function getOldSpans(doc, change) {\n    var found = change[\"spans_\" + doc.id];\n    if (!found) return null;\n    for (var i = 0, nw = []; i < change.text.length; ++i)\n      nw.push(removeClearedSpans(found[i]));\n    return nw;\n  }\n\n  // Used both to provide a JSON-safe object in .getHistory, and, when\n  // detaching a document, to split the history in two\n  function copyHistoryArray(events, newGroup, instantiateSel) {\n    for (var i = 0, copy = []; i < events.length; ++i) {\n      var event = events[i];\n      if (event.ranges) {\n        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);\n        continue;\n      }\n      var changes = event.changes, newChanges = [];\n      copy.push({changes: newChanges});\n      for (var j = 0; j < changes.length; ++j) {\n        var change = changes[j], m;\n        newChanges.push({from: change.from, to: change.to, text: change.text});\n        if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\\d+)$/)) {\n          if (indexOf(newGroup, Number(m[1])) > -1) {\n            lst(newChanges)[prop] = change[prop];\n            delete change[prop];\n          }\n        }\n      }\n    }\n    return copy;\n  }\n\n  // Rebasing/resetting history to deal with externally-sourced changes\n\n  function rebaseHistSelSingle(pos, from, to, diff) {\n    if (to < pos.line) {\n      pos.line += diff;\n    } else if (from < pos.line) {\n      pos.line = from;\n      pos.ch = 0;\n    }\n  }\n\n  // Tries to rebase an array of history events given a change in the\n  // document. If the change touches the same lines as the event, the\n  // event, and everything 'behind' it, is discarded. If the change is\n  // before the event, the event's positions are updated. Uses a\n  // copy-on-write scheme for the positions, to avoid having to\n  // reallocate them all on every rebase, but also avoid problems with\n  // shared position objects being unsafely updated.\n  function rebaseHistArray(array, from, to, diff) {\n    for (var i = 0; i < array.length; ++i) {\n      var sub = array[i], ok = true;\n      if (sub.ranges) {\n        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }\n        for (var j = 0; j < sub.ranges.length; j++) {\n          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);\n          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);\n        }\n        continue;\n      }\n      for (var j = 0; j < sub.changes.length; ++j) {\n        var cur = sub.changes[j];\n        if (to < cur.from.line) {\n          cur.from = Pos(cur.from.line + diff, cur.from.ch);\n          cur.to = Pos(cur.to.line + diff, cur.to.ch);\n        } else if (from <= cur.to.line) {\n          ok = false;\n          break;\n        }\n      }\n      if (!ok) {\n        array.splice(0, i + 1);\n        i = 0;\n      }\n    }\n  }\n\n  function rebaseHist(hist, change) {\n    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;\n    rebaseHistArray(hist.done, from, to, diff);\n    rebaseHistArray(hist.undone, from, to, diff);\n  }\n\n  // EVENT UTILITIES\n\n  // Due to the fact that we still support jurassic IE versions, some\n  // compatibility wrappers are needed.\n\n  var e_preventDefault = CodeMirror.e_preventDefault = function(e) {\n    if (e.preventDefault) e.preventDefault();\n    else e.returnValue = false;\n  };\n  var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {\n    if (e.stopPropagation) e.stopPropagation();\n    else e.cancelBubble = true;\n  };\n  function e_defaultPrevented(e) {\n    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;\n  }\n  var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};\n\n  function e_target(e) {return e.target || e.srcElement;}\n  function e_button(e) {\n    var b = e.which;\n    if (b == null) {\n      if (e.button & 1) b = 1;\n      else if (e.button & 2) b = 3;\n      else if (e.button & 4) b = 2;\n    }\n    if (mac && e.ctrlKey && b == 1) b = 3;\n    return b;\n  }\n\n  // EVENT HANDLING\n\n  // Lightweight event framework. on/off also work on DOM nodes,\n  // registering native DOM handlers.\n\n  var on = CodeMirror.on = function(emitter, type, f) {\n    if (emitter.addEventListener)\n      emitter.addEventListener(type, f, false);\n    else if (emitter.attachEvent)\n      emitter.attachEvent(\"on\" + type, f);\n    else {\n      var map = emitter._handlers || (emitter._handlers = {});\n      var arr = map[type] || (map[type] = []);\n      arr.push(f);\n    }\n  };\n\n  var off = CodeMirror.off = function(emitter, type, f) {\n    if (emitter.removeEventListener)\n      emitter.removeEventListener(type, f, false);\n    else if (emitter.detachEvent)\n      emitter.detachEvent(\"on\" + type, f);\n    else {\n      var arr = emitter._handlers && emitter._handlers[type];\n      if (!arr) return;\n      for (var i = 0; i < arr.length; ++i)\n        if (arr[i] == f) { arr.splice(i, 1); break; }\n    }\n  };\n\n  var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {\n    var arr = emitter._handlers && emitter._handlers[type];\n    if (!arr) return;\n    var args = Array.prototype.slice.call(arguments, 2);\n    for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);\n  };\n\n  // Often, we want to signal events at a point where we are in the\n  // middle of some work, but don't want the handler to start calling\n  // other methods on the editor, which might be in an inconsistent\n  // state or simply not expect any other events to happen.\n  // signalLater looks whether there are any handlers, and schedules\n  // them to be executed when the last operation ends, or, if no\n  // operation is active, when a timeout fires.\n  var delayedCallbacks, delayedCallbackDepth = 0;\n  function signalLater(emitter, type /*, values...*/) {\n    var arr = emitter._handlers && emitter._handlers[type];\n    if (!arr) return;\n    var args = Array.prototype.slice.call(arguments, 2);\n    if (!delayedCallbacks) {\n      ++delayedCallbackDepth;\n      delayedCallbacks = [];\n      setTimeout(fireDelayed, 0);\n    }\n    function bnd(f) {return function(){f.apply(null, args);};};\n    for (var i = 0; i < arr.length; ++i)\n      delayedCallbacks.push(bnd(arr[i]));\n  }\n\n  function fireDelayed() {\n    --delayedCallbackDepth;\n    var delayed = delayedCallbacks;\n    delayedCallbacks = null;\n    for (var i = 0; i < delayed.length; ++i) delayed[i]();\n  }\n\n  // The DOM events that CodeMirror handles can be overridden by\n  // registering a (non-DOM) handler on the editor for the event name,\n  // and preventDefault-ing the event in that handler.\n  function signalDOMEvent(cm, e, override) {\n    signal(cm, override || e.type, cm, e);\n    return e_defaultPrevented(e) || e.codemirrorIgnore;\n  }\n\n  function signalCursorActivity(cm) {\n    var arr = cm._handlers && cm._handlers.cursorActivity;\n    if (!arr) return;\n    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);\n    for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)\n      set.push(arr[i]);\n  }\n\n  function hasHandler(emitter, type) {\n    var arr = emitter._handlers && emitter._handlers[type];\n    return arr && arr.length > 0;\n  }\n\n  // Add on and off methods to a constructor's prototype, to make\n  // registering events on such objects more convenient.\n  function eventMixin(ctor) {\n    ctor.prototype.on = function(type, f) {on(this, type, f);};\n    ctor.prototype.off = function(type, f) {off(this, type, f);};\n  }\n\n  // MISC UTILITIES\n\n  // Number of pixels added to scroller and sizer to hide scrollbar\n  var scrollerCutOff = 30;\n\n  // Returned or thrown by various protocols to signal 'I'm not\n  // handling this'.\n  var Pass = CodeMirror.Pass = {toString: function(){return \"CodeMirror.Pass\";}};\n\n  // Reused option objects for setSelection & friends\n  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: \"*mouse\"}, sel_move = {origin: \"+move\"};\n\n  function Delayed() {this.id = null;}\n  Delayed.prototype.set = function(ms, f) {\n    clearTimeout(this.id);\n    this.id = setTimeout(f, ms);\n  };\n\n  // Counts the column offset in a string, taking tabs into account.\n  // Used mostly to find indentation.\n  var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {\n    if (end == null) {\n      end = string.search(/[^\\s\\u00a0]/);\n      if (end == -1) end = string.length;\n    }\n    for (var i = startIndex || 0, n = startValue || 0;;) {\n      var nextTab = string.indexOf(\"\\t\", i);\n      if (nextTab < 0 || nextTab >= end)\n        return n + (end - i);\n      n += nextTab - i;\n      n += tabSize - (n % tabSize);\n      i = nextTab + 1;\n    }\n  };\n\n  // The inverse of countColumn -- find the offset that corresponds to\n  // a particular column.\n  function findColumn(string, goal, tabSize) {\n    for (var pos = 0, col = 0;;) {\n      var nextTab = string.indexOf(\"\\t\", pos);\n      if (nextTab == -1) nextTab = string.length;\n      var skipped = nextTab - pos;\n      if (nextTab == string.length || col + skipped >= goal)\n        return pos + Math.min(skipped, goal - col);\n      col += nextTab - pos;\n      col += tabSize - (col % tabSize);\n      pos = nextTab + 1;\n      if (col >= goal) return pos;\n    }\n  }\n\n  var spaceStrs = [\"\"];\n  function spaceStr(n) {\n    while (spaceStrs.length <= n)\n      spaceStrs.push(lst(spaceStrs) + \" \");\n    return spaceStrs[n];\n  }\n\n  function lst(arr) { return arr[arr.length-1]; }\n\n  var selectInput = function(node) { node.select(); };\n  if (ios) // Mobile Safari apparently has a bug where select() is broken.\n    selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };\n  else if (ie) // Suppress mysterious IE10 errors\n    selectInput = function(node) { try { node.select(); } catch(_e) {} };\n\n  function indexOf(array, elt) {\n    for (var i = 0; i < array.length; ++i)\n      if (array[i] == elt) return i;\n    return -1;\n  }\n  if ([].indexOf) indexOf = function(array, elt) { return array.indexOf(elt); };\n  function map(array, f) {\n    var out = [];\n    for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);\n    return out;\n  }\n  if ([].map) map = function(array, f) { return array.map(f); };\n\n  function createObj(base, props) {\n    var inst;\n    if (Object.create) {\n      inst = Object.create(base);\n    } else {\n      var ctor = function() {};\n      ctor.prototype = base;\n      inst = new ctor();\n    }\n    if (props) copyObj(props, inst);\n    return inst;\n  };\n\n  function copyObj(obj, target, overwrite) {\n    if (!target) target = {};\n    for (var prop in obj)\n      if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))\n        target[prop] = obj[prop];\n    return target;\n  }\n\n  function bind(f) {\n    var args = Array.prototype.slice.call(arguments, 1);\n    return function(){return f.apply(null, args);};\n  }\n\n  var nonASCIISingleCaseWordChar = /[\\u00df\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;\n  var isWordCharBasic = CodeMirror.isWordChar = function(ch) {\n    return /\\w/.test(ch) || ch > \"\\x80\" &&\n      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));\n  };\n  function isWordChar(ch, helper) {\n    if (!helper) return isWordCharBasic(ch);\n    if (helper.source.indexOf(\"\\\\w\") > -1 && isWordCharBasic(ch)) return true;\n    return helper.test(ch);\n  }\n\n  function isEmpty(obj) {\n    for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;\n    return true;\n  }\n\n  // Extending unicode characters. A series of a non-extending char +\n  // any number of extending chars is treated as a single unit as far\n  // as editing and measuring is concerned. This is not fully correct,\n  // since some scripts/fonts/browsers also treat other configurations\n  // of code points as a group.\n  var extendingChars = /[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;\n  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }\n\n  // DOM UTILITIES\n\n  function elt(tag, content, className, style) {\n    var e = document.createElement(tag);\n    if (className) e.className = className;\n    if (style) e.style.cssText = style;\n    if (typeof content == \"string\") e.appendChild(document.createTextNode(content));\n    else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);\n    return e;\n  }\n\n  var range;\n  if (document.createRange) range = function(node, start, end) {\n    var r = document.createRange();\n    r.setEnd(node, end);\n    r.setStart(node, start);\n    return r;\n  };\n  else range = function(node, start, end) {\n    var r = document.body.createTextRange();\n    r.moveToElementText(node.parentNode);\n    r.collapse(true);\n    r.moveEnd(\"character\", end);\n    r.moveStart(\"character\", start);\n    return r;\n  };\n\n  function removeChildren(e) {\n    for (var count = e.childNodes.length; count > 0; --count)\n      e.removeChild(e.firstChild);\n    return e;\n  }\n\n  function removeChildrenAndAdd(parent, e) {\n    return removeChildren(parent).appendChild(e);\n  }\n\n  function contains(parent, child) {\n    if (parent.contains)\n      return parent.contains(child);\n    while (child = child.parentNode)\n      if (child == parent) return true;\n  }\n\n  function activeElt() { return document.activeElement; }\n  // Older versions of IE throws unspecified error when touching\n  // document.activeElement in some cases (during loading, in iframe)\n  if (ie_upto10) activeElt = function() {\n    try { return document.activeElement; }\n    catch(e) { return document.body; }\n  };\n\n  function classTest(cls) { return new RegExp(\"\\\\b\" + cls + \"\\\\b\\\\s*\"); }\n  function rmClass(node, cls) {\n    var test = classTest(cls);\n    if (test.test(node.className)) node.className = node.className.replace(test, \"\");\n  }\n  function addClass(node, cls) {\n    if (!classTest(cls).test(node.className)) node.className += \" \" + cls;\n  }\n  function joinClasses(a, b) {\n    var as = a.split(\" \");\n    for (var i = 0; i < as.length; i++)\n      if (as[i] && !classTest(as[i]).test(b)) b += \" \" + as[i];\n    return b;\n  }\n\n  // WINDOW-WIDE EVENTS\n\n  // These must be handled carefully, because naively registering a\n  // handler for each editor will cause the editors to never be\n  // garbage collected.\n\n  function forEachCodeMirror(f) {\n    if (!document.body.getElementsByClassName) return;\n    var byClass = document.body.getElementsByClassName(\"CodeMirror\");\n    for (var i = 0; i < byClass.length; i++) {\n      var cm = byClass[i].CodeMirror;\n      if (cm) f(cm);\n    }\n  }\n\n  var globalsRegistered = false;\n  function ensureGlobalHandlers() {\n    if (globalsRegistered) return;\n    registerGlobalHandlers();\n    globalsRegistered = true;\n  }\n  function registerGlobalHandlers() {\n    // When the window resizes, we need to refresh active editors.\n    var resizeTimer;\n    on(window, \"resize\", function() {\n      if (resizeTimer == null) resizeTimer = setTimeout(function() {\n        resizeTimer = null;\n        knownScrollbarWidth = null;\n        forEachCodeMirror(onResize);\n      }, 100);\n    });\n    // When the window loses focus, we want to show the editor as blurred\n    on(window, \"blur\", function() {\n      forEachCodeMirror(onBlur);\n    });\n  }\n\n  // FEATURE DETECTION\n\n  // Detect drag-and-drop\n  var dragAndDrop = function() {\n    // There is *some* kind of drag-and-drop support in IE6-8, but I\n    // couldn't get it to work yet.\n    if (ie_upto8) return false;\n    var div = elt('div');\n    return \"draggable\" in div || \"dragDrop\" in div;\n  }();\n\n  var knownScrollbarWidth;\n  function scrollbarWidth(measure) {\n    if (knownScrollbarWidth != null) return knownScrollbarWidth;\n    var test = elt(\"div\", null, null, \"width: 50px; height: 50px; overflow-x: scroll\");\n    removeChildrenAndAdd(measure, test);\n    if (test.offsetWidth)\n      knownScrollbarWidth = test.offsetHeight - test.clientHeight;\n    return knownScrollbarWidth || 0;\n  }\n\n  var zwspSupported;\n  function zeroWidthElement(measure) {\n    if (zwspSupported == null) {\n      var test = elt(\"span\", \"\\u200b\");\n      removeChildrenAndAdd(measure, elt(\"span\", [test, document.createTextNode(\"x\")]));\n      if (measure.firstChild.offsetHeight != 0)\n        zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_upto7;\n    }\n    if (zwspSupported) return elt(\"span\", \"\\u200b\");\n    else return elt(\"span\", \"\\u00a0\", null, \"display: inline-block; width: 1px; margin-right: -1px\");\n  }\n\n  // Feature-detect IE's crummy client rect reporting for bidi text\n  var badBidiRects;\n  function hasBadBidiRects(measure) {\n    if (badBidiRects != null) return badBidiRects;\n    var txt = removeChildrenAndAdd(measure, document.createTextNode(\"A\\u062eA\"));\n    var r0 = range(txt, 0, 1).getBoundingClientRect();\n    if (r0.left == r0.right) return false;\n    var r1 = range(txt, 1, 2).getBoundingClientRect();\n    return badBidiRects = (r1.right - r0.right < 3);\n  }\n\n  // See if \"\".split is the broken IE version, if so, provide an\n  // alternative way to split lines.\n  var splitLines = CodeMirror.splitLines = \"\\n\\nb\".split(/\\n/).length != 3 ? function(string) {\n    var pos = 0, result = [], l = string.length;\n    while (pos <= l) {\n      var nl = string.indexOf(\"\\n\", pos);\n      if (nl == -1) nl = string.length;\n      var line = string.slice(pos, string.charAt(nl - 1) == \"\\r\" ? nl - 1 : nl);\n      var rt = line.indexOf(\"\\r\");\n      if (rt != -1) {\n        result.push(line.slice(0, rt));\n        pos += rt + 1;\n      } else {\n        result.push(line);\n        pos = nl + 1;\n      }\n    }\n    return result;\n  } : function(string){return string.split(/\\r\\n?|\\n/);};\n\n  var hasSelection = window.getSelection ? function(te) {\n    try { return te.selectionStart != te.selectionEnd; }\n    catch(e) { return false; }\n  } : function(te) {\n    try {var range = te.ownerDocument.selection.createRange();}\n    catch(e) {}\n    if (!range || range.parentElement() != te) return false;\n    return range.compareEndPoints(\"StartToEnd\", range) != 0;\n  };\n\n  var hasCopyEvent = (function() {\n    var e = elt(\"div\");\n    if (\"oncopy\" in e) return true;\n    e.setAttribute(\"oncopy\", \"return;\");\n    return typeof e.oncopy == \"function\";\n  })();\n\n  // KEY NAMES\n\n  var keyNames = {3: \"Enter\", 8: \"Backspace\", 9: \"Tab\", 13: \"Enter\", 16: \"Shift\", 17: \"Ctrl\", 18: \"Alt\",\n                  19: \"Pause\", 20: \"CapsLock\", 27: \"Esc\", 32: \"Space\", 33: \"PageUp\", 34: \"PageDown\", 35: \"End\",\n                  36: \"Home\", 37: \"Left\", 38: \"Up\", 39: \"Right\", 40: \"Down\", 44: \"PrintScrn\", 45: \"Insert\",\n                  46: \"Delete\", 59: \";\", 61: \"=\", 91: \"Mod\", 92: \"Mod\", 93: \"Mod\", 107: \"=\", 109: \"-\", 127: \"Delete\",\n                  173: \"-\", 186: \";\", 187: \"=\", 188: \",\", 189: \"-\", 190: \".\", 191: \"/\", 192: \"`\", 219: \"[\", 220: \"\\\\\",\n                  221: \"]\", 222: \"'\", 63232: \"Up\", 63233: \"Down\", 63234: \"Left\", 63235: \"Right\", 63272: \"Delete\",\n                  63273: \"Home\", 63275: \"End\", 63276: \"PageUp\", 63277: \"PageDown\", 63302: \"Insert\"};\n  CodeMirror.keyNames = keyNames;\n  (function() {\n    // Number keys\n    for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);\n    // Alphabetic keys\n    for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);\n    // Function keys\n    for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = \"F\" + i;\n  })();\n\n  // BIDI HELPERS\n\n  function iterateBidiSections(order, from, to, f) {\n    if (!order) return f(from, to, \"ltr\");\n    var found = false;\n    for (var i = 0; i < order.length; ++i) {\n      var part = order[i];\n      if (part.from < to && part.to > from || from == to && part.to == from) {\n        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? \"rtl\" : \"ltr\");\n        found = true;\n      }\n    }\n    if (!found) f(from, to, \"ltr\");\n  }\n\n  function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }\n  function bidiRight(part) { return part.level % 2 ? part.from : part.to; }\n\n  function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }\n  function lineRight(line) {\n    var order = getOrder(line);\n    if (!order) return line.text.length;\n    return bidiRight(lst(order));\n  }\n\n  function lineStart(cm, lineN) {\n    var line = getLine(cm.doc, lineN);\n    var visual = visualLine(line);\n    if (visual != line) lineN = lineNo(visual);\n    var order = getOrder(visual);\n    var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);\n    return Pos(lineN, ch);\n  }\n  function lineEnd(cm, lineN) {\n    var merged, line = getLine(cm.doc, lineN);\n    while (merged = collapsedSpanAtEnd(line)) {\n      line = merged.find(1, true).line;\n      lineN = null;\n    }\n    var order = getOrder(line);\n    var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);\n    return Pos(lineN == null ? lineNo(line) : lineN, ch);\n  }\n\n  function compareBidiLevel(order, a, b) {\n    var linedir = order[0].level;\n    if (a == linedir) return true;\n    if (b == linedir) return false;\n    return a < b;\n  }\n  var bidiOther;\n  function getBidiPartAt(order, pos) {\n    bidiOther = null;\n    for (var i = 0, found; i < order.length; ++i) {\n      var cur = order[i];\n      if (cur.from < pos && cur.to > pos) return i;\n      if ((cur.from == pos || cur.to == pos)) {\n        if (found == null) {\n          found = i;\n        } else if (compareBidiLevel(order, cur.level, order[found].level)) {\n          if (cur.from != cur.to) bidiOther = found;\n          return i;\n        } else {\n          if (cur.from != cur.to) bidiOther = i;\n          return found;\n        }\n      }\n    }\n    return found;\n  }\n\n  function moveInLine(line, pos, dir, byUnit) {\n    if (!byUnit) return pos + dir;\n    do pos += dir;\n    while (pos > 0 && isExtendingChar(line.text.charAt(pos)));\n    return pos;\n  }\n\n  // This is needed in order to move 'visually' through bi-directional\n  // text -- i.e., pressing left should make the cursor go left, even\n  // when in RTL text. The tricky part is the 'jumps', where RTL and\n  // LTR text touch each other. This often requires the cursor offset\n  // to move more than one unit, in order to visually move one unit.\n  function moveVisually(line, start, dir, byUnit) {\n    var bidi = getOrder(line);\n    if (!bidi) return moveLogically(line, start, dir, byUnit);\n    var pos = getBidiPartAt(bidi, start), part = bidi[pos];\n    var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);\n\n    for (;;) {\n      if (target > part.from && target < part.to) return target;\n      if (target == part.from || target == part.to) {\n        if (getBidiPartAt(bidi, target) == pos) return target;\n        part = bidi[pos += dir];\n        return (dir > 0) == part.level % 2 ? part.to : part.from;\n      } else {\n        part = bidi[pos += dir];\n        if (!part) return null;\n        if ((dir > 0) == part.level % 2)\n          target = moveInLine(line, part.to, -1, byUnit);\n        else\n          target = moveInLine(line, part.from, 1, byUnit);\n      }\n    }\n  }\n\n  function moveLogically(line, start, dir, byUnit) {\n    var target = start + dir;\n    if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;\n    return target < 0 || target > line.text.length ? null : target;\n  }\n\n  // Bidirectional ordering algorithm\n  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm\n  // that this (partially) implements.\n\n  // One-char codes used for character types:\n  // L (L):   Left-to-Right\n  // R (R):   Right-to-Left\n  // r (AL):  Right-to-Left Arabic\n  // 1 (EN):  European Number\n  // + (ES):  European Number Separator\n  // % (ET):  European Number Terminator\n  // n (AN):  Arabic Number\n  // , (CS):  Common Number Separator\n  // m (NSM): Non-Spacing Mark\n  // b (BN):  Boundary Neutral\n  // s (B):   Paragraph Separator\n  // t (S):   Segment Separator\n  // w (WS):  Whitespace\n  // N (ON):  Other Neutrals\n\n  // Returns null if characters are ordered as they appear\n  // (left-to-right), or an array of sections ({from, to, level}\n  // objects) in the order in which they occur visually.\n  var bidiOrdering = (function() {\n    // Character types for codepoints 0 to 0xff\n    var lowTypes = \"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\";\n    // Character types for codepoints 0x600 to 0x6ff\n    var arabicTypes = \"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm\";\n    function charType(code) {\n      if (code <= 0xf7) return lowTypes.charAt(code);\n      else if (0x590 <= code && code <= 0x5f4) return \"R\";\n      else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);\n      else if (0x6ee <= code && code <= 0x8ac) return \"r\";\n      else if (0x2000 <= code && code <= 0x200b) return \"w\";\n      else if (code == 0x200c) return \"b\";\n      else return \"L\";\n    }\n\n    var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;\n    // Browsers seem to always treat the boundaries of block elements as being L.\n    var outerType = \"L\";\n\n    function BidiSpan(level, from, to) {\n      this.level = level;\n      this.from = from; this.to = to;\n    }\n\n    return function(str) {\n      if (!bidiRE.test(str)) return false;\n      var len = str.length, types = [];\n      for (var i = 0, type; i < len; ++i)\n        types.push(type = charType(str.charCodeAt(i)));\n\n      // W1. Examine each non-spacing mark (NSM) in the level run, and\n      // change the type of the NSM to the type of the previous\n      // character. If the NSM is at the start of the level run, it will\n      // get the type of sor.\n      for (var i = 0, prev = outerType; i < len; ++i) {\n        var type = types[i];\n        if (type == \"m\") types[i] = prev;\n        else prev = type;\n      }\n\n      // W2. Search backwards from each instance of a European number\n      // until the first strong type (R, L, AL, or sor) is found. If an\n      // AL is found, change the type of the European number to Arabic\n      // number.\n      // W3. Change all ALs to R.\n      for (var i = 0, cur = outerType; i < len; ++i) {\n        var type = types[i];\n        if (type == \"1\" && cur == \"r\") types[i] = \"n\";\n        else if (isStrong.test(type)) { cur = type; if (type == \"r\") types[i] = \"R\"; }\n      }\n\n      // W4. A single European separator between two European numbers\n      // changes to a European number. A single common separator between\n      // two numbers of the same type changes to that type.\n      for (var i = 1, prev = types[0]; i < len - 1; ++i) {\n        var type = types[i];\n        if (type == \"+\" && prev == \"1\" && types[i+1] == \"1\") types[i] = \"1\";\n        else if (type == \",\" && prev == types[i+1] &&\n                 (prev == \"1\" || prev == \"n\")) types[i] = prev;\n        prev = type;\n      }\n\n      // W5. A sequence of European terminators adjacent to European\n      // numbers changes to all European numbers.\n      // W6. Otherwise, separators and terminators change to Other\n      // Neutral.\n      for (var i = 0; i < len; ++i) {\n        var type = types[i];\n        if (type == \",\") types[i] = \"N\";\n        else if (type == \"%\") {\n          for (var end = i + 1; end < len && types[end] == \"%\"; ++end) {}\n          var replace = (i && types[i-1] == \"!\") || (end < len && types[end] == \"1\") ? \"1\" : \"N\";\n          for (var j = i; j < end; ++j) types[j] = replace;\n          i = end - 1;\n        }\n      }\n\n      // W7. Search backwards from each instance of a European number\n      // until the first strong type (R, L, or sor) is found. If an L is\n      // found, then change the type of the European number to L.\n      for (var i = 0, cur = outerType; i < len; ++i) {\n        var type = types[i];\n        if (cur == \"L\" && type == \"1\") types[i] = \"L\";\n        else if (isStrong.test(type)) cur = type;\n      }\n\n      // N1. A sequence of neutrals takes the direction of the\n      // surrounding strong text if the text on both sides has the same\n      // direction. European and Arabic numbers act as if they were R in\n      // terms of their influence on neutrals. Start-of-level-run (sor)\n      // and end-of-level-run (eor) are used at level run boundaries.\n      // N2. Any remaining neutrals take the embedding direction.\n      for (var i = 0; i < len; ++i) {\n        if (isNeutral.test(types[i])) {\n          for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}\n          var before = (i ? types[i-1] : outerType) == \"L\";\n          var after = (end < len ? types[end] : outerType) == \"L\";\n          var replace = before || after ? \"L\" : \"R\";\n          for (var j = i; j < end; ++j) types[j] = replace;\n          i = end - 1;\n        }\n      }\n\n      // Here we depart from the documented algorithm, in order to avoid\n      // building up an actual levels array. Since there are only three\n      // levels (0, 1, 2) in an implementation that doesn't take\n      // explicit embedding into account, we can build up the order on\n      // the fly, without following the level-based algorithm.\n      var order = [], m;\n      for (var i = 0; i < len;) {\n        if (countsAsLeft.test(types[i])) {\n          var start = i;\n          for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}\n          order.push(new BidiSpan(0, start, i));\n        } else {\n          var pos = i, at = order.length;\n          for (++i; i < len && types[i] != \"L\"; ++i) {}\n          for (var j = pos; j < i;) {\n            if (countsAsNum.test(types[j])) {\n              if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));\n              var nstart = j;\n              for (++j; j < i && countsAsNum.test(types[j]); ++j) {}\n              order.splice(at, 0, new BidiSpan(2, nstart, j));\n              pos = j;\n            } else ++j;\n          }\n          if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));\n        }\n      }\n      if (order[0].level == 1 && (m = str.match(/^\\s+/))) {\n        order[0].from = m[0].length;\n        order.unshift(new BidiSpan(0, 0, m[0].length));\n      }\n      if (lst(order).level == 1 && (m = str.match(/\\s+$/))) {\n        lst(order).to -= m[0].length;\n        order.push(new BidiSpan(0, len - m[0].length, len));\n      }\n      if (order[0].level != lst(order).level)\n        order.push(new BidiSpan(order[0].level, len, len));\n\n      return order;\n    };\n  })();\n\n  // THE END\n\n  CodeMirror.version = \"4.1.1\";\n\n  return CodeMirror;\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/lib/codemirror.css": {
            "type": "text/css",
            "title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.css",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace;\n  height: 300px;\n}\n.CodeMirror-scroll {\n  /* Set scrolling behaviour here */\n  overflow: auto;\n}\n\n/* PADDING */\n\n.CodeMirror-lines {\n  padding: 4px 0; /* Vertical padding around content */\n}\n.CodeMirror pre {\n  padding: 0 4px; /* Horizontal padding of content */\n}\n\n.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  background-color: white; /* The little square between H and V scrollbars */\n}\n\n/* GUTTER */\n\n.CodeMirror-gutters {\n  border-right: 1px solid #ddd;\n  background-color: #f7f7f7;\n  white-space: nowrap;\n}\n.CodeMirror-linenumbers {}\n.CodeMirror-linenumber {\n  padding: 0 3px 0 5px;\n  min-width: 20px;\n  text-align: right;\n  color: #999;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n/* CURSOR */\n\n.CodeMirror div.CodeMirror-cursor {\n  border-left: 1px solid black;\n}\n/* Shown when moving in bi-directional text */\n.CodeMirror div.CodeMirror-secondarycursor {\n  border-left: 1px solid silver;\n}\n.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {\n  width: auto;\n  border: 0;\n  background: #7e7;\n}\n/* Can style cursor different in overwrite (non-insert) mode */\ndiv.CodeMirror-overwrite div.CodeMirror-cursor {}\n\n.cm-tab { display: inline-block; }\n\n.CodeMirror-ruler {\n  border-left: 1px solid #ccc;\n  position: absolute;\n}\n\n/* DEFAULT THEME */\n\n.cm-s-default .cm-keyword {color: #708;}\n.cm-s-default .cm-atom {color: #219;}\n.cm-s-default .cm-number {color: #164;}\n.cm-s-default .cm-def {color: #00f;}\n.cm-s-default .cm-variable,\n.cm-s-default .cm-punctuation,\n.cm-s-default .cm-property,\n.cm-s-default .cm-operator {}\n.cm-s-default .cm-variable-2 {color: #05a;}\n.cm-s-default .cm-variable-3 {color: #085;}\n.cm-s-default .cm-comment {color: #a50;}\n.cm-s-default .cm-string {color: #a11;}\n.cm-s-default .cm-string-2 {color: #f50;}\n.cm-s-default .cm-meta {color: #555;}\n.cm-s-default .cm-qualifier {color: #555;}\n.cm-s-default .cm-builtin {color: #30a;}\n.cm-s-default .cm-bracket {color: #997;}\n.cm-s-default .cm-tag {color: #170;}\n.cm-s-default .cm-attribute {color: #00c;}\n.cm-s-default .cm-header {color: blue;}\n.cm-s-default .cm-quote {color: #090;}\n.cm-s-default .cm-hr {color: #999;}\n.cm-s-default .cm-link {color: #00c;}\n\n.cm-negative {color: #d44;}\n.cm-positive {color: #292;}\n.cm-header, .cm-strong {font-weight: bold;}\n.cm-em {font-style: italic;}\n.cm-link {text-decoration: underline;}\n\n.cm-s-default .cm-error {color: #f00;}\n.cm-invalidchar {color: #f00;}\n\ndiv.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}\n.CodeMirror-activeline-background {background: #e8f2ff;}\n\n/* STOP */\n\n/* The rest of this file contains styles related to the mechanics of\n   the editor. You probably shouldn't touch them. */\n\n.CodeMirror {\n  line-height: 1;\n  position: relative;\n  overflow: hidden;\n  background: white;\n  color: black;\n}\n\n.CodeMirror-scroll {\n  /* 30px is the magic margin used to hide the element's real scrollbars */\n  /* See overflow: hidden in .CodeMirror */\n  margin-bottom: -30px; margin-right: -30px;\n  padding-bottom: 30px;\n  height: 100%;\n  outline: none; /* Prevent dragging from highlighting the element */\n  position: relative;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n.CodeMirror-sizer {\n  position: relative;\n  border-right: 30px solid transparent;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n}\n\n/* The fake, visible scrollbars. Used to force redraw during scrolling\n   before actuall scrolling happens, thus preventing shaking and\n   flickering artifacts. */\n.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {\n  position: absolute;\n  z-index: 6;\n  display: none;\n}\n.CodeMirror-vscrollbar {\n  right: 0; top: 0;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.CodeMirror-hscrollbar {\n  bottom: 0; left: 0;\n  overflow-y: hidden;\n  overflow-x: scroll;\n}\n.CodeMirror-scrollbar-filler {\n  right: 0; bottom: 0;\n}\n.CodeMirror-gutter-filler {\n  left: 0; bottom: 0;\n}\n\n.CodeMirror-gutters {\n  position: absolute; left: 0; top: 0;\n  padding-bottom: 30px;\n  z-index: 3;\n}\n.CodeMirror-gutter {\n  white-space: normal;\n  height: 100%;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  padding-bottom: 30px;\n  margin-bottom: -32px;\n  display: inline-block;\n  /* Hack to make IE7 behave */\n  *zoom:1;\n  *display:inline;\n}\n.CodeMirror-gutter-elt {\n  position: absolute;\n  cursor: default;\n  z-index: 4;\n}\n\n.CodeMirror-lines {\n  cursor: text;\n}\n.CodeMirror pre {\n  /* Reset some styles that the rest of the page might have set */\n  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;\n  border-width: 0;\n  background: transparent;\n  font-family: inherit;\n  font-size: inherit;\n  margin: 0;\n  white-space: pre;\n  word-wrap: normal;\n  line-height: inherit;\n  color: inherit;\n  z-index: 2;\n  position: relative;\n  overflow: visible;\n}\n.CodeMirror-wrap pre {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  word-break: normal;\n}\n\n.CodeMirror-linebackground {\n  position: absolute;\n  left: 0; right: 0; top: 0; bottom: 0;\n  z-index: 0;\n}\n\n.CodeMirror-linewidget {\n  position: relative;\n  z-index: 2;\n  overflow: auto;\n}\n\n.CodeMirror-widget {}\n\n.CodeMirror-wrap .CodeMirror-scroll {\n  overflow-x: hidden;\n}\n\n.CodeMirror-measure {\n  position: absolute;\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  visibility: hidden;\n}\n.CodeMirror-measure pre { position: static; }\n\n.CodeMirror div.CodeMirror-cursor {\n  position: absolute;\n  border-right: none;\n  width: 0;\n}\n\ndiv.CodeMirror-cursors {\n  visibility: hidden;\n  position: relative;\n  z-index: 1;\n}\n.CodeMirror-focused div.CodeMirror-cursors {\n  visibility: visible;\n}\n\n.CodeMirror-selected { background: #d9d9d9; }\n.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }\n.CodeMirror-crosshair { cursor: crosshair; }\n\n.cm-searching {\n  background: #ffa;\n  background: rgba(255, 255, 0, .4);\n}\n\n/* IE7 hack to prevent it from returning funny offsetTops on the spans */\n.CodeMirror span { *vertical-align: text-bottom; }\n\n/* Used to force a border model for a node */\n.cm-force-border { padding-right: .1px; }\n\n@media print {\n  /* Hide the cursor when printing */\n  .CodeMirror div.CodeMirror-cursors {\n    visibility: hidden;\n  }\n}\n"
        },
        "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css": {
            "type": "text/css",
            "title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": ".CodeMirror-dialog {\n  position: absolute;\n  left: 0; right: 0;\n  background: white;\n  z-index: 15;\n  padding: .1em .8em;\n  overflow: hidden;\n  color: #333;\n}\n\n.CodeMirror-dialog-top {\n  border-bottom: 1px solid #eee;\n  top: 0;\n}\n\n.CodeMirror-dialog-bottom {\n  border-top: 1px solid #eee;\n  bottom: 0;\n}\n\n.CodeMirror-dialog input {\n  border: none;\n  outline: none;\n  background: transparent;\n  width: 20em;\n  color: inherit;\n  font-family: monospace;\n}\n\n.CodeMirror-dialog button {\n  font-size: 70%;\n}\n"
        },
        "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js",
            "module-type": "library",
            "text": "// Open simple dialogs on top of an editor. Relies on dialog.css.\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  function dialogDiv(cm, template, bottom) {\n    var wrap = cm.getWrapperElement();\n    var dialog;\n    dialog = wrap.appendChild(document.createElement(\"div\"));\n    if (bottom) {\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-bottom\";\n    } else {\n      dialog.className = \"CodeMirror-dialog CodeMirror-dialog-top\";\n    }\n    if (typeof template == \"string\") {\n      dialog.innerHTML = template;\n    } else { // Assuming it's a detached DOM element.\n      dialog.appendChild(template);\n    }\n    return dialog;\n  }\n\n  function closeNotification(cm, newVal) {\n    if (cm.state.currentNotificationClose)\n      cm.state.currentNotificationClose();\n    cm.state.currentNotificationClose = newVal;\n  }\n\n  CodeMirror.defineExtension(\"openDialog\", function(template, callback, options) {\n    closeNotification(this, null);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var closed = false, me = this;\n    function close() {\n      if (closed) return;\n      closed = true;\n      dialog.parentNode.removeChild(dialog);\n    }\n    var inp = dialog.getElementsByTagName(\"input\")[0], button;\n    if (inp) {\n      if (options && options.value) inp.value = options.value;\n      CodeMirror.on(inp, \"keydown\", function(e) {\n        if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }\n        if (e.keyCode == 13 || e.keyCode == 27) {\n          inp.blur();\n          CodeMirror.e_stop(e);\n          close();\n          me.focus();\n          if (e.keyCode == 13) callback(inp.value);\n        }\n      });\n      if (options && options.onKeyUp) {\n        CodeMirror.on(inp, \"keyup\", function(e) {options.onKeyUp(e, inp.value, close);});\n      }\n      if (options && options.value) inp.value = options.value;\n      inp.focus();\n      CodeMirror.on(inp, \"blur\", close);\n    } else if (button = dialog.getElementsByTagName(\"button\")[0]) {\n      CodeMirror.on(button, \"click\", function() {\n        close();\n        me.focus();\n      });\n      button.focus();\n      CodeMirror.on(button, \"blur\", close);\n    }\n    return close;\n  });\n\n  CodeMirror.defineExtension(\"openConfirm\", function(template, callbacks, options) {\n    closeNotification(this, null);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var buttons = dialog.getElementsByTagName(\"button\");\n    var closed = false, me = this, blurring = 1;\n    function close() {\n      if (closed) return;\n      closed = true;\n      dialog.parentNode.removeChild(dialog);\n      me.focus();\n    }\n    buttons[0].focus();\n    for (var i = 0; i < buttons.length; ++i) {\n      var b = buttons[i];\n      (function(callback) {\n        CodeMirror.on(b, \"click\", function(e) {\n          CodeMirror.e_preventDefault(e);\n          close();\n          if (callback) callback(me);\n        });\n      })(callbacks[i]);\n      CodeMirror.on(b, \"blur\", function() {\n        --blurring;\n        setTimeout(function() { if (blurring <= 0) close(); }, 200);\n      });\n      CodeMirror.on(b, \"focus\", function() { ++blurring; });\n    }\n  });\n\n  /*\n   * openNotification\n   * Opens a notification, that can be closed with an optional timer\n   * (default 5000ms timer) and always closes on click.\n   *\n   * If a notification is opened while another is opened, it will close the\n   * currently opened one and open the new one immediately.\n   */\n  CodeMirror.defineExtension(\"openNotification\", function(template, options) {\n    closeNotification(this, close);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var duration = options && (options.duration === undefined ? 5000 : options.duration);\n    var closed = false, doneTimer;\n\n    function close() {\n      if (closed) return;\n      closed = true;\n      clearTimeout(doneTimer);\n      dialog.parentNode.removeChild(dialog);\n    }\n\n    CodeMirror.on(dialog, 'click', function(e) {\n      CodeMirror.e_preventDefault(e);\n      close();\n    });\n    if (duration)\n      doneTimer = setTimeout(close, options.duration);\n  });\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js",
            "module-type": "library",
            "text": "(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  var ie_lt8 = /MSIE \\d/.test(navigator.userAgent) &&\n    (document.documentMode == null || document.documentMode < 8);\n\n  var Pos = CodeMirror.Pos;\n\n  var matching = {\"(\": \")>\", \")\": \"(<\", \"[\": \"]>\", \"]\": \"[<\", \"{\": \"}>\", \"}\": \"{<\"};\n\n  function findMatchingBracket(cm, where, strict, config) {\n    var line = cm.getLineHandle(where.line), pos = where.ch - 1;\n    var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];\n    if (!match) return null;\n    var dir = match.charAt(1) == \">\" ? 1 : -1;\n    if (strict && (dir > 0) != (pos == where.ch)) return null;\n    var style = cm.getTokenTypeAt(Pos(where.line, pos + 1));\n\n    var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config);\n    if (found == null) return null;\n    return {from: Pos(where.line, pos), to: found && found.pos,\n            match: found && found.ch == match.charAt(0), forward: dir > 0};\n  }\n\n  // bracketRegex is used to specify which type of bracket to scan\n  // should be a regexp, e.g. /[[\\]]/\n  //\n  // Note: If \"where\" is on an open bracket, then this bracket is ignored.\n  //\n  // Returns false when no bracket was found, null when it reached\n  // maxScanLines and gave up\n  function scanForBracket(cm, where, dir, style, config) {\n    var maxScanLen = (config && config.maxScanLineLength) || 10000;\n    var maxScanLines = (config && config.maxScanLines) || 1000;\n\n    var stack = [];\n    var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\\]]/;\n    var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1)\n                          : Math.max(cm.firstLine() - 1, where.line - maxScanLines);\n    for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) {\n      var line = cm.getLine(lineNo);\n      if (!line) continue;\n      var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1;\n      if (line.length > maxScanLen) continue;\n      if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0);\n      for (; pos != end; pos += dir) {\n        var ch = line.charAt(pos);\n        if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) {\n          var match = matching[ch];\n          if ((match.charAt(1) == \">\") == (dir > 0)) stack.push(ch);\n          else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch};\n          else stack.pop();\n        }\n      }\n    }\n    return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null;\n  }\n\n  function matchBrackets(cm, autoclear, config) {\n    // Disable brace matching in long lines, since it'll cause hugely slow updates\n    var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000;\n    var marks = [], ranges = cm.listSelections();\n    for (var i = 0; i < ranges.length; i++) {\n      var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config);\n      if (match && cm.getLine(match.from.line).length <= maxHighlightLen) {\n        var style = match.match ? \"CodeMirror-matchingbracket\" : \"CodeMirror-nonmatchingbracket\";\n        marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style}));\n        if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen)\n          marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style}));\n      }\n    }\n\n    if (marks.length) {\n      // Kludge to work around the IE bug from issue #1193, where text\n      // input stops going to the textare whever this fires.\n      if (ie_lt8 && cm.state.focused) cm.display.input.focus();\n\n      var clear = function() {\n        cm.operation(function() {\n          for (var i = 0; i < marks.length; i++) marks[i].clear();\n        });\n      };\n      if (autoclear) setTimeout(clear, 800);\n      else return clear;\n    }\n  }\n\n  var currentlyHighlighted = null;\n  function doMatchBrackets(cm) {\n    cm.operation(function() {\n      if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;}\n      currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets);\n    });\n  }\n\n  CodeMirror.defineOption(\"matchBrackets\", false, function(cm, val, old) {\n    if (old && old != CodeMirror.Init)\n      cm.off(\"cursorActivity\", doMatchBrackets);\n    if (val) {\n      cm.state.matchBrackets = typeof val == \"object\" ? val : {};\n      cm.on(\"cursorActivity\", doMatchBrackets);\n    }\n  });\n\n  CodeMirror.defineExtension(\"matchBrackets\", function() {matchBrackets(this, true);});\n  CodeMirror.defineExtension(\"findMatchingBracket\", function(pos, strict, config){\n    return findMatchingBracket(this, pos, strict, config);\n  });\n  CodeMirror.defineExtension(\"scanForBracket\", function(pos, dir, style, config){\n    return scanForBracket(this, pos, dir, style, config);\n  });\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js",
            "module-type": "library",
            "text": "(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n  var Pos = CodeMirror.Pos;\n\n  function SearchCursor(doc, query, pos, caseFold) {\n    this.atOccurrence = false; this.doc = doc;\n    if (caseFold == null && typeof query == \"string\") caseFold = false;\n\n    pos = pos ? doc.clipPos(pos) : Pos(0, 0);\n    this.pos = {from: pos, to: pos};\n\n    // The matches method is filled in based on the type of query.\n    // It takes a position and a direction, and returns an object\n    // describing the next occurrence of the query, or null if no\n    // more matches were found.\n    if (typeof query != \"string\") { // Regexp match\n      if (!query.global) query = new RegExp(query.source, query.ignoreCase ? \"ig\" : \"g\");\n      this.matches = function(reverse, pos) {\n        if (reverse) {\n          query.lastIndex = 0;\n          var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start;\n          for (;;) {\n            query.lastIndex = cutOff;\n            var newMatch = query.exec(line);\n            if (!newMatch) break;\n            match = newMatch;\n            start = match.index;\n            cutOff = match.index + (match[0].length || 1);\n            if (cutOff == line.length) break;\n          }\n          var matchLen = (match && match[0].length) || 0;\n          if (!matchLen) {\n            if (start == 0 && line.length == 0) {match = undefined;}\n            else if (start != doc.getLine(pos.line).length) {\n              matchLen++;\n            }\n          }\n        } else {\n          query.lastIndex = pos.ch;\n          var line = doc.getLine(pos.line), match = query.exec(line);\n          var matchLen = (match && match[0].length) || 0;\n          var start = match && match.index;\n          if (start + matchLen != line.length && !matchLen) matchLen = 1;\n        }\n        if (match && matchLen)\n          return {from: Pos(pos.line, start),\n                  to: Pos(pos.line, start + matchLen),\n                  match: match};\n      };\n    } else { // String query\n      var origQuery = query;\n      if (caseFold) query = query.toLowerCase();\n      var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};\n      var target = query.split(\"\\n\");\n      // Different methods for single-line and multi-line queries\n      if (target.length == 1) {\n        if (!query.length) {\n          // Empty string would match anything and never progress, so\n          // we define it to match nothing instead.\n          this.matches = function() {};\n        } else {\n          this.matches = function(reverse, pos) {\n            if (reverse) {\n              var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig);\n              var match = line.lastIndexOf(query);\n              if (match > -1) {\n                match = adjustPos(orig, line, match);\n                return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};\n              }\n             } else {\n               var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig);\n               var match = line.indexOf(query);\n               if (match > -1) {\n                 match = adjustPos(orig, line, match) + pos.ch;\n                 return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)};\n               }\n            }\n          };\n        }\n      } else {\n        var origTarget = origQuery.split(\"\\n\");\n        this.matches = function(reverse, pos) {\n          var last = target.length - 1;\n          if (reverse) {\n            if (pos.line - (target.length - 1) < doc.firstLine()) return;\n            if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return;\n            var to = Pos(pos.line, origTarget[last].length);\n            for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln)\n              if (target[i] != fold(doc.getLine(ln))) return;\n            var line = doc.getLine(ln), cut = line.length - origTarget[0].length;\n            if (fold(line.slice(cut)) != target[0]) return;\n            return {from: Pos(ln, cut), to: to};\n          } else {\n            if (pos.line + (target.length - 1) > doc.lastLine()) return;\n            var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length;\n            if (fold(line.slice(cut)) != target[0]) return;\n            var from = Pos(pos.line, cut);\n            for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln)\n              if (target[i] != fold(doc.getLine(ln))) return;\n            if (doc.getLine(ln).slice(0, origTarget[last].length) != target[last]) return;\n            return {from: from, to: Pos(ln, origTarget[last].length)};\n          }\n        };\n      }\n    }\n  }\n\n  SearchCursor.prototype = {\n    findNext: function() {return this.find(false);},\n    findPrevious: function() {return this.find(true);},\n\n    find: function(reverse) {\n      var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to);\n      function savePosAndFail(line) {\n        var pos = Pos(line, 0);\n        self.pos = {from: pos, to: pos};\n        self.atOccurrence = false;\n        return false;\n      }\n\n      for (;;) {\n        if (this.pos = this.matches(reverse, pos)) {\n          this.atOccurrence = true;\n          return this.pos.match || true;\n        }\n        if (reverse) {\n          if (!pos.line) return savePosAndFail(0);\n          pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length);\n        }\n        else {\n          var maxLine = this.doc.lineCount();\n          if (pos.line == maxLine - 1) return savePosAndFail(maxLine);\n          pos = Pos(pos.line + 1, 0);\n        }\n      }\n    },\n\n    from: function() {if (this.atOccurrence) return this.pos.from;},\n    to: function() {if (this.atOccurrence) return this.pos.to;},\n\n    replace: function(newText) {\n      if (!this.atOccurrence) return;\n      var lines = CodeMirror.splitLines(newText);\n      this.doc.replaceRange(lines, this.pos.from, this.pos.to);\n      this.pos.to = Pos(this.pos.from.line + lines.length - 1,\n                        lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0));\n    }\n  };\n\n  // Maps a position in a case-folded line back to a position in the original line\n  // (compensating for codepoints increasing in number during folding)\n  function adjustPos(orig, folded, pos) {\n    if (orig.length == folded.length) return pos;\n    for (var pos1 = Math.min(pos, orig.length);;) {\n      var len1 = orig.slice(0, pos1).toLowerCase().length;\n      if (len1 < pos) ++pos1;\n      else if (len1 > pos) --pos1;\n      else return pos1;\n    }\n  }\n\n  CodeMirror.defineExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this.doc, query, pos, caseFold);\n  });\n  CodeMirror.defineDocExtension(\"getSearchCursor\", function(query, pos, caseFold) {\n    return new SearchCursor(this, query, pos, caseFold);\n  });\n\n  CodeMirror.defineExtension(\"selectMatches\", function(query, caseFold) {\n    var ranges = [], next;\n    var cur = this.getSearchCursor(query, this.getCursor(\"from\"), caseFold);\n    while (next = cur.findNext()) {\n      if (CodeMirror.cmpPos(cur.to(), this.getCursor(\"to\")) > 0) break;\n      ranges.push({anchor: cur.from(), head: cur.to()});\n    }\n    if (ranges.length)\n      this.setSelections(ranges, 0);\n  });\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js",
            "module-type": "library",
            "text": "// TODO actually recognize syntax of TypeScript constructs\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"javascript\", function(config, parserConfig) {\n  var indentUnit = config.indentUnit;\n  var statementIndent = parserConfig.statementIndent;\n  var jsonldMode = parserConfig.jsonld;\n  var jsonMode = parserConfig.json || jsonldMode;\n  var isTS = parserConfig.typescript;\n\n  // Tokenizer\n\n  var keywords = function(){\n    function kw(type) {return {type: type, style: \"keyword\"};}\n    var A = kw(\"keyword a\"), B = kw(\"keyword b\"), C = kw(\"keyword c\");\n    var operator = kw(\"operator\"), atom = {type: \"atom\", style: \"atom\"};\n\n    var jsKeywords = {\n      \"if\": kw(\"if\"), \"while\": A, \"with\": A, \"else\": B, \"do\": B, \"try\": B, \"finally\": B,\n      \"return\": C, \"break\": C, \"continue\": C, \"new\": C, \"delete\": C, \"throw\": C, \"debugger\": C,\n      \"var\": kw(\"var\"), \"const\": kw(\"var\"), \"let\": kw(\"var\"),\n      \"function\": kw(\"function\"), \"catch\": kw(\"catch\"),\n      \"for\": kw(\"for\"), \"switch\": kw(\"switch\"), \"case\": kw(\"case\"), \"default\": kw(\"default\"),\n      \"in\": operator, \"typeof\": operator, \"instanceof\": operator,\n      \"true\": atom, \"false\": atom, \"null\": atom, \"undefined\": atom, \"NaN\": atom, \"Infinity\": atom,\n      \"this\": kw(\"this\"), \"module\": kw(\"module\"), \"class\": kw(\"class\"), \"super\": kw(\"atom\"),\n      \"yield\": C, \"export\": kw(\"export\"), \"import\": kw(\"import\"), \"extends\": C\n    };\n\n    // Extend the 'normal' keywords with the TypeScript language extensions\n    if (isTS) {\n      var type = {type: \"variable\", style: \"variable-3\"};\n      var tsKeywords = {\n        // object-like things\n        \"interface\": kw(\"interface\"),\n        \"extends\": kw(\"extends\"),\n        \"constructor\": kw(\"constructor\"),\n\n        // scope modifiers\n        \"public\": kw(\"public\"),\n        \"private\": kw(\"private\"),\n        \"protected\": kw(\"protected\"),\n        \"static\": kw(\"static\"),\n\n        // types\n        \"string\": type, \"number\": type, \"bool\": type, \"any\": type\n      };\n\n      for (var attr in tsKeywords) {\n        jsKeywords[attr] = tsKeywords[attr];\n      }\n    }\n\n    return jsKeywords;\n  }();\n\n  var isOperatorChar = /[+\\-*&%=<>!?|~^]/;\n  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;\n\n  function readRegexp(stream) {\n    var escaped = false, next, inSet = false;\n    while ((next = stream.next()) != null) {\n      if (!escaped) {\n        if (next == \"/\" && !inSet) return;\n        if (next == \"[\") inSet = true;\n        else if (inSet && next == \"]\") inSet = false;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n  }\n\n  // Used as scratch variables to communicate multiple values without\n  // consing up tons of objects.\n  var type, content;\n  function ret(tp, style, cont) {\n    type = tp; content = cont;\n    return style;\n  }\n  function tokenBase(stream, state) {\n    var ch = stream.next();\n    if (ch == '\"' || ch == \"'\") {\n      state.tokenize = tokenString(ch);\n      return state.tokenize(stream, state);\n    } else if (ch == \".\" && stream.match(/^\\d+(?:[eE][+\\-]?\\d+)?/)) {\n      return ret(\"number\", \"number\");\n    } else if (ch == \".\" && stream.match(\"..\")) {\n      return ret(\"spread\", \"meta\");\n    } else if (/[\\[\\]{}\\(\\),;\\:\\.]/.test(ch)) {\n      return ret(ch);\n    } else if (ch == \"=\" && stream.eat(\">\")) {\n      return ret(\"=>\", \"operator\");\n    } else if (ch == \"0\" && stream.eat(/x/i)) {\n      stream.eatWhile(/[\\da-f]/i);\n      return ret(\"number\", \"number\");\n    } else if (/\\d/.test(ch)) {\n      stream.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/);\n      return ret(\"number\", \"number\");\n    } else if (ch == \"/\") {\n      if (stream.eat(\"*\")) {\n        state.tokenize = tokenComment;\n        return tokenComment(stream, state);\n      } else if (stream.eat(\"/\")) {\n        stream.skipToEnd();\n        return ret(\"comment\", \"comment\");\n      } else if (state.lastType == \"operator\" || state.lastType == \"keyword c\" ||\n               state.lastType == \"sof\" || /^[\\[{}\\(,;:]$/.test(state.lastType)) {\n        readRegexp(stream);\n        stream.eatWhile(/[gimy]/); // 'y' is \"sticky\" option in Mozilla\n        return ret(\"regexp\", \"string-2\");\n      } else {\n        stream.eatWhile(isOperatorChar);\n        return ret(\"operator\", \"operator\", stream.current());\n      }\n    } else if (ch == \"`\") {\n      state.tokenize = tokenQuasi;\n      return tokenQuasi(stream, state);\n    } else if (ch == \"#\") {\n      stream.skipToEnd();\n      return ret(\"error\", \"error\");\n    } else if (isOperatorChar.test(ch)) {\n      stream.eatWhile(isOperatorChar);\n      return ret(\"operator\", \"operator\", stream.current());\n    } else {\n      stream.eatWhile(/[\\w\\$_]/);\n      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];\n      return (known && state.lastType != \".\") ? ret(known.type, known.style, word) :\n                     ret(\"variable\", \"variable\", word);\n    }\n  }\n\n  function tokenString(quote) {\n    return function(stream, state) {\n      var escaped = false, next;\n      if (jsonldMode && stream.peek() == \"@\" && stream.match(isJsonldKeyword)){\n        state.tokenize = tokenBase;\n        return ret(\"jsonld-keyword\", \"meta\");\n      }\n      while ((next = stream.next()) != null) {\n        if (next == quote && !escaped) break;\n        escaped = !escaped && next == \"\\\\\";\n      }\n      if (!escaped) state.tokenize = tokenBase;\n      return ret(\"string\", \"string\");\n    };\n  }\n\n  function tokenComment(stream, state) {\n    var maybeEnd = false, ch;\n    while (ch = stream.next()) {\n      if (ch == \"/\" && maybeEnd) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      maybeEnd = (ch == \"*\");\n    }\n    return ret(\"comment\", \"comment\");\n  }\n\n  function tokenQuasi(stream, state) {\n    var escaped = false, next;\n    while ((next = stream.next()) != null) {\n      if (!escaped && (next == \"`\" || next == \"$\" && stream.eat(\"{\"))) {\n        state.tokenize = tokenBase;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    return ret(\"quasi\", \"string-2\", stream.current());\n  }\n\n  var brackets = \"([{}])\";\n  // This is a crude lookahead trick to try and notice that we're\n  // parsing the argument patterns for a fat-arrow function before we\n  // actually hit the arrow token. It only works if the arrow is on\n  // the same line as the arguments and there's no strange noise\n  // (comments) in between. Fallback is to only notice when we hit the\n  // arrow, and not declare the arguments as locals for the arrow\n  // body.\n  function findFatArrow(stream, state) {\n    if (state.fatArrowAt) state.fatArrowAt = null;\n    var arrow = stream.string.indexOf(\"=>\", stream.start);\n    if (arrow < 0) return;\n\n    var depth = 0, sawSomething = false;\n    for (var pos = arrow - 1; pos >= 0; --pos) {\n      var ch = stream.string.charAt(pos);\n      var bracket = brackets.indexOf(ch);\n      if (bracket >= 0 && bracket < 3) {\n        if (!depth) { ++pos; break; }\n        if (--depth == 0) break;\n      } else if (bracket >= 3 && bracket < 6) {\n        ++depth;\n      } else if (/[$\\w]/.test(ch)) {\n        sawSomething = true;\n      } else if (sawSomething && !depth) {\n        ++pos;\n        break;\n      }\n    }\n    if (sawSomething && !depth) state.fatArrowAt = pos;\n  }\n\n  // Parser\n\n  var atomicTypes = {\"atom\": true, \"number\": true, \"variable\": true, \"string\": true, \"regexp\": true, \"this\": true, \"jsonld-keyword\": true};\n\n  function JSLexical(indented, column, type, align, prev, info) {\n    this.indented = indented;\n    this.column = column;\n    this.type = type;\n    this.prev = prev;\n    this.info = info;\n    if (align != null) this.align = align;\n  }\n\n  function inScope(state, varname) {\n    for (var v = state.localVars; v; v = v.next)\n      if (v.name == varname) return true;\n    for (var cx = state.context; cx; cx = cx.prev) {\n      for (var v = cx.vars; v; v = v.next)\n        if (v.name == varname) return true;\n    }\n  }\n\n  function parseJS(state, style, type, content, stream) {\n    var cc = state.cc;\n    // Communicate our context to the combinators.\n    // (Less wasteful than consing up a hundred closures on every call.)\n    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;\n\n    if (!state.lexical.hasOwnProperty(\"align\"))\n      state.lexical.align = true;\n\n    while(true) {\n      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;\n      if (combinator(type, content)) {\n        while(cc.length && cc[cc.length - 1].lex)\n          cc.pop()();\n        if (cx.marked) return cx.marked;\n        if (type == \"variable\" && inScope(state, content)) return \"variable-2\";\n        return style;\n      }\n    }\n  }\n\n  // Combinator utils\n\n  var cx = {state: null, column: null, marked: null, cc: null};\n  function pass() {\n    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);\n  }\n  function cont() {\n    pass.apply(null, arguments);\n    return true;\n  }\n  function register(varname) {\n    function inList(list) {\n      for (var v = list; v; v = v.next)\n        if (v.name == varname) return true;\n      return false;\n    }\n    var state = cx.state;\n    if (state.context) {\n      cx.marked = \"def\";\n      if (inList(state.localVars)) return;\n      state.localVars = {name: varname, next: state.localVars};\n    } else {\n      if (inList(state.globalVars)) return;\n      if (parserConfig.globalVars)\n        state.globalVars = {name: varname, next: state.globalVars};\n    }\n  }\n\n  // Combinators\n\n  var defaultVars = {name: \"this\", next: {name: \"arguments\"}};\n  function pushcontext() {\n    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};\n    cx.state.localVars = defaultVars;\n  }\n  function popcontext() {\n    cx.state.localVars = cx.state.context.vars;\n    cx.state.context = cx.state.context.prev;\n  }\n  function pushlex(type, info) {\n    var result = function() {\n      var state = cx.state, indent = state.indented;\n      if (state.lexical.type == \"stat\") indent = state.lexical.indented;\n      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);\n    };\n    result.lex = true;\n    return result;\n  }\n  function poplex() {\n    var state = cx.state;\n    if (state.lexical.prev) {\n      if (state.lexical.type == \")\")\n        state.indented = state.lexical.indented;\n      state.lexical = state.lexical.prev;\n    }\n  }\n  poplex.lex = true;\n\n  function expect(wanted) {\n    function exp(type) {\n      if (type == wanted) return cont();\n      else if (wanted == \";\") return pass();\n      else return cont(exp);\n    };\n    return exp;\n  }\n\n  function statement(type, value) {\n    if (type == \"var\") return cont(pushlex(\"vardef\", value.length), vardef, expect(\";\"), poplex);\n    if (type == \"keyword a\") return cont(pushlex(\"form\"), expression, statement, poplex);\n    if (type == \"keyword b\") return cont(pushlex(\"form\"), statement, poplex);\n    if (type == \"{\") return cont(pushlex(\"}\"), block, poplex);\n    if (type == \";\") return cont();\n    if (type == \"if\") {\n      if (cx.state.lexical.info == \"else\" && cx.state.cc[cx.state.cc.length - 1] == poplex)\n        cx.state.cc.pop()();\n      return cont(pushlex(\"form\"), expression, statement, poplex, maybeelse);\n    }\n    if (type == \"function\") return cont(functiondef);\n    if (type == \"for\") return cont(pushlex(\"form\"), forspec, statement, poplex);\n    if (type == \"variable\") return cont(pushlex(\"stat\"), maybelabel);\n    if (type == \"switch\") return cont(pushlex(\"form\"), expression, pushlex(\"}\", \"switch\"), expect(\"{\"),\n                                      block, poplex, poplex);\n    if (type == \"case\") return cont(expression, expect(\":\"));\n    if (type == \"default\") return cont(expect(\":\"));\n    if (type == \"catch\") return cont(pushlex(\"form\"), pushcontext, expect(\"(\"), funarg, expect(\")\"),\n                                     statement, poplex, popcontext);\n    if (type == \"module\") return cont(pushlex(\"form\"), pushcontext, afterModule, popcontext, poplex);\n    if (type == \"class\") return cont(pushlex(\"form\"), className, objlit, poplex);\n    if (type == \"export\") return cont(pushlex(\"form\"), afterExport, poplex);\n    if (type == \"import\") return cont(pushlex(\"form\"), afterImport, poplex);\n    return pass(pushlex(\"stat\"), expression, expect(\";\"), poplex);\n  }\n  function expression(type) {\n    return expressionInner(type, false);\n  }\n  function expressionNoComma(type) {\n    return expressionInner(type, true);\n  }\n  function expressionInner(type, noComma) {\n    if (cx.state.fatArrowAt == cx.stream.start) {\n      var body = noComma ? arrowBodyNoComma : arrowBody;\n      if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(pattern, \")\"), poplex, expect(\"=>\"), body, popcontext);\n      else if (type == \"variable\") return pass(pushcontext, pattern, expect(\"=>\"), body, popcontext);\n    }\n\n    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;\n    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);\n    if (type == \"function\") return cont(functiondef, maybeop);\n    if (type == \"keyword c\") return cont(noComma ? maybeexpressionNoComma : maybeexpression);\n    if (type == \"(\") return cont(pushlex(\")\"), maybeexpression, comprehension, expect(\")\"), poplex, maybeop);\n    if (type == \"operator\" || type == \"spread\") return cont(noComma ? expressionNoComma : expression);\n    if (type == \"[\") return cont(pushlex(\"]\"), arrayLiteral, poplex, maybeop);\n    if (type == \"{\") return contCommasep(objprop, \"}\", null, maybeop);\n    if (type == \"quasi\") { return pass(quasi, maybeop); }\n    return cont();\n  }\n  function maybeexpression(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expression);\n  }\n  function maybeexpressionNoComma(type) {\n    if (type.match(/[;\\}\\)\\],]/)) return pass();\n    return pass(expressionNoComma);\n  }\n\n  function maybeoperatorComma(type, value) {\n    if (type == \",\") return cont(expression);\n    return maybeoperatorNoComma(type, value, false);\n  }\n  function maybeoperatorNoComma(type, value, noComma) {\n    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;\n    var expr = noComma == false ? expression : expressionNoComma;\n    if (value == \"=>\") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);\n    if (type == \"operator\") {\n      if (/\\+\\+|--/.test(value)) return cont(me);\n      if (value == \"?\") return cont(expression, expect(\":\"), expr);\n      return cont(expr);\n    }\n    if (type == \"quasi\") { return pass(quasi, me); }\n    if (type == \";\") return;\n    if (type == \"(\") return contCommasep(expressionNoComma, \")\", \"call\", me);\n    if (type == \".\") return cont(property, me);\n    if (type == \"[\") return cont(pushlex(\"]\"), maybeexpression, expect(\"]\"), poplex, me);\n  }\n  function quasi(type, value) {\n    if (type != \"quasi\") return pass();\n    if (value.slice(value.length - 2) != \"${\") return cont(quasi);\n    return cont(expression, continueQuasi);\n  }\n  function continueQuasi(type) {\n    if (type == \"}\") {\n      cx.marked = \"string-2\";\n      cx.state.tokenize = tokenQuasi;\n      return cont(quasi);\n    }\n  }\n  function arrowBody(type) {\n    findFatArrow(cx.stream, cx.state);\n    if (type == \"{\") return pass(statement);\n    return pass(expression);\n  }\n  function arrowBodyNoComma(type) {\n    findFatArrow(cx.stream, cx.state);\n    if (type == \"{\") return pass(statement);\n    return pass(expressionNoComma);\n  }\n  function maybelabel(type) {\n    if (type == \":\") return cont(poplex, statement);\n    return pass(maybeoperatorComma, expect(\";\"), poplex);\n  }\n  function property(type) {\n    if (type == \"variable\") {cx.marked = \"property\"; return cont();}\n  }\n  function objprop(type, value) {\n    if (type == \"variable\") {\n      cx.marked = \"property\";\n      if (value == \"get\" || value == \"set\") return cont(getterSetter);\n    } else if (type == \"number\" || type == \"string\") {\n      cx.marked = jsonldMode ? \"property\" : (type + \" property\");\n    } else if (type == \"[\") {\n      return cont(expression, expect(\"]\"), afterprop);\n    }\n    if (atomicTypes.hasOwnProperty(type)) return cont(afterprop);\n  }\n  function getterSetter(type) {\n    if (type != \"variable\") return pass(afterprop);\n    cx.marked = \"property\";\n    return cont(functiondef);\n  }\n  function afterprop(type) {\n    if (type == \":\") return cont(expressionNoComma);\n    if (type == \"(\") return pass(functiondef);\n  }\n  function commasep(what, end) {\n    function proceed(type) {\n      if (type == \",\") {\n        var lex = cx.state.lexical;\n        if (lex.info == \"call\") lex.pos = (lex.pos || 0) + 1;\n        return cont(what, proceed);\n      }\n      if (type == end) return cont();\n      return cont(expect(end));\n    }\n    return function(type) {\n      if (type == end) return cont();\n      return pass(what, proceed);\n    };\n  }\n  function contCommasep(what, end, info) {\n    for (var i = 3; i < arguments.length; i++)\n      cx.cc.push(arguments[i]);\n    return cont(pushlex(end, info), commasep(what, end), poplex);\n  }\n  function block(type) {\n    if (type == \"}\") return cont();\n    return pass(statement, block);\n  }\n  function maybetype(type) {\n    if (isTS && type == \":\") return cont(typedef);\n  }\n  function typedef(type) {\n    if (type == \"variable\"){cx.marked = \"variable-3\"; return cont();}\n  }\n  function vardef() {\n    return pass(pattern, maybetype, maybeAssign, vardefCont);\n  }\n  function pattern(type, value) {\n    if (type == \"variable\") { register(value); return cont(); }\n    if (type == \"[\") return contCommasep(pattern, \"]\");\n    if (type == \"{\") return contCommasep(proppattern, \"}\");\n  }\n  function proppattern(type, value) {\n    if (type == \"variable\" && !cx.stream.match(/^\\s*:/, false)) {\n      register(value);\n      return cont(maybeAssign);\n    }\n    if (type == \"variable\") cx.marked = \"property\";\n    return cont(expect(\":\"), pattern, maybeAssign);\n  }\n  function maybeAssign(_type, value) {\n    if (value == \"=\") return cont(expressionNoComma);\n  }\n  function vardefCont(type) {\n    if (type == \",\") return cont(vardef);\n  }\n  function maybeelse(type, value) {\n    if (type == \"keyword b\" && value == \"else\") return cont(pushlex(\"form\", \"else\"), statement, poplex);\n  }\n  function forspec(type) {\n    if (type == \"(\") return cont(pushlex(\")\"), forspec1, expect(\")\"), poplex);\n  }\n  function forspec1(type) {\n    if (type == \"var\") return cont(vardef, expect(\";\"), forspec2);\n    if (type == \";\") return cont(forspec2);\n    if (type == \"variable\") return cont(formaybeinof);\n    return pass(expression, expect(\";\"), forspec2);\n  }\n  function formaybeinof(_type, value) {\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return cont(maybeoperatorComma, forspec2);\n  }\n  function forspec2(type, value) {\n    if (type == \";\") return cont(forspec3);\n    if (value == \"in\" || value == \"of\") { cx.marked = \"keyword\"; return cont(expression); }\n    return pass(expression, expect(\";\"), forspec3);\n  }\n  function forspec3(type) {\n    if (type != \")\") cont(expression);\n  }\n  function functiondef(type, value) {\n    if (value == \"*\") {cx.marked = \"keyword\"; return cont(functiondef);}\n    if (type == \"variable\") {register(value); return cont(functiondef);}\n    if (type == \"(\") return cont(pushcontext, pushlex(\")\"), commasep(funarg, \")\"), poplex, statement, popcontext);\n  }\n  function funarg(type) {\n    if (type == \"spread\") return cont(funarg);\n    return pass(pattern, maybetype);\n  }\n  function className(type, value) {\n    if (type == \"variable\") {register(value); return cont(classNameAfter);}\n  }\n  function classNameAfter(_type, value) {\n    if (value == \"extends\") return cont(expression);\n  }\n  function objlit(type) {\n    if (type == \"{\") return contCommasep(objprop, \"}\");\n  }\n  function afterModule(type, value) {\n    if (type == \"string\") return cont(statement);\n    if (type == \"variable\") { register(value); return cont(maybeFrom); }\n  }\n  function afterExport(_type, value) {\n    if (value == \"*\") { cx.marked = \"keyword\"; return cont(maybeFrom, expect(\";\")); }\n    if (value == \"default\") { cx.marked = \"keyword\"; return cont(expression, expect(\";\")); }\n    return pass(statement);\n  }\n  function afterImport(type) {\n    if (type == \"string\") return cont();\n    return pass(importSpec, maybeFrom);\n  }\n  function importSpec(type, value) {\n    if (type == \"{\") return contCommasep(importSpec, \"}\");\n    if (type == \"variable\") register(value);\n    return cont();\n  }\n  function maybeFrom(_type, value) {\n    if (value == \"from\") { cx.marked = \"keyword\"; return cont(expression); }\n  }\n  function arrayLiteral(type) {\n    if (type == \"]\") return cont();\n    return pass(expressionNoComma, maybeArrayComprehension);\n  }\n  function maybeArrayComprehension(type) {\n    if (type == \"for\") return pass(comprehension, expect(\"]\"));\n    if (type == \",\") return cont(commasep(expressionNoComma, \"]\"));\n    return pass(commasep(expressionNoComma, \"]\"));\n  }\n  function comprehension(type) {\n    if (type == \"for\") return cont(forspec, comprehension);\n    if (type == \"if\") return cont(expression, comprehension);\n  }\n\n  // Interface\n\n  return {\n    startState: function(basecolumn) {\n      var state = {\n        tokenize: tokenBase,\n        lastType: \"sof\",\n        cc: [],\n        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, \"block\", false),\n        localVars: parserConfig.localVars,\n        context: parserConfig.localVars && {vars: parserConfig.localVars},\n        indented: 0\n      };\n      if (parserConfig.globalVars && typeof parserConfig.globalVars == \"object\")\n        state.globalVars = parserConfig.globalVars;\n      return state;\n    },\n\n    token: function(stream, state) {\n      if (stream.sol()) {\n        if (!state.lexical.hasOwnProperty(\"align\"))\n          state.lexical.align = false;\n        state.indented = stream.indentation();\n        findFatArrow(stream, state);\n      }\n      if (state.tokenize != tokenComment && stream.eatSpace()) return null;\n      var style = state.tokenize(stream, state);\n      if (type == \"comment\") return style;\n      state.lastType = type == \"operator\" && (content == \"++\" || content == \"--\") ? \"incdec\" : type;\n      return parseJS(state, style, type, content, stream);\n    },\n\n    indent: function(state, textAfter) {\n      if (state.tokenize == tokenComment) return CodeMirror.Pass;\n      if (state.tokenize != tokenBase) return 0;\n      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;\n      // Kludge to prevent 'maybelse' from blocking lexical scope pops\n      if (!/^\\s*else\\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {\n        var c = state.cc[i];\n        if (c == poplex) lexical = lexical.prev;\n        else if (c != maybeelse) break;\n      }\n      if (lexical.type == \"stat\" && firstChar == \"}\") lexical = lexical.prev;\n      if (statementIndent && lexical.type == \")\" && lexical.prev.type == \"stat\")\n        lexical = lexical.prev;\n      var type = lexical.type, closing = firstChar == type;\n\n      if (type == \"vardef\") return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? lexical.info + 1 : 0);\n      else if (type == \"form\" && firstChar == \"{\") return lexical.indented;\n      else if (type == \"form\") return lexical.indented + indentUnit;\n      else if (type == \"stat\")\n        return lexical.indented + (state.lastType == \"operator\" || state.lastType == \",\" ? statementIndent || indentUnit : 0);\n      else if (lexical.info == \"switch\" && !closing && parserConfig.doubleIndentSwitch != false)\n        return lexical.indented + (/^(?:case|default)\\b/.test(textAfter) ? indentUnit : 2 * indentUnit);\n      else if (lexical.align) return lexical.column + (closing ? 0 : 1);\n      else return lexical.indented + (closing ? 0 : indentUnit);\n    },\n\n    electricChars: \":{}\",\n    blockCommentStart: jsonMode ? null : \"/*\",\n    blockCommentEnd: jsonMode ? null : \"*/\",\n    lineComment: jsonMode ? null : \"//\",\n    fold: \"brace\",\n\n    helperType: jsonMode ? \"json\" : \"javascript\",\n    jsonldMode: jsonldMode,\n    jsonMode: jsonMode\n  };\n});\n\nCodeMirror.registerHelper(\"wordChars\", \"javascript\", /[\\\\w$]/);\n\nCodeMirror.defineMIME(\"text/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"text/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/javascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/ecmascript\", \"javascript\");\nCodeMirror.defineMIME(\"application/json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/x-json\", {name: \"javascript\", json: true});\nCodeMirror.defineMIME(\"application/ld+json\", {name: \"javascript\", jsonld: true});\nCodeMirror.defineMIME(\"text/typescript\", { name: \"javascript\", typescript: true });\nCodeMirror.defineMIME(\"application/typescript\", { name: \"javascript\", typescript: true });\n\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/keymap/vim.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/keymap/vim.js",
            "module-type": "library",
            "text": "/**\n * Supported keybindings:\n *\n *   Motion:\n *   h, j, k, l\n *   gj, gk\n *   e, E, w, W, b, B, ge, gE\n *   f<character>, F<character>, t<character>, T<character>\n *   $, ^, 0, -, +, _\n *   gg, G\n *   %\n *   '<character>, `<character>\n *\n *   Operator:\n *   d, y, c\n *   dd, yy, cc\n *   g~, g~g~\n *   >, <, >>, <<\n *\n *   Operator-Motion:\n *   x, X, D, Y, C, ~\n *\n *   Action:\n *   a, i, s, A, I, S, o, O\n *   zz, z., z<CR>, zt, zb, z-\n *   J\n *   u, Ctrl-r\n *   m<character>\n *   r<character>\n *\n *   Modes:\n *   ESC - leave insert mode, visual mode, and clear input state.\n *   Ctrl-[, Ctrl-c - same as ESC.\n *\n * Registers: unnamed, -, a-z, A-Z, 0-9\n *   (Does not respect the special case for number registers when delete\n *    operator is made with these commands: %, (, ),  , /, ?, n, N, {, } )\n *   TODO: Implement the remaining registers.\n * Marks: a-z, A-Z, and 0-9\n *   TODO: Implement the remaining special marks. They have more complex\n *       behavior.\n *\n * Events:\n *  'vim-mode-change' - raised on the editor anytime the current mode changes,\n *                      Event object: {mode: \"visual\", subMode: \"linewise\"}\n *\n * Code structure:\n *  1. Default keymap\n *  2. Variable declarations and short basic helpers\n *  3. Instance (External API) implementation\n *  4. Internal state tracking objects (input state, counter) implementation\n *     and instanstiation\n *  5. Key handler (the main command dispatcher) implementation\n *  6. Motion, operator, and action implementations\n *  7. Helper functions for the key handler, motions, operators, and actions\n *  8. Set up Vim to work as a keymap for CodeMirror.\n */\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/dialog/dialog\"), require(\"../addon/edit/matchbrackets.js\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/dialog/dialog\", \"../addon/edit/matchbrackets\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  'use strict';\n\n  var defaultKeymap = [\n    // Key to key mapping. This goes first to make it possible to override\n    // existing mappings.\n    { keys: ['<Left>'], type: 'keyToKey', toKeys: ['h'] },\n    { keys: ['<Right>'], type: 'keyToKey', toKeys: ['l'] },\n    { keys: ['<Up>'], type: 'keyToKey', toKeys: ['k'] },\n    { keys: ['<Down>'], type: 'keyToKey', toKeys: ['j'] },\n    { keys: ['<Space>'], type: 'keyToKey', toKeys: ['l'] },\n    { keys: ['<BS>'], type: 'keyToKey', toKeys: ['h'] },\n    { keys: ['<C-Space>'], type: 'keyToKey', toKeys: ['W'] },\n    { keys: ['<C-BS>'], type: 'keyToKey', toKeys: ['B'] },\n    { keys: ['<S-Space>'], type: 'keyToKey', toKeys: ['w'] },\n    { keys: ['<S-BS>'], type: 'keyToKey', toKeys: ['b'] },\n    { keys: ['<C-n>'], type: 'keyToKey', toKeys: ['j'] },\n    { keys: ['<C-p>'], type: 'keyToKey', toKeys: ['k'] },\n    { keys: ['<C-[>'], type: 'keyToKey', toKeys: ['<Esc>'] },\n    { keys: ['<C-c>'], type: 'keyToKey', toKeys: ['<Esc>'] },\n    { keys: ['s'], type: 'keyToKey', toKeys: ['c', 'l'], context: 'normal' },\n    { keys: ['s'], type: 'keyToKey', toKeys: ['x', 'i'], context: 'visual'},\n    { keys: ['S'], type: 'keyToKey', toKeys: ['c', 'c'], context: 'normal' },\n    { keys: ['S'], type: 'keyToKey', toKeys: ['d', 'c', 'c'], context: 'visual' },\n    { keys: ['<Home>'], type: 'keyToKey', toKeys: ['0'] },\n    { keys: ['<End>'], type: 'keyToKey', toKeys: ['$'] },\n    { keys: ['<PageUp>'], type: 'keyToKey', toKeys: ['<C-b>'] },\n    { keys: ['<PageDown>'], type: 'keyToKey', toKeys: ['<C-f>'] },\n    { keys: ['<CR>'], type: 'keyToKey', toKeys: ['j', '^'], context: 'normal' },\n    // Motions\n    { keys: ['H'], type: 'motion',\n        motion: 'moveToTopLine',\n        motionArgs: { linewise: true, toJumplist: true }},\n    { keys: ['M'], type: 'motion',\n        motion: 'moveToMiddleLine',\n        motionArgs: { linewise: true, toJumplist: true }},\n    { keys: ['L'], type: 'motion',\n        motion: 'moveToBottomLine',\n        motionArgs: { linewise: true, toJumplist: true }},\n    { keys: ['h'], type: 'motion',\n        motion: 'moveByCharacters',\n        motionArgs: { forward: false }},\n    { keys: ['l'], type: 'motion',\n        motion: 'moveByCharacters',\n        motionArgs: { forward: true }},\n    { keys: ['j'], type: 'motion',\n        motion: 'moveByLines',\n        motionArgs: { forward: true, linewise: true }},\n    { keys: ['k'], type: 'motion',\n        motion: 'moveByLines',\n        motionArgs: { forward: false, linewise: true }},\n    { keys: ['g','j'], type: 'motion',\n        motion: 'moveByDisplayLines',\n        motionArgs: { forward: true }},\n    { keys: ['g','k'], type: 'motion',\n        motion: 'moveByDisplayLines',\n        motionArgs: { forward: false }},\n    { keys: ['w'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: true, wordEnd: false }},\n    { keys: ['W'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: true, wordEnd: false, bigWord: true }},\n    { keys: ['e'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: true, wordEnd: true, inclusive: true }},\n    { keys: ['E'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: true, wordEnd: true, bigWord: true,\n            inclusive: true }},\n    { keys: ['b'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: false, wordEnd: false }},\n    { keys: ['B'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: false, wordEnd: false, bigWord: true }},\n    { keys: ['g', 'e'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: false, wordEnd: true, inclusive: true }},\n    { keys: ['g', 'E'], type: 'motion',\n        motion: 'moveByWords',\n        motionArgs: { forward: false, wordEnd: true, bigWord: true,\n            inclusive: true }},\n    { keys: ['{'], type: 'motion', motion: 'moveByParagraph',\n        motionArgs: { forward: false, toJumplist: true }},\n    { keys: ['}'], type: 'motion', motion: 'moveByParagraph',\n        motionArgs: { forward: true, toJumplist: true }},\n    { keys: ['<C-f>'], type: 'motion',\n        motion: 'moveByPage', motionArgs: { forward: true }},\n    { keys: ['<C-b>'], type: 'motion',\n        motion: 'moveByPage', motionArgs: { forward: false }},\n    { keys: ['<C-d>'], type: 'motion',\n        motion: 'moveByScroll',\n        motionArgs: { forward: true, explicitRepeat: true }},\n    { keys: ['<C-u>'], type: 'motion',\n        motion: 'moveByScroll',\n        motionArgs: { forward: false, explicitRepeat: true }},\n    { keys: ['g', 'g'], type: 'motion',\n        motion: 'moveToLineOrEdgeOfDocument',\n        motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }},\n    { keys: ['G'], type: 'motion',\n        motion: 'moveToLineOrEdgeOfDocument',\n        motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }},\n    { keys: ['0'], type: 'motion', motion: 'moveToStartOfLine' },\n    { keys: ['^'], type: 'motion',\n        motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: ['+'], type: 'motion',\n        motion: 'moveByLines',\n        motionArgs: { forward: true, toFirstChar:true }},\n    { keys: ['-'], type: 'motion',\n        motion: 'moveByLines',\n        motionArgs: { forward: false, toFirstChar:true }},\n    { keys: ['_'], type: 'motion',\n        motion: 'moveByLines',\n        motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }},\n    { keys: ['$'], type: 'motion',\n        motion: 'moveToEol',\n        motionArgs: { inclusive: true }},\n    { keys: ['%'], type: 'motion',\n        motion: 'moveToMatchedSymbol',\n        motionArgs: { inclusive: true, toJumplist: true }},\n    { keys: ['f', 'character'], type: 'motion',\n        motion: 'moveToCharacter',\n        motionArgs: { forward: true , inclusive: true }},\n    { keys: ['F', 'character'], type: 'motion',\n        motion: 'moveToCharacter',\n        motionArgs: { forward: false }},\n    { keys: ['t', 'character'], type: 'motion',\n        motion: 'moveTillCharacter',\n        motionArgs: { forward: true, inclusive: true }},\n    { keys: ['T', 'character'], type: 'motion',\n        motion: 'moveTillCharacter',\n        motionArgs: { forward: false }},\n    { keys: [';'], type: 'motion', motion: 'repeatLastCharacterSearch',\n        motionArgs: { forward: true }},\n    { keys: [','], type: 'motion', motion: 'repeatLastCharacterSearch',\n        motionArgs: { forward: false }},\n    { keys: ['\\'', 'character'], type: 'motion', motion: 'goToMark',\n        motionArgs: {toJumplist: true, linewise: true}},\n    { keys: ['`', 'character'], type: 'motion', motion: 'goToMark',\n        motionArgs: {toJumplist: true}},\n    { keys: [']', '`'], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },\n    { keys: ['[', '`'], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },\n    { keys: [']', '\\''], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },\n    { keys: ['[', '\\''], type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },\n    // the next two aren't motions but must come before more general motion declarations\n    { keys: [']', 'p'], type: 'action', action: 'paste', isEdit: true,\n        actionArgs: { after: true, isEdit: true, matchIndent: true}},\n    { keys: ['[', 'p'], type: 'action', action: 'paste', isEdit: true,\n        actionArgs: { after: false, isEdit: true, matchIndent: true}},\n    { keys: [']', 'character'], type: 'motion',\n        motion: 'moveToSymbol',\n        motionArgs: { forward: true, toJumplist: true}},\n    { keys: ['[', 'character'], type: 'motion',\n        motion: 'moveToSymbol',\n        motionArgs: { forward: false, toJumplist: true}},\n    { keys: ['|'], type: 'motion',\n        motion: 'moveToColumn',\n        motionArgs: { }},\n    { keys: ['o'], type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: { },context:'visual'},\n    // Operators\n    { keys: ['d'], type: 'operator', operator: 'delete' },\n    { keys: ['y'], type: 'operator', operator: 'yank' },\n    { keys: ['c'], type: 'operator', operator: 'change' },\n    { keys: ['>'], type: 'operator', operator: 'indent',\n        operatorArgs: { indentRight: true }},\n    { keys: ['<'], type: 'operator', operator: 'indent',\n        operatorArgs: { indentRight: false }},\n    { keys: ['g', '~'], type: 'operator', operator: 'swapcase' },\n    { keys: ['n'], type: 'motion', motion: 'findNext',\n        motionArgs: { forward: true, toJumplist: true }},\n    { keys: ['N'], type: 'motion', motion: 'findNext',\n        motionArgs: { forward: false, toJumplist: true }},\n    // Operator-Motion dual commands\n    { keys: ['x'], type: 'operatorMotion', operator: 'delete',\n        motion: 'moveByCharacters', motionArgs: { forward: true },\n        operatorMotionArgs: { visualLine: false }},\n    { keys: ['X'], type: 'operatorMotion', operator: 'delete',\n        motion: 'moveByCharacters', motionArgs: { forward: false },\n        operatorMotionArgs: { visualLine: true }},\n    { keys: ['D'], type: 'operatorMotion', operator: 'delete',\n      motion: 'moveToEol', motionArgs: { inclusive: true },\n        operatorMotionArgs: { visualLine: true }},\n    { keys: ['Y'], type: 'operatorMotion', operator: 'yank',\n        motion: 'moveToEol', motionArgs: { inclusive: true },\n        operatorMotionArgs: { visualLine: true }},\n    { keys: ['C'], type: 'operatorMotion',\n        operator: 'change',\n        motion: 'moveToEol', motionArgs: { inclusive: true },\n        operatorMotionArgs: { visualLine: true }},\n    { keys: ['~'], type: 'operatorMotion',\n        operator: 'swapcase', operatorArgs: { shouldMoveCursor: true },\n        motion: 'moveByCharacters', motionArgs: { forward: true }},\n    // Actions\n    { keys: ['<C-i>'], type: 'action', action: 'jumpListWalk',\n        actionArgs: { forward: true }},\n    { keys: ['<C-o>'], type: 'action', action: 'jumpListWalk',\n        actionArgs: { forward: false }},\n    { keys: ['<C-e>'], type: 'action',\n        action: 'scroll',\n        actionArgs: { forward: true, linewise: true }},\n    { keys: ['<C-y>'], type: 'action',\n        action: 'scroll',\n        actionArgs: { forward: false, linewise: true }},\n    { keys: ['a'], type: 'action', action: 'enterInsertMode', isEdit: true,\n        actionArgs: { insertAt: 'charAfter' }},\n    { keys: ['A'], type: 'action', action: 'enterInsertMode', isEdit: true,\n        actionArgs: { insertAt: 'eol' }},\n    { keys: ['i'], type: 'action', action: 'enterInsertMode', isEdit: true,\n        actionArgs: { insertAt: 'inplace' }},\n    { keys: ['I'], type: 'action', action: 'enterInsertMode', isEdit: true,\n        actionArgs: { insertAt: 'firstNonBlank' }},\n    { keys: ['o'], type: 'action', action: 'newLineAndEnterInsertMode',\n        isEdit: true, interlaceInsertRepeat: true,\n        actionArgs: { after: true }},\n    { keys: ['O'], type: 'action', action: 'newLineAndEnterInsertMode',\n        isEdit: true, interlaceInsertRepeat: true,\n        actionArgs: { after: false }},\n    { keys: ['v'], type: 'action', action: 'toggleVisualMode' },\n    { keys: ['V'], type: 'action', action: 'toggleVisualMode',\n        actionArgs: { linewise: true }},\n    { keys: ['g', 'v'], type: 'action', action: 'reselectLastSelection' },\n    { keys: ['J'], type: 'action', action: 'joinLines', isEdit: true },\n    { keys: ['p'], type: 'action', action: 'paste', isEdit: true,\n        actionArgs: { after: true, isEdit: true }},\n    { keys: ['P'], type: 'action', action: 'paste', isEdit: true,\n        actionArgs: { after: false, isEdit: true }},\n    { keys: ['r', 'character'], type: 'action', action: 'replace', isEdit: true },\n    { keys: ['@', 'character'], type: 'action', action: 'replayMacro' },\n    { keys: ['q', 'character'], type: 'action', action: 'enterMacroRecordMode' },\n    // Handle Replace-mode as a special case of insert mode.\n    { keys: ['R'], type: 'action', action: 'enterInsertMode', isEdit: true,\n        actionArgs: { replace: true }},\n    { keys: ['u'], type: 'action', action: 'undo' },\n    { keys: ['u'], type: 'action', action: 'changeCase', actionArgs: {toLower: true}, context: 'visual', isEdit: true },\n    { keys: ['U'],type: 'action', action: 'changeCase', actionArgs: {toLower: false}, context: 'visual', isEdit: true },\n    { keys: ['<C-r>'], type: 'action', action: 'redo' },\n    { keys: ['m', 'character'], type: 'action', action: 'setMark' },\n    { keys: ['\"', 'character'], type: 'action', action: 'setRegister' },\n    { keys: ['z', 'z'], type: 'action', action: 'scrollToCursor',\n        actionArgs: { position: 'center' }},\n    { keys: ['z', '.'], type: 'action', action: 'scrollToCursor',\n        actionArgs: { position: 'center' },\n        motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: ['z', 't'], type: 'action', action: 'scrollToCursor',\n        actionArgs: { position: 'top' }},\n    { keys: ['z', '<CR>'], type: 'action', action: 'scrollToCursor',\n        actionArgs: { position: 'top' },\n        motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: ['z', '-'], type: 'action', action: 'scrollToCursor',\n        actionArgs: { position: 'bottom' }},\n    { keys: ['z', 'b'], type: 'action', action: 'scrollToCursor',\n        actionArgs: { position: 'bottom' },\n        motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: ['.'], type: 'action', action: 'repeatLastEdit' },\n    { keys: ['<C-a>'], type: 'action', action: 'incrementNumberToken',\n        isEdit: true,\n        actionArgs: {increase: true, backtrack: false}},\n    { keys: ['<C-x>'], type: 'action', action: 'incrementNumberToken',\n        isEdit: true,\n        actionArgs: {increase: false, backtrack: false}},\n    // Text object motions\n    { keys: ['a', 'character'], type: 'motion',\n        motion: 'textObjectManipulation' },\n    { keys: ['i', 'character'], type: 'motion',\n        motion: 'textObjectManipulation',\n        motionArgs: { textObjectInner: true }},\n    // Search\n    { keys: ['/'], type: 'search',\n        searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},\n    { keys: ['?'], type: 'search',\n        searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},\n    { keys: ['*'], type: 'search',\n        searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: ['#'], type: 'search',\n        searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: ['g', '*'], type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},\n    { keys: ['g', '#'], type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},\n    // Ex command\n    { keys: [':'], type: 'ex' }\n  ];\n\n  var Pos = CodeMirror.Pos;\n\n  var Vim = function() {\n    CodeMirror.defineOption('vimMode', false, function(cm, val) {\n      if (val) {\n        cm.setOption('keyMap', 'vim');\n        cm.setOption('disableInput', true);\n        CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n        cm.on('beforeSelectionChange', beforeSelectionChange);\n        cm.on('cursorActivity', onCursorActivity);\n        maybeInitVimState(cm);\n        CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));\n      } else if (cm.state.vim) {\n        cm.setOption('keyMap', 'default');\n        cm.setOption('disableInput', false);\n        cm.off('beforeSelectionChange', beforeSelectionChange);\n        cm.off('cursorActivity', onCursorActivity);\n        CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));\n        cm.state.vim = null;\n      }\n    });\n    function beforeSelectionChange(cm, obj) {\n      var vim = cm.state.vim;\n      if (vim.insertMode || vim.exMode) return;\n\n      var head = obj.ranges[0].head;\n      var anchor = obj.ranges[0].anchor;\n      if (head.ch && head.ch == cm.doc.getLine(head.line).length) {\n        var pos = Pos(head.line, head.ch - 1);\n        obj.update([{anchor: cursorEqual(head, anchor) ? pos : anchor,\n                     head: pos}]);\n      }\n    }\n    function getOnPasteFn(cm) {\n      var vim = cm.state.vim;\n      if (!vim.onPasteFn) {\n        vim.onPasteFn = function() {\n          if (!vim.insertMode) {\n            cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n            actions.enterInsertMode(cm, {}, vim);\n          }\n        };\n      }\n      return vim.onPasteFn;\n    }\n\n    var numberRegex = /[\\d]/;\n    var wordRegexp = [(/\\w/), (/[^\\w\\s]/)], bigWordRegexp = [(/\\S/)];\n    function makeKeyRange(start, size) {\n      var keys = [];\n      for (var i = start; i < start + size; i++) {\n        keys.push(String.fromCharCode(i));\n      }\n      return keys;\n    }\n    var upperCaseAlphabet = makeKeyRange(65, 26);\n    var lowerCaseAlphabet = makeKeyRange(97, 26);\n    var numbers = makeKeyRange(48, 10);\n    var specialSymbols = '~`!@#$%^&*()_-+=[{}]\\\\|/?.,<>:;\"\\''.split('');\n    var specialKeys = ['Left', 'Right', 'Up', 'Down', 'Space', 'Backspace',\n        'Esc', 'Home', 'End', 'PageUp', 'PageDown', 'Enter'];\n    var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);\n    var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '\"', '.', ':']);\n\n    function isLine(cm, line) {\n      return line >= cm.firstLine() && line <= cm.lastLine();\n    }\n    function isLowerCase(k) {\n      return (/^[a-z]$/).test(k);\n    }\n    function isMatchableSymbol(k) {\n      return '()[]{}'.indexOf(k) != -1;\n    }\n    function isNumber(k) {\n      return numberRegex.test(k);\n    }\n    function isUpperCase(k) {\n      return (/^[A-Z]$/).test(k);\n    }\n    function isWhiteSpaceString(k) {\n      return (/^\\s*$/).test(k);\n    }\n    function inArray(val, arr) {\n      for (var i = 0; i < arr.length; i++) {\n        if (arr[i] == val) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    var options = {};\n    function defineOption(name, defaultValue, type) {\n      if (defaultValue === undefined) { throw Error('defaultValue is required'); }\n      if (!type) { type = 'string'; }\n      options[name] = {\n        type: type,\n        defaultValue: defaultValue\n      };\n      setOption(name, defaultValue);\n    }\n\n    function setOption(name, value) {\n      var option = options[name];\n      if (!option) {\n        throw Error('Unknown option: ' + name);\n      }\n      if (option.type == 'boolean') {\n        if (value && value !== true) {\n          throw Error('Invalid argument: ' + name + '=' + value);\n        } else if (value !== false) {\n          // Boolean options are set to true if value is not defined.\n          value = true;\n        }\n      }\n      option.value = option.type == 'boolean' ? !!value : value;\n    }\n\n    function getOption(name) {\n      var option = options[name];\n      if (!option) {\n        throw Error('Unknown option: ' + name);\n      }\n      return option.value;\n    }\n\n    var createCircularJumpList = function() {\n      var size = 100;\n      var pointer = -1;\n      var head = 0;\n      var tail = 0;\n      var buffer = new Array(size);\n      function add(cm, oldCur, newCur) {\n        var current = pointer % size;\n        var curMark = buffer[current];\n        function useNextSlot(cursor) {\n          var next = ++pointer % size;\n          var trashMark = buffer[next];\n          if (trashMark) {\n            trashMark.clear();\n          }\n          buffer[next] = cm.setBookmark(cursor);\n        }\n        if (curMark) {\n          var markPos = curMark.find();\n          // avoid recording redundant cursor position\n          if (markPos && !cursorEqual(markPos, oldCur)) {\n            useNextSlot(oldCur);\n          }\n        } else {\n          useNextSlot(oldCur);\n        }\n        useNextSlot(newCur);\n        head = pointer;\n        tail = pointer - size + 1;\n        if (tail < 0) {\n          tail = 0;\n        }\n      }\n      function move(cm, offset) {\n        pointer += offset;\n        if (pointer > head) {\n          pointer = head;\n        } else if (pointer < tail) {\n          pointer = tail;\n        }\n        var mark = buffer[(size + pointer) % size];\n        // skip marks that are temporarily removed from text buffer\n        if (mark && !mark.find()) {\n          var inc = offset > 0 ? 1 : -1;\n          var newCur;\n          var oldCur = cm.getCursor();\n          do {\n            pointer += inc;\n            mark = buffer[(size + pointer) % size];\n            // skip marks that are the same as current position\n            if (mark &&\n                (newCur = mark.find()) &&\n                !cursorEqual(oldCur, newCur)) {\n              break;\n            }\n          } while (pointer < head && pointer > tail);\n        }\n        return mark;\n      }\n      return {\n        cachedCursor: undefined, //used for # and * jumps\n        add: add,\n        move: move\n      };\n    };\n\n    // Returns an object to track the changes associated insert mode.  It\n    // clones the object that is passed in, or creates an empty object one if\n    // none is provided.\n    var createInsertModeChanges = function(c) {\n      if (c) {\n        // Copy construction\n        return {\n          changes: c.changes,\n          expectCursorActivityForChange: c.expectCursorActivityForChange\n        };\n      }\n      return {\n        // Change list\n        changes: [],\n        // Set to true on change, false on cursorActivity.\n        expectCursorActivityForChange: false\n      };\n    };\n\n    function MacroModeState() {\n      this.latestRegister = undefined;\n      this.isPlaying = false;\n      this.isRecording = false;\n      this.replaySearchQueries = [];\n      this.onRecordingDone = undefined;\n      this.lastInsertModeChanges = createInsertModeChanges();\n    }\n    MacroModeState.prototype = {\n      exitMacroRecordMode: function() {\n        var macroModeState = vimGlobalState.macroModeState;\n        macroModeState.onRecordingDone(); // close dialog\n        macroModeState.onRecordingDone = undefined;\n        macroModeState.isRecording = false;\n      },\n      enterMacroRecordMode: function(cm, registerName) {\n        var register =\n            vimGlobalState.registerController.getRegister(registerName);\n        if (register) {\n          register.clear();\n          this.latestRegister = registerName;\n          this.onRecordingDone = cm.openDialog(\n              '(recording)['+registerName+']', null, {bottom:true});\n          this.isRecording = true;\n        }\n      }\n    };\n\n    function maybeInitVimState(cm) {\n      if (!cm.state.vim) {\n        // Store instance state in the CodeMirror object.\n        cm.state.vim = {\n          inputState: new InputState(),\n          // Vim's input state that triggered the last edit, used to repeat\n          // motions and operators with '.'.\n          lastEditInputState: undefined,\n          // Vim's action command before the last edit, used to repeat actions\n          // with '.' and insert mode repeat.\n          lastEditActionCommand: undefined,\n          // When using jk for navigation, if you move from a longer line to a\n          // shorter line, the cursor may clip to the end of the shorter line.\n          // If j is pressed again and cursor goes to the next line, the\n          // cursor should go back to its horizontal position on the longer\n          // line if it can. This is to keep track of the horizontal position.\n          lastHPos: -1,\n          // Doing the same with screen-position for gj/gk\n          lastHSPos: -1,\n          // The last motion command run. Cleared if a non-motion command gets\n          // executed in between.\n          lastMotion: null,\n          marks: {},\n          insertMode: false,\n          // Repeat count for changes made in insert mode, triggered by key\n          // sequences like 3,i. Only exists when insertMode is true.\n          insertModeRepeat: undefined,\n          visualMode: false,\n          // If we are in visual line mode. No effect if visualMode is false.\n          visualLine: false,\n          lastSelection: null\n        };\n      }\n      return cm.state.vim;\n    }\n    var vimGlobalState;\n    function resetVimGlobalState() {\n      vimGlobalState = {\n        // The current search query.\n        searchQuery: null,\n        // Whether we are searching backwards.\n        searchIsReversed: false,\n        // Replace part of the last substituted pattern\n        lastSubstituteReplacePart: undefined,\n        jumpList: createCircularJumpList(),\n        macroModeState: new MacroModeState,\n        // Recording latest f, t, F or T motion command.\n        lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},\n        registerController: new RegisterController({})\n      };\n      for (var optionName in options) {\n        var option = options[optionName];\n        option.value = option.defaultValue;\n      }\n    }\n\n    var vimApi= {\n      buildKeyMap: function() {\n        // TODO: Convert keymap into dictionary format for fast lookup.\n      },\n      // Testing hook, though it might be useful to expose the register\n      // controller anyways.\n      getRegisterController: function() {\n        return vimGlobalState.registerController;\n      },\n      // Testing hook.\n      resetVimGlobalState_: resetVimGlobalState,\n\n      // Testing hook.\n      getVimGlobalState_: function() {\n        return vimGlobalState;\n      },\n\n      // Testing hook.\n      maybeInitVimState_: maybeInitVimState,\n\n      InsertModeKey: InsertModeKey,\n      map: function(lhs, rhs, ctx) {\n        // Add user defined key bindings.\n        exCommandDispatcher.map(lhs, rhs, ctx);\n      },\n      setOption: setOption,\n      getOption: getOption,\n      defineOption: defineOption,\n      defineEx: function(name, prefix, func){\n        if (name.indexOf(prefix) !== 0) {\n          throw new Error('(Vim.defineEx) \"'+prefix+'\" is not a prefix of \"'+name+'\", command not registered');\n        }\n        exCommands[name]=func;\n        exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};\n      },\n      // This is the outermost function called by CodeMirror, after keys have\n      // been mapped to their Vim equivalents.\n      handleKey: function(cm, key) {\n        var command;\n        var vim = maybeInitVimState(cm);\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isRecording) {\n          if (key == 'q') {\n            macroModeState.exitMacroRecordMode();\n            vim.inputState = new InputState();\n            return;\n          }\n        }\n        if (key == '<Esc>') {\n          // Clear input state and get back to normal mode.\n          vim.inputState = new InputState();\n          if (vim.visualMode) {\n            exitVisualMode(cm);\n          }\n          return;\n        }\n        // Enter visual mode when the mouse selects text.\n        if (!vim.visualMode &&\n            !cursorEqual(cm.getCursor('head'), cm.getCursor('anchor'))) {\n          vim.visualMode = true;\n          vim.visualLine = false;\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n          cm.on('mousedown', exitVisualMode);\n        }\n        if (key != '0' || (key == '0' && vim.inputState.getRepeat() === 0)) {\n          // Have to special case 0 since it's both a motion and a number.\n          command = commandDispatcher.matchCommand(key, defaultKeymap, vim);\n        }\n        if (!command) {\n          if (isNumber(key)) {\n            // Increment count unless count is 0 and key is 0.\n            vim.inputState.pushRepeatDigit(key);\n          }\n          if (macroModeState.isRecording) {\n            logKey(macroModeState, key);\n          }\n          return;\n        }\n        if (command.type == 'keyToKey') {\n          // TODO: prevent infinite recursion.\n          for (var i = 0; i < command.toKeys.length; i++) {\n            this.handleKey(cm, command.toKeys[i]);\n          }\n        } else {\n          if (macroModeState.isRecording) {\n            logKey(macroModeState, key);\n          }\n          commandDispatcher.processCommand(cm, vim, command);\n        }\n      },\n      handleEx: function(cm, input) {\n        exCommandDispatcher.processCommand(cm, input);\n      }\n    };\n\n    // Represents the current input state.\n    function InputState() {\n      this.prefixRepeat = [];\n      this.motionRepeat = [];\n\n      this.operator = null;\n      this.operatorArgs = null;\n      this.motion = null;\n      this.motionArgs = null;\n      this.keyBuffer = []; // For matching multi-key commands.\n      this.registerName = null; // Defaults to the unnamed register.\n    }\n    InputState.prototype.pushRepeatDigit = function(n) {\n      if (!this.operator) {\n        this.prefixRepeat = this.prefixRepeat.concat(n);\n      } else {\n        this.motionRepeat = this.motionRepeat.concat(n);\n      }\n    };\n    InputState.prototype.getRepeat = function() {\n      var repeat = 0;\n      if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {\n        repeat = 1;\n        if (this.prefixRepeat.length > 0) {\n          repeat *= parseInt(this.prefixRepeat.join(''), 10);\n        }\n        if (this.motionRepeat.length > 0) {\n          repeat *= parseInt(this.motionRepeat.join(''), 10);\n        }\n      }\n      return repeat;\n    };\n\n    /*\n     * Register stores information about copy and paste registers.  Besides\n     * text, a register must store whether it is linewise (i.e., when it is\n     * pasted, should it insert itself into a new line, or should the text be\n     * inserted at the cursor position.)\n     */\n    function Register(text, linewise) {\n      this.clear();\n      this.keyBuffer = [text || ''];\n      this.insertModeChanges = [];\n      this.searchQueries = [];\n      this.linewise = !!linewise;\n    }\n    Register.prototype = {\n      setText: function(text, linewise) {\n        this.keyBuffer = [text || ''];\n        this.linewise = !!linewise;\n      },\n      pushText: function(text, linewise) {\n        // if this register has ever been set to linewise, use linewise.\n        if (linewise) {\n          if (!this.linewise) {\n            this.keyBuffer.push('\\n');\n          }\n          this.linewise = true;\n        }\n        this.keyBuffer.push(text);\n      },\n      pushInsertModeChanges: function(changes) {\n        this.insertModeChanges.push(createInsertModeChanges(changes));\n      },\n      pushSearchQuery: function(query) {\n        this.searchQueries.push(query);\n      },\n      clear: function() {\n        this.keyBuffer = [];\n        this.insertModeChanges = [];\n        this.searchQueries = [];\n        this.linewise = false;\n      },\n      toString: function() {\n        return this.keyBuffer.join('');\n      }\n    };\n\n    /*\n     * vim registers allow you to keep many independent copy and paste buffers.\n     * See http://usevim.com/2012/04/13/registers/ for an introduction.\n     *\n     * RegisterController keeps the state of all the registers.  An initial\n     * state may be passed in.  The unnamed register '\"' will always be\n     * overridden.\n     */\n    function RegisterController(registers) {\n      this.registers = registers;\n      this.unnamedRegister = registers['\"'] = new Register();\n      registers['.'] = new Register();\n      registers[':'] = new Register();\n    }\n    RegisterController.prototype = {\n      pushText: function(registerName, operator, text, linewise) {\n        if (linewise && text.charAt(0) == '\\n') {\n          text = text.slice(1) + '\\n';\n        }\n        if (linewise && text.charAt(text.length - 1) !== '\\n'){\n          text += '\\n';\n        }\n        // Lowercase and uppercase registers refer to the same register.\n        // Uppercase just means append.\n        var register = this.isValidRegister(registerName) ?\n            this.getRegister(registerName) : null;\n        // if no register/an invalid register was specified, things go to the\n        // default registers\n        if (!register) {\n          switch (operator) {\n            case 'yank':\n              // The 0 register contains the text from the most recent yank.\n              this.registers['0'] = new Register(text, linewise);\n              break;\n            case 'delete':\n            case 'change':\n              if (text.indexOf('\\n') == -1) {\n                // Delete less than 1 line. Update the small delete register.\n                this.registers['-'] = new Register(text, linewise);\n              } else {\n                // Shift down the contents of the numbered registers and put the\n                // deleted text into register 1.\n                this.shiftNumericRegisters_();\n                this.registers['1'] = new Register(text, linewise);\n              }\n              break;\n          }\n          // Make sure the unnamed register is set to what just happened\n          this.unnamedRegister.setText(text, linewise);\n          return;\n        }\n\n        // If we've gotten to this point, we've actually specified a register\n        var append = isUpperCase(registerName);\n        if (append) {\n          register.pushText(text, linewise);\n        } else {\n          register.setText(text, linewise);\n        }\n        // The unnamed register always has the same value as the last used\n        // register.\n        this.unnamedRegister.setText(register.toString(), linewise);\n      },\n      // Gets the register named @name.  If one of @name doesn't already exist,\n      // create it.  If @name is invalid, return the unnamedRegister.\n      getRegister: function(name) {\n        if (!this.isValidRegister(name)) {\n          return this.unnamedRegister;\n        }\n        name = name.toLowerCase();\n        if (!this.registers[name]) {\n          this.registers[name] = new Register();\n        }\n        return this.registers[name];\n      },\n      isValidRegister: function(name) {\n        return name && inArray(name, validRegisters);\n      },\n      shiftNumericRegisters_: function() {\n        for (var i = 9; i >= 2; i--) {\n          this.registers[i] = this.getRegister('' + (i - 1));\n        }\n      }\n    };\n\n    var commandDispatcher = {\n      matchCommand: function(key, keyMap, vim) {\n        var inputState = vim.inputState;\n        var keys = inputState.keyBuffer.concat(key);\n        var matchedCommands = [];\n        var selectedCharacter;\n        for (var i = 0; i < keyMap.length; i++) {\n          var command = keyMap[i];\n          if (matchKeysPartial(keys, command.keys)) {\n            if (inputState.operator && command.type == 'action') {\n              // Ignore matched action commands after an operator. Operators\n              // only operate on motions. This check is really for text\n              // objects since aW, a[ etcs conflicts with a.\n              continue;\n            }\n            // Match commands that take <character> as an argument.\n            if (command.keys[keys.length - 1] == 'character') {\n              selectedCharacter = keys[keys.length - 1];\n              if (selectedCharacter.length>1){\n                switch(selectedCharacter){\n                  case '<CR>':\n                    selectedCharacter='\\n';\n                    break;\n                  case '<Space>':\n                    selectedCharacter=' ';\n                    break;\n                  default:\n                    continue;\n                }\n              }\n            }\n            // Add the command to the list of matched commands. Choose the best\n            // command later.\n            matchedCommands.push(command);\n          }\n        }\n\n        // Returns the command if it is a full match, or null if not.\n        function getFullyMatchedCommandOrNull(command) {\n          if (keys.length < command.keys.length) {\n            // Matches part of a multi-key command. Buffer and wait for next\n            // stroke.\n            inputState.keyBuffer.push(key);\n            return null;\n          } else {\n            if (command.keys[keys.length - 1] == 'character') {\n              inputState.selectedCharacter = selectedCharacter;\n            }\n            // Clear the buffer since a full match was found.\n            inputState.keyBuffer = [];\n            return command;\n          }\n        }\n\n        if (!matchedCommands.length) {\n          // Clear the buffer since there were no matches.\n          inputState.keyBuffer = [];\n          return null;\n        } else if (matchedCommands.length == 1) {\n          return getFullyMatchedCommandOrNull(matchedCommands[0]);\n        } else {\n          // Find the best match in the list of matchedCommands.\n          var context = vim.visualMode ? 'visual' : 'normal';\n          var bestMatch; // Default to first in the list.\n          for (var i = 0; i < matchedCommands.length; i++) {\n            var current = matchedCommands[i];\n            if (current.context == context) {\n              bestMatch = current;\n              break;\n            } else if (!bestMatch && !current.context) {\n              // Only set an imperfect match to best match if no best match is\n              // set and the imperfect match is not restricted to another\n              // context.\n              bestMatch = current;\n            }\n          }\n          return getFullyMatchedCommandOrNull(bestMatch);\n        }\n      },\n      processCommand: function(cm, vim, command) {\n        vim.inputState.repeatOverride = command.repeatOverride;\n        switch (command.type) {\n          case 'motion':\n            this.processMotion(cm, vim, command);\n            break;\n          case 'operator':\n            this.processOperator(cm, vim, command);\n            break;\n          case 'operatorMotion':\n            this.processOperatorMotion(cm, vim, command);\n            break;\n          case 'action':\n            this.processAction(cm, vim, command);\n            break;\n          case 'search':\n            this.processSearch(cm, vim, command);\n            break;\n          case 'ex':\n          case 'keyToEx':\n            this.processEx(cm, vim, command);\n            break;\n          default:\n            break;\n        }\n      },\n      processMotion: function(cm, vim, command) {\n        vim.inputState.motion = command.motion;\n        vim.inputState.motionArgs = copyArgs(command.motionArgs);\n        this.evalInput(cm, vim);\n      },\n      processOperator: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        if (inputState.operator) {\n          if (inputState.operator == command.operator) {\n            // Typing an operator twice like 'dd' makes the operator operate\n            // linewise\n            inputState.motion = 'expandToLine';\n            inputState.motionArgs = { linewise: true };\n            this.evalInput(cm, vim);\n            return;\n          } else {\n            // 2 different operators in a row doesn't make sense.\n            vim.inputState = new InputState();\n          }\n        }\n        inputState.operator = command.operator;\n        inputState.operatorArgs = copyArgs(command.operatorArgs);\n        if (vim.visualMode) {\n          // Operating on a selection in visual mode. We don't need a motion.\n          this.evalInput(cm, vim);\n        }\n      },\n      processOperatorMotion: function(cm, vim, command) {\n        var visualMode = vim.visualMode;\n        var operatorMotionArgs = copyArgs(command.operatorMotionArgs);\n        if (operatorMotionArgs) {\n          // Operator motions may have special behavior in visual mode.\n          if (visualMode && operatorMotionArgs.visualLine) {\n            vim.visualLine = true;\n          }\n        }\n        this.processOperator(cm, vim, command);\n        if (!visualMode) {\n          this.processMotion(cm, vim, command);\n        }\n      },\n      processAction: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        var repeat = inputState.getRepeat();\n        var repeatIsExplicit = !!repeat;\n        var actionArgs = copyArgs(command.actionArgs) || {};\n        if (inputState.selectedCharacter) {\n          actionArgs.selectedCharacter = inputState.selectedCharacter;\n        }\n        // Actions may or may not have motions and operators. Do these first.\n        if (command.operator) {\n          this.processOperator(cm, vim, command);\n        }\n        if (command.motion) {\n          this.processMotion(cm, vim, command);\n        }\n        if (command.motion || command.operator) {\n          this.evalInput(cm, vim);\n        }\n        actionArgs.repeat = repeat || 1;\n        actionArgs.repeatIsExplicit = repeatIsExplicit;\n        actionArgs.registerName = inputState.registerName;\n        vim.inputState = new InputState();\n        vim.lastMotion = null;\n        if (command.isEdit) {\n          this.recordLastEdit(vim, inputState, command);\n        }\n        actions[command.action](cm, actionArgs, vim);\n      },\n      processSearch: function(cm, vim, command) {\n        if (!cm.getSearchCursor) {\n          // Search depends on SearchCursor.\n          return;\n        }\n        var forward = command.searchArgs.forward;\n        var wholeWordOnly = command.searchArgs.wholeWordOnly;\n        getSearchState(cm).setReversed(!forward);\n        var promptPrefix = (forward) ? '/' : '?';\n        var originalQuery = getSearchState(cm).getQuery();\n        var originalScrollPos = cm.getScrollInfo();\n        function handleQuery(query, ignoreCase, smartCase) {\n          try {\n            updateSearchQuery(cm, query, ignoreCase, smartCase);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + query);\n            return;\n          }\n          commandDispatcher.processMotion(cm, vim, {\n            type: 'motion',\n            motion: 'findNext',\n            motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }\n          });\n        }\n        function onPromptClose(query) {\n          cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          handleQuery(query, true /** ignoreCase */, true /** smartCase */);\n          var macroModeState = vimGlobalState.macroModeState;\n          if (macroModeState.isRecording) {\n            logSearchQuery(macroModeState, query);\n          }\n        }\n        function onPromptKeyUp(_e, query) {\n          var parsedQuery;\n          try {\n            parsedQuery = updateSearchQuery(cm, query,\n                true /** ignoreCase */, true /** smartCase */);\n          } catch (e) {\n            // Swallow bad regexes for incremental search.\n          }\n          if (parsedQuery) {\n            cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);\n          } else {\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          }\n        }\n        function onPromptKeyDown(e, _query, close) {\n          var keyName = CodeMirror.keyName(e);\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {\n            updateSearchQuery(cm, originalQuery);\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n\n            CodeMirror.e_stop(e);\n            close();\n            cm.focus();\n          }\n        }\n        switch (command.searchArgs.querySrc) {\n          case 'prompt':\n            var macroModeState = vimGlobalState.macroModeState;\n            if (macroModeState.isPlaying) {\n              var query = macroModeState.replaySearchQueries.shift();\n              handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            } else {\n              showPrompt(cm, {\n                  onClose: onPromptClose,\n                  prefix: promptPrefix,\n                  desc: searchPromptDesc,\n                  onKeyUp: onPromptKeyUp,\n                  onKeyDown: onPromptKeyDown\n              });\n            }\n            break;\n          case 'wordUnderCursor':\n            var word = expandWordUnderCursor(cm, false /** inclusive */,\n                true /** forward */, false /** bigWord */,\n                true /** noSymbol */);\n            var isKeyword = true;\n            if (!word) {\n              word = expandWordUnderCursor(cm, false /** inclusive */,\n                  true /** forward */, false /** bigWord */,\n                  false /** noSymbol */);\n              isKeyword = false;\n            }\n            if (!word) {\n              return;\n            }\n            var query = cm.getLine(word.start.line).substring(word.start.ch,\n                word.end.ch);\n            if (isKeyword && wholeWordOnly) {\n                query = '\\\\b' + query + '\\\\b';\n            } else {\n              query = escapeRegex(query);\n            }\n\n            // cachedCursor is used to save the old position of the cursor\n            // when * or # causes vim to seek for the nearest word and shift\n            // the cursor before entering the motion.\n            vimGlobalState.jumpList.cachedCursor = cm.getCursor();\n            cm.setCursor(word.start);\n\n            handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            break;\n        }\n      },\n      processEx: function(cm, vim, command) {\n        function onPromptClose(input) {\n          // Give the prompt some time to close so that if processCommand shows\n          // an error, the elements don't overlap.\n          exCommandDispatcher.processCommand(cm, input);\n        }\n        function onPromptKeyDown(e, _input, close) {\n          var keyName = CodeMirror.keyName(e);\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {\n            CodeMirror.e_stop(e);\n            close();\n            cm.focus();\n          }\n        }\n        if (command.type == 'keyToEx') {\n          // Handle user defined Ex to Ex mappings\n          exCommandDispatcher.processCommand(cm, command.exArgs.input);\n        } else {\n          if (vim.visualMode) {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\\'<,\\'>',\n                onKeyDown: onPromptKeyDown});\n          } else {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':',\n                onKeyDown: onPromptKeyDown});\n          }\n        }\n      },\n      evalInput: function(cm, vim) {\n        // If the motion comand is set, execute both the operator and motion.\n        // Otherwise return.\n        var inputState = vim.inputState;\n        var motion = inputState.motion;\n        var motionArgs = inputState.motionArgs || {};\n        var operator = inputState.operator;\n        var operatorArgs = inputState.operatorArgs || {};\n        var registerName = inputState.registerName;\n        var selectionEnd = copyCursor(cm.getCursor('head'));\n        var selectionStart = copyCursor(cm.getCursor('anchor'));\n        // The difference between cur and selection cursors are that cur is\n        // being operated on and ignores that there is a selection.\n        var curStart = copyCursor(selectionEnd);\n        var curOriginal = copyCursor(curStart);\n        var curEnd;\n        var repeat;\n        if (operator) {\n          this.recordLastEdit(vim, inputState);\n        }\n        if (inputState.repeatOverride !== undefined) {\n          // If repeatOverride is specified, that takes precedence over the\n          // input state's repeat. Used by Ex mode and can be user defined.\n          repeat = inputState.repeatOverride;\n        } else {\n          repeat = inputState.getRepeat();\n        }\n        if (repeat > 0 && motionArgs.explicitRepeat) {\n          motionArgs.repeatIsExplicit = true;\n        } else if (motionArgs.noRepeat ||\n            (!motionArgs.explicitRepeat && repeat === 0)) {\n          repeat = 1;\n          motionArgs.repeatIsExplicit = false;\n        }\n        if (inputState.selectedCharacter) {\n          // If there is a character input, stick it in all of the arg arrays.\n          motionArgs.selectedCharacter = operatorArgs.selectedCharacter =\n              inputState.selectedCharacter;\n        }\n        motionArgs.repeat = repeat;\n        vim.inputState = new InputState();\n        if (motion) {\n          var motionResult = motions[motion](cm, motionArgs, vim);\n          vim.lastMotion = motions[motion];\n          if (!motionResult) {\n            return;\n          }\n          if (motionArgs.toJumplist) {\n            var jumpList = vimGlobalState.jumpList;\n            // if the current motion is # or *, use cachedCursor\n            var cachedCursor = jumpList.cachedCursor;\n            if (cachedCursor) {\n              recordJumpPosition(cm, cachedCursor, motionResult);\n              delete jumpList.cachedCursor;\n            } else {\n              recordJumpPosition(cm, curOriginal, motionResult);\n            }\n          }\n          if (motionResult instanceof Array) {\n            curStart = motionResult[0];\n            curEnd = motionResult[1];\n          } else {\n            curEnd = motionResult;\n          }\n          // TODO: Handle null returns from motion commands better.\n          if (!curEnd) {\n            curEnd = Pos(curStart.line, curStart.ch);\n          }\n          if (vim.visualMode) {\n            // Check if the selection crossed over itself. Will need to shift\n            // the start point if that happened.\n            if (cursorIsBefore(selectionStart, selectionEnd) &&\n                (cursorEqual(selectionStart, curEnd) ||\n                    cursorIsBefore(curEnd, selectionStart))) {\n              // The end of the selection has moved from after the start to\n              // before the start. We will shift the start right by 1.\n              selectionStart.ch += 1;\n            } else if (cursorIsBefore(selectionEnd, selectionStart) &&\n                (cursorEqual(selectionStart, curEnd) ||\n                    cursorIsBefore(selectionStart, curEnd))) {\n              // The opposite happened. We will shift the start left by 1.\n              selectionStart.ch -= 1;\n            }\n            selectionEnd = curEnd;\n            selectionStart = (motionResult instanceof Array) ? curStart : selectionStart;\n            if (vim.visualLine) {\n              if (cursorIsBefore(selectionStart, selectionEnd)) {\n                selectionStart.ch = 0;\n\n                var lastLine = cm.lastLine();\n                if (selectionEnd.line > lastLine) {\n                  selectionEnd.line = lastLine;\n                }\n                selectionEnd.ch = lineLength(cm, selectionEnd.line);\n              } else {\n                selectionEnd.ch = 0;\n                selectionStart.ch = lineLength(cm, selectionStart.line);\n              }\n            }\n            cm.setSelection(selectionStart, selectionEnd);\n            updateMark(cm, vim, '<',\n                cursorIsBefore(selectionStart, selectionEnd) ? selectionStart\n                    : selectionEnd);\n            updateMark(cm, vim, '>',\n                cursorIsBefore(selectionStart, selectionEnd) ? selectionEnd\n                    : selectionStart);\n          } else if (!operator) {\n            curEnd = clipCursorToContent(cm, curEnd);\n            cm.setCursor(curEnd.line, curEnd.ch);\n          }\n        }\n\n        if (operator) {\n          var inverted = false;\n          vim.lastMotion = null;\n          operatorArgs.repeat = repeat; // Indent in visual mode needs this.\n          if (vim.visualMode) {\n            curStart = selectionStart;\n            curEnd = selectionEnd;\n            motionArgs.inclusive = true;\n          }\n          // Swap start and end if motion was backward.\n          if (curEnd && cursorIsBefore(curEnd, curStart)) {\n            var tmp = curStart;\n            curStart = curEnd;\n            curEnd = tmp;\n            inverted = true;\n          } else if (!curEnd) {\n            curEnd = copyCursor(curStart);\n          }\n          if (motionArgs.inclusive && !(vim.visualMode && inverted)) {\n            // Move the selection end one to the right to include the last\n            // character.\n            curEnd.ch++;\n          }\n          if (operatorArgs.selOffset) {\n            // Replaying a visual mode operation\n            curEnd.line = curStart.line + operatorArgs.selOffset.line;\n            if (operatorArgs.selOffset.line) {curEnd.ch = operatorArgs.selOffset.ch; }\n            else { curEnd.ch = curStart.ch + operatorArgs.selOffset.ch; }\n          } else if (vim.visualMode) {\n            var selOffset = Pos();\n            selOffset.line = curEnd.line - curStart.line;\n            if (selOffset.line) { selOffset.ch = curEnd.ch; }\n            else { selOffset.ch = curEnd.ch - curStart.ch; }\n            operatorArgs.selOffset = selOffset;\n          }\n          var linewise = motionArgs.linewise ||\n              (vim.visualMode && vim.visualLine) ||\n              operatorArgs.linewise;\n          if (linewise) {\n            // Expand selection to entire line.\n            expandSelectionToLine(cm, curStart, curEnd);\n          } else if (motionArgs.forward) {\n            // Clip to trailing newlines only if the motion goes forward.\n            clipToLine(cm, curStart, curEnd);\n          }\n          operatorArgs.registerName = registerName;\n          // Keep track of linewise as it affects how paste and change behave.\n          operatorArgs.linewise = linewise;\n          operators[operator](cm, operatorArgs, vim, curStart,\n              curEnd, curOriginal);\n          if (vim.visualMode) {\n            exitVisualMode(cm);\n          }\n        }\n      },\n      recordLastEdit: function(vim, inputState, actionCommand) {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        vim.lastEditInputState = inputState;\n        vim.lastEditActionCommand = actionCommand;\n        macroModeState.lastInsertModeChanges.changes = [];\n        macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;\n      }\n    };\n\n    /**\n     * typedef {Object{line:number,ch:number}} Cursor An object containing the\n     *     position of the cursor.\n     */\n    // All of the functions below return Cursor objects.\n    var motions = {\n      moveToTopLine: function(cm, motionArgs) {\n        var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;\n        return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToMiddleLine: function(cm) {\n        var range = getUserVisibleLines(cm);\n        var line = Math.floor((range.top + range.bottom) * 0.5);\n        return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToBottomLine: function(cm, motionArgs) {\n        var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;\n        return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      expandToLine: function(cm, motionArgs) {\n        // Expands forward to end of line, and then to next line if repeat is\n        // >1. Does not handle backward motion!\n        var cur = cm.getCursor();\n        return Pos(cur.line + motionArgs.repeat - 1, Infinity);\n      },\n      findNext: function(cm, motionArgs) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        if (!query) {\n          return;\n        }\n        var prev = !motionArgs.forward;\n        // If search is initiated with ? instead of /, negate direction.\n        prev = (state.isReversed()) ? !prev : prev;\n        highlightSearchMatches(cm, query);\n        return findNext(cm, prev/** prev */, query, motionArgs.repeat);\n      },\n      goToMark: function(cm, motionArgs, vim) {\n        var mark = vim.marks[motionArgs.selectedCharacter];\n        if (mark) {\n          var pos = mark.find();\n          return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;\n        }\n        return null;\n      },\n      moveToOtherHighlightedEnd: function(cm) {\n        var curEnd = copyCursor(cm.getCursor('head'));\n        var curStart = copyCursor(cm.getCursor('anchor'));\n        if (cursorIsBefore(curStart, curEnd)) {\n           curEnd.ch += 1;\n        } else if (cursorIsBefore(curEnd, curStart)) {\n           curStart.ch -= 1;\n        }\n        return ([curEnd,curStart]);\n      },\n      jumpToMark: function(cm, motionArgs, vim) {\n        var best = cm.getCursor();\n        for (var i = 0; i < motionArgs.repeat; i++) {\n          var cursor = best;\n          for (var key in vim.marks) {\n            if (!isLowerCase(key)) {\n              continue;\n            }\n            var mark = vim.marks[key].find();\n            var isWrongDirection = (motionArgs.forward) ?\n              cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark);\n\n            if (isWrongDirection) {\n              continue;\n            }\n            if (motionArgs.linewise && (mark.line == cursor.line)) {\n              continue;\n            }\n\n            var equal = cursorEqual(cursor, best);\n            var between = (motionArgs.forward) ?\n              cusrorIsBetween(cursor, mark, best) :\n              cusrorIsBetween(best, mark, cursor);\n\n            if (equal || between) {\n              best = mark;\n            }\n          }\n        }\n\n        if (motionArgs.linewise) {\n          // Vim places the cursor on the first non-whitespace character of\n          // the line if there is one, else it places the cursor at the end\n          // of the line, regardless of whether a mark was found.\n          best = Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));\n        }\n        return best;\n      },\n      moveByCharacters: function(cm, motionArgs) {\n        var cur = cm.getCursor();\n        var repeat = motionArgs.repeat;\n        var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;\n        return Pos(cur.line, ch);\n      },\n      moveByLines: function(cm, motionArgs, vim) {\n        var cur = cm.getCursor();\n        var endCh = cur.ch;\n        // Depending what our last motion was, we may want to do different\n        // things. If our last motion was moving vertically, we want to\n        // preserve the HPos from our last horizontal move.  If our last motion\n        // was going to the end of a line, moving vertically we should go to\n        // the end of the line, etc.\n        switch (vim.lastMotion) {\n          case this.moveByLines:\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveToColumn:\n          case this.moveToEol:\n            endCh = vim.lastHPos;\n            break;\n          default:\n            vim.lastHPos = endCh;\n        }\n        var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);\n        var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;\n        var first = cm.firstLine();\n        var last = cm.lastLine();\n        // Vim cancels linewise motions that start on an edge and move beyond\n        // that edge. It does not cancel motions that do not start on an edge.\n        if ((line < first && cur.line == first) ||\n            (line > last && cur.line == last)) {\n          return;\n        }\n        if (motionArgs.toFirstChar){\n          endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));\n          vim.lastHPos = endCh;\n        }\n        vim.lastHSPos = cm.charCoords(Pos(line, endCh),'div').left;\n        return Pos(line, endCh);\n      },\n      moveByDisplayLines: function(cm, motionArgs, vim) {\n        var cur = cm.getCursor();\n        switch (vim.lastMotion) {\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveByLines:\n          case this.moveToColumn:\n          case this.moveToEol:\n            break;\n          default:\n            vim.lastHSPos = cm.charCoords(cur,'div').left;\n        }\n        var repeat = motionArgs.repeat;\n        var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos);\n        if (res.hitSide) {\n          if (motionArgs.forward) {\n            var lastCharCoords = cm.charCoords(res, 'div');\n            var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };\n            var res = cm.coordsChar(goalCoords, 'div');\n          } else {\n            var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div');\n            resCoords.left = vim.lastHSPos;\n            res = cm.coordsChar(resCoords, 'div');\n          }\n        }\n        vim.lastHPos = res.ch;\n        return res;\n      },\n      moveByPage: function(cm, motionArgs) {\n        // CodeMirror only exposes functions that move the cursor page down, so\n        // doing this bad hack to move the cursor and move it back. evalInput\n        // will move the cursor to where it should be in the end.\n        var curStart = cm.getCursor();\n        var repeat = motionArgs.repeat;\n        return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page');\n      },\n      moveByParagraph: function(cm, motionArgs) {\n        var line = cm.getCursor().line;\n        var repeat = motionArgs.repeat;\n        var inc = motionArgs.forward ? 1 : -1;\n        for (var i = 0; i < repeat; i++) {\n          if ((!motionArgs.forward && line === cm.firstLine() ) ||\n              (motionArgs.forward && line == cm.lastLine())) {\n            break;\n          }\n          line += inc;\n          while (line !== cm.firstLine() && line != cm.lastLine() && cm.getLine(line)) {\n            line += inc;\n          }\n        }\n        return Pos(line, 0);\n      },\n      moveByScroll: function(cm, motionArgs, vim) {\n        var scrollbox = cm.getScrollInfo();\n        var curEnd = null;\n        var repeat = motionArgs.repeat;\n        if (!repeat) {\n          repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());\n        }\n        var orig = cm.charCoords(cm.getCursor(), 'local');\n        motionArgs.repeat = repeat;\n        var curEnd = motions.moveByDisplayLines(cm, motionArgs, vim);\n        if (!curEnd) {\n          return null;\n        }\n        var dest = cm.charCoords(curEnd, 'local');\n        cm.scrollTo(null, scrollbox.top + dest.top - orig.top);\n        return curEnd;\n      },\n      moveByWords: function(cm, motionArgs) {\n        return moveToWord(cm, motionArgs.repeat, !!motionArgs.forward,\n            !!motionArgs.wordEnd, !!motionArgs.bigWord);\n      },\n      moveTillCharacter: function(cm, motionArgs) {\n        var repeat = motionArgs.repeat;\n        var curEnd = moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter);\n        var increment = motionArgs.forward ? -1 : 1;\n        recordLastCharacterSearch(increment, motionArgs);\n        if (!curEnd) return null;\n        curEnd.ch += increment;\n        return curEnd;\n      },\n      moveToCharacter: function(cm, motionArgs) {\n        var repeat = motionArgs.repeat;\n        recordLastCharacterSearch(0, motionArgs);\n        return moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || cm.getCursor();\n      },\n      moveToSymbol: function(cm, motionArgs) {\n        var repeat = motionArgs.repeat;\n        return findSymbol(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || cm.getCursor();\n      },\n      moveToColumn: function(cm, motionArgs, vim) {\n        var repeat = motionArgs.repeat;\n        // repeat is equivalent to which column we want to move to!\n        vim.lastHPos = repeat - 1;\n        vim.lastHSPos = cm.charCoords(cm.getCursor(),'div').left;\n        return moveToColumn(cm, repeat);\n      },\n      moveToEol: function(cm, motionArgs, vim) {\n        var cur = cm.getCursor();\n        vim.lastHPos = Infinity;\n        var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);\n        var end=cm.clipPos(retval);\n        end.ch--;\n        vim.lastHSPos = cm.charCoords(end,'div').left;\n        return retval;\n      },\n      moveToFirstNonWhiteSpaceCharacter: function(cm) {\n        // Go to the start of the line where the text begins, or the end for\n        // whitespace-only lines\n        var cursor = cm.getCursor();\n        return Pos(cursor.line,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));\n      },\n      moveToMatchedSymbol: function(cm) {\n        var cursor = cm.getCursor();\n        var line = cursor.line;\n        var ch = cursor.ch;\n        var lineText = cm.getLine(line);\n        var symbol;\n        do {\n          symbol = lineText.charAt(ch++);\n          if (symbol && isMatchableSymbol(symbol)) {\n            var style = cm.getTokenTypeAt(Pos(line, ch));\n            if (style !== \"string\" && style !== \"comment\") {\n              break;\n            }\n          }\n        } while (symbol);\n        if (symbol) {\n          var matched = cm.findMatchingBracket(Pos(line, ch));\n          return matched.to;\n        } else {\n          return cursor;\n        }\n      },\n      moveToStartOfLine: function(cm) {\n        var cursor = cm.getCursor();\n        return Pos(cursor.line, 0);\n      },\n      moveToLineOrEdgeOfDocument: function(cm, motionArgs) {\n        var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();\n        if (motionArgs.repeatIsExplicit) {\n          lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');\n        }\n        return Pos(lineNum,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));\n      },\n      textObjectManipulation: function(cm, motionArgs) {\n        // TODO: lots of possible exceptions that can be thrown here. Try da(\n        //     outside of a () block.\n\n        // TODO: adding <> >< to this map doesn't work, presumably because\n        // they're operators\n        var mirroredPairs = {'(': ')', ')': '(',\n                             '{': '}', '}': '{',\n                             '[': ']', ']': '['};\n        var selfPaired = {'\\'': true, '\"': true};\n\n        var character = motionArgs.selectedCharacter;\n        // 'b' refers to  '()' block.\n        // 'B' refers to  '{}' block.\n        if (character == 'b') {\n          character = '(';\n        } else if (character == 'B') {\n          character = '{';\n        }\n\n        // Inclusive is the difference between a and i\n        // TODO: Instead of using the additional text object map to perform text\n        //     object operations, merge the map into the defaultKeyMap and use\n        //     motionArgs to define behavior. Define separate entries for 'aw',\n        //     'iw', 'a[', 'i[', etc.\n        var inclusive = !motionArgs.textObjectInner;\n\n        var tmp;\n        if (mirroredPairs[character]) {\n          tmp = selectCompanionObject(cm, character, inclusive);\n        } else if (selfPaired[character]) {\n          tmp = findBeginningAndEnd(cm, character, inclusive);\n        } else if (character === 'W') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     true /** bigWord */);\n        } else if (character === 'w') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     false /** bigWord */);\n        } else {\n          // No text object defined for this, don't move.\n          return null;\n        }\n\n        return [tmp.start, tmp.end];\n      },\n\n      repeatLastCharacterSearch: function(cm, motionArgs) {\n        var lastSearch = vimGlobalState.lastChararacterSearch;\n        var repeat = motionArgs.repeat;\n        var forward = motionArgs.forward === lastSearch.forward;\n        var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);\n        cm.moveH(-increment, 'char');\n        motionArgs.inclusive = forward ? true : false;\n        var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);\n        if (!curEnd) {\n          cm.moveH(increment, 'char');\n          return cm.getCursor();\n        }\n        curEnd.ch += increment;\n        return curEnd;\n      }\n    };\n\n    var operators = {\n      change: function(cm, operatorArgs, _vim, curStart, curEnd) {\n        vimGlobalState.registerController.pushText(\n            operatorArgs.registerName, 'change', cm.getRange(curStart, curEnd),\n            operatorArgs.linewise);\n        if (operatorArgs.linewise) {\n          // Push the next line back down, if there is a next line.\n          var replacement = curEnd.line > cm.lastLine() ? '' : '\\n';\n          cm.replaceRange(replacement, curStart, curEnd);\n          cm.indentLine(curStart.line, 'smart');\n          // null ch so setCursor moves to end of line.\n          curStart.ch = null;\n        } else {\n          // Exclude trailing whitespace if the range is not all whitespace.\n          var text = cm.getRange(curStart, curEnd);\n          if (!isWhiteSpaceString(text)) {\n            var match = (/\\s+$/).exec(text);\n            if (match) {\n              curEnd = offsetCursor(curEnd, 0, - match[0].length);\n            }\n          }\n          cm.replaceRange('', curStart, curEnd);\n        }\n        actions.enterInsertMode(cm, {}, cm.state.vim);\n        cm.setCursor(curStart);\n      },\n      // delete is a javascript keyword.\n      'delete': function(cm, operatorArgs, _vim, curStart, curEnd) {\n        // If the ending line is past the last line, inclusive, instead of\n        // including the trailing \\n, include the \\n before the starting line\n        if (operatorArgs.linewise &&\n            curEnd.line > cm.lastLine() && curStart.line > cm.firstLine()) {\n          curStart.line--;\n          curStart.ch = lineLength(cm, curStart.line);\n        }\n        vimGlobalState.registerController.pushText(\n            operatorArgs.registerName, 'delete', cm.getRange(curStart, curEnd),\n            operatorArgs.linewise);\n        cm.replaceRange('', curStart, curEnd);\n        if (operatorArgs.linewise) {\n          cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));\n        } else {\n          cm.setCursor(curStart);\n        }\n      },\n      indent: function(cm, operatorArgs, vim, curStart, curEnd) {\n        var startLine = curStart.line;\n        var endLine = curEnd.line;\n        // In visual mode, n> shifts the selection right n times, instead of\n        // shifting n lines right once.\n        var repeat = (vim.visualMode) ? operatorArgs.repeat : 1;\n        if (operatorArgs.linewise) {\n          // The only way to delete a newline is to delete until the start of\n          // the next line, so in linewise mode evalInput will include the next\n          // line. We don't want this in indent, so we go back a line.\n          endLine--;\n        }\n        for (var i = startLine; i <= endLine; i++) {\n          for (var j = 0; j < repeat; j++) {\n            cm.indentLine(i, operatorArgs.indentRight);\n          }\n        }\n        cm.setCursor(curStart);\n        cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));\n      },\n      swapcase: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {\n        var toSwap = cm.getRange(curStart, curEnd);\n        var swapped = '';\n        for (var i = 0; i < toSwap.length; i++) {\n          var character = toSwap.charAt(i);\n          swapped += isUpperCase(character) ? character.toLowerCase() :\n              character.toUpperCase();\n        }\n        cm.replaceRange(swapped, curStart, curEnd);\n        if (!operatorArgs.shouldMoveCursor) {\n          cm.setCursor(curOriginal);\n        }\n      },\n      yank: function(cm, operatorArgs, _vim, curStart, curEnd, curOriginal) {\n        vimGlobalState.registerController.pushText(\n            operatorArgs.registerName, 'yank',\n            cm.getRange(curStart, curEnd), operatorArgs.linewise);\n        cm.setCursor(curOriginal);\n      }\n    };\n\n    var actions = {\n      jumpListWalk: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat;\n        var forward = actionArgs.forward;\n        var jumpList = vimGlobalState.jumpList;\n\n        var mark = jumpList.move(cm, forward ? repeat : -repeat);\n        var markPos = mark ? mark.find() : undefined;\n        markPos = markPos ? markPos : cm.getCursor();\n        cm.setCursor(markPos);\n      },\n      scroll: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat || 1;\n        var lineHeight = cm.defaultTextHeight();\n        var top = cm.getScrollInfo().top;\n        var delta = lineHeight * repeat;\n        var newPos = actionArgs.forward ? top + delta : top - delta;\n        var cursor = copyCursor(cm.getCursor());\n        var cursorCoords = cm.charCoords(cursor, 'local');\n        if (actionArgs.forward) {\n          if (newPos > cursorCoords.top) {\n             cursor.line += (newPos - cursorCoords.top) / lineHeight;\n             cursor.line = Math.ceil(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(null, cursorCoords.top);\n          } else {\n             // Cursor stays within bounds.  Just reposition the scroll window.\n             cm.scrollTo(null, newPos);\n          }\n        } else {\n          var newBottom = newPos + cm.getScrollInfo().clientHeight;\n          if (newBottom < cursorCoords.bottom) {\n             cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;\n             cursor.line = Math.floor(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(\n                 null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);\n          } else {\n             // Cursor stays within bounds.  Just reposition the scroll window.\n             cm.scrollTo(null, newPos);\n          }\n        }\n      },\n      scrollToCursor: function(cm, actionArgs) {\n        var lineNum = cm.getCursor().line;\n        var charCoords = cm.charCoords(Pos(lineNum, 0), 'local');\n        var height = cm.getScrollInfo().clientHeight;\n        var y = charCoords.top;\n        var lineHeight = charCoords.bottom - y;\n        switch (actionArgs.position) {\n          case 'center': y = y - (height / 2) + lineHeight;\n            break;\n          case 'bottom': y = y - height + lineHeight*1.4;\n            break;\n          case 'top': y = y + lineHeight*0.4;\n            break;\n        }\n        cm.scrollTo(null, y);\n      },\n      replayMacro: function(cm, actionArgs, vim) {\n        var registerName = actionArgs.selectedCharacter;\n        var repeat = actionArgs.repeat;\n        var macroModeState = vimGlobalState.macroModeState;\n        if (registerName == '@') {\n          registerName = macroModeState.latestRegister;\n        }\n        while(repeat--){\n          executeMacroRegister(cm, vim, macroModeState, registerName);\n        }\n      },\n      enterMacroRecordMode: function(cm, actionArgs) {\n        var macroModeState = vimGlobalState.macroModeState;\n        var registerName = actionArgs.selectedCharacter;\n        macroModeState.enterMacroRecordMode(cm, registerName);\n      },\n      enterInsertMode: function(cm, actionArgs, vim) {\n        if (cm.getOption('readOnly')) { return; }\n        vim.insertMode = true;\n        vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;\n        var insertAt = (actionArgs) ? actionArgs.insertAt : null;\n        if (insertAt == 'eol') {\n          var cursor = cm.getCursor();\n          cursor = Pos(cursor.line, lineLength(cm, cursor.line));\n          cm.setCursor(cursor);\n        } else if (insertAt == 'charAfter') {\n          cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n        } else if (insertAt == 'firstNonBlank') {\n          cm.setCursor(motions.moveToFirstNonWhiteSpaceCharacter(cm));\n        }\n        cm.setOption('keyMap', 'vim-insert');\n        cm.setOption('disableInput', false);\n        if (actionArgs && actionArgs.replace) {\n          // Handle Replace-mode as a special case of insert mode.\n          cm.toggleOverwrite(true);\n          cm.setOption('keyMap', 'vim-replace');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n        } else {\n          cm.setOption('keyMap', 'vim-insert');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n        }\n        if (!vimGlobalState.macroModeState.isPlaying) {\n          // Only record if not replaying.\n          cm.on('change', onChange);\n          CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n        }\n      },\n      toggleVisualMode: function(cm, actionArgs, vim) {\n        var repeat = actionArgs.repeat;\n        var curStart = cm.getCursor();\n        var curEnd;\n        // TODO: The repeat should actually select number of characters/lines\n        //     equal to the repeat times the size of the previous visual\n        //     operation.\n        if (!vim.visualMode) {\n          cm.on('mousedown', exitVisualMode);\n          vim.visualMode = true;\n          vim.visualLine = !!actionArgs.linewise;\n          if (vim.visualLine) {\n            curStart.ch = 0;\n            curEnd = clipCursorToContent(\n              cm, Pos(curStart.line + repeat - 1, lineLength(cm, curStart.line)),\n              true /** includeLineBreak */);\n          } else {\n            curEnd = clipCursorToContent(\n              cm, Pos(curStart.line, curStart.ch + repeat),\n              true /** includeLineBreak */);\n          }\n          // Make the initial selection.\n          if (!actionArgs.repeatIsExplicit && !vim.visualLine) {\n            // This is a strange case. Here the implicit repeat is 1. The\n            // following commands lets the cursor hover over the 1 character\n            // selection.\n            cm.setCursor(curEnd);\n            cm.setSelection(curEnd, curStart);\n          } else {\n            cm.setSelection(curStart, curEnd);\n          }\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : \"\"});\n        } else {\n          curStart = cm.getCursor('anchor');\n          curEnd = cm.getCursor('head');\n          if (!vim.visualLine && actionArgs.linewise) {\n            // Shift-V pressed in characterwise visual mode. Switch to linewise\n            // visual mode instead of exiting visual mode.\n            vim.visualLine = true;\n            curStart.ch = cursorIsBefore(curStart, curEnd) ? 0 :\n                lineLength(cm, curStart.line);\n            curEnd.ch = cursorIsBefore(curStart, curEnd) ?\n                lineLength(cm, curEnd.line) : 0;\n            cm.setSelection(curStart, curEnd);\n            CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: \"linewise\"});\n          } else if (vim.visualLine && !actionArgs.linewise) {\n            // v pressed in linewise visual mode. Switch to characterwise visual\n            // mode instead of exiting visual mode.\n            vim.visualLine = false;\n            CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n          } else {\n            exitVisualMode(cm);\n          }\n        }\n        updateMark(cm, vim, '<', cursorIsBefore(curStart, curEnd) ? curStart\n            : curEnd);\n        updateMark(cm, vim, '>', cursorIsBefore(curStart, curEnd) ? curEnd\n            : curStart);\n      },\n      reselectLastSelection: function(cm, _actionArgs, vim) {\n        if (vim.lastSelection) {\n          var lastSelection = vim.lastSelection;\n          cm.setSelection(lastSelection.curStart, lastSelection.curEnd);\n          if (lastSelection.visualLine) {\n            vim.visualMode = true;\n            vim.visualLine = true;\n          }\n          else {\n            vim.visualMode = true;\n            vim.visualLine = false;\n          }\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : \"\"});\n        }\n      },\n      joinLines: function(cm, actionArgs, vim) {\n        var curStart, curEnd;\n        if (vim.visualMode) {\n          curStart = cm.getCursor('anchor');\n          curEnd = cm.getCursor('head');\n          curEnd.ch = lineLength(cm, curEnd.line) - 1;\n        } else {\n          // Repeat is the number of lines to join. Minimum 2 lines.\n          var repeat = Math.max(actionArgs.repeat, 2);\n          curStart = cm.getCursor();\n          curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1,\n                                               Infinity));\n        }\n        var finalCh = 0;\n        cm.operation(function() {\n          for (var i = curStart.line; i < curEnd.line; i++) {\n            finalCh = lineLength(cm, curStart.line);\n            var tmp = Pos(curStart.line + 1,\n                          lineLength(cm, curStart.line + 1));\n            var text = cm.getRange(curStart, tmp);\n            text = text.replace(/\\n\\s*/g, ' ');\n            cm.replaceRange(text, curStart, tmp);\n          }\n          var curFinalPos = Pos(curStart.line, finalCh);\n          cm.setCursor(curFinalPos);\n        });\n      },\n      newLineAndEnterInsertMode: function(cm, actionArgs, vim) {\n        vim.insertMode = true;\n        var insertAt = copyCursor(cm.getCursor());\n        if (insertAt.line === cm.firstLine() && !actionArgs.after) {\n          // Special case for inserting newline before start of document.\n          cm.replaceRange('\\n', Pos(cm.firstLine(), 0));\n          cm.setCursor(cm.firstLine(), 0);\n        } else {\n          insertAt.line = (actionArgs.after) ? insertAt.line :\n              insertAt.line - 1;\n          insertAt.ch = lineLength(cm, insertAt.line);\n          cm.setCursor(insertAt);\n          var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||\n              CodeMirror.commands.newlineAndIndent;\n          newlineFn(cm);\n        }\n        this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);\n      },\n      paste: function(cm, actionArgs) {\n        var cur = copyCursor(cm.getCursor());\n        var register = vimGlobalState.registerController.getRegister(\n            actionArgs.registerName);\n        var text = register.toString();\n        if (!text) {\n          return;\n        }\n        if (actionArgs.matchIndent) {\n          // length that considers tabs and cm.options.tabSize\n          var whitespaceLength = function(str) {\n            var tabs = (str.split(\"\\t\").length - 1);\n            var spaces = (str.split(\" \").length - 1);\n            return tabs * cm.options.tabSize + spaces * 1;\n          };\n          var currentLine = cm.getLine(cm.getCursor().line);\n          var indent = whitespaceLength(currentLine.match(/^\\s*/)[0]);\n          // chomp last newline b/c don't want it to match /^\\s*/gm\n          var chompedText = text.replace(/\\n$/, '');\n          var wasChomped = text !== chompedText;\n          var firstIndent = whitespaceLength(text.match(/^\\s*/)[0]);\n          var text = chompedText.replace(/^\\s*/gm, function(wspace) {\n            var newIndent = indent + (whitespaceLength(wspace) - firstIndent);\n            if (newIndent < 0) {\n              return \"\";\n            }\n            else if (cm.options.indentWithTabs) {\n              var quotient = Math.floor(newIndent / cm.options.tabSize);\n              return Array(quotient + 1).join('\\t');\n            }\n            else {\n              return Array(newIndent + 1).join(' ');\n            }\n          });\n          text += wasChomped ? \"\\n\" : \"\";\n        }\n        if (actionArgs.repeat > 1) {\n          var text = Array(actionArgs.repeat + 1).join(text);\n        }\n        var linewise = register.linewise;\n        if (linewise) {\n          if (actionArgs.after) {\n            // Move the newline at the end to the start instead, and paste just\n            // before the newline character of the line we are on right now.\n            text = '\\n' + text.slice(0, text.length - 1);\n            cur.ch = lineLength(cm, cur.line);\n          } else {\n            cur.ch = 0;\n          }\n        } else {\n          cur.ch += actionArgs.after ? 1 : 0;\n        }\n        cm.replaceRange(text, cur);\n        // Now fine tune the cursor to where we want it.\n        var curPosFinal;\n        var idx;\n        if (linewise && actionArgs.after) {\n          curPosFinal = Pos(\n            cur.line + 1,\n            findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)));\n        } else if (linewise && !actionArgs.after) {\n          curPosFinal = Pos(\n            cur.line,\n            findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)));\n        } else if (!linewise && actionArgs.after) {\n          idx = cm.indexFromPos(cur);\n          curPosFinal = cm.posFromIndex(idx + text.length - 1);\n        } else {\n          idx = cm.indexFromPos(cur);\n          curPosFinal = cm.posFromIndex(idx + text.length);\n        }\n        cm.setCursor(curPosFinal);\n      },\n      undo: function(cm, actionArgs) {\n        cm.operation(function() {\n          repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();\n          cm.setCursor(cm.getCursor('anchor'));\n        });\n      },\n      redo: function(cm, actionArgs) {\n        repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();\n      },\n      setRegister: function(_cm, actionArgs, vim) {\n        vim.inputState.registerName = actionArgs.selectedCharacter;\n      },\n      setMark: function(cm, actionArgs, vim) {\n        var markName = actionArgs.selectedCharacter;\n        updateMark(cm, vim, markName, cm.getCursor());\n      },\n      replace: function(cm, actionArgs, vim) {\n        var replaceWith = actionArgs.selectedCharacter;\n        var curStart = cm.getCursor();\n        var replaceTo;\n        var curEnd;\n        if (vim.visualMode){\n          curStart=cm.getCursor('start');\n          curEnd=cm.getCursor('end');\n          // workaround to catch the character under the cursor\n          //  existing workaround doesn't cover actions\n          curEnd=cm.clipPos(Pos(curEnd.line, curEnd.ch+1));\n        }else{\n          var line = cm.getLine(curStart.line);\n          replaceTo = curStart.ch + actionArgs.repeat;\n          if (replaceTo > line.length) {\n            replaceTo=line.length;\n          }\n          curEnd = Pos(curStart.line, replaceTo);\n        }\n        if (replaceWith=='\\n'){\n          if (!vim.visualMode) cm.replaceRange('', curStart, curEnd);\n          // special case, where vim help says to replace by just one line-break\n          (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);\n        }else {\n          var replaceWithStr=cm.getRange(curStart, curEnd);\n          //replace all characters in range by selected, but keep linebreaks\n          replaceWithStr=replaceWithStr.replace(/[^\\n]/g,replaceWith);\n          cm.replaceRange(replaceWithStr, curStart, curEnd);\n          if (vim.visualMode){\n            cm.setCursor(curStart);\n            exitVisualMode(cm);\n          }else{\n            cm.setCursor(offsetCursor(curEnd, 0, -1));\n          }\n        }\n      },\n      incrementNumberToken: function(cm, actionArgs) {\n        var cur = cm.getCursor();\n        var lineStr = cm.getLine(cur.line);\n        var re = /-?\\d+/g;\n        var match;\n        var start;\n        var end;\n        var numberStr;\n        var token;\n        while ((match = re.exec(lineStr)) !== null) {\n          token = match[0];\n          start = match.index;\n          end = start + token.length;\n          if (cur.ch < end)break;\n        }\n        if (!actionArgs.backtrack && (end <= cur.ch))return;\n        if (token) {\n          var increment = actionArgs.increase ? 1 : -1;\n          var number = parseInt(token) + (increment * actionArgs.repeat);\n          var from = Pos(cur.line, start);\n          var to = Pos(cur.line, end);\n          numberStr = number.toString();\n          cm.replaceRange(numberStr, from, to);\n        } else {\n          return;\n        }\n        cm.setCursor(Pos(cur.line, start + numberStr.length - 1));\n      },\n      repeatLastEdit: function(cm, actionArgs, vim) {\n        var lastEditInputState = vim.lastEditInputState;\n        if (!lastEditInputState) { return; }\n        var repeat = actionArgs.repeat;\n        if (repeat && actionArgs.repeatIsExplicit) {\n          vim.lastEditInputState.repeatOverride = repeat;\n        } else {\n          repeat = vim.lastEditInputState.repeatOverride || repeat;\n        }\n        repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);\n      },\n      changeCase: function(cm, actionArgs, vim) {\n        var selectedAreaRange = getSelectedAreaRange(cm, vim);\n        var selectionStart = selectedAreaRange[0];\n        var selectionEnd = selectedAreaRange[1];\n        var toLower = actionArgs.toLower;\n        if (cursorIsBefore(selectionEnd, selectionStart)) {\n          var tmp = selectionStart;\n          selectionStart = selectionEnd;\n          selectionEnd = tmp;\n        } else {\n          selectionEnd = cm.clipPos(Pos(selectionEnd.line, selectionEnd.ch+1));\n        }\n        var text = cm.getRange(selectionStart, selectionEnd);\n        cm.replaceRange(toLower ? text.toLowerCase() : text.toUpperCase(), selectionStart, selectionEnd);\n        cm.setCursor(selectionStart);\n      }\n    };\n\n    /*\n     * Below are miscellaneous utility functions used by vim.js\n     */\n\n    /**\n     * Clips cursor to ensure that line is within the buffer's range\n     * If includeLineBreak is true, then allow cur.ch == lineLength.\n     */\n    function clipCursorToContent(cm, cur, includeLineBreak) {\n      var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() );\n      var maxCh = lineLength(cm, line) - 1;\n      maxCh = (includeLineBreak) ? maxCh + 1 : maxCh;\n      var ch = Math.min(Math.max(0, cur.ch), maxCh);\n      return Pos(line, ch);\n    }\n    function copyArgs(args) {\n      var ret = {};\n      for (var prop in args) {\n        if (args.hasOwnProperty(prop)) {\n          ret[prop] = args[prop];\n        }\n      }\n      return ret;\n    }\n    function offsetCursor(cur, offsetLine, offsetCh) {\n      return Pos(cur.line + offsetLine, cur.ch + offsetCh);\n    }\n    function matchKeysPartial(pressed, mapped) {\n      for (var i = 0; i < pressed.length; i++) {\n        // 'character' means any character. For mark, register commads, etc.\n        if (pressed[i] != mapped[i] && mapped[i] != 'character') {\n          return false;\n        }\n      }\n      return true;\n    }\n    function repeatFn(cm, fn, repeat) {\n      return function() {\n        for (var i = 0; i < repeat; i++) {\n          fn(cm);\n        }\n      };\n    }\n    function copyCursor(cur) {\n      return Pos(cur.line, cur.ch);\n    }\n    function cursorEqual(cur1, cur2) {\n      return cur1.ch == cur2.ch && cur1.line == cur2.line;\n    }\n    function cursorIsBefore(cur1, cur2) {\n      if (cur1.line < cur2.line) {\n        return true;\n      }\n      if (cur1.line == cur2.line && cur1.ch < cur2.ch) {\n        return true;\n      }\n      return false;\n    }\n    function cusrorIsBetween(cur1, cur2, cur3) {\n      // returns true if cur2 is between cur1 and cur3.\n      var cur1before2 = cursorIsBefore(cur1, cur2);\n      var cur2before3 = cursorIsBefore(cur2, cur3);\n      return cur1before2 && cur2before3;\n    }\n    function lineLength(cm, lineNum) {\n      return cm.getLine(lineNum).length;\n    }\n    function reverse(s){\n      return s.split('').reverse().join('');\n    }\n    function trim(s) {\n      if (s.trim) {\n        return s.trim();\n      }\n      return s.replace(/^\\s+|\\s+$/g, '');\n    }\n    function escapeRegex(s) {\n      return s.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g, '\\\\$1');\n    }\n    function getSelectedAreaRange(cm, vim) {\n      var selectionStart = cm.getCursor('anchor');\n      var selectionEnd = cm.getCursor('head');\n      var lastSelection = vim.lastSelection;\n      if (!vim.visualMode) {\n        var line = lastSelection.curEnd.line - lastSelection.curStart.line;\n        var ch = line ? lastSelection.curEnd.ch : lastSelection.curEnd.ch - lastSelection.curStart.ch;\n        selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch};\n        if (lastSelection.visualLine) {\n          return [{line: selectionStart.line, ch: 0}, {line: selectionEnd.line, ch: lineLength(cm, selectionEnd.line)}];\n        }\n      } else {\n        exitVisualMode(cm);\n      }\n      return [selectionStart, selectionEnd];\n    }\n\n    function exitVisualMode(cm) {\n      cm.off('mousedown', exitVisualMode);\n      var vim = cm.state.vim;\n      // can't use selection state here because yank has already reset its cursor\n      vim.lastSelection = {'curStart': vim.marks['<'].find(),\n        'curEnd': vim.marks['>'].find(), 'visualMode': vim.visualMode,\n        'visualLine': vim.visualLine};\n      vim.visualMode = false;\n      vim.visualLine = false;\n      var selectionStart = cm.getCursor('anchor');\n      var selectionEnd = cm.getCursor('head');\n      if (!cursorEqual(selectionStart, selectionEnd)) {\n        // Clear the selection and set the cursor only if the selection has not\n        // already been cleared. Otherwise we risk moving the cursor somewhere\n        // it's not supposed to be.\n        cm.setCursor(clipCursorToContent(cm, selectionEnd));\n      }\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n    }\n\n    // Remove any trailing newlines from the selection. For\n    // example, with the caret at the start of the last word on the line,\n    // 'dw' should word, but not the newline, while 'w' should advance the\n    // caret to the first character of the next line.\n    function clipToLine(cm, curStart, curEnd) {\n      var selection = cm.getRange(curStart, curEnd);\n      // Only clip if the selection ends with trailing newline + whitespace\n      if (/\\n\\s*$/.test(selection)) {\n        var lines = selection.split('\\n');\n        // We know this is all whitepsace.\n        lines.pop();\n\n        // Cases:\n        // 1. Last word is an empty line - do not clip the trailing '\\n'\n        // 2. Last word is not an empty line - clip the trailing '\\n'\n        var line;\n        // Find the line containing the last word, and clip all whitespace up\n        // to it.\n        for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {\n          curEnd.line--;\n          curEnd.ch = 0;\n        }\n        // If the last word is not an empty line, clip an additional newline\n        if (line) {\n          curEnd.line--;\n          curEnd.ch = lineLength(cm, curEnd.line);\n        } else {\n          curEnd.ch = 0;\n        }\n      }\n    }\n\n    // Expand the selection to line ends.\n    function expandSelectionToLine(_cm, curStart, curEnd) {\n      curStart.ch = 0;\n      curEnd.ch = 0;\n      curEnd.line++;\n    }\n\n    function findFirstNonWhiteSpaceCharacter(text) {\n      if (!text) {\n        return 0;\n      }\n      var firstNonWS = text.search(/\\S/);\n      return firstNonWS == -1 ? text.length : firstNonWS;\n    }\n\n    function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) {\n      var cur = cm.getCursor();\n      var line = cm.getLine(cur.line);\n      var idx = cur.ch;\n\n      // Seek to first word or non-whitespace character, depending on if\n      // noSymbol is true.\n      var textAfterIdx = line.substring(idx);\n      var firstMatchedChar;\n      if (noSymbol) {\n        firstMatchedChar = textAfterIdx.search(/\\w/);\n      } else {\n        firstMatchedChar = textAfterIdx.search(/\\S/);\n      }\n      if (firstMatchedChar == -1) {\n        return null;\n      }\n      idx += firstMatchedChar;\n      textAfterIdx = line.substring(idx);\n      var textBeforeIdx = line.substring(0, idx);\n\n      var matchRegex;\n      // Greedy matchers for the \"word\" we are trying to expand.\n      if (bigWord) {\n        matchRegex = /^\\S+/;\n      } else {\n        if ((/\\w/).test(line.charAt(idx))) {\n          matchRegex = /^\\w+/;\n        } else {\n          matchRegex = /^[^\\w\\s]+/;\n        }\n      }\n\n      var wordAfterRegex = matchRegex.exec(textAfterIdx);\n      var wordStart = idx;\n      var wordEnd = idx + wordAfterRegex[0].length;\n      // TODO: Find a better way to do this. It will be slow on very long lines.\n      var revTextBeforeIdx = reverse(textBeforeIdx);\n      var wordBeforeRegex = matchRegex.exec(revTextBeforeIdx);\n      if (wordBeforeRegex) {\n        wordStart -= wordBeforeRegex[0].length;\n      }\n\n      if (inclusive) {\n        // If present, trim all whitespace after word.\n        // Otherwise, trim all whitespace before word.\n        var textAfterWordEnd = line.substring(wordEnd);\n        var whitespacesAfterWord = textAfterWordEnd.match(/^\\s*/)[0].length;\n        if (whitespacesAfterWord > 0) {\n          wordEnd += whitespacesAfterWord;\n        } else {\n          var revTrim = revTextBeforeIdx.length - wordStart;\n          var textBeforeWordStart = revTextBeforeIdx.substring(revTrim);\n          var whitespacesBeforeWord = textBeforeWordStart.match(/^\\s*/)[0].length;\n          wordStart -= whitespacesBeforeWord;\n        }\n      }\n\n      return { start: Pos(cur.line, wordStart),\n               end: Pos(cur.line, wordEnd) };\n    }\n\n    function recordJumpPosition(cm, oldCur, newCur) {\n      if (!cursorEqual(oldCur, newCur)) {\n        vimGlobalState.jumpList.add(cm, oldCur, newCur);\n      }\n    }\n\n    function recordLastCharacterSearch(increment, args) {\n        vimGlobalState.lastChararacterSearch.increment = increment;\n        vimGlobalState.lastChararacterSearch.forward = args.forward;\n        vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;\n    }\n\n    var symbolToMode = {\n        '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',\n        '[': 'section', ']': 'section',\n        '*': 'comment', '/': 'comment',\n        'm': 'method', 'M': 'method',\n        '#': 'preprocess'\n    };\n    var findSymbolModes = {\n      bracket: {\n        isComplete: function(state) {\n          if (state.nextCh === state.symb) {\n            state.depth++;\n            if (state.depth >= 1)return true;\n          } else if (state.nextCh === state.reverseSymb) {\n            state.depth--;\n          }\n          return false;\n        }\n      },\n      section: {\n        init: function(state) {\n          state.curMoveThrough = true;\n          state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';\n        },\n        isComplete: function(state) {\n          return state.index === 0 && state.nextCh === state.symb;\n        }\n      },\n      comment: {\n        isComplete: function(state) {\n          var found = state.lastCh === '*' && state.nextCh === '/';\n          state.lastCh = state.nextCh;\n          return found;\n        }\n      },\n      // TODO: The original Vim implementation only operates on level 1 and 2.\n      // The current implementation doesn't check for code block level and\n      // therefore it operates on any levels.\n      method: {\n        init: function(state) {\n          state.symb = (state.symb === 'm' ? '{' : '}');\n          state.reverseSymb = state.symb === '{' ? '}' : '{';\n        },\n        isComplete: function(state) {\n          if (state.nextCh === state.symb)return true;\n          return false;\n        }\n      },\n      preprocess: {\n        init: function(state) {\n          state.index = 0;\n        },\n        isComplete: function(state) {\n          if (state.nextCh === '#') {\n            var token = state.lineText.match(/#(\\w+)/)[1];\n            if (token === 'endif') {\n              if (state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth++;\n            } else if (token === 'if') {\n              if (!state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth--;\n            }\n            if (token === 'else' && state.depth === 0)return true;\n          }\n          return false;\n        }\n      }\n    };\n    function findSymbol(cm, repeat, forward, symb) {\n      var cur = copyCursor(cm.getCursor());\n      var increment = forward ? 1 : -1;\n      var endLine = forward ? cm.lineCount() : -1;\n      var curCh = cur.ch;\n      var line = cur.line;\n      var lineText = cm.getLine(line);\n      var state = {\n        lineText: lineText,\n        nextCh: lineText.charAt(curCh),\n        lastCh: null,\n        index: curCh,\n        symb: symb,\n        reverseSymb: (forward ?  { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],\n        forward: forward,\n        depth: 0,\n        curMoveThrough: false\n      };\n      var mode = symbolToMode[symb];\n      if (!mode)return cur;\n      var init = findSymbolModes[mode].init;\n      var isComplete = findSymbolModes[mode].isComplete;\n      if (init) { init(state); }\n      while (line !== endLine && repeat) {\n        state.index += increment;\n        state.nextCh = state.lineText.charAt(state.index);\n        if (!state.nextCh) {\n          line += increment;\n          state.lineText = cm.getLine(line) || '';\n          if (increment > 0) {\n            state.index = 0;\n          } else {\n            var lineLen = state.lineText.length;\n            state.index = (lineLen > 0) ? (lineLen-1) : 0;\n          }\n          state.nextCh = state.lineText.charAt(state.index);\n        }\n        if (isComplete(state)) {\n          cur.line = line;\n          cur.ch = state.index;\n          repeat--;\n        }\n      }\n      if (state.nextCh || state.curMoveThrough) {\n        return Pos(line, state.index);\n      }\n      return cur;\n    }\n\n    /*\n     * Returns the boundaries of the next word. If the cursor in the middle of\n     * the word, then returns the boundaries of the current word, starting at\n     * the cursor. If the cursor is at the start/end of a word, and we are going\n     * forward/backward, respectively, find the boundaries of the next word.\n     *\n     * @param {CodeMirror} cm CodeMirror object.\n     * @param {Cursor} cur The cursor position.\n     * @param {boolean} forward True to search forward. False to search\n     *     backward.\n     * @param {boolean} bigWord True if punctuation count as part of the word.\n     *     False if only [a-zA-Z0-9] characters count as part of the word.\n     * @param {boolean} emptyLineIsWord True if empty lines should be treated\n     *     as words.\n     * @return {Object{from:number, to:number, line: number}} The boundaries of\n     *     the word, or null if there are no more words.\n     */\n    function findWord(cm, cur, forward, bigWord, emptyLineIsWord) {\n      var lineNum = cur.line;\n      var pos = cur.ch;\n      var line = cm.getLine(lineNum);\n      var dir = forward ? 1 : -1;\n      var regexps = bigWord ? bigWordRegexp : wordRegexp;\n\n      if (emptyLineIsWord && line == '') {\n        lineNum += dir;\n        line = cm.getLine(lineNum);\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        pos = (forward) ? 0 : line.length;\n      }\n\n      while (true) {\n        if (emptyLineIsWord && line == '') {\n          return { from: 0, to: 0, line: lineNum };\n        }\n        var stop = (dir > 0) ? line.length : -1;\n        var wordStart = stop, wordEnd = stop;\n        // Find bounds of next word.\n        while (pos != stop) {\n          var foundWord = false;\n          for (var i = 0; i < regexps.length && !foundWord; ++i) {\n            if (regexps[i].test(line.charAt(pos))) {\n              wordStart = pos;\n              // Advance to end of word.\n              while (pos != stop && regexps[i].test(line.charAt(pos))) {\n                pos += dir;\n              }\n              wordEnd = pos;\n              foundWord = wordStart != wordEnd;\n              if (wordStart == cur.ch && lineNum == cur.line &&\n                  wordEnd == wordStart + dir) {\n                // We started at the end of a word. Find the next one.\n                continue;\n              } else {\n                return {\n                  from: Math.min(wordStart, wordEnd + 1),\n                  to: Math.max(wordStart, wordEnd),\n                  line: lineNum };\n              }\n            }\n          }\n          if (!foundWord) {\n            pos += dir;\n          }\n        }\n        // Advance to next/prev line.\n        lineNum += dir;\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        line = cm.getLine(lineNum);\n        pos = (dir > 0) ? 0 : line.length;\n      }\n      // Should never get here.\n      throw new Error('The impossible happened.');\n    }\n\n    /**\n     * @param {CodeMirror} cm CodeMirror object.\n     * @param {int} repeat Number of words to move past.\n     * @param {boolean} forward True to search forward. False to search\n     *     backward.\n     * @param {boolean} wordEnd True to move to end of word. False to move to\n     *     beginning of word.\n     * @param {boolean} bigWord True if punctuation count as part of the word.\n     *     False if only alphabet characters count as part of the word.\n     * @return {Cursor} The position the cursor should move to.\n     */\n    function moveToWord(cm, repeat, forward, wordEnd, bigWord) {\n      var cur = cm.getCursor();\n      var curStart = copyCursor(cur);\n      var words = [];\n      if (forward && !wordEnd || !forward && wordEnd) {\n        repeat++;\n      }\n      // For 'e', empty lines are not considered words, go figure.\n      var emptyLineIsWord = !(forward && wordEnd);\n      for (var i = 0; i < repeat; i++) {\n        var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);\n        if (!word) {\n          var eodCh = lineLength(cm, cm.lastLine());\n          words.push(forward\n              ? {line: cm.lastLine(), from: eodCh, to: eodCh}\n              : {line: 0, from: 0, to: 0});\n          break;\n        }\n        words.push(word);\n        cur = Pos(word.line, forward ? (word.to - 1) : word.from);\n      }\n      var shortCircuit = words.length != repeat;\n      var firstWord = words[0];\n      var lastWord = words.pop();\n      if (forward && !wordEnd) {\n        // w\n        if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {\n          // We did not start in the middle of a word. Discard the extra word at the end.\n          lastWord = words.pop();\n        }\n        return Pos(lastWord.line, lastWord.from);\n      } else if (forward && wordEnd) {\n        return Pos(lastWord.line, lastWord.to - 1);\n      } else if (!forward && wordEnd) {\n        // ge\n        if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {\n          // We did not start in the middle of a word. Discard the extra word at the end.\n          lastWord = words.pop();\n        }\n        return Pos(lastWord.line, lastWord.to);\n      } else {\n        // b\n        return Pos(lastWord.line, lastWord.from);\n      }\n    }\n\n    function moveToCharacter(cm, repeat, forward, character) {\n      var cur = cm.getCursor();\n      var start = cur.ch;\n      var idx;\n      for (var i = 0; i < repeat; i ++) {\n        var line = cm.getLine(cur.line);\n        idx = charIdxInLine(start, line, character, forward, true);\n        if (idx == -1) {\n          return null;\n        }\n        start = idx;\n      }\n      return Pos(cm.getCursor().line, idx);\n    }\n\n    function moveToColumn(cm, repeat) {\n      // repeat is always >= 1, so repeat - 1 always corresponds\n      // to the column we want to go to.\n      var line = cm.getCursor().line;\n      return clipCursorToContent(cm, Pos(line, repeat - 1));\n    }\n\n    function updateMark(cm, vim, markName, pos) {\n      if (!inArray(markName, validMarks)) {\n        return;\n      }\n      if (vim.marks[markName]) {\n        vim.marks[markName].clear();\n      }\n      vim.marks[markName] = cm.setBookmark(pos);\n    }\n\n    function charIdxInLine(start, line, character, forward, includeChar) {\n      // Search for char in line.\n      // motion_options: {forward, includeChar}\n      // If includeChar = true, include it too.\n      // If forward = true, search forward, else search backwards.\n      // If char is not found on this line, do nothing\n      var idx;\n      if (forward) {\n        idx = line.indexOf(character, start + 1);\n        if (idx != -1 && !includeChar) {\n          idx -= 1;\n        }\n      } else {\n        idx = line.lastIndexOf(character, start - 1);\n        if (idx != -1 && !includeChar) {\n          idx += 1;\n        }\n      }\n      return idx;\n    }\n\n    // TODO: perhaps this finagling of start and end positions belonds\n    // in codmirror/replaceRange?\n    function selectCompanionObject(cm, symb, inclusive) {\n      var cur = cm.getCursor(), start, end;\n\n      var bracketRegexp = ({\n        '(': /[()]/, ')': /[()]/,\n        '[': /[[\\]]/, ']': /[[\\]]/,\n        '{': /[{}]/, '}': /[{}]/})[symb];\n      var openSym = ({\n        '(': '(', ')': '(',\n        '[': '[', ']': '[',\n        '{': '{', '}': '{'})[symb];\n      var curChar = cm.getLine(cur.line).charAt(cur.ch);\n      // Due to the behavior of scanForBracket, we need to add an offset if the\n      // cursor is on a matching open bracket.\n      var offset = curChar === openSym ? 1 : 0;\n\n      start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp});\n      end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp});\n\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n\n      start = start.pos;\n      end = end.pos;\n\n      if ((start.line == end.line && start.ch > end.ch)\n          || (start.line > end.line)) {\n        var tmp = start;\n        start = end;\n        end = tmp;\n      }\n\n      if (inclusive) {\n        end.ch += 1;\n      } else {\n        start.ch += 1;\n      }\n\n      return { start: start, end: end };\n    }\n\n    // Takes in a symbol and a cursor and tries to simulate text objects that\n    // have identical opening and closing symbols\n    // TODO support across multiple lines\n    function findBeginningAndEnd(cm, symb, inclusive) {\n      var cur = copyCursor(cm.getCursor());\n      var line = cm.getLine(cur.line);\n      var chars = line.split('');\n      var start, end, i, len;\n      var firstIndex = chars.indexOf(symb);\n\n      // the decision tree is to always look backwards for the beginning first,\n      // but if the cursor is in front of the first instance of the symb,\n      // then move the cursor forward\n      if (cur.ch < firstIndex) {\n        cur.ch = firstIndex;\n        // Why is this line even here???\n        // cm.setCursor(cur.line, firstIndex+1);\n      }\n      // otherwise if the cursor is currently on the closing symbol\n      else if (firstIndex < cur.ch && chars[cur.ch] == symb) {\n        end = cur.ch; // assign end to the current cursor\n        --cur.ch; // make sure to look backwards\n      }\n\n      // if we're currently on the symbol, we've got a start\n      if (chars[cur.ch] == symb && !end) {\n        start = cur.ch + 1; // assign start to ahead of the cursor\n      } else {\n        // go backwards to find the start\n        for (i = cur.ch; i > -1 && !start; i--) {\n          if (chars[i] == symb) {\n            start = i + 1;\n          }\n        }\n      }\n\n      // look forwards for the end symbol\n      if (start && !end) {\n        for (i = start, len = chars.length; i < len && !end; i++) {\n          if (chars[i] == symb) {\n            end = i;\n          }\n        }\n      }\n\n      // nothing found\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n\n      // include the symbols\n      if (inclusive) {\n        --start; ++end;\n      }\n\n      return {\n        start: Pos(cur.line, start),\n        end: Pos(cur.line, end)\n      };\n    }\n\n    // Search functions\n    defineOption('pcre', true, 'boolean');\n    function SearchState() {}\n    SearchState.prototype = {\n      getQuery: function() {\n        return vimGlobalState.query;\n      },\n      setQuery: function(query) {\n        vimGlobalState.query = query;\n      },\n      getOverlay: function() {\n        return this.searchOverlay;\n      },\n      setOverlay: function(overlay) {\n        this.searchOverlay = overlay;\n      },\n      isReversed: function() {\n        return vimGlobalState.isReversed;\n      },\n      setReversed: function(reversed) {\n        vimGlobalState.isReversed = reversed;\n      }\n    };\n    function getSearchState(cm) {\n      var vim = cm.state.vim;\n      return vim.searchState_ || (vim.searchState_ = new SearchState());\n    }\n    function dialog(cm, template, shortText, onClose, options) {\n      if (cm.openDialog) {\n        cm.openDialog(template, onClose, { bottom: true, value: options.value,\n            onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp });\n      }\n      else {\n        onClose(prompt(shortText, ''));\n      }\n    }\n\n    function findUnescapedSlashes(str) {\n      var escapeNextChar = false;\n      var slashes = [];\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charAt(i);\n        if (!escapeNextChar && c == '/') {\n          slashes.push(i);\n        }\n        escapeNextChar = !escapeNextChar && (c == '\\\\');\n      }\n      return slashes;\n    }\n\n    // Translates a search string from ex (vim) syntax into javascript form.\n    function translateRegex(str) {\n      // When these match, add a '\\' if unescaped or remove one if escaped.\n      var specials = '|(){';\n      // Remove, but never add, a '\\' for these.\n      var unescape = '}';\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        var specialComesNext = (n && specials.indexOf(n) != -1);\n        if (escapeNextChar) {\n          if (c !== '\\\\' || !specialComesNext) {\n            out.push(c);\n          }\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            // Treat the unescape list as special for removing, but not adding '\\'.\n            if (n && unescape.indexOf(n) != -1) {\n              specialComesNext = true;\n            }\n            // Not passing this test means removing a '\\'.\n            if (!specialComesNext || n === '\\\\') {\n              out.push(c);\n            }\n          } else {\n            out.push(c);\n            if (specialComesNext && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n\n    // Translates the replace part of a search and replace from ex (vim) syntax into\n    // javascript form.  Similar to translateRegex, but additionally fixes back references\n    // (translates '\\[0..9]' to '$[0..9]') and follows different rules for escaping '$'.\n    function translateRegexReplace(str) {\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        if (escapeNextChar) {\n          // At any point in the loop, escapeNextChar is true if the previous\n          // character was a '\\' and was not escaped.\n          out.push(c);\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            if ((isNumber(n) || n === '$')) {\n              out.push('$');\n            } else if (n !== '/' && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          } else {\n            if (c === '$') {\n              out.push('$');\n            }\n            out.push(c);\n            if (n === '/') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n\n    // Unescape \\ and / in the replace part, for PCRE mode.\n    function unescapeRegexReplace(str) {\n      var stream = new CodeMirror.StringStream(str);\n      var output = [];\n      while (!stream.eol()) {\n        // Search for \\.\n        while (stream.peek() && stream.peek() != '\\\\') {\n          output.push(stream.next());\n        }\n        if (stream.match('\\\\/', true)) {\n          // \\/ => /\n          output.push('/');\n        } else if (stream.match('\\\\\\\\', true)) {\n          // \\\\ => \\\n          output.push('\\\\');\n        } else {\n          // Don't change anything\n          output.push(stream.next());\n        }\n      }\n      return output.join('');\n    }\n\n    /**\n     * Extract the regular expression from the query and return a Regexp object.\n     * Returns null if the query is blank.\n     * If ignoreCase is passed in, the Regexp object will have the 'i' flag set.\n     * If smartCase is passed in, and the query contains upper case letters,\n     *   then ignoreCase is overridden, and the 'i' flag will not be set.\n     * If the query contains the /i in the flag part of the regular expression,\n     *   then both ignoreCase and smartCase are ignored, and 'i' will be passed\n     *   through to the Regex object.\n     */\n    function parseQuery(query, ignoreCase, smartCase) {\n      // Check if the query is already a regex.\n      if (query instanceof RegExp) { return query; }\n      // First try to extract regex + flags from the input. If no flags found,\n      // extract just the regex. IE does not accept flags directly defined in\n      // the regex string in the form /regex/flags\n      var slashes = findUnescapedSlashes(query);\n      var regexPart;\n      var forceIgnoreCase;\n      if (!slashes.length) {\n        // Query looks like 'regexp'\n        regexPart = query;\n      } else {\n        // Query looks like 'regexp/...'\n        regexPart = query.substring(0, slashes[0]);\n        var flagsPart = query.substring(slashes[0]);\n        forceIgnoreCase = (flagsPart.indexOf('i') != -1);\n      }\n      if (!regexPart) {\n        return null;\n      }\n      if (!getOption('pcre')) {\n        regexPart = translateRegex(regexPart);\n      }\n      if (smartCase) {\n        ignoreCase = (/^[^A-Z]*$/).test(regexPart);\n      }\n      var regexp = new RegExp(regexPart,\n          (ignoreCase || forceIgnoreCase) ? 'i' : undefined);\n      return regexp;\n    }\n    function showConfirm(cm, text) {\n      if (cm.openNotification) {\n        cm.openNotification('<span style=\"color: red\">' + text + '</span>',\n                            {bottom: true, duration: 5000});\n      } else {\n        alert(text);\n      }\n    }\n    function makePrompt(prefix, desc) {\n      var raw = '';\n      if (prefix) {\n        raw += '<span style=\"font-family: monospace\">' + prefix + '</span>';\n      }\n      raw += '<input type=\"text\"/> ' +\n          '<span style=\"color: #888\">';\n      if (desc) {\n        raw += '<span style=\"color: #888\">';\n        raw += desc;\n        raw += '</span>';\n      }\n      return raw;\n    }\n    var searchPromptDesc = '(Javascript regexp)';\n    function showPrompt(cm, options) {\n      var shortText = (options.prefix || '') + ' ' + (options.desc || '');\n      var prompt = makePrompt(options.prefix, options.desc);\n      dialog(cm, prompt, shortText, options.onClose, options);\n    }\n    function regexEqual(r1, r2) {\n      if (r1 instanceof RegExp && r2 instanceof RegExp) {\n          var props = ['global', 'multiline', 'ignoreCase', 'source'];\n          for (var i = 0; i < props.length; i++) {\n              var prop = props[i];\n              if (r1[prop] !== r2[prop]) {\n                  return false;\n              }\n          }\n          return true;\n      }\n      return false;\n    }\n    // Returns true if the query is valid.\n    function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {\n      if (!rawQuery) {\n        return;\n      }\n      var state = getSearchState(cm);\n      var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase);\n      if (!query) {\n        return;\n      }\n      highlightSearchMatches(cm, query);\n      if (regexEqual(query, state.getQuery())) {\n        return query;\n      }\n      state.setQuery(query);\n      return query;\n    }\n    function searchOverlay(query) {\n      if (query.source.charAt(0) == '^') {\n        var matchSol = true;\n      }\n      return {\n        token: function(stream) {\n          if (matchSol && !stream.sol()) {\n            stream.skipToEnd();\n            return;\n          }\n          var match = stream.match(query, false);\n          if (match) {\n            if (match[0].length == 0) {\n              // Matched empty string, skip to next.\n              stream.next();\n              return 'searching';\n            }\n            if (!stream.sol()) {\n              // Backtrack 1 to match \\b\n              stream.backUp(1);\n              if (!query.exec(stream.next() + match[0])) {\n                stream.next();\n                return null;\n              }\n            }\n            stream.match(query);\n            return 'searching';\n          }\n          while (!stream.eol()) {\n            stream.next();\n            if (stream.match(query, false)) break;\n          }\n        },\n        query: query\n      };\n    }\n    function highlightSearchMatches(cm, query) {\n      var overlay = getSearchState(cm).getOverlay();\n      if (!overlay || query != overlay.query) {\n        if (overlay) {\n          cm.removeOverlay(overlay);\n        }\n        overlay = searchOverlay(query);\n        cm.addOverlay(overlay);\n        getSearchState(cm).setOverlay(overlay);\n      }\n    }\n    function findNext(cm, prev, query, repeat) {\n      if (repeat === undefined) { repeat = 1; }\n      return cm.operation(function() {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n        for (var i = 0; i < repeat; i++) {\n          var found = cursor.find(prev);\n          if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); }\n          if (!found) {\n            // SearchCursor may have returned null because it hit EOF, wrap\n            // around and try again.\n            cursor = cm.getSearchCursor(query,\n                (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) );\n            if (!cursor.find(prev)) {\n              return;\n            }\n          }\n        }\n        return cursor.from();\n      });\n    }\n    function clearSearchHighlight(cm) {\n      cm.removeOverlay(getSearchState(cm).getOverlay());\n      getSearchState(cm).setOverlay(null);\n    }\n    /**\n     * Check if pos is in the specified range, INCLUSIVE.\n     * Range can be specified with 1 or 2 arguments.\n     * If the first range argument is an array, treat it as an array of line\n     * numbers. Match pos against any of the lines.\n     * If the first range argument is a number,\n     *   if there is only 1 range argument, check if pos has the same line\n     *       number\n     *   if there are 2 range arguments, then check if pos is in between the two\n     *       range arguments.\n     */\n    function isInRange(pos, start, end) {\n      if (typeof pos != 'number') {\n        // Assume it is a cursor position. Get the line number.\n        pos = pos.line;\n      }\n      if (start instanceof Array) {\n        return inArray(pos, start);\n      } else {\n        if (end) {\n          return (pos >= start && pos <= end);\n        } else {\n          return pos == start;\n        }\n      }\n    }\n    function getUserVisibleLines(cm) {\n      var scrollInfo = cm.getScrollInfo();\n      var occludeToleranceTop = 6;\n      var occludeToleranceBottom = 10;\n      var from = cm.coordsChar({left:0, top: occludeToleranceTop + scrollInfo.top}, 'local');\n      var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top;\n      var to = cm.coordsChar({left:0, top: bottomY}, 'local');\n      return {top: from.line, bottom: to.line};\n    }\n\n    // Ex command handling\n    // Care must be taken when adding to the default Ex command map. For any\n    // pair of commands that have a shared prefix, at least one of their\n    // shortNames must not match the prefix of the other command.\n    var defaultExCommandMap = [\n      { name: 'map' },\n      { name: 'nmap', shortName: 'nm' },\n      { name: 'vmap', shortName: 'vm' },\n      { name: 'unmap' },\n      { name: 'write', shortName: 'w' },\n      { name: 'undo', shortName: 'u' },\n      { name: 'redo', shortName: 'red' },\n      { name: 'set', shortName: 'set' },\n      { name: 'sort', shortName: 'sor' },\n      { name: 'substitute', shortName: 's' },\n      { name: 'nohlsearch', shortName: 'noh' },\n      { name: 'delmarks', shortName: 'delm' },\n      { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true }\n    ];\n    Vim.ExCommandDispatcher = function() {\n      this.buildCommandMap_();\n    };\n    Vim.ExCommandDispatcher.prototype = {\n      processCommand: function(cm, input) {\n        var vim = cm.state.vim;\n        var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');\n        var previousCommand = commandHistoryRegister.toString();\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        var inputStream = new CodeMirror.StringStream(input);\n        // update \": with the latest command whether valid or invalid\n        commandHistoryRegister.setText(input);\n        var params = {};\n        params.input = input;\n        try {\n          this.parseInput_(cm, inputStream, params);\n        } catch(e) {\n          showConfirm(cm, e);\n          throw e;\n        }\n        var commandName;\n        if (!params.commandName) {\n          // If only a line range is defined, move to the line.\n          if (params.line !== undefined) {\n            commandName = 'move';\n          }\n        } else {\n          var command = this.matchCommand_(params.commandName);\n          if (command) {\n            commandName = command.name;\n            if (command.excludeFromCommandHistory) {\n              commandHistoryRegister.setText(previousCommand);\n            }\n            this.parseCommandArgs_(inputStream, params, command);\n            if (command.type == 'exToKey') {\n              // Handle Ex to Key mapping.\n              for (var i = 0; i < command.toKeys.length; i++) {\n                CodeMirror.Vim.handleKey(cm, command.toKeys[i]);\n              }\n              return;\n            } else if (command.type == 'exToEx') {\n              // Handle Ex to Ex mapping.\n              this.processCommand(cm, command.toInput);\n              return;\n            }\n          }\n        }\n        if (!commandName) {\n          showConfirm(cm, 'Not an editor command \":' + input + '\"');\n          return;\n        }\n        try {\n          exCommands[commandName](cm, params);\n        } catch(e) {\n          showConfirm(cm, e);\n          throw e;\n        }\n      },\n      parseInput_: function(cm, inputStream, result) {\n        inputStream.eatWhile(':');\n        // Parse range.\n        if (inputStream.eat('%')) {\n          result.line = cm.firstLine();\n          result.lineEnd = cm.lastLine();\n        } else {\n          result.line = this.parseLineSpec_(cm, inputStream);\n          if (result.line !== undefined && inputStream.eat(',')) {\n            result.lineEnd = this.parseLineSpec_(cm, inputStream);\n          }\n        }\n\n        // Parse command name.\n        var commandMatch = inputStream.match(/^(\\w+)/);\n        if (commandMatch) {\n          result.commandName = commandMatch[1];\n        } else {\n          result.commandName = inputStream.match(/.*/)[0];\n        }\n\n        return result;\n      },\n      parseLineSpec_: function(cm, inputStream) {\n        var numberMatch = inputStream.match(/^(\\d+)/);\n        if (numberMatch) {\n          return parseInt(numberMatch[1], 10) - 1;\n        }\n        switch (inputStream.next()) {\n          case '.':\n            return cm.getCursor().line;\n          case '$':\n            return cm.lastLine();\n          case '\\'':\n            var mark = cm.state.vim.marks[inputStream.next()];\n            if (mark && mark.find()) {\n              return mark.find().line;\n            }\n            throw new Error('Mark not set');\n          default:\n            inputStream.backUp(1);\n            return undefined;\n        }\n      },\n      parseCommandArgs_: function(inputStream, params, command) {\n        if (inputStream.eol()) {\n          return;\n        }\n        params.argString = inputStream.match(/.*/)[0];\n        // Parse command-line arguments\n        var delim = command.argDelimiter || /\\s+/;\n        var args = trim(params.argString).split(delim);\n        if (args.length && args[0]) {\n          params.args = args;\n        }\n      },\n      matchCommand_: function(commandName) {\n        // Return the command in the command map that matches the shortest\n        // prefix of the passed in command name. The match is guaranteed to be\n        // unambiguous if the defaultExCommandMap's shortNames are set up\n        // correctly. (see @code{defaultExCommandMap}).\n        for (var i = commandName.length; i > 0; i--) {\n          var prefix = commandName.substring(0, i);\n          if (this.commandMap_[prefix]) {\n            var command = this.commandMap_[prefix];\n            if (command.name.indexOf(commandName) === 0) {\n              return command;\n            }\n          }\n        }\n        return null;\n      },\n      buildCommandMap_: function() {\n        this.commandMap_ = {};\n        for (var i = 0; i < defaultExCommandMap.length; i++) {\n          var command = defaultExCommandMap[i];\n          var key = command.shortName || command.name;\n          this.commandMap_[key] = command;\n        }\n      },\n      map: function(lhs, rhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            // Ex to Ex mapping\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToEx',\n              toInput: rhs.substring(1),\n              user: true\n            };\n          } else {\n            // Ex to key mapping\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToKey',\n              toKeys: parseKeyString(rhs),\n              user: true\n            };\n          }\n        } else {\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            // Key to Ex mapping.\n            var mapping = {\n              keys: parseKeyString(lhs),\n              type: 'keyToEx',\n              exArgs: { input: rhs.substring(1) },\n              user: true};\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          } else {\n            // Key to key mapping\n            var mapping = {\n              keys: parseKeyString(lhs),\n              type: 'keyToKey',\n              toKeys: parseKeyString(rhs),\n              user: true\n            };\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          }\n        }\n      },\n      unmap: function(lhs, ctx) {\n        var arrayEquals = function(a, b) {\n          if (a === b) return true;\n          if (a == null || b == null) return true;\n          if (a.length != b.length) return false;\n          for (var i = 0; i < a.length; i++) {\n            if (a[i] !== b[i]) return false;\n          }\n          return true;\n        };\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          // Ex to Ex or Ex to key mapping\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (this.commandMap_[commandName] && this.commandMap_[commandName].user) {\n            delete this.commandMap_[commandName];\n            return;\n          }\n        } else {\n          // Key to Ex or key to key mapping\n          var keys = parseKeyString(lhs);\n          for (var i = 0; i < defaultKeymap.length; i++) {\n            if (arrayEquals(keys, defaultKeymap[i].keys)\n                && defaultKeymap[i].context === ctx\n                && defaultKeymap[i].user) {\n              defaultKeymap.splice(i, 1);\n              return;\n            }\n          }\n        }\n        throw Error('No such mapping.');\n      }\n    };\n\n    // Converts a key string sequence of the form a<C-w>bd<Left> into Vim's\n    // keymap representation.\n    function parseKeyString(str) {\n      var key, match;\n      var keys = [];\n      while (str) {\n        match = (/<\\w+-.+?>|<\\w+>|./).exec(str);\n        if (match === null)break;\n        key = match[0];\n        str = str.substring(match.index + key.length);\n        keys.push(key);\n      }\n      return keys;\n    }\n\n    var exCommands = {\n      map: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 2) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx);\n      },\n      nmap: function(cm, params) { this.map(cm, params, 'normal'); },\n      vmap: function(cm, params) { this.map(cm, params, 'visual'); },\n      unmap: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 1) {\n          if (cm) {\n            showConfirm(cm, 'No such mapping: ' + params.input);\n          }\n          return;\n        }\n        exCommandDispatcher.unmap(mapArgs[0], ctx);\n      },\n      move: function(cm, params) {\n        commandDispatcher.processCommand(cm, cm.state.vim, {\n            type: 'motion',\n            motion: 'moveToLineOrEdgeOfDocument',\n            motionArgs: { forward: false, explicitRepeat: true,\n              linewise: true },\n            repeatOverride: params.line+1});\n      },\n      set: function(cm, params) {\n        var setArgs = params.args;\n        if (!setArgs || setArgs.length < 1) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        var expr = setArgs[0].split('=');\n        var optionName = expr[0];\n        var value = expr[1];\n        var forceGet = false;\n\n        if (optionName.charAt(optionName.length - 1) == '?') {\n          // If post-fixed with ?, then the set is actually a get.\n          if (value) { throw Error('Trailing characters: ' + params.argString); }\n          optionName = optionName.substring(0, optionName.length - 1);\n          forceGet = true;\n        }\n        if (value === undefined && optionName.substring(0, 2) == 'no') {\n          // To set boolean options to false, the option name is prefixed with\n          // 'no'.\n          optionName = optionName.substring(2);\n          value = false;\n        }\n        var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean';\n        if (optionIsBoolean && value == undefined) {\n          // Calling set with a boolean option sets it to true.\n          value = true;\n        }\n        if (!optionIsBoolean && !value || forceGet) {\n          var oldValue = getOption(optionName);\n          // If no value is provided, then we assume this is a get.\n          if (oldValue === true || oldValue === false) {\n            showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);\n          } else {\n            showConfirm(cm, '  ' + optionName + '=' + oldValue);\n          }\n        } else {\n          setOption(optionName, value);\n        }\n      },\n      registers: function(cm,params) {\n        var regArgs = params.args;\n        var registers = vimGlobalState.registerController.registers;\n        var regInfo = '----------Registers----------<br><br>';\n        if (!regArgs) {\n          for (var registerName in registers) {\n            var text = registers[registerName].toString();\n            if (text.length) {\n              regInfo += '\"' + registerName + '    ' + text + '<br>';\n            }\n          }\n        } else {\n          var registerName;\n          regArgs = regArgs.join('');\n          for (var i = 0; i < regArgs.length; i++) {\n            registerName = regArgs.charAt(i);\n            if (!vimGlobalState.registerController.isValidRegister(registerName)) {\n              continue;\n            }\n            var register = registers[registerName] || new Register();\n            regInfo += '\"' + registerName + '    ' + register.toString() + '<br>';\n          }\n        }\n        showConfirm(cm, regInfo);\n      },\n      sort: function(cm, params) {\n        var reverse, ignoreCase, unique, number;\n        function parseArgs() {\n          if (params.argString) {\n            var args = new CodeMirror.StringStream(params.argString);\n            if (args.eat('!')) { reverse = true; }\n            if (args.eol()) { return; }\n            if (!args.eatSpace()) { return 'Invalid arguments'; }\n            var opts = args.match(/[a-z]+/);\n            if (opts) {\n              opts = opts[0];\n              ignoreCase = opts.indexOf('i') != -1;\n              unique = opts.indexOf('u') != -1;\n              var decimal = opts.indexOf('d') != -1 && 1;\n              var hex = opts.indexOf('x') != -1 && 1;\n              var octal = opts.indexOf('o') != -1 && 1;\n              if (decimal + hex + octal > 1) { return 'Invalid arguments'; }\n              number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';\n            }\n            if (args.eatSpace() && args.match(/\\/.*\\//)) { 'patterns not supported'; }\n          }\n        }\n        var err = parseArgs();\n        if (err) {\n          showConfirm(cm, err + ': ' + params.argString);\n          return;\n        }\n        var lineStart = params.line || cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        if (lineStart == lineEnd) { return; }\n        var curStart = Pos(lineStart, 0);\n        var curEnd = Pos(lineEnd, lineLength(cm, lineEnd));\n        var text = cm.getRange(curStart, curEnd).split('\\n');\n        var numberRegex = (number == 'decimal') ? /(-?)([\\d]+)/ :\n           (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :\n           (number == 'octal') ? /([0-7]+)/ : null;\n        var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;\n        var numPart = [], textPart = [];\n        if (number) {\n          for (var i = 0; i < text.length; i++) {\n            if (numberRegex.exec(text[i])) {\n              numPart.push(text[i]);\n            } else {\n              textPart.push(text[i]);\n            }\n          }\n        } else {\n          textPart = text;\n        }\n        function compareFn(a, b) {\n          if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n          if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); }\n          var anum = number && numberRegex.exec(a);\n          var bnum = number && numberRegex.exec(b);\n          if (!anum) { return a < b ? -1 : 1; }\n          anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix);\n          bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);\n          return anum - bnum;\n        }\n        numPart.sort(compareFn);\n        textPart.sort(compareFn);\n        text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);\n        if (unique) { // Remove duplicate lines\n          var textOld = text;\n          var lastLine;\n          text = [];\n          for (var i = 0; i < textOld.length; i++) {\n            if (textOld[i] != lastLine) {\n              text.push(textOld[i]);\n            }\n            lastLine = textOld[i];\n          }\n        }\n        cm.replaceRange(text.join('\\n'), curStart, curEnd);\n      },\n      substitute: function(cm, params) {\n        if (!cm.getSearchCursor) {\n          throw new Error('Search feature not available. Requires searchcursor.js or ' +\n              'any other getSearchCursor implementation.');\n        }\n        var argString = params.argString;\n        var slashes = argString ? findUnescapedSlashes(argString) : [];\n        var replacePart = '';\n        if (slashes.length) {\n          if (slashes[0] !== 0) {\n            showConfirm(cm, 'Substitutions should be of the form ' +\n                ':s/pattern/replace/');\n            return;\n          }\n          var regexPart = argString.substring(slashes[0] + 1, slashes[1]);\n          var flagsPart;\n          var count;\n          var confirm = false; // Whether to confirm each replace.\n          if (slashes[1]) {\n            replacePart = argString.substring(slashes[1] + 1, slashes[2]);\n            if (getOption('pcre')) {\n              replacePart = unescapeRegexReplace(replacePart);\n            } else {\n              replacePart = translateRegexReplace(replacePart);\n            }\n            vimGlobalState.lastSubstituteReplacePart = replacePart;\n          }\n          if (slashes[2]) {\n            // After the 3rd slash, we can have flags followed by a space followed\n            // by count.\n            var trailing = argString.substring(slashes[2] + 1).split(' ');\n            flagsPart = trailing[0];\n            count = parseInt(trailing[1]);\n          }\n          if (flagsPart) {\n            if (flagsPart.indexOf('c') != -1) {\n              confirm = true;\n              flagsPart.replace('c', '');\n            }\n            regexPart = regexPart + '/' + flagsPart;\n          }\n        }\n        if (regexPart) {\n          // If regex part is empty, then use the previous query. Otherwise use\n          // the regex part as the new query.\n          try {\n            updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n              true /** smartCase */);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + regexPart);\n            return;\n          }\n        }\n        replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;\n        if (replacePart === undefined) {\n          showConfirm(cm, 'No previous substitute regular expression');\n          return;\n        }\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;\n        var lineEnd = params.lineEnd || lineStart;\n        if (count) {\n          lineStart = lineEnd;\n          lineEnd = lineStart + count - 1;\n        }\n        var startPos = clipCursorToContent(cm, Pos(lineStart, 0));\n        var cursor = cm.getSearchCursor(query, startPos);\n        doReplace(cm, confirm, lineStart, lineEnd, cursor, query, replacePart);\n      },\n      redo: CodeMirror.commands.redo,\n      undo: CodeMirror.commands.undo,\n      write: function(cm) {\n        if (CodeMirror.commands.save) {\n          // If a save command is defined, call it.\n          CodeMirror.commands.save(cm);\n        } else {\n          // Saves to text area if no save command is defined.\n          cm.save();\n        }\n      },\n      nohlsearch: function(cm) {\n        clearSearchHighlight(cm);\n      },\n      delmarks: function(cm, params) {\n        if (!params.argString || !trim(params.argString)) {\n          showConfirm(cm, 'Argument required');\n          return;\n        }\n\n        var state = cm.state.vim;\n        var stream = new CodeMirror.StringStream(trim(params.argString));\n        while (!stream.eol()) {\n          stream.eatSpace();\n\n          // Record the streams position at the beginning of the loop for use\n          // in error messages.\n          var count = stream.pos;\n\n          if (!stream.match(/[a-zA-Z]/, false)) {\n            showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n            return;\n          }\n\n          var sym = stream.next();\n          // Check if this symbol is part of a range\n          if (stream.match('-', true)) {\n            // This symbol is part of a range.\n\n            // The range must terminate at an alphabetic character.\n            if (!stream.match(/[a-zA-Z]/, false)) {\n              showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n              return;\n            }\n\n            var startMark = sym;\n            var finishMark = stream.next();\n            // The range must terminate at an alphabetic character which\n            // shares the same case as the start of the range.\n            if (isLowerCase(startMark) && isLowerCase(finishMark) ||\n                isUpperCase(startMark) && isUpperCase(finishMark)) {\n              var start = startMark.charCodeAt(0);\n              var finish = finishMark.charCodeAt(0);\n              if (start >= finish) {\n                showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n                return;\n              }\n\n              // Because marks are always ASCII values, and we have\n              // determined that they are the same case, we can use\n              // their char codes to iterate through the defined range.\n              for (var j = 0; j <= finish - start; j++) {\n                var mark = String.fromCharCode(start + j);\n                delete state.marks[mark];\n              }\n            } else {\n              showConfirm(cm, 'Invalid argument: ' + startMark + '-');\n              return;\n            }\n          } else {\n            // This symbol is a valid mark, and is not part of a range.\n            delete state.marks[sym];\n          }\n        }\n      }\n    };\n\n    var exCommandDispatcher = new Vim.ExCommandDispatcher();\n\n    /**\n    * @param {CodeMirror} cm CodeMirror instance we are in.\n    * @param {boolean} confirm Whether to confirm each replace.\n    * @param {Cursor} lineStart Line to start replacing from.\n    * @param {Cursor} lineEnd Line to stop replacing at.\n    * @param {RegExp} query Query for performing matches with.\n    * @param {string} replaceWith Text to replace matches with. May contain $1,\n    *     $2, etc for replacing captured groups using Javascript replace.\n    */\n    function doReplace(cm, confirm, lineStart, lineEnd, searchCursor, query,\n        replaceWith) {\n      // Set up all the functions.\n      cm.state.vim.exMode = true;\n      var done = false;\n      var lastPos = searchCursor.from();\n      function replaceAll() {\n        cm.operation(function() {\n          while (!done) {\n            replace();\n            next();\n          }\n          stop();\n        });\n      }\n      function replace() {\n        var text = cm.getRange(searchCursor.from(), searchCursor.to());\n        var newText = text.replace(query, replaceWith);\n        searchCursor.replace(newText);\n      }\n      function next() {\n        var found = searchCursor.findNext();\n        if (!found) {\n          done = true;\n        } else if (isInRange(searchCursor.from(), lineStart, lineEnd)) {\n          cm.scrollIntoView(searchCursor.from(), 30);\n          cm.setSelection(searchCursor.from(), searchCursor.to());\n          lastPos = searchCursor.from();\n          done = false;\n        } else {\n          done = true;\n        }\n      }\n      function stop(close) {\n        if (close) { close(); }\n        cm.focus();\n        if (lastPos) {\n          cm.setCursor(lastPos);\n          var vim = cm.state.vim;\n          vim.exMode = false;\n          vim.lastHPos = vim.lastHSPos = lastPos.ch;\n        }\n      }\n      function onPromptKeyDown(e, _value, close) {\n        // Swallow all keys.\n        CodeMirror.e_stop(e);\n        var keyName = CodeMirror.keyName(e);\n        switch (keyName) {\n          case 'Y':\n            replace(); next(); break;\n          case 'N':\n            next(); break;\n          case 'A':\n            cm.operation(replaceAll); break;\n          case 'L':\n            replace();\n            // fall through and exit.\n          case 'Q':\n          case 'Esc':\n          case 'Ctrl-C':\n          case 'Ctrl-[':\n            stop(close);\n            break;\n        }\n        if (done) { stop(close); }\n      }\n\n      // Actually do replace.\n      next();\n      if (done) {\n        showConfirm(cm, 'No matches for ' + query.source);\n        return;\n      }\n      if (!confirm) {\n        replaceAll();\n        return;\n      }\n      showPrompt(cm, {\n        prefix: 'replace with <strong>' + replaceWith + '</strong> (y/n/a/q/l)',\n        onKeyDown: onPromptKeyDown\n      });\n    }\n\n    // Register Vim with CodeMirror\n    function buildVimKeyMap() {\n      /**\n       * Handle the raw key event from CodeMirror. Translate the\n       * Shift + key modifier to the resulting letter, while preserving other\n       * modifers.\n       */\n      function cmKeyToVimKey(key, modifier) {\n        var vimKey = key;\n        if (isUpperCase(vimKey) && modifier == 'Ctrl') {\n            vimKey = vimKey.toLowerCase();\n        }\n        if (modifier) {\n          // Vim will parse modifier+key combination as a single key.\n          vimKey = modifier.charAt(0) + '-' + vimKey;\n        }\n        var specialKey = ({Enter:'CR',Backspace:'BS',Delete:'Del'})[vimKey];\n        vimKey = specialKey ? specialKey : vimKey;\n        vimKey = vimKey.length > 1 ? '<'+ vimKey + '>' : vimKey;\n        return vimKey;\n      }\n\n      // Closure to bind CodeMirror, key, modifier.\n      function keyMapper(vimKey) {\n        return function(cm) {\n          CodeMirror.Vim.handleKey(cm, vimKey);\n        };\n      }\n\n      var cmToVimKeymap = {\n        'nofallthrough': true,\n        'style': 'fat-cursor'\n      };\n      function bindKeys(keys, modifier) {\n        for (var i = 0; i < keys.length; i++) {\n          var key = keys[i];\n          if (!modifier && key.length == 1) {\n            // Wrap all keys without modifiers with '' to identify them by their\n            // key characters instead of key identifiers.\n            key = \"'\" + key + \"'\";\n          }\n          var vimKey = cmKeyToVimKey(keys[i], modifier);\n          var cmKey = modifier ? modifier + '-' + key : key;\n          cmToVimKeymap[cmKey] = keyMapper(vimKey);\n        }\n      }\n      bindKeys(upperCaseAlphabet);\n      bindKeys(lowerCaseAlphabet);\n      bindKeys(upperCaseAlphabet, 'Ctrl');\n      bindKeys(specialSymbols);\n      bindKeys(specialSymbols, 'Ctrl');\n      bindKeys(numbers);\n      bindKeys(numbers, 'Ctrl');\n      bindKeys(specialKeys);\n      bindKeys(specialKeys, 'Ctrl');\n      return cmToVimKeymap;\n    }\n    CodeMirror.keyMap.vim = buildVimKeyMap();\n\n    function exitInsertMode(cm) {\n      var vim = cm.state.vim;\n      var macroModeState = vimGlobalState.macroModeState;\n      var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');\n      var isPlaying = macroModeState.isPlaying;\n      if (!isPlaying) {\n        cm.off('change', onChange);\n        CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n      }\n      if (!isPlaying && vim.insertModeRepeat > 1) {\n        // Perform insert mode repeat for commands like 3,a and 3,o.\n        repeatLastEdit(cm, vim, vim.insertModeRepeat - 1,\n            true /** repeatForInsert */);\n        vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;\n      }\n      delete vim.insertModeRepeat;\n      vim.insertMode = false;\n      cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);\n      cm.setOption('keyMap', 'vim');\n      cm.setOption('disableInput', true);\n      cm.toggleOverwrite(false); // exit replace mode if we were in it.\n      // update the \". register before exiting insert mode\n      insertModeChangeRegister.setText(macroModeState.lastInsertModeChanges.changes.join(''));\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      if (macroModeState.isRecording) {\n        logInsertModeChange(macroModeState);\n      }\n    }\n\n    CodeMirror.keyMap['vim-insert'] = {\n      // TODO: override navigation keys so that Esc will cancel automatic\n      // indentation from o, O, i_<CR>\n      'Esc': exitInsertMode,\n      'Ctrl-[': exitInsertMode,\n      'Ctrl-C': exitInsertMode,\n      'Ctrl-N': 'autocomplete',\n      'Ctrl-P': 'autocomplete',\n      'Enter': function(cm) {\n        var fn = CodeMirror.commands.newlineAndIndentContinueComment ||\n            CodeMirror.commands.newlineAndIndent;\n        fn(cm);\n      },\n      fallthrough: ['default']\n    };\n\n    CodeMirror.keyMap['vim-replace'] = {\n      'Backspace': 'goCharLeft',\n      fallthrough: ['vim-insert']\n    };\n\n    function executeMacroRegister(cm, vim, macroModeState, registerName) {\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      var keyBuffer = register.keyBuffer;\n      var imc = 0;\n      macroModeState.isPlaying = true;\n      macroModeState.replaySearchQueries = register.searchQueries.slice(0);\n      for (var i = 0; i < keyBuffer.length; i++) {\n        var text = keyBuffer[i];\n        var match, key;\n        while (text) {\n          // Pull off one command key, which is either a single character\n          // or a special sequence wrapped in '<' and '>', e.g. '<Space>'.\n          match = (/<\\w+-.+?>|<\\w+>|./).exec(text);\n          key = match[0];\n          text = text.substring(match.index + key.length);\n          CodeMirror.Vim.handleKey(cm, key);\n          if (vim.insertMode) {\n            repeatInsertModeChanges(\n                cm, register.insertModeChanges[imc++].changes, 1);\n            exitInsertMode(cm);\n          }\n        }\n      };\n      macroModeState.isPlaying = false;\n    }\n\n    function logKey(macroModeState, key) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushText(key);\n      }\n    }\n\n    function logInsertModeChange(macroModeState) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushInsertModeChanges(macroModeState.lastInsertModeChanges);\n      }\n    }\n\n    function logSearchQuery(macroModeState, query) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushSearchQuery(query);\n      }\n    }\n\n    /**\n     * Listens for changes made in insert mode.\n     * Should only be active in insert mode.\n     */\n    function onChange(_cm, changeObj) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      if (!macroModeState.isPlaying) {\n        while(changeObj) {\n          lastChange.expectCursorActivityForChange = true;\n          if (changeObj.origin == '+input' || changeObj.origin == 'paste'\n              || changeObj.origin === undefined /* only in testing */) {\n            var text = changeObj.text.join('\\n');\n            lastChange.changes.push(text);\n          }\n          // Change objects may be chained with next.\n          changeObj = changeObj.next;\n        }\n      }\n    }\n\n    /**\n    * Listens for any kind of cursor activity on CodeMirror.\n    */\n    function onCursorActivity(cm) {\n      var vim = cm.state.vim;\n      if (vim.insertMode) {\n        // Tracking cursor activity in insert mode (for macro support).\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        var lastChange = macroModeState.lastInsertModeChanges;\n        if (lastChange.expectCursorActivityForChange) {\n          lastChange.expectCursorActivityForChange = false;\n        } else {\n          // Cursor moved outside the context of an edit. Reset the change.\n          lastChange.changes = [];\n        }\n      } else if (cm.doc.history.lastSelOrigin == '*mouse') {\n        // Reset lastHPos if mouse click was done in normal mode.\n        vim.lastHPos = cm.doc.getCursor().ch;\n      }\n    }\n\n    /** Wrapper for special keys pressed in insert mode */\n    function InsertModeKey(keyName) {\n      this.keyName = keyName;\n    }\n\n    /**\n    * Handles raw key down events from the text area.\n    * - Should only be active in insert mode.\n    * - For recording deletes in insert mode.\n    */\n    function onKeyEventTargetKeyDown(e) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      var keyName = CodeMirror.keyName(e);\n      function onKeyFound() {\n        lastChange.changes.push(new InsertModeKey(keyName));\n        return true;\n      }\n      if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) {\n        CodeMirror.lookupKey(keyName, ['vim-insert'], onKeyFound);\n      }\n    }\n\n    /**\n     * Repeats the last edit, which includes exactly 1 command and at most 1\n     * insert. Operator and motion commands are read from lastEditInputState,\n     * while action commands are read from lastEditActionCommand.\n     *\n     * If repeatForInsert is true, then the function was called by\n     * exitInsertMode to repeat the insert mode changes the user just made. The\n     * corresponding enterInsertMode call was made with a count.\n     */\n    function repeatLastEdit(cm, vim, repeat, repeatForInsert) {\n      var macroModeState = vimGlobalState.macroModeState;\n      macroModeState.isPlaying = true;\n      var isAction = !!vim.lastEditActionCommand;\n      var cachedInputState = vim.inputState;\n      function repeatCommand() {\n        if (isAction) {\n          commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand);\n        } else {\n          commandDispatcher.evalInput(cm, vim);\n        }\n      }\n      function repeatInsert(repeat) {\n        if (macroModeState.lastInsertModeChanges.changes.length > 0) {\n          // For some reason, repeat cw in desktop VIM does not repeat\n          // insert mode changes. Will conform to that behavior.\n          repeat = !vim.lastEditActionCommand ? 1 : repeat;\n          var changeObject = macroModeState.lastInsertModeChanges;\n          // This isn't strictly necessary, but since lastInsertModeChanges is\n          // supposed to be immutable during replay, this helps catch bugs.\n          macroModeState.lastInsertModeChanges = {};\n          repeatInsertModeChanges(cm, changeObject.changes, repeat);\n          macroModeState.lastInsertModeChanges = changeObject;\n        }\n      }\n      vim.inputState = vim.lastEditInputState;\n      if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) {\n        // o and O repeat have to be interlaced with insert repeats so that the\n        // insertions appear on separate lines instead of the last line.\n        for (var i = 0; i < repeat; i++) {\n          repeatCommand();\n          repeatInsert(1);\n        }\n      } else {\n        if (!repeatForInsert) {\n          // Hack to get the cursor to end up at the right place. If I is\n          // repeated in insert mode repeat, cursor will be 1 insert\n          // change set left of where it should be.\n          repeatCommand();\n        }\n        repeatInsert(repeat);\n      }\n      vim.inputState = cachedInputState;\n      if (vim.insertMode && !repeatForInsert) {\n        // Don't exit insert mode twice. If repeatForInsert is set, then we\n        // were called by an exitInsertMode call lower on the stack.\n        exitInsertMode(cm);\n      }\n      macroModeState.isPlaying = false;\n    };\n\n    function repeatInsertModeChanges(cm, changes, repeat) {\n      function keyHandler(binding) {\n        if (typeof binding == 'string') {\n          CodeMirror.commands[binding](cm);\n        } else {\n          binding(cm);\n        }\n        return true;\n      }\n      for (var i = 0; i < repeat; i++) {\n        for (var j = 0; j < changes.length; j++) {\n          var change = changes[j];\n          if (change instanceof InsertModeKey) {\n            CodeMirror.lookupKey(change.keyName, ['vim-insert'], keyHandler);\n          } else {\n            var cur = cm.getCursor();\n            cm.replaceRange(change, cur, cur);\n          }\n        }\n      }\n    }\n\n    resetVimGlobalState();\n    return vimApi;\n  };\n  // Initialize Vim and make it available as an API.\n  CodeMirror.Vim = Vim();\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/keymap/sublime.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/keymap/sublime.js",
            "module-type": "library",
            "text": "// A rough approximation of Sublime Text's keybindings\n// Depends on addon/search/searchcursor.js and optionally addon/dialog/dialogs.js\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"), require(\"../addon/search/searchcursor\"), require(\"../addon/edit/matchbrackets\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\", \"../addon/search/searchcursor\", \"../addon/edit/matchbrackets\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var map = CodeMirror.keyMap.sublime = {fallthrough: \"default\"};\n  var cmds = CodeMirror.commands;\n  var Pos = CodeMirror.Pos;\n  var ctrl = CodeMirror.keyMap[\"default\"] == CodeMirror.keyMap.pcDefault ? \"Ctrl-\" : \"Cmd-\";\n\n  // This is not exactly Sublime's algorithm. I couldn't make heads or tails of that.\n  function findPosSubword(doc, start, dir) {\n    if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1));\n    var line = doc.getLine(start.line);\n    if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0));\n    var state = \"start\", type;\n    for (var pos = start.ch, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) {\n      var next = line.charAt(dir < 0 ? pos - 1 : pos);\n      var cat = next != \"_\" && CodeMirror.isWordChar(next) ? \"w\" : \"o\";\n      if (cat == \"w\" && next.toUpperCase() == next) cat = \"W\";\n      if (state == \"start\") {\n        if (cat != \"o\") { state = \"in\"; type = cat; }\n      } else if (state == \"in\") {\n        if (type != cat) {\n          if (type == \"w\" && cat == \"W\" && dir < 0) pos--;\n          if (type == \"W\" && cat == \"w\" && dir > 0) { type = \"w\"; continue; }\n          break;\n        }\n      }\n    }\n    return Pos(start.line, pos);\n  }\n\n  function moveSubword(cm, dir) {\n    cm.extendSelectionsBy(function(range) {\n      if (cm.display.shift || cm.doc.extend || range.empty())\n        return findPosSubword(cm.doc, range.head, dir);\n      else\n        return dir < 0 ? range.from() : range.to();\n    });\n  }\n\n  cmds[map[\"Alt-Left\"] = \"goSubwordLeft\"] = function(cm) { moveSubword(cm, -1); };\n  cmds[map[\"Alt-Right\"] = \"goSubwordRight\"] = function(cm) { moveSubword(cm, 1); };\n\n  cmds[map[ctrl + \"Up\"] = \"scrollLineUp\"] = function(cm) {\n    var info = cm.getScrollInfo();\n    if (!cm.somethingSelected()) {\n      var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, \"local\");\n      if (cm.getCursor().line >= visibleBottomLine)\n        cm.execCommand(\"goLineUp\");\n    }\n    cm.scrollTo(null, info.top - cm.defaultTextHeight());\n  };\n  cmds[map[ctrl + \"Down\"] = \"scrollLineDown\"] = function(cm) {\n    var info = cm.getScrollInfo();\n    if (!cm.somethingSelected()) {\n      var visibleTopLine = cm.lineAtHeight(info.top, \"local\")+1;\n      if (cm.getCursor().line <= visibleTopLine)\n        cm.execCommand(\"goLineDown\");\n    }\n    cm.scrollTo(null, info.top + cm.defaultTextHeight());\n  };\n\n  cmds[map[\"Shift-\" + ctrl + \"L\"] = \"splitSelectionByLine\"] = function(cm) {\n    var ranges = cm.listSelections(), lineRanges = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      for (var line = from.line; line <= to.line; ++line)\n        if (!(to.line > from.line && line == to.line && to.ch == 0))\n          lineRanges.push({anchor: line == from.line ? from : Pos(line, 0),\n                           head: line == to.line ? to : Pos(line)});\n    }\n    cm.setSelections(lineRanges, 0);\n  };\n\n  map[\"Shift-Tab\"] = \"indentLess\";\n\n  cmds[map[\"Esc\"] = \"singleSelectionTop\"] = function(cm) {\n    var range = cm.listSelections()[0];\n    cm.setSelection(range.anchor, range.head, {scroll: false});\n  };\n\n  cmds[map[ctrl + \"L\"] = \"selectLine\"] = function(cm) {\n    var ranges = cm.listSelections(), extended = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      extended.push({anchor: Pos(range.from().line, 0),\n                     head: Pos(range.to().line + 1, 0)});\n    }\n    cm.setSelections(extended);\n  };\n\n  map[\"Shift-\" + ctrl + \"K\"] = \"deleteLine\";\n\n  function insertLine(cm, above) {\n    cm.operation(function() {\n      var len = cm.listSelections().length, newSelection = [], last = -1;\n      for (var i = 0; i < len; i++) {\n        var head = cm.listSelections()[i].head;\n        if (head.line <= last) continue;\n        var at = Pos(head.line + (above ? 0 : 1), 0);\n        cm.replaceRange(\"\\n\", at, null, \"+insertLine\");\n        cm.indentLine(at.line, null, true);\n        newSelection.push({head: at, anchor: at});\n        last = head.line + 1;\n      }\n      cm.setSelections(newSelection);\n    });\n  }\n\n  cmds[map[ctrl + \"Enter\"] = \"insertLineAfter\"] = function(cm) { insertLine(cm, false); };\n\n  cmds[map[\"Shift-\" + ctrl + \"Enter\"] = \"insertLineBefore\"] = function(cm) { insertLine(cm, true); };\n\n  function wordAt(cm, pos) {\n    var start = pos.ch, end = start, line = cm.getLine(pos.line);\n    while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start;\n    while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end;\n    return {from: Pos(pos.line, start), to: Pos(pos.line, end), word: line.slice(start, end)};\n  }\n\n  cmds[map[ctrl + \"D\"] = \"selectNextOccurrence\"] = function(cm) {\n    var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n    var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel;\n    if (CodeMirror.cmpPos(from, to) == 0) {\n      var word = wordAt(cm, from);\n      if (!word.word) return;\n      cm.setSelection(word.from, word.to);\n      fullWord = true;\n    } else {\n      var text = cm.getRange(from, to);\n      var query = fullWord ? new RegExp(\"\\\\b\" + text + \"\\\\b\") : text;\n      var cur = cm.getSearchCursor(query, to);\n      if (cur.findNext()) {\n        cm.addSelection(cur.from(), cur.to());\n      } else {\n        cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0));\n        if (cur.findNext())\n          cm.addSelection(cur.from(), cur.to());\n      }\n    }\n    if (fullWord)\n      cm.state.sublimeFindFullWord = cm.doc.sel;\n  };\n\n  var mirror = \"(){}[]\";\n  function selectBetweenBrackets(cm) {\n    var pos = cm.getCursor(), opening = cm.scanForBracket(pos, -1);\n    if (!opening) return;\n    for (;;) {\n      var closing = cm.scanForBracket(pos, 1);\n      if (!closing) return;\n      if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) {\n        cm.setSelection(Pos(opening.pos.line, opening.pos.ch + 1), closing.pos, false);\n        return true;\n      }\n      pos = Pos(closing.pos.line, closing.pos.ch + 1);\n    }\n  }\n\n  cmds[map[\"Shift-\" + ctrl + \"Space\"] = \"selectScope\"] = function(cm) {\n    selectBetweenBrackets(cm) || cm.execCommand(\"selectAll\");\n  };\n  cmds[map[\"Shift-\" + ctrl + \"M\"] = \"selectBetweenBrackets\"] = function(cm) {\n    if (!selectBetweenBrackets(cm)) return CodeMirror.Pass;\n  };\n\n  cmds[map[ctrl + \"M\"] = \"goToBracket\"] = function(cm) {\n    cm.extendSelectionsBy(function(range) {\n      var next = cm.scanForBracket(range.head, 1);\n      if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos;\n      var prev = cm.scanForBracket(range.head, -1);\n      return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head;\n    });\n  };\n\n  cmds[map[\"Shift-\" + ctrl + \"Up\"] = \"swapLineUp\"] = function(cm) {\n    var ranges = cm.listSelections(), linesToMove = [], at = cm.firstLine() - 1;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], from = range.from().line - 1, to = range.to().line;\n      if (from > at) linesToMove.push(from, to);\n      else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n      at = to;\n    }\n    cm.operation(function() {\n      for (var i = 0; i < linesToMove.length; i += 2) {\n        var from = linesToMove[i], to = linesToMove[i + 1];\n        var line = cm.getLine(from);\n        cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n        if (to > cm.lastLine()) {\n          cm.replaceRange(\"\\n\" + line, Pos(cm.lastLine()), null, \"+swapLine\");\n          var sels = cm.listSelections(), last = sels[sels.length - 1];\n          var head = last.head.line == to ? Pos(to - 1) : last.head;\n          var anchor = last.anchor.line == to ? Pos(to - 1) : last.anchor;\n          cm.setSelections(sels.slice(0, sels.length - 1).concat([{head: head, anchor: anchor}]));\n        } else {\n          cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n        }\n      }\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds[map[\"Shift-\" + ctrl + \"Down\"] = \"swapLineDown\"] = function(cm) {\n    var ranges = cm.listSelections(), linesToMove = [], at = cm.lastLine() + 1;\n    for (var i = ranges.length - 1; i >= 0; i--) {\n      var range = ranges[i], from = range.to().line + 1, to = range.from().line;\n      if (from < at) linesToMove.push(from, to);\n      else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to;\n      at = to;\n    }\n    cm.operation(function() {\n      for (var i = linesToMove.length - 2; i >= 0; i -= 2) {\n        var from = linesToMove[i], to = linesToMove[i + 1];\n        var line = cm.getLine(from);\n        if (from == cm.lastLine())\n          cm.replaceRange(\"\", Pos(from - 1), Pos(from), \"+swapLine\");\n        else\n          cm.replaceRange(\"\", Pos(from, 0), Pos(from + 1, 0), \"+swapLine\");\n        cm.replaceRange(line + \"\\n\", Pos(to, 0), null, \"+swapLine\");\n      }\n      cm.scrollIntoView();\n    });\n  };\n\n  map[ctrl + \"/\"] = \"toggleComment\";\n\n  cmds[map[ctrl + \"J\"] = \"joinLines\"] = function(cm) {\n    var ranges = cm.listSelections(), joined = [];\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i], from = range.from();\n      var start = from.line, end = range.to().line;\n      while (i < ranges.length - 1 && ranges[i + 1].from().line == end)\n        end = ranges[++i].to().line;\n      joined.push({start: start, end: end, anchor: !range.empty() && from});\n    }\n    cm.operation(function() {\n      var offset = 0, ranges = [];\n      for (var i = 0; i < joined.length; i++) {\n        var obj = joined[i];\n        var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), head;\n        for (var line = obj.start; line <= obj.end; line++) {\n          var actual = line - offset;\n          if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1);\n          if (actual < cm.lastLine()) {\n            cm.replaceRange(\" \", Pos(actual), Pos(actual + 1, /^\\s*/.exec(cm.getLine(actual + 1))[0].length));\n            ++offset;\n          }\n        }\n        ranges.push({anchor: anchor || head, head: head});\n      }\n      cm.setSelections(ranges, 0);\n    });\n  };\n\n  cmds[map[\"Shift-\" + ctrl + \"D\"] = \"duplicateLine\"] = function(cm) {\n    cm.operation(function() {\n      var rangeCount = cm.listSelections().length;\n      for (var i = 0; i < rangeCount; i++) {\n        var range = cm.listSelections()[i];\n        if (range.empty())\n          cm.replaceRange(cm.getLine(range.head.line) + \"\\n\", Pos(range.head.line, 0));\n        else\n          cm.replaceRange(cm.getRange(range.from(), range.to()), range.from());\n      }\n      cm.scrollIntoView();\n    });\n  };\n\n  map[ctrl + \"T\"] = \"transposeChars\";\n\n  function sortLines(cm, caseSensitive) {\n    var ranges = cm.listSelections(), toSort = [], selected;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = ranges[i];\n      if (range.empty()) continue;\n      var from = range.from().line, to = range.to().line;\n      while (i < ranges.length - 1 && ranges[i + 1].from().line == to)\n        to = range[++i].to().line;\n      toSort.push(from, to);\n    }\n    if (toSort.length) selected = true;\n    else toSort.push(cm.firstLine(), cm.lastLine());\n\n    cm.operation(function() {\n      var ranges = [];\n      for (var i = 0; i < toSort.length; i += 2) {\n        var from = toSort[i], to = toSort[i + 1];\n        var start = Pos(from, 0), end = Pos(to);\n        var lines = cm.getRange(start, end, false);\n        if (caseSensitive)\n          lines.sort();\n        else\n          lines.sort(function(a, b) {\n            var au = a.toUpperCase(), bu = b.toUpperCase();\n            if (au != bu) { a = au; b = bu; }\n            return a < b ? -1 : a == b ? 0 : 1;\n          });\n        cm.replaceRange(lines, start, end);\n        if (selected) ranges.push({anchor: start, head: end});\n      }\n      if (selected) cm.setSelections(ranges, 0);\n    });\n  }\n\n  cmds[map[\"F9\"] = \"sortLines\"] = function(cm) { sortLines(cm, true); };\n  cmds[map[ctrl + \"F9\"] = \"sortLinesInsensitive\"] = function(cm) { sortLines(cm, false); };\n\n  cmds[map[\"F2\"] = \"nextBookmark\"] = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) while (marks.length) {\n      var current = marks.shift();\n      var found = current.find();\n      if (found) {\n        marks.push(current);\n        return cm.setSelection(found.from, found.to);\n      }\n    }\n  };\n\n  cmds[map[\"Shift-F2\"] = \"prevBookmark\"] = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) while (marks.length) {\n      marks.unshift(marks.pop());\n      var found = marks[marks.length - 1].find();\n      if (!found)\n        marks.pop();\n      else\n        return cm.setSelection(found.from, found.to);\n    }\n  };\n\n  cmds[map[ctrl + \"F2\"] = \"toggleBookmark\"] = function(cm) {\n    var ranges = cm.listSelections();\n    var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []);\n    for (var i = 0; i < ranges.length; i++) {\n      var from = ranges[i].from(), to = ranges[i].to();\n      var found = cm.findMarks(from, to);\n      for (var j = 0; j < found.length; j++) {\n        if (found[j].sublimeBookmark) {\n          found[j].clear();\n          for (var k = 0; k < marks.length; k++)\n            if (marks[k] == found[j])\n              marks.splice(k--, 1);\n          break;\n        }\n      }\n      if (j == found.length)\n        marks.push(cm.markText(from, to, {sublimeBookmark: true, clearWhenEmpty: false}));\n    }\n  };\n\n  cmds[map[\"Shift-\" + ctrl + \"F2\"] = \"clearBookmarks\"] = function(cm) {\n    var marks = cm.state.sublimeBookmarks;\n    if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear();\n    marks.length = 0;\n  };\n\n  cmds[map[\"Alt-F2\"] = \"selectBookmarks\"] = function(cm) {\n    var marks = cm.state.sublimeBookmarks, ranges = [];\n    if (marks) for (var i = 0; i < marks.length; i++) {\n      var found = marks[i].find();\n      if (!found)\n        marks.splice(i--, 0);\n      else\n        ranges.push({anchor: found.from, head: found.to});\n    }\n    if (ranges.length)\n      cm.setSelections(ranges, 0);\n  };\n\n  map[\"Alt-Q\"] = \"wrapLines\";\n\n  var mapK = CodeMirror.keyMap[\"sublime-Ctrl-K\"] = {auto: \"sublime\", nofallthrough: true};\n\n  map[ctrl + \"K\"] = function(cm) {cm.setOption(\"keyMap\", \"sublime-Ctrl-K\");};\n\n  function modifyWordOrSelection(cm, mod) {\n    cm.operation(function() {\n      var ranges = cm.listSelections(), indices = [], replacements = [];\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        if (range.empty()) { indices.push(i); replacements.push(\"\"); }\n        else replacements.push(mod(cm.getRange(range.from(), range.to())));\n      }\n      cm.replaceSelections(replacements, \"around\", \"case\");\n      for (var i = indices.length - 1, at; i >= 0; i--) {\n        var range = ranges[indices[i]];\n        if (at && CodeMirror.cmpPos(range.head, at) > 0) continue;\n        var word = wordAt(cm, range.head);\n        at = word.from;\n        cm.replaceRange(mod(word.word), word.from, word.to);\n      }\n    });\n  }\n\n  mapK[ctrl + \"Backspace\"] = \"delLineLeft\";\n\n  cmds[mapK[ctrl + \"K\"] = \"delLineRight\"] = function(cm) {\n    cm.operation(function() {\n      var ranges = cm.listSelections();\n      for (var i = ranges.length - 1; i >= 0; i--)\n        cm.replaceRange(\"\", ranges[i].anchor, Pos(ranges[i].to().line), \"+delete\");\n      cm.scrollIntoView();\n    });\n  };\n\n  cmds[mapK[ctrl + \"U\"] = \"upcaseAtCursor\"] = function(cm) {\n    modifyWordOrSelection(cm, function(str) { return str.toUpperCase(); });\n  };\n  cmds[mapK[ctrl + \"L\"] = \"downcaseAtCursor\"] = function(cm) {\n    modifyWordOrSelection(cm, function(str) { return str.toLowerCase(); });\n  };\n\n  cmds[mapK[ctrl + \"Space\"] = \"setSublimeMark\"] = function(cm) {\n    if (cm.state.sublimeMark) cm.state.sublimeMark.clear();\n    cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n  };\n  cmds[mapK[ctrl + \"A\"] = \"selectToSublimeMark\"] = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) cm.setSelection(cm.getCursor(), found);\n  };\n  cmds[mapK[ctrl + \"W\"] = \"deleteToSublimeMark\"] = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) {\n      var from = cm.getCursor(), to = found;\n      if (CodeMirror.cmpPos(from, to) > 0) { var tmp = to; to = from; from = tmp; }\n      cm.state.sublimeKilled = cm.getRange(from, to);\n      cm.replaceRange(\"\", from, to);\n    }\n  };\n  cmds[mapK[ctrl + \"X\"] = \"swapWithSublimeMark\"] = function(cm) {\n    var found = cm.state.sublimeMark && cm.state.sublimeMark.find();\n    if (found) {\n      cm.state.sublimeMark.clear();\n      cm.state.sublimeMark = cm.setBookmark(cm.getCursor());\n      cm.setCursor(found);\n    }\n  };\n  cmds[mapK[ctrl + \"Y\"] = \"sublimeYank\"] = function(cm) {\n    if (cm.state.sublimeKilled != null)\n      cm.replaceSelection(cm.state.sublimeKilled, null, \"paste\");\n  };\n\n  mapK[ctrl + \"G\"] = \"clearBookmarks\";\n  cmds[mapK[ctrl + \"C\"] = \"showInCenter\"] = function(cm) {\n    var pos = cm.cursorCoords(null, \"local\");\n    cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2);\n  };\n\n  cmds[map[\"Shift-Alt-Up\"] = \"selectLinesUpward\"] = function(cm) {\n    cm.operation(function() {\n      var ranges = cm.listSelections();\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        if (range.head.line > cm.firstLine())\n          cm.addSelection(Pos(range.head.line - 1, range.head.ch));\n      }\n    });\n  };\n  cmds[map[\"Shift-Alt-Down\"] = \"selectLinesDownward\"] = function(cm) {\n    cm.operation(function() {\n      var ranges = cm.listSelections();\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        if (range.head.line < cm.lastLine())\n          cm.addSelection(Pos(range.head.line + 1, range.head.ch));\n      }\n    });\n  };\n\n  function findAndGoTo(cm, forward) {\n    var from = cm.getCursor(\"from\"), to = cm.getCursor(\"to\");\n    if (CodeMirror.cmpPos(from, to) == 0) {\n      var word = wordAt(cm, from);\n      if (!word.word) return;\n      from = word.from;\n      to = word.to;\n    }\n\n    var query = cm.getRange(from, to);\n    var cur = cm.getSearchCursor(query, forward ? to : from);\n\n    if (forward ? cur.findNext() : cur.findPrevious()) {\n      cm.setSelection(cur.from(), cur.to());\n    } else {\n      cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0)\n                                              : cm.clipPos(Pos(cm.lastLine())));\n      if (forward ? cur.findNext() : cur.findPrevious())\n        cm.setSelection(cur.from(), cur.to());\n      else if (word)\n        cm.setSelection(from, to);\n    }\n  };\n  cmds[map[ctrl + \"F3\"] = \"findUnder\"] = function(cm) { findAndGoTo(cm, true); };\n  cmds[map[\"Shift-\" + ctrl + \"F3\"] = \"findUnderPrevious\"] = function(cm) { findAndGoTo(cm,false); };\n\n  map[\"Shift-\" + ctrl + \"[\"] = \"fold\";\n  map[\"Shift-\" + ctrl + \"]\"] = \"unfold\";\n  mapK[ctrl + \"0\"] = mapK[ctrl + \"j\"] = \"unfoldAll\";\n\n  map[ctrl + \"I\"] = \"findIncremental\";\n  map[\"Shift-\" + ctrl + \"I\"] = \"findIncrementalReverse\";\n  map[ctrl + \"H\"] = \"replace\";\n  map[\"F3\"] = \"findNext\";\n  map[\"Shift-F3\"] = \"findPrev\";\n\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/keymap/emacs.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/codemirror/keymap/emacs.js",
            "module-type": "library",
            "text": "(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  var Pos = CodeMirror.Pos;\n  function posEq(a, b) { return a.line == b.line && a.ch == b.ch; }\n\n  // Kill 'ring'\n\n  var killRing = [];\n  function addToRing(str) {\n    killRing.push(str);\n    if (killRing.length > 50) killRing.shift();\n  }\n  function growRingTop(str) {\n    if (!killRing.length) return addToRing(str);\n    killRing[killRing.length - 1] += str;\n  }\n  function getFromRing(n) { return killRing[killRing.length - (n ? Math.min(n, 1) : 1)] || \"\"; }\n  function popFromRing() { if (killRing.length > 1) killRing.pop(); return getFromRing(); }\n\n  var lastKill = null;\n\n  function kill(cm, from, to, mayGrow, text) {\n    if (text == null) text = cm.getRange(from, to);\n\n    if (mayGrow && lastKill && lastKill.cm == cm && posEq(from, lastKill.pos) && cm.isClean(lastKill.gen))\n      growRingTop(text);\n    else\n      addToRing(text);\n    cm.replaceRange(\"\", from, to, \"+delete\");\n\n    if (mayGrow) lastKill = {cm: cm, pos: from, gen: cm.changeGeneration()};\n    else lastKill = null;\n  }\n\n  // Boundaries of various units\n\n  function byChar(cm, pos, dir) {\n    return cm.findPosH(pos, dir, \"char\", true);\n  }\n\n  function byWord(cm, pos, dir) {\n    return cm.findPosH(pos, dir, \"word\", true);\n  }\n\n  function byLine(cm, pos, dir) {\n    return cm.findPosV(pos, dir, \"line\", cm.doc.sel.goalColumn);\n  }\n\n  function byPage(cm, pos, dir) {\n    return cm.findPosV(pos, dir, \"page\", cm.doc.sel.goalColumn);\n  }\n\n  function byParagraph(cm, pos, dir) {\n    var no = pos.line, line = cm.getLine(no);\n    var sawText = /\\S/.test(dir < 0 ? line.slice(0, pos.ch) : line.slice(pos.ch));\n    var fst = cm.firstLine(), lst = cm.lastLine();\n    for (;;) {\n      no += dir;\n      if (no < fst || no > lst)\n        return cm.clipPos(Pos(no - dir, dir < 0 ? 0 : null));\n      line = cm.getLine(no);\n      var hasText = /\\S/.test(line);\n      if (hasText) sawText = true;\n      else if (sawText) return Pos(no, 0);\n    }\n  }\n\n  function bySentence(cm, pos, dir) {\n    var line = pos.line, ch = pos.ch;\n    var text = cm.getLine(pos.line), sawWord = false;\n    for (;;) {\n      var next = text.charAt(ch + (dir < 0 ? -1 : 0));\n      if (!next) { // End/beginning of line reached\n        if (line == (dir < 0 ? cm.firstLine() : cm.lastLine())) return Pos(line, ch);\n        text = cm.getLine(line + dir);\n        if (!/\\S/.test(text)) return Pos(line, ch);\n        line += dir;\n        ch = dir < 0 ? text.length : 0;\n        continue;\n      }\n      if (sawWord && /[!?.]/.test(next)) return Pos(line, ch + (dir > 0 ? 1 : 0));\n      if (!sawWord) sawWord = /\\w/.test(next);\n      ch += dir;\n    }\n  }\n\n  function byExpr(cm, pos, dir) {\n    var wrap;\n    if (cm.findMatchingBracket && (wrap = cm.findMatchingBracket(pos, true))\n        && wrap.match && (wrap.forward ? 1 : -1) == dir)\n      return dir > 0 ? Pos(wrap.to.line, wrap.to.ch + 1) : wrap.to;\n\n    for (var first = true;; first = false) {\n      var token = cm.getTokenAt(pos);\n      var after = Pos(pos.line, dir < 0 ? token.start : token.end);\n      if (first && dir > 0 && token.end == pos.ch || !/\\w/.test(token.string)) {\n        var newPos = cm.findPosH(after, dir, \"char\");\n        if (posEq(after, newPos)) return pos;\n        else pos = newPos;\n      } else {\n        return after;\n      }\n    }\n  }\n\n  // Prefixes (only crudely supported)\n\n  function getPrefix(cm, precise) {\n    var digits = cm.state.emacsPrefix;\n    if (!digits) return precise ? null : 1;\n    clearPrefix(cm);\n    return digits == \"-\" ? -1 : Number(digits);\n  }\n\n  function repeated(cmd) {\n    var f = typeof cmd == \"string\" ? function(cm) { cm.execCommand(cmd); } : cmd;\n    return function(cm) {\n      var prefix = getPrefix(cm);\n      f(cm);\n      for (var i = 1; i < prefix; ++i) f(cm);\n    };\n  }\n\n  function findEnd(cm, by, dir) {\n    var pos = cm.getCursor(), prefix = getPrefix(cm);\n    if (prefix < 0) { dir = -dir; prefix = -prefix; }\n    for (var i = 0; i < prefix; ++i) {\n      var newPos = by(cm, pos, dir);\n      if (posEq(newPos, pos)) break;\n      pos = newPos;\n    }\n    return pos;\n  }\n\n  function move(by, dir) {\n    var f = function(cm) {\n      cm.extendSelection(findEnd(cm, by, dir));\n    };\n    f.motion = true;\n    return f;\n  }\n\n  function killTo(cm, by, dir) {\n    kill(cm, cm.getCursor(), findEnd(cm, by, dir), true);\n  }\n\n  function addPrefix(cm, digit) {\n    if (cm.state.emacsPrefix) {\n      if (digit != \"-\") cm.state.emacsPrefix += digit;\n      return;\n    }\n    // Not active yet\n    cm.state.emacsPrefix = digit;\n    cm.on(\"keyHandled\", maybeClearPrefix);\n    cm.on(\"inputRead\", maybeDuplicateInput);\n  }\n\n  var prefixPreservingKeys = {\"Alt-G\": true, \"Ctrl-X\": true, \"Ctrl-Q\": true, \"Ctrl-U\": true};\n\n  function maybeClearPrefix(cm, arg) {\n    if (!cm.state.emacsPrefixMap && !prefixPreservingKeys.hasOwnProperty(arg))\n      clearPrefix(cm);\n  }\n\n  function clearPrefix(cm) {\n    cm.state.emacsPrefix = null;\n    cm.off(\"keyHandled\", maybeClearPrefix);\n    cm.off(\"inputRead\", maybeDuplicateInput);\n  }\n\n  function maybeDuplicateInput(cm, event) {\n    var dup = getPrefix(cm);\n    if (dup > 1 && event.origin == \"+input\") {\n      var one = event.text.join(\"\\n\"), txt = \"\";\n      for (var i = 1; i < dup; ++i) txt += one;\n      cm.replaceSelection(txt);\n    }\n  }\n\n  function addPrefixMap(cm) {\n    cm.state.emacsPrefixMap = true;\n    cm.addKeyMap(prefixMap);\n    cm.on(\"keyHandled\", maybeRemovePrefixMap);\n    cm.on(\"inputRead\", maybeRemovePrefixMap);\n  }\n\n  function maybeRemovePrefixMap(cm, arg) {\n    if (typeof arg == \"string\" && (/^\\d$/.test(arg) || arg == \"Ctrl-U\")) return;\n    cm.removeKeyMap(prefixMap);\n    cm.state.emacsPrefixMap = false;\n    cm.off(\"keyHandled\", maybeRemovePrefixMap);\n    cm.off(\"inputRead\", maybeRemovePrefixMap);\n  }\n\n  // Utilities\n\n  function setMark(cm) {\n    cm.setCursor(cm.getCursor());\n    cm.setExtending(!cm.getExtending());\n    cm.on(\"change\", function() { cm.setExtending(false); });\n  }\n\n  function clearMark(cm) {\n    cm.setExtending(false);\n    cm.setCursor(cm.getCursor());\n  }\n\n  function getInput(cm, msg, f) {\n    if (cm.openDialog)\n      cm.openDialog(msg + \": <input type=\\\"text\\\" style=\\\"width: 10em\\\"/>\", f, {bottom: true});\n    else\n      f(prompt(msg, \"\"));\n  }\n\n  function operateOnWord(cm, op) {\n    var start = cm.getCursor(), end = cm.findPosH(start, 1, \"word\");\n    cm.replaceRange(op(cm.getRange(start, end)), start, end);\n    cm.setCursor(end);\n  }\n\n  function toEnclosingExpr(cm) {\n    var pos = cm.getCursor(), line = pos.line, ch = pos.ch;\n    var stack = [];\n    while (line >= cm.firstLine()) {\n      var text = cm.getLine(line);\n      for (var i = ch == null ? text.length : ch; i > 0;) {\n        var ch = text.charAt(--i);\n        if (ch == \")\")\n          stack.push(\"(\");\n        else if (ch == \"]\")\n          stack.push(\"[\");\n        else if (ch == \"}\")\n          stack.push(\"{\");\n        else if (/[\\(\\{\\[]/.test(ch) && (!stack.length || stack.pop() != ch))\n          return cm.extendSelection(Pos(line, i));\n      }\n      --line; ch = null;\n    }\n  }\n\n  function quit(cm) {\n    cm.execCommand(\"clearSearch\");\n    clearMark(cm);\n  }\n\n  // Actual keymap\n\n  var keyMap = CodeMirror.keyMap.emacs = {\n    \"Ctrl-W\": function(cm) {kill(cm, cm.getCursor(\"start\"), cm.getCursor(\"end\"));},\n    \"Ctrl-K\": repeated(function(cm) {\n      var start = cm.getCursor(), end = cm.clipPos(Pos(start.line));\n      var text = cm.getRange(start, end);\n      if (!/\\S/.test(text)) {\n        text += \"\\n\";\n        end = Pos(start.line + 1, 0);\n      }\n      kill(cm, start, end, true, text);\n    }),\n    \"Alt-W\": function(cm) {\n      addToRing(cm.getSelection());\n      clearMark(cm);\n    },\n    \"Ctrl-Y\": function(cm) {\n      var start = cm.getCursor();\n      cm.replaceRange(getFromRing(getPrefix(cm)), start, start, \"paste\");\n      cm.setSelection(start, cm.getCursor());\n    },\n    \"Alt-Y\": function(cm) {cm.replaceSelection(popFromRing(), \"around\", \"paste\");},\n\n    \"Ctrl-Space\": setMark, \"Ctrl-Shift-2\": setMark,\n\n    \"Ctrl-F\": move(byChar, 1), \"Ctrl-B\": move(byChar, -1),\n    \"Right\": move(byChar, 1), \"Left\": move(byChar, -1),\n    \"Ctrl-D\": function(cm) { killTo(cm, byChar, 1); },\n    \"Delete\": function(cm) { killTo(cm, byChar, 1); },\n    \"Ctrl-H\": function(cm) { killTo(cm, byChar, -1); },\n    \"Backspace\": function(cm) { killTo(cm, byChar, -1); },\n\n    \"Alt-F\": move(byWord, 1), \"Alt-B\": move(byWord, -1),\n    \"Alt-D\": function(cm) { killTo(cm, byWord, 1); },\n    \"Alt-Backspace\": function(cm) { killTo(cm, byWord, -1); },\n\n    \"Ctrl-N\": move(byLine, 1), \"Ctrl-P\": move(byLine, -1),\n    \"Down\": move(byLine, 1), \"Up\": move(byLine, -1),\n    \"Ctrl-A\": \"goLineStart\", \"Ctrl-E\": \"goLineEnd\",\n    \"End\": \"goLineEnd\", \"Home\": \"goLineStart\",\n\n    \"Alt-V\": move(byPage, -1), \"Ctrl-V\": move(byPage, 1),\n    \"PageUp\": move(byPage, -1), \"PageDown\": move(byPage, 1),\n\n    \"Ctrl-Up\": move(byParagraph, -1), \"Ctrl-Down\": move(byParagraph, 1),\n\n    \"Alt-A\": move(bySentence, -1), \"Alt-E\": move(bySentence, 1),\n    \"Alt-K\": function(cm) { killTo(cm, bySentence, 1); },\n\n    \"Ctrl-Alt-K\": function(cm) { killTo(cm, byExpr, 1); },\n    \"Ctrl-Alt-Backspace\": function(cm) { killTo(cm, byExpr, -1); },\n    \"Ctrl-Alt-F\": move(byExpr, 1), \"Ctrl-Alt-B\": move(byExpr, -1),\n\n    \"Shift-Ctrl-Alt-2\": function(cm) {\n      cm.setSelection(findEnd(cm, byExpr, 1), cm.getCursor());\n    },\n    \"Ctrl-Alt-T\": function(cm) {\n      var leftStart = byExpr(cm, cm.getCursor(), -1), leftEnd = byExpr(cm, leftStart, 1);\n      var rightEnd = byExpr(cm, leftEnd, 1), rightStart = byExpr(cm, rightEnd, -1);\n      cm.replaceRange(cm.getRange(rightStart, rightEnd) + cm.getRange(leftEnd, rightStart) +\n                      cm.getRange(leftStart, leftEnd), leftStart, rightEnd);\n    },\n    \"Ctrl-Alt-U\": repeated(toEnclosingExpr),\n\n    \"Alt-Space\": function(cm) {\n      var pos = cm.getCursor(), from = pos.ch, to = pos.ch, text = cm.getLine(pos.line);\n      while (from && /\\s/.test(text.charAt(from - 1))) --from;\n      while (to < text.length && /\\s/.test(text.charAt(to))) ++to;\n      cm.replaceRange(\" \", Pos(pos.line, from), Pos(pos.line, to));\n    },\n    \"Ctrl-O\": repeated(function(cm) { cm.replaceSelection(\"\\n\", \"start\"); }),\n    \"Ctrl-T\": repeated(function(cm) {\n      cm.execCommand(\"transposeChars\");\n    }),\n\n    \"Alt-C\": repeated(function(cm) {\n      operateOnWord(cm, function(w) {\n        var letter = w.search(/\\w/);\n        if (letter == -1) return w;\n        return w.slice(0, letter) + w.charAt(letter).toUpperCase() + w.slice(letter + 1).toLowerCase();\n      });\n    }),\n    \"Alt-U\": repeated(function(cm) {\n      operateOnWord(cm, function(w) { return w.toUpperCase(); });\n    }),\n    \"Alt-L\": repeated(function(cm) {\n      operateOnWord(cm, function(w) { return w.toLowerCase(); });\n    }),\n\n    \"Alt-;\": \"toggleComment\",\n\n    \"Ctrl-/\": repeated(\"undo\"), \"Shift-Ctrl--\": repeated(\"undo\"),\n    \"Ctrl-Z\": repeated(\"undo\"), \"Cmd-Z\": repeated(\"undo\"),\n    \"Shift-Alt-,\": \"goDocStart\", \"Shift-Alt-.\": \"goDocEnd\",\n    \"Ctrl-S\": \"findNext\", \"Ctrl-R\": \"findPrev\", \"Ctrl-G\": quit, \"Shift-Alt-5\": \"replace\",\n    \"Alt-/\": \"autocomplete\",\n    \"Ctrl-J\": \"newlineAndIndent\", \"Enter\": false, \"Tab\": \"indentAuto\",\n\n    \"Alt-G\": function(cm) {cm.setOption(\"keyMap\", \"emacs-Alt-G\");},\n    \"Ctrl-X\": function(cm) {cm.setOption(\"keyMap\", \"emacs-Ctrl-X\");},\n    \"Ctrl-Q\": function(cm) {cm.setOption(\"keyMap\", \"emacs-Ctrl-Q\");},\n    \"Ctrl-U\": addPrefixMap\n  };\n\n  CodeMirror.keyMap[\"emacs-Ctrl-X\"] = {\n    \"Tab\": function(cm) {\n      cm.indentSelection(getPrefix(cm, true) || cm.getOption(\"indentUnit\"));\n    },\n    \"Ctrl-X\": function(cm) {\n      cm.setSelection(cm.getCursor(\"head\"), cm.getCursor(\"anchor\"));\n    },\n\n    \"Ctrl-S\": \"save\", \"Ctrl-W\": \"save\", \"S\": \"saveAll\", \"F\": \"open\", \"U\": repeated(\"undo\"), \"K\": \"close\",\n    \"Delete\": function(cm) { kill(cm, cm.getCursor(), bySentence(cm, cm.getCursor(), 1), true); },\n    auto: \"emacs\", nofallthrough: true, disableInput: true\n  };\n\n  CodeMirror.keyMap[\"emacs-Alt-G\"] = {\n    \"G\": function(cm) {\n      var prefix = getPrefix(cm, true);\n      if (prefix != null && prefix > 0) return cm.setCursor(prefix - 1);\n\n      getInput(cm, \"Goto line\", function(str) {\n        var num;\n        if (str && !isNaN(num = Number(str)) && num == num|0 && num > 0)\n          cm.setCursor(num - 1);\n      });\n    },\n    auto: \"emacs\", nofallthrough: true, disableInput: true\n  };\n\n  CodeMirror.keyMap[\"emacs-Ctrl-Q\"] = {\n    \"Tab\": repeated(\"insertTab\"),\n    auto: \"emacs\", nofallthrough: true\n  };\n\n  var prefixMap = {\"Ctrl-G\": clearPrefix};\n  function regPrefix(d) {\n    prefixMap[d] = function(cm) { addPrefix(cm, d); };\n    keyMap[\"Ctrl-\" + d] = function(cm) { addPrefix(cm, d); };\n    prefixPreservingKeys[\"Ctrl-\" + d] = true;\n  }\n  for (var i = 0; i < 10; ++i) regPrefix(String(i));\n  regPrefix(\"-\");\n});\n"
        },
        "$:/plugins/tiddlywiki/codemirror/readme": {
            "title": "$:/plugins/tiddlywiki/codemirror/readme",
            "text": "This plugin provides an enhanced text editor component based on [[CodeMirror|http://codemirror.net]]. It provides several advantages over the default browser text editor:\n\n* Code colouring for many languages (see [[the official documentation here|http://codemirror.net/mode/index.html]])\n* Auto closing brackets and tags\n* Folding brackets, comments, and tags\n* Auto-completion\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/codemirror]]\n"
        },
        "$:/plugins/tiddlywiki/codemirror/styles": {
            "title": "$:/plugins/tiddlywiki/codemirror/styles",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "/* Make the editor resize to fit its content */\n\n.CodeMirror {\n\theight: auto;\n\tborder: 1px solid #ddd;\n\tline-height: 1.5;\n\tfont-family: \"Monaco\", monospace;\n}\n\n.CodeMirror-scroll {\n\toverflow-x: auto;\n\toverflow-y: hidden;\t\n}\n"
        },
        "$:/plugins/tiddlywiki/codemirror/usage": {
            "title": "$:/plugins/tiddlywiki/codemirror/usage",
            "text": "! Setting ~CodeMirror Content Types\n\nYou can determine which tiddler content types are edited by the ~CodeMirror widget by creating or modifying special tiddlers whose prefix is comprised of the string `$:/config/EditorTypeMappings/` concatenated with the content type. The text of that tiddler gives the editor type to be used (eg, ''text'', ''bitmap'', ''codemirror'').\n\nThe current editor type mappings are shown in [[$:/ControlPanel]] under the \"Advanced\" tab.\n\n! ~CodeMirror Configuration\n\nYou can configure the ~CodeMirror plugin by creating a tiddler called [[$:/config/CodeMirror]] containing a JSON configuration object. The configuration tiddler must have its type field set to `application/json` to take effect.\n\nSee http://codemirror.net/ for details of available configuration options.\n\nFor example:\n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\",\n      \"$:/plugins/tiddlywiki/codemirror/keymap/vim.js\",\n      \"$:/plugins/tiddlywiki/codemirror/keymap/emacs.js\"\n  ],\n  \"configuration\": {\n      \"keyMap\": \"vim\",\n      \"matchBrackets\":true,\n      \"showCursorWhenSelecting\": true\n  }\n}\n```\n\n!! Basic working configuration\n\n# Create a tiddler called `$:/config/CodeMirror`\n\n# The type of the tiddler has to be set to `application/json`\n\n# The text of the tiddler is the following: \n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\"\n  ],\n  \"configuration\": {\n      \"matchBrackets\":true,\n      \"showCursorWhenSelecting\": true\n  }\n}\n\n```\n\n# You should see line numbers when editing a tiddler\n# When editing a tiddler, no matter what the type of the tiddler is set to, you should see matching brackets being highlighted whenever the cursor is next to one of them\n# If you edit a tiddler with the type `application/javascript` or `application/json` you should see the code being syntax highlighted\n\n!! Add HTML syntax highlighting\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[https://raw.githubusercontent.com/codemirror/CodeMirror/master/mode/xml/xml.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\"\n  ],\n  \"configuration\": {\n      \"showCursorWhenSelecting\": true,\n      \"matchBrackets\":true\n  }\n}\n```\n# Edit a tiddler with the type `text/html` and write some html code. You should see your code being coloured\n\n!! Add a non-existing language mode\n\nHere's an example of adding a new language mode - in this case, the language C.\n\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/mode/clike/clike.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[https://raw.githubusercontent.com/codemirror/CodeMirror/master/mode/clike/clike.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/mode/clike/clike.js\"\n  ],\n  \"configuration\": {\n      \"showCursorWhenSelecting\": true\n  }\n}\n```\n\n# Add the correct ~EditorTypeMappings tiddler\n## Find the matching MIME type. If you go on the [[CodeMirror documentation for language modes|http://codemirror.net/mode/index.html]] you can see the [[documentation for the c-like mode|http://codemirror.net/mode/clike/index.html]]. In this documentation, at the end you will be told the MIME types defined. Here it's ''text/x-csrc''\n## Add the tiddler: `$:/config/EditorTypeMappings/text/x-csrc` and fill the text field with : ''codemirror''\n\nIf you edit a tiddler with the type `text/x-csrc` and write some code in C, you should see your text being coloured.\n\n!! Add matching tags\n\n# Add XML and HTML colouring\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/edit/matchtags.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/edit/matchtags.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchtags.js\",\n      \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\"\n  ],\n  \"configuration\": {\n      \"showCursorWhenSelecting\": true,\n      \"matchTags\": {\"bothTags\": true},\n    \"extraKeys\": {\"Ctrl-J\": \"toMatchingTag\"}\n  }\n}\n```\n\nEdit a tiddler that has the type :`text/htm` and write this code:\n\n```\n<html>\n      <div id=\"click here and press CTRL+J\">\n      <ul>\n        <li>\n        </li>\n      </ul>\n   </div>\n</html>\n```\n\nIf you click on a tag and press CTRL+J, your cursor will select the matching tag. Supposedly, it should highlight the pair when clicking a tag. However, that part doesn't work.\n\n!! Adding closing tags\n\n# Add the xml mode (see \"Add XML and HTML colouring\")\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/edit/closetags.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/edit/closetag.js]]\n\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/edit/closetags.js\"\n  ],\n  \"configuration\": {\n      \"showCursorWhenSelecting\": true,\n      \"autoCloseTags\":true\n  }\n}\n```\n\nIf you edit a tiddler with the type`text/html` and write:\n\n```\n<html>\n```\n\nThen the closing tag ''</html>'' should automatically appear.\n\n!! Add closing brackets\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/edit/closebrackets.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/edit/closebrackets.js]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/edit/closebrackets.js\"\n  ],\n\n  \"configuration\": {\n\n      \"showCursorWhenSelecting\": true,\n      \"matchBrackets\":true,\n      \"autoCloseBrackets\":true\n  }\n}\n```\n\n# If you try to edit any tiddler and write `if(` you should see the bracket closing itself automatically (you will get \"if()\"). It works with (), [], and {}\n# If you try and edit a tiddler with the type `application/javascript`, it will auto-close `()`,`[]`,`{}`,`''` and `\"\"`\n\n!! Adding folding tags\n\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/foldcode.js`\n## Add a field `module-type` and set it to ''library''\n## Set the field `type` to ''application/javascript''\n## Set the text field of the tiddler with the javascript code from this link : [[http://codemirror.net/addon/fold/foldcode.js]]\n# Repeat the above process for the following tiddlers, but replace the code with the one from the given link:\n## Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js`, the code can be found here [[https://raw.githubusercontent.com/codemirror/CodeMirror/master/addon/fold/xml-fold.js]]\n## Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/foldgutter.js`, the code can be found here [[http://codemirror.net/addon/fold/foldgutter.js]]\n# Create a tiddler `$:/plugins/tiddlywiki/codemirror/addon/fold/foldgutter.css`\n## Add the tag `$:/tags/Stylesheet`\n## Set the text field of the tiddler with the css code from this link : [[http://codemirror.net/addon/fold/foldgutter.css]]\n# Set the text field of the tiddler `$:/config/CodeMirror` to:\n\n```\n{\n  \"require\": [\n      \"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js\",\n      \"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/fold/foldcode.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js\",\n      \"$:/plugins/tiddlywiki/codemirror/addon/fold/foldgutter.js\"\n  ],\n  \"configuration\": {\n      \"showCursorWhenSelecting\": true,\n      \"matchTags\": {\"bothTags\": true},\n      \"foldGutter\": true,\n      \"gutters\": [\"CodeMirror-linenumbers\", \"CodeMirror-foldgutter\"]\n  }\n}\n```\n\nNow if you type the below code in a tiddler with the type `text/html`:\n\n```\n<html>\n   <div>\n      <ul>\n\n      </ul>\n   </div>\n</html>\n```\n\nYou should see little arrows just next to the line numbers. Clicking on it will have the effect to fold the code (or unfold it).\n"
        }
    }
}
{
    "tiddlers": {
        "$:/plugins/tiddlywiki/highlight/highlight.js": {
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/highlight/highlight.js",
            "module-type": "library",
            "text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define(\"hljs\",[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){return/^(no-?highlight|plain|text)$/i.test(e)}function i(e){var n,t,r,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=/\\blang(?:uage)?-([\\w-]+)\\b/i.exec(i))return w(t[1])?t[1]:\"no-highlight\";for(i=i.split(/\\s+/),n=0,r=i.length;r>n;n++)if(w(i[n])||a(i[n]))return i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:\"start\",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:\"stop\",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:\"start\"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return\" \"+e.nodeName+'=\"'+n(e.value)+'\"'}f+=\"<\"+t(e)+Array.prototype.map.call(e.attributes,r).join(\"\")+\">\"}function u(e){f+=\"</\"+t(e)+\">\"}function c(e){(\"start\"==e.event?o:u)(e.node)}for(var s=0,f=\"\",l=[];e.length||r.length;){var g=i();if(f+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){l.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);l.reverse().forEach(o)}else\"start\"==g[0].event?l.push(g[0].node):l.pop(),c(g.splice(0,1)[0])}return f+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),\"m\"+(e.cI?\"i\":\"\")+(r?\"g\":\"\"))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(\" \").forEach(function(e){var t=e.split(\"|\");u[t[0]]=[n,t[1]?Number(t[1]):1]})};\"string\"==typeof a.k?c(\"keyword\",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\\b\\w+\\b/,!0),i&&(a.bK&&(a.b=\"\\\\b(\"+a.bK.split(\" \").join(\"|\")+\")\\\\b\"),a.b||(a.b=/\\B|\\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\\B|\\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||\"\",a.eW&&i.tE&&(a.tE+=(a.e?\"|\":\"\")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push(\"self\"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var f=a.c.map(function(e){return e.bK?\"\\\\.?(\"+e.b+\")\\\\.?\":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=f.length?t(f.join(\"|\"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?\"\":E.classPrefix,i='<span class=\"'+a,o=t?\"\":\"</span>\";return i+=e+'\">',i+n+o}function p(){if(!L.k)return n(y);var e=\"\",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=h(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function d(){var e=\"string\"==typeof L.sL;if(e&&!x[L.sL])return n(y);var t=e?f(L.sL,y,!0,M[L.sL]):l(y,L.sL.length?L.sL:void 0);return L.r>0&&(B+=t.r),e&&(M[L.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){return void 0!==L.sL?d():p()}function v(e,t){var r=e.cN?h(e.cN,\"\",!0):\"\";e.rB?(k+=r,y=\"\"):e.eB?(k+=n(t)+r,y=\"\"):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+=\"</span>\"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y=\"\",a.starts&&v(a.starts,\"\"),i.rE?0:t.length}if(c(t,L))throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(L.cN||\"<unnamed>\")+'\"');return y+=t,t.length||1}var N=w(e);if(!N)throw new Error('Unknown language: \"'+e+'\"');s(N);var R,L=i||N,M={},k=\"\";for(R=L;R!=N;R=R.parent)R.cN&&(k=h(R.cN,\"\",!0)+k);var y=\"\",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+=\"</span>\");return{r:B,value:k,language:e,top:L}}catch(O){if(-1!=O.message.indexOf(\"Illegal\"))return{r:0,value:n(t)};throw O}}function l(e,t){t=t||E.languages||Object.keys(x);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(w(n)){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function g(e){return E.tabReplace&&(e=e.replace(/^((<[^>]+>|\\t)+)/gm,function(e,n){return n.replace(/\\t/g,E.tabReplace)})),E.useBR&&(e=e.replace(/\\n/g,\"<br>\")),e}function h(e,n,t){var r=n?R[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}function p(e){var n=i(e);if(!a(n)){var t;E.useBR?(t=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\"),t.innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\")):t=e;var r=t.textContent,o=n?f(n,r,!0):l(r),s=u(t);if(s.length){var p=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"div\");p.innerHTML=o.value,o.value=c(s,u(p),r)}o.value=g(o.value),e.innerHTML=o.value,e.className=h(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){E=o(E,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(e,p)}}function v(){addEventListener(\"DOMContentLoaded\",b,!1),addEventListener(\"load\",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){R[e]=n})}function N(){return Object.keys(x)}function w(e){return e=e.toLowerCase(),x[e]||x[R[e]]}var E={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},x={},R={};return e.highlight=f,e.highlightAuto=l,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=w,e.inherit=o,e.IR=\"[a-zA-Z]\\\\w*\",e.UIR=\"[a-zA-Z_]\\\\w*\",e.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",e.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",e.BNR=\"\\\\b(0b[01]+)\",e.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",e.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0},e.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[e.BE]},e.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[e.BE]},e.PWM={b:/\\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\\b/},e.C=function(n,t,r){var a=e.inherit({cN:\"comment\",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",r:0}),a},e.CLCM=e.C(\"//\",\"$\"),e.CBCM=e.C(\"/\\\\*\",\"\\\\*/\"),e.HCM=e.C(\"#\",\"$\"),e.NM={cN:\"number\",b:e.NR,r:0},e.CNM={cN:\"number\",b:e.CNR,r:0},e.BNM={cN:\"number\",b:e.BNR,r:0},e.CSSNM={cN:\"number\",b:e.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",r:0},e.RM={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[e.BE,{b:/\\[/,e:/\\]/,r:0,c:[e.BE]}]},e.TM={cN:\"title\",b:e.IR,r:0},e.UTM={cN:\"title\",b:e.UIR,r:0},e});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],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:!0,c:[{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,r:0},{cN:\"link_url\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"link_reference\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],r:10},{b:\"^\\\\[.+\\\\]:\",rB:!0,c:[{cN:\"link_reference\",b:\"\\\\[\",e:\"\\\\]:\",eB:!0,eE:!0,starts:{cN:\"link_url\",e:\"$\"}}]}]}});hljs.registerLanguage(\"ruby\",function(e){var c=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",r=\"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\",b={cN:\"doctag\",b:\"@[A-Za-z]+\"},a={cN:\"value\",b:\"#<\",e:\">\"},n=[e.C(\"#\",\"$\",{c:[b]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[b],r:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:r},t={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:r},d=[t,a,{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}]}].concat(n)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{cN:\"constant\",b:\"(::)?(\\\\b[A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"symbol\",b:\":\",c:[t,{b: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},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[a,{cN:\"regexp\",c:[e.BE,s],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]*\"}]}].concat(n),r:0}].concat(n);s.c=d,i.c=d;var o=\"[>?]>\",l=\"[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>\",u=\"(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>\",N=[{b:/^\\s*=>/,cN:\"status\",starts:{e:\"$\",c:d}},{cN:\"prompt\",b:\"^(\"+o+\"|\"+l+\"|\"+u+\")\",starts:{e:\"$\",c:d}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:r,c:n.concat(N).concat(d)}});hljs.registerLanguage(\"makefile\",function(e){var a={cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]};return{aliases:[\"mk\",\"mak\"],c:[e.HCM,{b:/^\\w+\\s*\\W*=/,rB:!0,r:0,starts:{cN:\"constant\",e:/\\s*\\W*=/,eE:!0,starts:{e:/$/,r:0,c:[a]}}},{cN:\"title\",b:/^[\\w]+:\\s*$/},{cN:\"phony\",b:/^\\.PHONY:/,e:/$/,k:\".PHONY\",l:/[\\.\\w]+/},{b:/^\\t+/,e:/$/,r:0,c:[e.QSM,a]}]}});hljs.registerLanguage(\"json\",function(e){var t={literal:\"true false null\"},i=[e.QSM,e.CNM],l={cN:\"value\",e:\",\",eW:!0,eE:!0,c:i,k:t},c={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:!0,eE:!0,c:[e.BE],i:\"\\\\n\",starts:l}],i:\"\\\\S\"},n={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(l,{cN:null})],i:\"\\\\S\"};return i.splice(i.length,0,c,n),{c:i,k:t,i:\"\\\\S\"}});hljs.registerLanguage(\"xml\",function(t){var s=\"[A-Za-z0-9\\\\._:-]+\",c={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\"},e={eW:!0,i:/</,r:0,c:[c,{cN:\"attribute\",b:s,r:0},{b:\"=\",r:0,c:[{cN:\"value\",c:[c],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xsl\",\"plist\"],cI:!0,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},t.C(\"<!--\",\"-->\",{r:10}),{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[e],starts:{e:\"</style>\",rE:!0,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[e],starts:{e:\"</script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\"]}},c,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:/[^ \\/><\\n\\t]+/,r:0},e]}]}});hljs.registerLanguage(\"css\",function(e){var c=\"[a-zA-Z-][a-zA-Z0-9_-]*\",a={cN:\"function\",b:c+\"\\\\(\",rB:!0,eE:!0,e:\"\\\\(\"},r={cN:\"rule\",b:/[A-Z\\_\\.\\-]+\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{cN:\"value\",eW:!0,eE:!0,c:[a,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,r,{cN:\"id\",b:/\\#[A-Za-z0-9_-]+/},{cN:\"class\",b:/\\.[A-Za-z0-9_-]+/},{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:!0,eE:!0,r:0,c:[a,e.ASM,e.QSM,e.CSSNM]}]},{cN:\"tag\",b:c,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,r]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"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\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={cN:\"variable\",v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,r:0}]},o=[e.BE,r,n],i=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),s,{cN:\"string\",c:o,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:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.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:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],r:0}]},{cN:\"sub\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=i,s.c=i,{aliases:[\"pl\"],k:t,c:i}});hljs.registerLanguage(\"cs\",function(e){var r=\"abstract as base bool break byte case catch char checked const continue decimal dynamic 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 null when object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async protected public private internal ascending descending from get group into join let orderby partial select set value var where yield\",t=e.IR+\"(<\"+e.IR+\">)?\";return{aliases:[\"csharp\"],k:r,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"xmlDocTag\",v:[{b:\"///\",r:0},{b:\"<!--|-->\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line region endregion pragma checksum\"},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},e.ASM,e.QSM,e.CNM,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[{cN:\"title\",b:\"[a-zA-Z](\\\\.?\\\\w)*\",r:0},e.CLCM,e.CBCM]},{bK:\"new return throw await\",r:0},{cN:\"function\",b:\"(\"+t+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.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\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"http\",function(t){return{aliases:[\"https\"],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:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{cN:\"string\",e:\"$\"}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage(\"objectivec\",function(e){var t={cN:\"built_in\",b:\"(AV|CA|CF|CG|CI|MK|MP|NS|UI)\\\\w+\"},i={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 readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},o=/[a-zA-Z@][a-zA-Z0-9_]*/,n=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:i,l:o,i:\"</\",c:[t,e.CLCM,e.CBCM,e.CNM,e.QSM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{cN:\"title\",v:[{b:'\"',e:'\"'},{b:\"<\",e:\">\"}]}]},{cN:\"class\",b:\"(\"+n.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:n,l:o,c:[e.UTM]},{cN:\"variable\",b:\"\\\\.\"+e.UIR,r:0}]}});hljs.registerLanguage(\"python\",function(e){var r={cN:\"prompt\",b:/^(>>>|\\.\\.\\.) /},b={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[r],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},a={cN:\"number\",r:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},l={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",r,a,b]};return{aliases:[\"py\",\"gyp\"],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 async await nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)/,c:[r,a,b,e.HCM,{v:[{cN:\"function\",bK:\"def\",r:10},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,l]},{cN:\"decorator\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"java\",function(e){var a=e.UIR+\"(<\"+e.UIR+\">)?\",t=\"false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private\",c=\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",r={cN:\"number\",b:c,r:0};return{aliases:[\"jsp\"],k:t,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{r:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",r:0},{cN:\"function\",b:\"(\"+a+\"\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:t,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,r:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:t,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},r,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},s={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]},a={cN:\"string\",b:/'/,e:/'/};return{aliases:[\"sh\",\"zsh\"],l:/-?[a-z\\.]+/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",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:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],r:0},e.HCM,e.NM,s,a,t]}});hljs.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*]/,c:[{cN:\"operator\",bK:\"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 describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke\",e:/;/,eW:!0,k:{keyword:\"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes c cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle d data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration e each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract f failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function g general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http i id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists k keep keep_duplicates key keys kill l language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim m main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex n name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding p package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime t table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null\",built_in:\"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,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:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{cN:\"url\",b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{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},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"title\",b:e.UIR,starts:b}],r:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"cpp\",function(t){var e={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},r={cN:\"string\",v:[t.inherit(t.QSM,{b:'((u8?|U)|L)?\"'}),{b:'(u8?|U)?R\"',e:'\"',c:[t.BE]},{b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"}]},s={cN:\"number\",v:[{b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},{b:t.CNR}]},i={cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line pragma ifdef ifndef\",c:[{b:/\\\\\\n/,r:0},{bK:\"include\",e:\"$\",c:[r,{cN:\"string\",b:\"<\",e:\">\",i:\"\\\\n\"}]},r,s,t.CLCM,t.CBCM]},a=t.IR+\"\\\\s*\\\\(\",c={keyword:\"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 volatile static protected bool template mutable if public friend do goto auto void enum else break extern using class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong\",built_in:\"std string cin cout cerr clog stdin stdout stderr 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 realloc 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\",literal:\"true false nullptr NULL\"};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\"],k:c,i:\"</\",c:[e,t.CLCM,t.CBCM,s,r,i,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:c,c:[\"self\",e]},{b:t.IR+\"::\",k:c},{bK:\"new throw return else\",r:0},{cN:\"function\",b:\"(\"+t.IR+\"[\\\\*&\\\\s]+)+\"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\\w\\s\\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s]},t.CLCM,t.CBCM,i]}]}});hljs.registerLanguage(\"php\",function(e){var c={cN:\"variable\",b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},a={cN:\"preprocessor\",b:/<\\?(php)?|\\?>/},i={cN:\"string\",c:[e.BE,a],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},t={v:[e.BNM,e.CNM]};return{aliases:[\"php3\",\"php4\",\"php5\",\"php6\"],cI:!0,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:[e.CLCM,e.HCM,e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"},a]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},a,c,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,i,t]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},i,t]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={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\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={cN:\"subst\",b:/#\\{/,e:/}/,k:c},t=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,r]},{b:/\"/,e:/\"/,c:[e.BE,r]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[r,e.HCM]},{b:\"//[gim]*\",r:0},{b:/\\/(?![ *])(\\\\\\/|.)*?\\/[gim]*(?=\\W|$)/}]},{cN:\"property\",b:\"@\"+n},{b:\"`\",e:\"`\",eB:!0,eE:!0,sL:\"javascript\"}];r.c=t;var s=e.inherit(e.TM,{b:n}),i=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",o={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(t)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:t.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+i,e:\"[-=]>\",rB:!0,c:[s,o]},{b:/[:\\(,=]\\s*/,r:0,c:[{cN:\"function\",b:i,e:\"[-=]>\",rB:!0,c:[o]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[s]},s]},{cN:\"attribute\",b:n+\":\",e:\":\",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage(\"javascript\",function(e){return{aliases:[\"js\"],k:{keyword:\"in of 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 export super debugger as async await\",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 module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},c:[{cN:\"pi\",r:10,b:/^\\s*['\"]use (strict|asm)['\"]/},e.ASM,e.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,{cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\"}]},e.CLCM,e.CBCM,{cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)\"},{b:\"\\\\b(0[oO][0-7]+)\"},{b:e.CNR}],r:0},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{b:/</,e:/>\\s*[);\\]]/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM]}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,r:0},{bK:\"import\",e:\"[;$]\",k:\"import from as\",c:[e.ASM,e.QSM]},{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]}],i:/#/}});hljs.registerLanguage(\"ini\",function(e){var c={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",r:10},{b:'\"\"\"',e:'\"\"\"',r:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[e.C(\";\",\"$\"),e.HCM,{cN:\"title\",b:/^\\s*\\[+/,e:/\\]+/},{cN:\"setting\",b:/^[a-z0-9\\[\\]_-]+\\s*=\\s*/,e:\"$\",c:[{cN:\"value\",eW:!0,k:\"on off true false yes no\",c:[{cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},c,{cN:\"number\",b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},e.NM],r:0}]}]}});hljs.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],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:\"$\"}]}});\nexports.hljs = hljs;\n"
        },
        "$:/plugins/tiddlywiki/highlight/highlight.css": {
            "type": "text/css",
            "title": "$:/plugins/tiddlywiki/highlight/highlight.css",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #f0f0f0;\n  -webkit-text-size-adjust: none;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.nginx .hljs-title {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rule .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-name,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.pf .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute,\n.tp .hljs-variable {\n  color: #800;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #080;\n}\n\n.hljs-label,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #88f;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-doctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.pf .hljs-variable,\n.apache .hljs-tag,\n.hljs-type,\n.hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status,\n.tp .hljs-data,\n.tp .hljs-io {\n  font-weight: bold;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis,\n.tp .hljs-units {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
        },
        "$:/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\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n\nhljs.configure({tabReplace: \"    \"});\t\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} else if(!$tw.browser && this.language && this.language.indexOf(\"/\") === -1 ){\n\t\ttry {\n\t\t\tdomNode.className = this.language.toLowerCase() + \" hljs\";\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(this.language, this.getAttribute(\"code\")).value);\n\t\t}\n\t\tcatch(err) {\n\t\t\t// Can't easily tell if a language is registered or not in the packed version of hightlight.js,\n\t\t\t// so we silently fail and the codeblock remains unchanged\n\t\t}\n\t}\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/readme": {
            "title": "$:/plugins/tiddlywiki/highlight/readme",
            "text": "This plugin provides syntax highlighting of code blocks using v8.8.0 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev.\n\n! Usage\n\nWhen the plugin is installed it automatically applies highlighting to all codeblocks defined with triple backticks or with the CodeBlockWidget.\n\nThe language can optionally be specified after the opening triple braces:\n\n<$codeblock code=\"\"\"```css\n * { margin: 0; padding: 0; } /* micro reset */\n\nhtml { font-size: 62.5%; }\nbody { font-size: 14px; font-size: 1.4rem; } /* =14px */\nh1   { font-size: 24px; font-size: 2.4rem; } /* =24px */\n```\"\"\"/>\n\nIf no language is specified highlight.js will attempt to automatically detect the language.\n\n! Built-in Language Brushes\n\nThe plugin includes support for the following languages (referred to as \"brushes\" by highlight.js):\n\n* apache\n* bash\n* coffeescript\n* cpp\n* cs\n* css\n* diff\n* http\n* ini\n* java\n* javascript\n* json\n* makefile\n* markdown\n* nginx\n* objectivec\n* perl\n* php\n* python\n* ruby\n* sql\n* xml\n\n"
        },
        "$:/plugins/tiddlywiki/highlight/styles": {
            "title": "$:/plugins/tiddlywiki/highlight/styles",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": ".hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8;-webkit-text-size-adjust:none}.hljs-comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:teal}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.scss .hljs-preprocessor{color:#900;font-weight:bold}.hljs-list .hljs-keyword,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rule .hljs-property,.django .hljs-tag .hljs-keyword{color:navy;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.hljs-name{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.clojure .hljs-keyword,.scheme .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}"
        },
        "$:/plugins/tiddlywiki/highlight/usage": {
            "title": "$:/plugins/tiddlywiki/highlight/usage",
            "text": "! Usage\n\nFenced code blocks can have a language specifier added to trigger highlighting in a specific language. Otherwise heuristics are used to detect the language.\n\n```\n ```js\n var a = b + c; // Highlighted as JavaScript\n ```\n```\n! Adding Themes\n\nYou can add themes from highlight.js by copying the CSS to a new tiddler and tagging it with [[$:/tags/Stylesheet]]. The available themes can be found on GitHub:\n\nhttps://github.com/isagalaev/highlight.js/tree/master/src/styles\n"
        }
    }
}
A publicly viewable copy of my TW5 environment, without the private content of my offline TW instance, allowing for troubleshooting and other input from the TW community.
Hegart Dmishiv

{
    "tiddlers": {
        "$:/info/browser": {
            "title": "$:/info/browser",
            "text": "no"
        },
        "$:/info/node": {
            "title": "$:/info/node",
            "text": "yes"
        }
    }
}
$:/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-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,\n.tc-page-controls button.tc-selected {\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 {\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-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 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 \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
        }
    }
}
{
    "tiddlers": {
        "$:/themes/tiddlywiki/vanilla/themetweaks": {
            "title": "$:/themes/tiddlywiki/vanilla/themetweaks",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "Theme Tweaks",
            "text": "\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\">\n<$link to=\"\">\n(none)\n</$link>\n<hr>\n<$list filter=\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[sort[title]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\">Scroll with tiddlers</option>\n<option value=\"fixed\">Fixed to window</option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\">Auto</option>\n<option value=\"cover\">Cover</option>\n<option value=\"contain\">Contain</option>\n</$select>\n\\end\n\nYou can tweak certain aspects of the ''Vanilla'' theme.\n\n! Options\n\n|[[Sidebar layout|$:/themes/tiddlywiki/vanilla/options/sidebarlayout]] |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\">Fixed story, fluid sidebar</option><option value=\"fluid-fixed\">Fluid story, fixed sidebar</option></$select> |\n|[[Sticky titles|$:/themes/tiddlywiki/vanilla/options/stickytitles]]<br>//Causes tiddler titles to \"stick\" to the top of the browser window. Caution: Does not work at all with Chrome, and causes some layout issues in Firefox// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">No</option><option value=\"yes\">Yes</option></$select> |\n\n! Settings\n\n|[[Font family|$:/themes/tiddlywiki/vanilla/settings/fontfamily]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|[[Code font family|$:/themes/tiddlywiki/vanilla/settings/codefontfamily]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|[[Page background image|$:/themes/tiddlywiki/vanilla/settings/backgroundimage]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|[[Page background image attachment |$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment]] |<<backgroundimageattachment-dropdown>> | |\n|[[Page background image size |$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize]] |<<backgroundimagesize-dropdown>> | |\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]]<br>//how far the left margin of the story river<br>(tiddler area) is from the left of the page// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|[[Story top position|$:/themes/tiddlywiki/vanilla/metrics/storytop]]<br>//how far the top margin of the story river<br>is from the top of the page// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|[[Story right|$:/themes/tiddlywiki/vanilla/metrics/storyright]]<br>//how far the left margin of the sidebar <br>is from the left of the page// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|[[Story width|$:/themes/tiddlywiki/vanilla/metrics/storywidth]]<br>//the overall width of the story river// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|[[Tiddler width|$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth]]<br>//within the story river//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|[[Sidebar breakpoint|$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint]]<br>//the minimum page width at which the story<br>river and sidebar will appear side by side// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|[[Sidebar width|$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth]]<br>//the width of the sidebar in fluid-fixed layout// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
        },
        "$:/themes/tiddlywiki/vanilla/base": {
            "title": "$:/themes/tiddlywiki/vanilla/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\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\tcolor: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\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\tfill: <<colour foreground>>;\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\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\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\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\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\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\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<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-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\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\tdisplay: inline-block;\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\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\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.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n    width: calc(100% + 2px);\n    margin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n    top: 6px;\n    bottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t    width: calc(100% + 59px);\n    }\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t    font-size: 0.75em;\n\t}\n\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-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\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls 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\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\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-site-title {\n\tcolor: <<colour site-title-foreground>>;\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.tc-search button svg, .tc-search a svg {\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.tc-search button:hover svg, .tc-search a: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-body {\n\tclear: both;\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\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\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}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\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-prompt {\n\tpadding: 0 14px;\t\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\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\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\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.tc-search-results {\n    padding: 0 7px 0 7px;\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\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\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-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\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\tmargin-right: 0.3em;\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\tmargin-right: 0;\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\tdisplay: inline;\n\twidth: auto;\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\tdisplay: block;\n\twidth: 100%;\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>>;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\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: 0.5em 0 0.5em 0;\n\tpadding: 4px;\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 .tc-plugin-info > .tc-plugin-info-chunk > svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-plugin-info-chunk h1 {\n\tfont-size: 1em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk h2 {\n\tfont-size: 0.8em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk div {\n\tfont-size: 0.7em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info:hover > .tc-plugin-info-chunk > img, .tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info > .tc-plugin-info-chunk > img, .tc-plugin-info > .tc-plugin-info-chunk > svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > img, .tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 1em 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\tpadding: 2px 4px;\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}\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: 0.4em;\n\tborder: 1px solid #888;\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** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n    text-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n    min-width: 100%;\n    min-height: 100%;\n    max-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\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/metrics/sidebarwidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
            "text": "350px"
        },
        "$:/themes/tiddlywiki/vanilla/options/stickytitles": {
            "title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
            "text": "no"
        },
        "$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
            "title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
            "text": "fixed-fluid"
        },
        "$:/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\", \"DejaVu Sans\", sans-serif"
        },
        "$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
            "text": "Monaco, Consolas, \"Lucida Console\", \"DejaVu Sans Mono\", monospace"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
            "text": "fixed"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
            "text": "auto"
        },
        "$:/themes/tiddlywiki/vanilla/sticky": {
            "title": "$:/themes/tiddlywiki/vanilla/sticky",
            "text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n``\n</$reveal>\n"
        }
    }
}
''There are <<DaysToDate "4/21/2016">> days until the release of Ubuntu 16.04 LTS (Xenial Xerus).''

<span style="float:left; padding-right: 15px;">[img width=100 [Hegart's face.png]]</span> Welcome to my "development" TiddlyWiki. This publicly accessible wiki is here so that I can demonstrate any problems I'm having while getting to know TW, so that members of the TW community can point me in the right direction. It allows me to separate the "environment" from the "content" of my personal, offline TW instance.

I'm using TW to document my home network, so I don't really want to be doing that in a public place. I have used a full MediaWiki installation for this in the past, running a LAMP server on a spare PC, with MW on top. While this was a good solution, it became difficult when the software stack on the PC hosting the wiki needed to be upgraded. My documentation about which versions of software to use, the download links, etc, were all stored on the PC that I was upgrading!

I'm now starting to migrate this information into TiddlyWiki, which I'm running from a USB thumb drive permanently connected to my DSL router. While it doesn't serve web pages, I can use SAMBA to view the file in a web browser from any device connected to my LAN/WLAN. That is my "live" instance of TW. What you are seeing here is my "dev" instance of TW. The content of the two instances will not be the same, but I try very hard to ensure that the environment is exactly the same between both of them.
<$list filter="[!has[draft.of]tag[task]tag[done]sort[created]]">

<$checkbox tag="done">~~<$link to={{!!title}}><$view field="created" format="date" template="DD-mmm-YY hh:mm"/> - <$view field="title"/></$link>~~</$checkbox>

</$list>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Contents' sort[title]>>
</div>



iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0CAYAAADL1t+KAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wkOAysWQpHneQAAABl0RVh0Q29tbWVudABDcmVhdGVk
IHdpdGggR0lNUFeBDhcAACAASURBVHja7N1ZzL75fd/192+7tnt7tv/+n7HHYzuOXTs2TtOIlCKF
RlGKkCKhiEhsLaFBKpUoCNU9IuYAFCSWAw5QBS1KVVDUBghJHduJE2LHie14Jp7xeBmPZ/nPf/7r
s93Ltf52Dp4IkFBBSEDt5H6dPEeP9Oi+r+/zuX7X73d9v4K9vb3/k1e/9geSEH9adf5v0bo/K3NB
PV9BjiTriTKRoiO4jiwVSmtCu0MkASmBz2TryTmSc0ZkkMs5IgaEKok6Q/CMbYt3A65riXagXs6J
SQIgtSHlCDGhQ2ZxdBOERM5KzLwmECnMDMsEY8A+2iC7FuMAobnxsQ8ir93BzI9BKLSWtDHhlCTZ
js2918hnp4jWk9Y7mtWcVAiKWURERfP+uygxZypKZuU1WjtiK02aLLvNfbb3H3L+6kMOzmD7mxuO
1yM3/rUTwlstJ//yc1R37+B1RIUFfWNglLQPTpktIum1HTlZbn70eWy9ZHbjkFGsmIxidz5gE8Th
MZfd7vLw9rV/94f+6R/+e/urcm/v/5refwR7e/+7r33xf2z0FP5qard/o5lfe7fXiergGKwnlRrt
NZYRUSj82oJMiHFiChatNa7doauS0DtEYzBo7GVPebAgT45cCKSzhBwQSdBfdqg6k0Mi5YDMkjEG
Cp0YLwekkRihyQl0oXApYqoCaRqEdKQkiBHklPDnW4pSIJoCNS/QBweoaoYuND4pkBqZA1oInBDE
bkMctuicSZUlXGZSIxCFIbcW07cgQUqBrjxlXZNEQjYzor5DHjy7xY7gO8LzAVtr2mKHPFjTnldE
DaHM1E2GosIPE6rK+CAJU6CoJP3FJeakxk4DzewIFSV+VkGYCHlOPeyOpvPzX3rpi1/+q8Xi4Oc+
+EMfeG1/le7t7QN9b+8f65Wv/cah27X/jor5r5WxuIYH6TKNPEQpRcwOTAE5kaRCCkGWghwi2ImU
IXU7ckpE64j9hMYT49VqO3U7hDZkGwlCQWVIuxElI4yOFCKCkhASOgvCmMlZQZcpSkN5vCIVBdWs
QkpQlSYFCG6EzhEuOnRWyBQROaObCllV6GpOTmCMIQsQQuGDp1tfIHIm7SZiqTGrmriI6FlDGEdk
U5AmSxAJVRcI6ahliQ8DsjyhBNzqiOXda2ynCX5YECu4PD3j8P0Luu2OpEqUKYjXLylZEjY9atWQ
hgx3Dd4GtrsNR82S6emW2btPEC6zLGrKWLDRFfPZAeP6Ap/Wf94N7Utff+mN/7AoVv/pBz54EvdX
7d7ePtD39v43L7zw39/RRfk389j9lVmzWoiNRZslhZyhfEFTLRmHFq0KRBa4aDGlJvuAbEr8pSem
gMyJcbKYsiD0I0IopM2EqUPPavLoUFUitBOsKvQE7fYSYwzOJaRIGJXxdqCcLdluWhozQ5cS3VSU
B0uEFhSzFXHsyUWB8BBtgDEwnV8iJ0vVzEldT3VyhFIKqRQhg9KKlEABaRoJ5yN0E0YqVCFRhQGp
MbMZbsooA9kHfPYoP0KIlDWYUNAoDbnCHdzi8E5geLol5QlpPC6N2K0gyUxRegIRUxiUrBExQ8hX
N0PaoLJCAFPfkazGHV+QcoUWAmFqZmKFEgoxGMb2jNCOtQsPf1EcDj/90svv/NxHf+iZb+2v4L29
faDv/Sn3R1/5h3eV8/9e8OLfKrNu0hAp6wohZ5T1MU3W+CTR2SByvlqN20QYPapSJFMiowEjQGgk
EWwEDTlZyIHsEsIHsB5CIAVJJpCCJ3eBFBwiRlSOJCwxQAyJKA1qCpgqU9YN5bJBNw1mXiC8RWpF
iBPB9thtB+c9aesoZgpIKCWIfiDnTFYJJTSIDGSSyMSYr84CtBNKSlQpENFjqhpEQByW6KSIk6XQ
JWHXIpYT1rY0agHJUgBVOUMcXefkuVucv9aDb6kPDkmbEbkyxLVDVQWil/g0ohYzhBWo2RzvMllF
9HzOeNFSSM203iFngYCnmtegJEFI5jfvIk4TU3uGuNwy9tsfnd04funlL3zpP0+z+j/42Mc/6vZX
9N7ePtD3/pT5vX/0d37YKH5BxfyXjEaqIBGDpZQrTJxRljMWZoVLGZUTLgYSgmQncpLooiTgkEaT
SJhlhbaJHBzV0YpkJ4QJZNcxdQO6Vvhxh65qBIEkBaJPjLZHVRXjdgclRBEheFQ1p3/9AdVihYqO
YqVRlQA2aI4ZNmvkyTFh7XDrgTh4ogsUJytyGAke1GSw64EsIEaPNoYYAkoZohc4OUNohdtCUUdU
SMRupDisyVpQzCpi68kkqhRxm3P8cU2MK+rDkkDCSE2NhNmSg2ffRX/+hLiONEvDcL5DW0k0ESWg
rAtcSkgpydlQNTPyaMmzkqI5JPoSVRVEDGRBGDqq2mJMQ20KZL0g5RvIUuAvzunPL8gkE1z4RD6p
furF3/r0z338J37qhf3VvbcP9L29PwU+86t/5y/O0J/Mo/ux+qiB3pF9opIFTILV4RExapazA7Sa
MU2WQkNvdyAUMmiiSRgZyS4hC0OwDqoSZUpCtEhrsTYgpcA5R9QJowx2CKiVxibIBMpdYrSOImbS
mJFIhC0YLkfq2xAGMDdK6pMluhYoFYlk4jjg+xG9skQf8aknmA6rJ6QHkTMiBdKU0PMaGUdS9uSc
EEKRcwQpEAaoNKGISDKyHxDGACCLq5+pEAhnGKeJ6HpCvyaniehnGL0kCUEpMtkUhMWKw1s36DLk
XYu8doAzCZVAJpjGEX14DWJCFgJ0iVos0fMFSjU0NxtkDJRlg8sjWSpy9IRsKbRG5cR8tiLnTIqe
GSPd2SVaJyT6I8yrL33pN37lPwsu/sI/89P/kt1f7Xt/Wsn9R7D3J9kr3/xS8dXf+8x/ORPFbxVC
/5iOEuk0hTOYSaEnqGdHVPWCVXOIKWYgBEILfEwkqUkpEYWlMgVKl6h6RqEXlMsDyqJBNytMtQJZ
oqUBoVBGoSV4EqCwQ4asCRO0vkU0EMRIKkZQDvKEqRVxtMyePwYSQhtSELjdCH1k6lqkhjh05DSi
ihJ8gQqSftsT3QAXLfa1M9S6I04bTJ6IySJFIpJRGiqViCnjfCImh50mlPCEqccUgjhuQTlSkRhD
iyYxnZ4Sdxt8d4ZU4mrrIHWUJLSE+Z33sLhxQtYa6gZrBXJZEFuP73ukSdjTxxiTwTl0vaBKFVqX
NM010DOqxQ0oD9HVIVFqvO2pgBwH5kZQFw3V9WcpFkfELiN2Cs4SPNjp5dp+Yt7HL3/j07/+sf1V
v7cP9L29P2G++ervP0e0XxbS/fWyMEgbmJsKzjrYWkyskJTMqxVaVmhT4/NV8CUJnoAsJAlLURQY
U5JzpjJLNIJCL5CiRiqNiZLUdcjkiM6TlEDOGpIANatxbsL2HfZ+jxtGVKEZT59CnMgyMalMNhWp
SzTVjJQd3vakfiKs12QXcJcbtNaIAMxKoiwYB5jOAt3nR9w3E2kQ2DdOyX6Hmy6JaSCGq0VrSgmR
MkqViPoG1fUTnNe4dSJ3AT86srVkl0DGq4NygA+ZYd1hNy32/BRcB8mjMhgSWiTK2ZzZzVvUx0fM
lgtMWSNlRewFyQnCZgMpEnyHn7aEcU1MA1qBVJlysULqiqJYUpYHSFmgVYP1HikUREFdVtRFTX1y
l+b4NuQSWk/eTIjOMiuLj5Ypv/Dq5z77t1/5nc/O9xWwtw/0vb0/AV7+2m/8pMR8VY72Y7mz1L1B
9qBtRk8a1UtqdUClV8zKayjRgCgJCKK4OkOWY6JQCp0VhdIUaAwFpagpRIlSBpkL4jQRdmty30HK
KKMxukKXc7JpiMmQkybaDI3AZY8XEe89IZZ478kiIGSEQ0FKIxjIyRNdTyaR7IBUkATo2QKlK/CZ
4CK7b3dMTyNx54hyQN/M9A/OSesttr1A5UROCSMkOguk1pSrJeWdZ1FmiWkOme5HVC/xQ0BIjRY1
KYFeLnAxkGOFf9DhztZkNxGiQ1GQo6WWGpkdenHA4pk7FMua5t3XCEkSjyvErGHqRpiV+M6hnCdd
bgh+ROVEGFuM0gzp6l3+JBVKaKTRjP0WkyPR9TQkGjJKV6ze9QzFwSGqqZAe3OM15TiRn17Kpqx+
fqlXX//O7//BP7evhL19oO/tfZ/6+ouflq+8+Klf1Ln4NG17HHuHGgR+22K8hC6hs6aYzynLkrJZ
IJREakVMHoNGkvBpQilFshapDUIIjEhUpkEpRVFcvcaGVuTdjvHhQ6R3KJ0xBxVFVZKDoAoV6bGl
rBqKaoYrIApJ93iNrheIXY/WJarbEh+/Q5kj/u1XMaNF24zwnqKek0KJXhzhtxO5lIgp412HUAOT
W1P/SIDnArZ7gjrU+JdfJ7z1iOn+m8jUQhr/uOIzMwGLZUNxdB1z7SYq1rhvj8TO4i9bJAFNBpWg
LkihRJQNcQK/9sR2R+6mqxPxOVMKiYqeoiopD07Qh4fI5QLZVKhZRUoSN1my7YntjjAMZDcSxy3R
bcl2jRQjOToyAZFB/PHxnqtufC3J7/Bxh0JQSYlZLanvHKOOZ6SqxA6W6d45+eElxnsKYZ4rTflb
b/3hK3/vm7/7+4f7ytjbB/re3veRl774jw6VF7+WLqdPaBeEu3eBfdCjt5l4GVBeIYZ09T73cgYy
UNT6qmsbkZAcYCFEovXInEjBoXJE2oGcPKY06MJcHYQTmqgUfr3FPt4h1j3VbEV57Tqs5lhryWFC
eEcxE1Q3V8hbNakqaJ84bF0RjgomnXDlgMvnRDL+AuRjkFmgTIOqFqhyjpAVOUJG4vseP45M2wFx
S8F8Is9b5M0VzCQxedp7j3Hf+ha+uw/CgfAIEoVKlArMwdHV6fhSw3Nzgs3ETYffteRsUVogQkLU
FRFNLBSUGj90CCaIE1oCcaSQiipLlFKUhyvK2ZxisUAWJdMwonRJ3A1kJXFxwHuPzDC1a5Jw+G5D
ITPWtSRx9X1EP6KqghACANFPmBRZFgYRBsqDBWZWkcuImFd000iYRvzpGal/RNVvhInDv3q4Ovjm
a7/7ez+9r5C9faDv7X0f+MYXP/1hXPpD3YV/Xlw6ptcfkZ5uSOuOeL5DuUj2FjUr0PMKVUh0qQnS
kXPCxQHnB2IMuOggOLIbyHEi+ZFkWxKRICLSSIQCUyhyznibUCKT44jSgWLeYFZzZFEybLfoRlEu
ZpTX5ixuHhEPa9Yu8fTNh4xC4+yAHTVudZvt6Ui8+Qx2gvA4IqcE2VMclsSxR6EQUyJ0Pe60x93r
aSpDGlqSB1XUjDvgmVsMn/tt/Ndexp49QdCSc4vIDokghMCiLtGLE9LhCnG7ZFq3yFqSNltsv8Eg
iXaiOpyTZUbVJUWWDNstvh9w7YjIkmkaKKWmSqBiZr66QbFYIm8ckJYNk8wYPcM+zAhliF0k9yPZ
B6apQ2SwbQe+Z9pekmyLjw4/DVRaIFK+Wq1PE+SenCZSv8EUIKVESYNezeiWitg02NMd7uKStLuk
iYFD1K3GVP/Tk6+/+Q/e/tLXT/bVsrcP9L2971Hf/M1f/8u5c3+ox/Ree7oldT39gzXtdoOyE35o
UTIiCSgR0FqCT6A1bhxIecJODi0NKTjGMILMjP0Z0vWk7RPccIHMEzmPCFOAFDSFQYoaURyhpSKu
J0Tn0WJGce0u9eIEHxcUtkLFEjk7oJydMLiCna1Zv9OTxADS4pqHiJOBic+T4hlu9zbuG98lE4nK
ImcSV0byUjB0Z2zHM9buNda8AOI+bvMiljP67gn99sukO5pJnDJeXNDee53U37t6pJ0COQdKIWh0
whzcwBw/S6Qgjgr3zoh/syO2A2kYkZNFKY8uJcwMWSSQgjS2xGmAOFIiwI/kHDHGIEuDnC9Q1Qyh
DUqXtI9bfAt+OxBsIKbM5AZyFnSbCya7YxguEcmSfI9IPVomYk5IFRBpQgiPQpDCiNIJbAcioKoC
bQzzoiFVBjdNxJ1leLohjgPROeamoQnpZw5mB9+498KrP7Ovmr19oO/tfQ/5o1//ZfWNz/3qL0rL
3w3roQq7nm494PtAzJKUJTIa4uAxBYjkQPur8KG7GioyWUiJ5AMqadLVGpiUA9FOjLs1vuvw44AL
W7K0V3vLKiFEoqgK1I0F2Sjy7o8Pn2WHLgrM0QGYOeGRByMo6wq5WuGqA863nvFDS8b4GFUWFPOE
FPcxiwm7fQH/+HN4XsU/eA3pJqIP6LIiZYhBMLUj67fexo6BoU2k/AzTdzaEpwVc/yF6N8CH7uAe
fp3+hU8znJ4z7R5BduSYqCSkLJmvGso7t2BxnSCWdF+22BcdYj0xPXiAFAFImKOSLDNTyIhkiJct
yY34sSXmgA8jKlmMAD/uqGZHKDGnmK3QiyUDiXxo8OcjIW0JwuH8gCRi1ztyGvDDjuwnsre4cYcQ
njBMSFEQY0CITCQytqco6QgXD3H9U8J0zrh7QllJQh7IK0kICX/RE88usI/fQeUBhp465xtL5D94
+OJr/8Xjr72+78Oxtw/0vb1/0l761N+/LVL6fNy0n7DbS5HbEXu5Q1hHdIFMQhWGECZ0k4h5g6ws
wV4drvJ2R3f2iJw8KXhmZYmUEqPm6HJJoCaJEvtgizvvEcMOuT1DpJFEBCGIEppaUS6WRNkgdXG1
T9xdoieLagTz65H4rCfrSIweUSW0H6lmGtM3+E2DHSWF+Rgxvofq8C8xPNlgS41XiuE73yR3EzEM
mEVFDJ6gPON6zfZL36JJR+QzSXH9eZrjDxJ8jY8NIdWoj/8Ibkz4z75I/+Qe4fG3ELlFCEBd9Y+v
K4lazIiHB/jbikFO2KcD7p17uEePyT4Qp4BRFdIJQCExJH/V+c3bCCmTQr46xpZGYECLCVVaiptz
VK2wC0U40HRuotvZq73udocfWsRkr94qCJGUPSlaQpyIvid7i5CZlBJSK1IeyToTnWXaXOCfnMLF
GnZrRLdDq4xqDLkU+Ozozi6I7Y727D4ydcg4IuOOmUx/Yyb57IOvvHS8r6a9faDv7f0T8vIv//0f
zxf2JSb3Y2HTES46mAKhtwihcEKgixIjBD5PFDNBtI4Uw9Whr9MNYTvgTi/QwVGoAlnWZF1hKgW6
IKgFKdfYB4HwaIvoBtzpObnvEN6DyAiRKWVClwvE4TViBd6eMu3uE+05qYiURyXljRKAbD1inKhU
xHSB5hsD+nKNjAMyBaAmqyXu4Bnc8hna3UT/zrfx2weksSXHkVRnpqFjvb2POByoV4bZu1ZUdxcU
7zqEZUlazPGzOXY3EufHeKfpf/eLhPtvE22P0BmRM0YKlMgUi5rm2bukfMhoCsIPBIbX/gj/6B72
na+QxkuS3aLmJdVyTiCglwtETkiVcXaNwpPzSPIdVaHIdotpCnRRoZcls6MZfYhMUmMfBqY3e9hF
xodPrw7rxUSWmRwE3kfIBre1SClJ1mNkInqHDwO6FLihx7oR71r67ROkyAzna5R3Vzd1eUItGkbn
cDlj751jXUt2PcJZimTRbvjxQyNePvv8V39kX1V7+0Df2/v/2Vd+6b/9RO6Hz2brr7Ed/riFayan
hC5KinmF1hq4GkAiCfjJkqQgjiNx15HaifhkjUiZHOPVnq+UaJXJQiC1xJTyaiV+oohPB8bTLWm3
xm+fIMSanAImZxIZWSrMUUEqLHQb4tNz4vgU2Z+TbY+uCoTOxKkjD56qUBSzkunUEi8cxk/k/pxK
CHj9TcrZbVK8jbt8AGHCPXqIJmEfnyN0ZHh8n/7t1xCmZLw4ZfncCdJIaAT1u5fEo5q4uMb6lTPi
7Q8TfvC9jJ/5Cv7BU+zuPtASc0ZpQc5Xf395eESsjpDvPWG8U7J9fES0iu7rX4GLU9y2gzJRmIop
e5IM2LYlui3T2Tki7MjJkWxHISKkeDXtTRjKoxOaxTE211hTMl5I+lccqU/Ypy0pDYSxR+iIJCKV
QopEyBaRPH6yxOghOkS+etIR/QRJIL1AKIkuZuQpk0Ik2QhFgVzOkIsDXAY3eYahZ7C7q1CPAykH
FOlOWZgv7L72yl/ZV9fe97v9HtLe94Wv/fovz0Lb/zdq6382DyNaa2LyeCEQhcBJaA5XCKXQpcRt
JN5NVCjsMFKWChcDKkboM+GdDYuPvgeZIlJCzB6EJEeLzZaiUDgxI2lJ3mamtx6Q7z7LtL7HfDwh
Fw2YBTEmlE7IRSILhbcFYieJ51ukWZJ2CUNN2lpizohUIIJmebuhO5vBW4+RPwhBbFkujuh3bzKv
Pe6gYLrscdWCYfs2i6EjDYZ8kInnHfHNB2jxHtSiRG3fQdW30bOG+uQA1Q3EbmR4ckI0geZaR3r6
XfzFOWFzH+58CMmclBQFkkKCmlWUzxzRWY09n2MObuO390m9JowexgEhJWFmqIxk2O2QqsbsEnno
SbUhig0qBETUFFIRosNUFaGao4eW+vqM7swTFwK76SlevU95ELFpSfGREplnJCmQIuOiBQPCW7IS
+NGjtERXJePFGlk1SDZIn6lmR+QUqJYNIYIuKqSuiVmhZwXeDVBoxBSYygGtFMFOlFVDO1wwK1Zl
Du7vnv72p39UCP3Xr/34T/h9xe3tV+h7e/8f+ObnPvXBeGFfaE+Hn01+ZJoGfIp4BLKpQRfIokQh
EUajyhInBGPOjEIyokiiYdx67OCJ99bEfiBc7EgiQeyJfk3wLTH2JN+RUoeaC1QTCd23ybOGccyE
3UQcR3AdcWoRPiLDhM4FWleQDdEFkpPE0aMrSdaQc0aMmWAtpfTkb2/grTWiOcTFBsQh1k7Id90k
Hl/HvPs5ig89yxRG8uwWw/aCqMFvErI4oDj4Z9HNu5kdvYd0KlE5UVQZkSyzowqz0jQfeQ8uRaZv
3EN9+CcZXvwq8a23SM4C09XNjMjodDUPvT6UyEJhZjPqjz/P7t5zJPejDNsSdzniTzeMwxpkwPc9
OTqGR48J7Rb/9BS7OQMs0/biapU+9WgNc91QLK9x8OxdVDFnqkq2Nxa8+ZnfJ51l7G+/TLA77LbD
rjeIzuLb6Wra3dYR/US2I8SA9/5q/rqb8Bcd43mHtAE37MgrQzI1uaqQqkYkhdYFYfRkHLHdYrsN
IUas9QQRiNaCEKiYSX78eZXc57af+R+u76tubx/oe3v/b4f5Z37tXwxn7ZdDO33ADI44eJSuyDlD
zsStJ44W0UWyT2ghSc6jciD4gd5aKCr6FInGMO4Cm9fPkNca7LQjTT2u3xBdSxhPce4U7UbytEGZ
jjTuIGzRh5lpcw7C4DcDcbrAjZeI1CNSxDmHOpzDzJCMQU2ZECbkrCCrDKYg2kgKE8UK6g8rZj+i
SKtAOlujnGL65oCaP0Nwz2C3DaL/s/i35ojzEre+QFWB4czRAvl2TXt5H3mgGJ78Hmn3BJUTadxR
KklZNZQHK6I4wG3uIOvbhO88wT8JxPGCnEeC75AkVJqAQH04Z3HjkOXzzyJvn9D/8G3i8+9lvDCM
bzzGvvGItNlhUkJmhzSJICLBXY1w3T1ZkzYPSeOWnEekiJg0kXGYUrG4dsTxM9coThaIdoaf/RTb
72yYHr7N9PAthqcPCeOWEHtKk4iuJYsWLSdSaCHtcHZNudRX30sVkLOC2AtUtcToGVUzQ9cNQipk
VZEKQ9bgrcNOA8l5bLdDa032EWnm+KjIKMpiDsH+BVWYF3b/y698fF99e99v9o/c974nvf57v6MY
7H8UrPub/aML4dZbqqJiTJ7moCCQEUlCDNjesSgNfrSIRpPGREoSo2s8ElEW+GHAKU1gwoxnHKV3
EV87xd84ZFpcYrWkkDUploScCPaq9WleT4jxEBEFeUpXJ7HbLbHQ+LglLANSzpB5QMwkwUvwkSgA
kZGLilxIRGEQW0g+Qi4oVgfEg4bcd9jLifK6oHhGYSiROSBkjVv3ZLsiblvS5g728hQfGtLQIWYd
5n2a7uwBs6FgvlMwecrDOThH2VQYU2L/zF3SGbg3B3Rxi3S2wV2eo8QcVd8CZwnBo0mUheHg7k3C
1DFdKuYfcvQP18jBY994xNz3NB84obs8pVw0CJHRqxnERLfraQ7nDK8+Qjx3l9jurp6YiAFZRaqq
ZEyRg+dvYv3EaT+Rj2+w+dY9wuVEdf9tUmuprr2bURmq+Qy7W1MezfFO4HyP8hKXA6pR5FPIskGZ
Q8Zty6o8xDsoby4pzOrq0b0URD+hmiXd/afk4Wp7JYXIbLVECYksDTlEVD1DGofvOvRs8cywO/u8
e+kLf7n46F/4lX017n2/UPuPYO97Lsy/+Js3hI+/FvvhX3GbSxHOd8SQUEaRNFAKcspX401jxluP
ShmMRAqIwZGR6FqjyxJlCpLQ2MkzbnukUZQj0J+RjytEJUl2RKpIEha7vQQscdfjt2sIBoYNxY0l
WUvqw6u9XhtACkmIlpwDfteTeotWhhQ91eGCkAJSl+ATcXIopckpo4TA3u/xFxI9gqwki/ce41NE
NArhI6kdMIeZmB4y/8E7jI+/SmyO8F3L7vWvoZojUv+UZXwGce8+5YfeQ3N0QGgnzOqQqCWqksQ+
Ed+4oLw+kuw55QfeSxIJ09QQJZ1zCDsQ/YCuGmTUZOsQ3YS9GNBHgvDGl8lfeYHl+4+Im4fUzz6P
Lmp0M8d1lhgTVSNov/1NzM0VBoVPDnzCh4DWBj859MEKkRM+T5xNLevhDPnmA8Q6wFuvUeYCefOA
5mjOMLSo+ur3iAEtJUjIhcEPnhgiYWPpdz1lVZL8SHX7GD0/IOoCCWSRyT7RvX1B2oyoBxO5txTX
Z5iiQhRXr+EZU+JERCqBlBrvbKFK8zOf/Lf/jfpv/bV//Xf+4//ql/K+Mvf2gb639/8kzD//G39O
uPg5t91+BOvpHj4luYApCwIWUxdMwRK8x3YeO01EN5GcxVT5qr2ryBhVYBZzqnpBzDWq1PTrER8k
xWpFcgmTFUrdJ1WGNF71chdFiT1viTkyPbkkDj0xZPw7D6nmR6RaI68dIkKJnSa0VtjgQCb8ZiA7
B50jxUx54UXcawAAIABJREFU/TppSujZHLwmJ9CqxGtNeTBjOzps8FBAOUscPLtg0hZRCKaxI0xr
cuqIm+9S33gXw6OXSPoO1jVcfOtFXByJ8ZRq65nLwOLjH6aczYhTRDczRGFQdUkcI/5ih9m+hTae
+vYRUxboZYXKkuAjMY1AJnkHROzpOXG7hdGjlgr/tic+uIfcnlMe34RbJ5SrJaasSUGji4JoB3Jp
0E2NrErCbrjqiS81buyRhUEIg5AaqWGYRi5GQ34kKZylamr0+m2aD/8gqmrQdYEKGZIghYgiUjUr
+raDZYO9HGnfeIKYJnLb0hw0yLrErGYYfdWDQBSK8eka7wbimSO+3FIcJFgpyqMDrLXUzQIhK1wI
SD0jDxM5RdKEqIz88zHzI//+v/mzn/pP/uv/btpX6N73sv0e+t73jO9+9tM/n7rx87nt7qazLe7i
nLTrKZKnqjW+yASVsTESUmbYDPTdiOsn+tMWO+0Y+h2+2yBzwGhJaSrqsqYq5ywOjqmOV3BQEI4M
PU+Yhrfw7Rq37Zg2LdPTS3zbEtcbkh3IMhDqgXy3Znj8bdw3vkLyCe8t2Q04u0NER+hbVKUQpSFa
i6400fXIuYTsEOZqKEwKnnpeo3XBtQ/c4OBjx4jnGtRhwzQGSr0kOxCFZDATffsU/a6P0Z17xPQM
edTY0/uo2x9kuJhI5fsZ1xo7ZIqjQ0L0mEYTxpYCgXKK4niOfPaIzXfO8RLae6+SdqekboeILYW6
uiEpy5LU9bjNlnjeMXy9o4gagiY+8zzDx3+Ch+9siD7gXnkNTCS5EdEI6qImjAF1coBdX+KCx+1a
+vuPyNuO8PYDxLBBDz2mEjTLFcfPXOfw7gn9/H3YdBdhltg3H6DaEd+2SG1QSUKO6ODwyaGUIDiP
WMyIOTF0Atk5wmtPEFwihw1Ctog8XDXPSQHXDaQoyUnQtwFrJ9z5U/z2Etd1SCnJApAlWldkWRFj
JLurLnVKlj+ltfnD8OoLH9xX6d4+0Pf2/u9W5l/4nz9BHP523GxL+847pHFNXF8gZUKWApdGZmVB
sIEcobeOUCt8JRjSgDeOYQr4wePaiTxYdIggPNVCUFSGxc0DmsNDvDIMZeaiO2P0Ad9tsN0j/Dgy
nD4iBotdXxLtRJwcyQ+o+YLh1a8gjyvCboePHQSPbXeImIiXLXq+QgZNfNyRdztSf4kuE7nbgbAY
o5EVVKbBFDOOb13j5M4JyxsHCGkY1x5DSWmWxOUB6u7zjM/9KPboozx9dYu9+HPYeyXDdzRiuIvx
70Oc3yYOifr2n0FOjjB0V61pux152JCmiVAm8qFgS8Y/6nHfavEPO8SQkMKglKIq5mRTE1CM7Y7+
omNqPeV1Q3N3ibrV4KRg6xzD40vGF/8I34+I4FEyI2aC8sYBqmpgcUzEEF0mu4S7PMefPiJtzyCs
kaHFGMHRwSG3rh0h8wGhfB/92xEODrA5kR/dw7cdnoCRV0NwquWKKU3Iw4bsA04lJmdZf3WDMpC7
d4AJIQMp9ghhiX1Pjp44BoZXBpIOjN/+CnE6o99dkHXCh+mqr4ApQRh0vcLuPMl6UlTEXFDPnnsf
HHyhffXFv7iv1r19oO/t/WPcf+F3Phm24RfdeiCtA+PTnjxIUusp9NV4U+RVo5LJ9le9w20gRo/3
nu5yIieJfSLwjxP+Tc+06RGTxXeXYCZk6SkOMtVyjlkeY2VNq26zXStaGRn9OTEOuKEnDyNxsEif
UEKCnJNSg+8LQg6EyZH9SBYKEohpQmqFKiLywMBMQUwkm4k7h9AKIwt0bSgOFleNaOqCct5wcPsG
q9tHZF0zPcjgNEopFsWMyhkavbzaEnjvs2zLDedhw3jT0E1bnF8yrHeE1U3sO5lQaAQF9ryFKPEX
HSSP0olUKvjA87RvPsA9PiM8OiW052QC0W4oiahokY3CdS3taxeowwk3bJnfWFHeaLDVHc7qD/Ld
r79IGgL+5TfIRiKSQ6rM/PCQnDTm+BikwitJNorhO28hu0R8eg4yIa1D1TVVYyBnbv3kIbx3STg8
Ql1/F/b+26jyBPvwIdiERJCQSFGSdUW5PCH0JaPXbLLmtH2EfJclfuvbiOwpp4hzEykFNpsNnRp4
8vpjHseHDB98k+HaK4TksUNElCVhAO8dInsgoQpF9g479lfz2Hct0iwR8vpxIY9/88kLv/uL59/9
6v5/594+0Pf2/o/e+sNPfTJN0y/gHGHT4bqORCamjJwvEElTiBqdDUlrRCGZrGeMli54+mCJ85JO
tIzVRF8N7NSOflqzfvKQ2LfEiw3SjcgxMD80LA5KzEGDevczDPUPMPU3SeaDjK9nsp3he4Eo5uSm
IpUSdVDT3X+E/MGPMd2/jx8taVDkkNBlgx2vQlNw9TRB3z3CuasBLXnTorS4GrkqM1W5gJQpqzky
G+rbN5ldO4GTGbOPLBldjypKlgcryoMa2SfaL52yMAeMLjMsAsXHn8M+o/E/tGArJvShIf7AXbrz
9dV2wHaHAPx2S7SXGDx5BvIjN7hYKYZqTvidl+keXBCjJw09UkpcEMjS4C8n/Ld2zLf3EFwiyoio
DMO75wzX/ilOt7eY3n6H8OgN/PCUlC1aBlShyTFR1DOiNaAq8DXjt3ri/Tfxb7+E8AOmnqHqBlMs
mB/cYnb7Bna1pFPvJy3fh31wSf/OBf7NNdlebVub8mqimtAVWZZE3WCTpusk4ZkZYTUj3T0kx0RI
kZwjIjqyDGx3HWftOf1RxzSrsRwTfYWeH5CDBAUZxeBahMggBfrOMeVsTrBbhJTk5P74DMBMJFaf
iJP71adf//XlvoL39oG+twd89w/+4SdF4BfcZksaJrL1+HGiKIqrftuFBpHIRUZUDTFGqsUh0VT4
es5WCCapiY3Cih3RjIzD6/hyTUiW7flj4nbH7ukpbrMmnm9I08hMCZq6ZLaaEbxhemSJ9z1TD0pW
jA89QmlkWZGFQM1LpvANJvMOW/8Qe/4CcVyD7EBbomsRWIR3iLpGHcxBVoicSeMIBLQRyKpAS4kQ
ggKNoaCoDygPryFDw3iaiY8mKqPRtSFp6IYtrQ8EURNHxbTLDG+/jr33bfz5m8jwAJ/eQb57Sw6Z
nAJCK6IfyK4nrzcoKahnJergFv2N93P+YMvwIMHTTNick70jZUdZl0Sf8EXJ8L4ZF0/n+NdbhE0U
s4KmMJiTFeHGHS4vB8ZX3yC89TZq6JClRsRAfbJCKQPzGkGDs4Li4+/Bn69J75wjY0IxUqaEKhpO
bp1QSkl1yyCuVWy++yrp2jnj5ecJb3+eFFqC3VBWElNImmZBcBFxXF01yImSWbjN+MpTZP0sYr5k
SgElClzvISSmXUDLI3RekvqK+bM/Doe30JUmZ4mbleBHxouneN8So2V+eAOpluxOB4TrcN351eo9
G5bNMTKU/0J/evHFy9c+9Z59Je/tA33vT/fK/Au/+sm0mX4hW08eInnM4DOBTEgZB6SUyDmSlURp
jVAFTb1kNT9hVs0w/yt7b/5ra5afd33W9M5777PPeOeqvlVd3e0ebLc7ttxxUECKSKwQCfErIIEE
QshSElvCRkRUQWxjIGRACGEIUkQIkqOEkFjIseUgE7lnd1zd1V1d06268z3znt79Dmvkh9P/ACh4
yvn8Cefs9X32Wvv5Po9sSKFCjAXDw122Fwp7MSNsKmzfMTx4zPr4jO7ygmFxztAtCO0SaT1VntPM
GvKX70AzYRwSUQrsYgPmyvAmpcfkmhQDxSs/Sv/uC1g6UucIcSRJQQqWcqeClBAyYbISNanRh3Pc
NoCp4Mo4TgaEOGByjR/XKOkxPlGUikldEL47ULiEXS3QpWS202Ayjd7JWF8MjM5jVEP/+DnFboYI
j1H6KaN7yHD5PVQmGbcbTFURXEQ2EwiBOLbUsxmqauDGfc50YsFz/NkjLn/n/yalDWxX5NKhUISm
5GSqebyR+Bdg2w4tPc1OIqr3CJ+6zxMladdgv/Yhw/kCH69y7aumBqnR8xlJTYlVhtqtGX73MeKj
Dp0iMoxkKaGUod7ZpynmNDuKcGfNyi5gdo/t0w8Jm5b44ROCi8QosMkhUCQEUQpcSPhSwdYTnoNu
PXh59X9JCRckSedXYT83c/ytHdy4RhQSsgydN+AV3gaG7RJ3cc64ekEIPZkqUFWByDPGyxbf9xAt
CE2hdxChJjn92fbk4TeOv/23/9T1ib7mWtCv+ReS9778998I/fZ1ERJh0171XA9bUkpoVTDaiBA5
IQqSzpEygzKnbGaITDPbmzCfzzk83CczJb0t2awbnr03sHaazfqS4fIBzCpWv/0V+m//Lqvnj1k9
+x6bkzPa1SmVkWihKWclSilcBvk0YzzdoMurp+PYWZQsUEWFOrzF5UpiH2tEt48/W4BXoBTlZAJW
IqQmVxminpLtHuBtQgWDsII0OKRNaHXluA+jRzgLdo1gpKgE5sJgFgb/1KEzQ1PV1PsT6k9M2Z4/
wN/YIF5WOHMBaYkyA2mi6eVI/9FHiCFCDIBHxhGVHMqtEGFE6YguEubGAW2ARWrZPPhn9B99gDt/
ju9XxHGDkJbmQFEeSYaPCTZioG1bgnVoFRF2Cd7T7u5w8dFTNg+OGU478AlkDpnB1A1VPcEczaCq
sDERbn6eNLmJW/VgPVoMVKVCyYHp7T3qaUkaJ8TJq3TnAW59gjiJDNtj1OgJfrxKd/M9alJgvEKG
CbrWjB9/QXa/xQ/fI8oWrTXee5CRfjsgcoXaywlNTpq/jM32yaoJo+2IucOvL2mXF7C5wJ6/ANET
I5j5EXk1p1u3BLvCjQsQgRAFWk8x5ojhqdi1y8tfe/rNX/7Z65N9zbWgX/MvFB986VffkIvx9bgZ
UFGSQiQpSUwZDo/IJM45EFd920ootCqR6koosrykOdpj98YRhy/d4uDlW4S9KZvXJox3ZiybGWfb
lpOLY9a14Lx7i5V+xsXxV9mcfp2h/Yhh/YK4XZJCi5YOkY2ousW6S8azDwljS7QjKUaiVDCvGUNk
O10z+MRw8g6uO8b3W/KsxPsIRY4UBgCT5cgiQ+aKNI6EfiQ5i/eRPCtJQqN0dhWZ2q9gGMgmiupH
c8Z+gwgRYUF4weTGLoaEOpqg7u4SzCPUawcM5Ya2s4xlwo0ZwU9ZvP0BImSEECArSJue6HNy1ZA2
I3UzI7c1yb5GKz7P+ddGVH2f7aOvENWC2J0gRE/jI7cnBbfnc+xihnvksc97xkcPmU+mZGePUWXD
C9txcnZK+Oq36U6OQWlG21FO52g9Q9+4iTo4oj3XyM++Rjp8leGDE/yLc2SyFDoAluJ2RlFmGDnB
3Pg47W9/QOzmuGUHb30HmTpCvyKlRDuuyHKIvsTPbuAmNZdjQk0k/fvv48c1hIj3lmQ8iZHpTFFP
Fc0kJ89K7FlEeo9fLhF+RVgeM37wlPDinHDyGBk2+NBjmhkUOT5Ixss1bnvVKCdkIjcFsphC0KRW
qvH47JeW3/kH/5t79NXq+pRf8/vFdbDMNb9nvPt//cobrLvX43ZAeI9IAqENIiRsu8EOW1AjKTm0
UZhSIAYPhcHszpBZgcpLMA2qaMjLkul8TiEzOhvohWdceKLwZMU+w8WXIdvgxCVOLfDnpxAekE/v
kYImRodU4WpHXIwIaTE3DgnbgZQkWV2QtEBNCsa+x/uc8Z13qO1Idf8quKW6dYcUIwhBFhTJ5Ii8
wA4jKgaGZyeoQiErA8mS7cyxIiPgiW2PC1tS3zOs1jBusd95Tnm3oXx5l7Zf43Xi5EtfpigSutqj
PngZpfbZHD+kXW9xQlKJgr0bP4B4tmBy4z5u6KkO9hl+7Xfh3h6qztluV8i6ZvliyeWwpm03CPuM
O5/8OO7pd5Eff4U0QnCetHGErqPerRAFUAu2q1Pa86+gj+4R+hfIl14lXJ4jl5dkoUfcPqQ8PKAf
tjS7N4AaspKY5/R9j2hXqHZAi4hpFNmNfQozpZcZIqsZ25aNd/RbC+kG+fAE8c4xerdCHsyQWlPe
uX0VzKNqgq5ZXx5zenrM6eOO7L03qXYKmtd+FDmZEgVEG5AhXdXkDhbhBzg/IRee6by5crMryXB8
RtpsYdtR7e5h5juIPEMKRQwJKUF2DlloMBqjC7TO2NglCWDQpOBIMn42avmT/9nP/oV//PN/7X9a
XZ/4a64F/Zo/krz9G//rG9La1/3JKVIldFYQrEcVFeNyJAQPSRKipKoaGCBTVxGkui4xOw0xgDEz
pKxQRiGiQE1q6kYjRcDrkY0YSaYkpJLQaZyfkXyNTYLxrGf0A3rmsKvvkOWHZPkMXWSobMLQSeqd
Q1YfLeHEI6YFqczImyP6EOm3JevvPqIKjunsNtRzdu+9inVg6hIhFNYIpKrwNsB2g/3dc9RcoEyG
zHPyvTsI02AJ2PWI71ekfo0dt0SxJcYnFJOa4t4eqcwRRrJpt9A79NEEVUi6xSPa5++SRoW6mcjK
Gbq1qGGL6fVVeU0hkPv7iGKAPOGTIjgI84qLkzVWCpDnVBcO01aYV+4ToyS0I8kFTGbIlSDfM2Ak
iw/fwvsV69N3EGGD3H+ZuFWI5ZLxfMF0f4pYvo+8c5u8blDZlRtdlhMgsf3WU/R330V/ZgLSkt86
RJn6avc9SkLyrI5PWT3dkDcl9sH/CYuB8gc/g+gfU7zyCsXOPqKa0g0GWU0Ynj3m4v0zsqpifP97
7I45009/kjQt0KZhbHu0NtjRkc1rxlXH+PgFezGnmOXIWY5vW4azU4zTuF//KsXtG5ibe2RVifUB
pQ0yRvrFClUKohjIyqtNhY3zCBER6y0UgRBaoL9ZGP1v/kc//e//zi/9jb/18PrkX3P95H7NHyne
/6f/+xtuMb5uL1uk1OACIgqEykkxYtc9aeMxzpAbg0EjYsK1Fm8DoR0JvSONDtIAYiQNLbgOxUhe
KI5uT/jYvX12j2pik9PmmqWvePHeGYsu4+yxYrm9wfaDl7j8xgvco47w+H0MCiUkWaYp9ia06xZ5
dwpVzfjBCmEtyXY0VU41qxF7P0Sbdtl8+V3k+Zbt0FOUOWHrr35bdeDSgFA926ensCeIThK7FolC
uIFKK6RzqIkiDZHu0iJsRugMYn6fUBX4zmLKCSHkiN37DHJGCiVG5vTa4ma38XdvUc8/T3RHLN59
wtoc8OKbX6F7+gJ3doznlNg9wS6/TZEncBsmWWLv8IyyXKB/8Ed4+uDrDItztt/4JmGzIh630I1U
8xwxDjQ3dhB1xfCxz7K583kudUP98R/FlJL5v/rHST/2gyyBzekjzn71t+n/ya/j7YqYTsAtybSh
uXWIPNrF2oYwdlfRuu2IDz1aWkSC4uCAJiuRLhE92PMCWQqE2GDfeki62IJ3COeIbgARKfIK3eXo
J5Is/Qm8k8QPT/CLM+I4QJAoCbZtUdLj4wqRvklpIqoqSAF81xFcwA9reDkjyHMCAy6sEcli3UAQ
kDREu8X3S7xfgwiUWYESiVjkyFiiuhyVpqyXl/tx6H9jePD1P399+q+5vqFf80fnZv5bv/Kz/fHZ
z8utJV1sEEKg65oUAlJIQhfw7UgIAyJ5smmFdR0xBcLJJaIdMbUhjANKS0IMiDwjtQNJBqTQ2KHD
5BlGKYrc0A0jq6eOfC/HXYzoMJAVR6QnAcZAPG/JijvEFw8x5ZR8sktKkby8cjSrWqG8Jj3fYF5q
UHsFxWzO5UliHAX9i3Py9ZLdz3wKdXuXrMhxqxGKDOk8NljiOLJ98ATVDegokVXCZAVmMoO8oO0d
SQLWY7uBXOXYZNF4dA9mv0RXu7T9yKgt5+cteTBMd3bws0Oi2cUtIjqbk7oZaVsQ2sTQXjLNVxR7
GqU6hF0h6hoRJTYKsnrGuO1JxS5jtUv3/jOmKmFu5MhmB5EEqlDo0oCK6IMdHILTR+eszi4we/eZ
jYHZnZeY7OyQMkFc9UTbEx6ek61WlF/4EcgLlJJkpsBFgRsW+N4Tz0fUmFA35pT7hzihEGVDDIl+
XHHRLehPBnSzoqo3xNUlxf2XSLMJ1d2XCCHhmpIUJqzWjqcvXnDetcy7jOniEnVgaF69g3Mjskx0
7RKpJW67JW4umeiBIgzUn/kBYoz47Rpiwj79GkZL9OyI4uZtvDQU5QxEzuryBF2CjJaERZYGKRJC
SbZdDyGRtj26rjDFhG6xJqkg7bj+03/pz/+7q1/67//OV68nwTXXN/Rr/lDzva/+wzdi63/Jvljh
lmvouqsoVykhgBCCOCZk4krA8wwhDT4krJb0qxF7ORJcJPQdoR8Iy544bIkxIr+/AoXr0NFT5Q1H
e/vcOdinnhSkUGGa1xhfzBifCbo+YFPNWJRcLh6yWJ2zPPka/WaDHxLSScrdGVW5Q333EPPSHeRQ
INaC2AdmBznVpypsKRnthuGdD5FDZGg3yEoi5MgQW1IaCeOAMJpQKnw7QtLYdiD2HbHr0Foivm8I
zGYVsYBiUiIKDdYiUySMF9TTRCUi+wczzCDIMsWd3TlHBzeY3f0ERXWErI6wk5e4XAg2qeLs4pLg
JcNbb+GqCap6Gfv0I5TQVyaxm3dpbh8QPnxE2P0sF2ea7lFgfLEhnJ+idcR3PVUzQQlNsVsiNgG7
rRG6pmsTs2zGTFc0O3fY+Yk/g+1vMR59geWZZ/WP/gnu4Qvi9oTQn5C2LfXH9ik+u0uaTIkrRf/h
GcElfNtTZAYpcor9ffTODq3IyV76kwz2E4zPIqKa4V+cEoZEu1qjjCT5iKgM+VFJ3CiKqiKkT+Dd
HiKbMPaWYAV2TOiiJA4Oud5yEHfJpzOySU0MgtTs4U3BurW4k4RfWKIXGDlB6PoqNrZziDwnCfBD
R9iu8XaDwl2tKeqCsAoQFVIaBBmu83Snl2wuHv/VxTv/4D+4ngbXXN/Qr/nD+8z+1lff8Kv29fFk
hV10iNEjtSKrM4IAaTJCgOA9dhxJPqEnFSk4fAQSyEmFDY5UgK4kwVtMrhDFVb84SRATCAXIDF3V
pBAhRAYxsHo0MLQRt/V0F2uE2COYPWImiYsTRJKIWKEuJbncQZaSZncOzpNNSuLG4rcj+UHFYLdQ
Cfy4Ybl8gHzyiGkSTD7/Oaz3iHmOSBprIzIo3KpF1yXj+QpVQz4v8F2H2SnoxwEvHGlr8WEgQxII
ZLVmc3aBjp5i3mDDFtNUhM5TlYb03JPtGeY7+4xWEJ2m/doGt1aEccu4fk6o1/jVBfvNEWLiMS//
APl0QnfyEUV1l+BHxPeDe4btBdyZEJfPKZtAMVMwXFLeukFSoDIBZY4TnnbtuHiwIssrCpexM6sw
gBCRosyRzS4y3iBuMvIhwfAMUQfMbE4cLSE5UgQKgbwcSIWgvLlDMImiarBIXIxsVxdsTtc0UaA7
SzZZY4RDXFrkS/eJZY4qcmI1wfktq8cvsO8umS4NpXzCzhfvoXQPWhMBWeV4l/B9IF9Gmm2JfuUe
enf3qobVBlanFwRbEr92xk6T03z2NYqbN5FmTuc7rOth3SI1hPWWLNPofMqQLKZo6LuWsF2iU0Dl
hqIucb2FBG69FkG6n/zFv/QffvALf+PvvHU9Ga65FvRr/pCJ+ZffCM69zvnI+uEFMoEMkFcFIkGI
Fi0N/WpLSoJh2V8lswlJHx35tEFOG1RTs7U9W+/IdMb2dEmpDCiNzDOUqoiAosBvA1JmCAdJBWzb
slgsQYzI2l0Zp/w52+0LdHkLLxtsm3A2R7c3KYuMmCeqWYUPW5JIiOSvHPCFYHAjHs/muOf4zYdk
i8TO3U+y84XXcNGh9maQNMFHonWEFK5avPoOKQIpBOJyQ7Y/w4urv0EKCQiQIklDkgI3bkkuInNQ
2qBNiRYa5SRSW/JJSVaUoASyUGyed/Rnl7gUid6COMUwUtea8qV7FIc1sfNIlQhnLxBGk1JBHDS+
U4yPHMkr0ukTxOUZme+QN++RNRVuu0I2NQSF224RNqI6ReUFPDtGmZGi9JhaMnn5CA4MoVSMq3cY
3v0dZG6wTUFVSLr1GjOfEkVg/PozstIg9Ui+N0XJKZRTknW4RYvDsnk2UtQX7HzqJu7Nr5GV+yQD
08Nb2FjC/i38ZmBzvGTYdPh3z5lkv8X8TkHaLcn3d4miQRclm5MNcYxMZYV/FqheuQFJE+sG1yc2
J1vkMid88xF7n6rJP/1xst0ZUU3ZIqEfcM+WmDyQBksykFUVXe8p6jl9uyEESzV6PJGy2WFMGlnO
CE9XuO5MmIn8cz/zF//tN//Kf/d337ueENdcC/o1fyh48PZvvxHH4fXgPGk54FqPEgAekRzCjVc3
ZB8J2xYREn50RB+INiGkJJ806LpBGUP0AT8GpBdXRjGTYbIMoRVSRoiWlAbAEaUHAsmO9MsN21VH
NdeYSU5+q8DnS3yWGNKIzF9ibed4fRdvd+mfP2T+siM986hJwugCET1Eid12EAe6dc92tWLz3vuU
a7j1w59D3puiD2YoAUkqCIqx6zG6wJ5tECkh+0RaWbSu8FqSHe7h+xFyiVTm6uZeVbiVJYRI/2aH
eNdSHVSITGL25/ihJ30/Jy0omMzn+FaQ3SoZ1xnegi4a7Oox9Q1BOYOJN9R7BdZuyScH2MUL9P4R
9jKAyin399g8t8R8n2G5Ii8V5Z1DYh6odm/TffgAfXSIWzmCdeTa0L9zji4SYfMu8unbqLpD1TWz
l1/Fp5Ls/gErCZvHD8gXnlQsyeoSu3aYu3uEjccPa7QRJH9BbBLZ5ABRzQjoK8HvWzaho5ETstAx
Pn6bcn8PdbiPuXGLUJcU+zeJLrF6ekb/cIEeFM3wnL0ffhV17xDT1DhZoHND13ZIAYURxKKjmDeI
WUOQETeM+BjxQ4977012PrZD9sn7mPkeqp4TgqDfLBhPz1Hy+znvmSF5h8gNOiuwKRDHgXHdUsgJ
3nnM7gFKGJzrid0Foz1X2aT51//zn/upL/3CX//bD68nxTXXgn7NH2g+fPNX3/Bt+7qwgtgnQufA
B3z1FVSvAAAgAElEQVQ3YLSAOJKcR+cFbtkiTI4bAtZ6uneXhNHSzCfITFIc7BL91a3VDpFuZTEh
4lcO6QLaQMolIs+wXYvQiRgSNgz06w3nizUyTygduXl3RrGTk82mlLfv4cYZm6GkHSWbjWS0x/jh
21RiD97rMLNAzA0jI0luWbUfoMspy3cv6C8K4ABzsuXw/h2ypiI/nBL7QFAC4RV+OyJI9OeXSBuQ
H0F8tELdKJBHFXoywY8JyprQe+K2R2YQI6RgSR90+C9dUn6shH2DOdi9WiVTCkaHEIZyd0q2UyJ0
ZDOMtDHgdIHrztH9mqLt2Bc3qKYC2ewjbSRJj9I1btURlAAtEdMNgSVueYrpLXJ4QnX/DkLrqy9M
RhFdQCkJUpCmkbQeUGGF6B8ixSOK/btke0dkk5x8/xAhDwjLXYbvvUDu9QzvPUfulohME0cLpcA/
eIKyJyROyO69hDLQE0hZYlwu6RcbuHQIpxDJEL7zbYpb9wnGk3/sLqbcoQ8B163p3r+g/DDQLAvq
2xXTz75MCI78cBfvRmywiOAJG0utJSlJ8tsHBA/kCusdy4fHNMfvUNYF1WuvoncOoNkhJUN7eopw
I/7ZC6LsKKYV49hRz/bxQZKKnOHikjQMVHXF9vyM+u4hKuaEPCf2krAaKESn13b5b/yXf/mN3/z5
/+ZvPr+eGNf88+baFHfNPxe+8+t/8w1/tnk9nHSk9YiJGSl6dCaQuUTrjOATfYh4O9BZi1WRTgQ2
7cB2SIwLS/D2KsPdO4QQmKJkdu8m1eEhvqwZt4LtRx3jyZKw6UjbAWEVoheI3iJ7SxklDZ6pSuzk
iZ1cctDk3DicM9+vmdzeRWY5rphzZiQP08CZPOSjTcuLjzku1DP6aIkarEwElbNdXuKakTDpcP4B
2qxw2Ug61HhnSSKhEITQIYuE79eYHOK2w1creC0jhR7TZMTRIY1GjQ66HmEMQUhMUyCyEn/PEH6g
Yvm1Y9LDFrHtMLUBLCI4Cp2g2zDZLZgf7NDcLQmnAzYKRPMKvbmJnx/SnT5l8/77mMkNhpPnpE2O
fZFAFejlCrf4HrPpA4r6q2SfeIKbPcOOC8gD7Td+Ez8eEy6fI5RHOI8qoJgX9NtjtqmljYn+3QH5
7AVxeUYxLVFWMLu3y+THPkP/Z36S893XeBK+y+U7/5j++dv05+8g7Ba3bCHLGX/ty4ThAj0skH5L
LiR1sctsP0PUknGTULdu4RKYVBC/c0oaA2q0CCGpd2vMniYcCkYZcW9+myLLEVGQT2qkqckmc1Iq
GbegnwfEpkUaicxL5GROaRp0mCCK17AykvoB5zbIOBLSFjKN0AJvA34TiP2VT8J2a4TvyUTAVBqh
E916hUCShoDJK3RRoOY7iGKHfhGJJxeTYX38a92jL3/6empccy3o1/yB41u/+stvxNP+dfdsTVgP
iHZAxPEq+1tAUeUEEh6FUJLe9ogqx0tJKCSdjXQ6YQ80m6EjBUfcrkmpR5lEdTRlfndGrwwbG9gs
e7abDsYRt1wjVSR2IzIklI3EGCmKCq0EmTGE6Mm0YKcsmOcFdz5Wc+vHZxx+YYq4NeVZmvK+znhg
Nzwft7x49h365XO0iwwXK0Tf0H7rCVLMiCcO+dSRNbfw2xFVSOzygig9QoKIPcYo0ApRlbjLgf7R
EzSOtDomyzUpeigjoe+xqw1agRAJmSliTIiDhjCpWL/Vkr61vdphl5DlOdmkpBQKug6jJLIs2Lkx
IdQGmxn0K3eJZo/NaLgkcPnuBZIa0U0xuzcRpUaGHllukdnbFM0MUwiyqcKlwLgV2P6SeKgJLuJP
zxBjhJhIhcKnSMcJrdmw3TcMM8EQHGHTEtYLpBzIpjB5pWHvxw/JXnoV//IXOX/wmPPf+RLj+THd
2Xukesl49jaxGxhfnOGGFXJYoESgnBaUmUEVGdnRHPwu2e3PMXbPSJtnuBfPGdMFSlhUqeHlivOj
EZsC+asv0z97QlbnoCT5wT6FaTBljckrtg8XiNUaRCSbV1eimxVMbs5gd59sUhO2LxDuDOnW9N0K
1Ujsan31hEJkcFuKuqA7vUQnhxo9upmgmwPG46v1SndxgVaWPIGsGrKj27iVJg0V7nK1Ny4Xv+Ge
f/e6qe2a6yf3a/7g8Obf/x/fWH94+nrWS1LnUUEhgiaYKyOcHQd0oQlbTwwBkQQuKUxZ4NCITOOF
ZOwcZZMjZKAockSISCURUUCdoYSgsz0+WUiOrBRkpSECGkO0AXRGioKowFt/FTlqLXbT4nuHkAZ8
oigMKZeUewpfSS7wbAuFWLbk+QV6fE5ebKjKCcPlJdFMiOcVadMwPgV5UpONOc39Cc3HdonRoScG
RIQUrxz4KscOkfFbLfGJQTUSuVOg7x4SlQLnsKdLGC1SBGSTgxEE54nBs/z6CeLUUjQWc0+TfEIJ
g1Ya7IgwGrU7gTpju97y6MkJ7Bh0qanKKfLcoi4uKYqcfDZDU4Ay6Ns3iauRwAq593GCfYxubiOF
JcYBQ4GUJc1LfxL3ZA1GobKaOI6oqmD9UUcq99g+WSLXUB/dJ58cMrnzMv54gTYaaTKQgaLIULkm
n96izwWbp2vkU0X/0RP07ZfZ/tOvk3eR7FM/SqoNSmeEosaUGZtnz3GDo5gLkoCsyXFf/RJ6vos8
rNB39zE09DGxbjecnV+w99YlB69oYtcy+eyr6OYmcnZAGAMhglwFut94zPS2I//0K4jdBuEbhs1I
LiXjdx9T5iP5xCMO5mTNIVtXkZKgf3JCsB0meOS0vNpCOGvJdiZEoYkqI225+oJmBoiJbK/B+RGV
T1Ap4dsObSqiFbg4TmSW/rX/5Od++u/9F3/1lzfXk+Saa0G/5veVb3/5/3hj/fjy9fXFFh0hpqv9
aSECUYSr6tPRofOMECFGBwSihCgAodB5gZD11YdRC7TJrgoyo0IkeXUzlILQX7nCy1Kha4mqNNJo
TFMhBhAhXWVvRwcyYf3AGAaGsSekRBg9rvXIeFX40jSGItOYSjI5LDAmo7I59uwBk+CYHt6BE4vQ
N/HPE2ZyRPfcYc8uEQeOuP4Ku58x6MaS7x9cGaVEQKiMaECVJcPZCnfcI1VO+mCgONiBWiGajOF0
Q7zYIJQkuAE9neBcQihNv2pZPN8Q3ICV71DvG+JmjagzTJNj7RZdZoQsIVSgv9iwXo9oIRCnIK1B
BYW8eEp2a4p461tMP/fDeG/QdUM82RC3PdXd+/SX30DPPgfpEivOkUIg84zp0Q/RfvXXkRVgcpwb
UNM9VtuOMNGMUVGaI/aq+5R3j6gO9ulP18jNiJASrKPIC8zehHo+J1DD3h1aLGfvfQ/Zzek/fIwZ
Rur7n0Lf2UPKDDndJ6Hx26uSGvAIIzGzEmePEWNEyQzz6ivEZIha4Ncj7YOW/Jlhunmb/JZA1Ybp
Kx9H6BkuJsI4Yl9sMdaRF4L8M7dRRUlQBckFuien8N5IOS/Ro6K4eYd4sEPKS+x2wLc96WJEBE9+
e58oIoGAMgIKTRSKKIEiYS8WVyFJhSApTa4LnB2QGoTJAYHrWlI8n+sy/emf/pl/71f+67/+v/TX
E+Waa0G/5veF997+5p86effB/3zybEGhMgbXoWQk2Z4kPEZEwnqLMTlRJKSIV7+PEzFZQX+ypa4m
5PmEfGdCVlZY57DJ40JCS40KEGNAR1i9uMD4iC4yzKRESA2loJgUrJcLjNQkCUEESJaNbUF6Ti7f
wYpL/ODYfnhCkyb028DuwQ5GG6RMyJQwESZ1Rnlg0McXlHsfp//2M2TzMr4tUHlBiIHVk/dRhwG/
+ID5zQVZNpLduEc2nYLMUGhSkoiypjveEDJPLHv8+jl53SEPMlStCNvuqp61KMA65E5DEBJPxMXA
idtgfYc0p5S2Q6WArGtkVYHzkDSCDEZIo2R1MjKeOrYfeaKG8eKCsXtIKSsOX/tX0K1GHcxRhSF6
Q9zkBB/Jipcw2S5R3ED6T5IeR9TeD5C8gHKCzBLJKoQscWhUVdKPCSUmqOcT8qeCvR+7BzoRrGN8
84x0skFv1qSJId/fR3hJUTWYZs7W5Zw89Zyfvoe8vYd0G4oiMfnBT+NMop7v4bxAGA8XPcRAoQXS
WdThXeIH30V86zHNv/wncGmLnk3wUfLs4YJhu6Z68pvs/fEfIq7OmP2xH8FREsopQ9uxvWgpTgak
L2leOyIWJRwcYJcLFu9cYM46smyF8SvKlw+xexV5eUi7iqTgab/7jLj6Z+y/ep8Bh56WxLYDo0AI
0myH1A30D09QT5dkc0kKDl019D4ijMZdLtHTBhUi7eI50rjDfrj8iV/6y7/4K7/wV/4Hdz1ZrrkW
9Gt+T3n/vXdMGNM/OnvwbH/djmAHgndkSuD7S9IYkfEqzcvoHJFpUkokL1FaYaLC+USlC8xkgt7b
QZXTq6CYmIMHJTRaamIMxAht2yFCIm9KdF0gtUCGRAoBQkBXGUEE3NBDCAifcM7TnSaiqEg0iGKH
MQlCbSkaSZlLihxkCjA6NsfHaAxlXRMWz9F2xIeWPG9IYcTPIr19RPvsG+iUMIuenRt30Ht3kVmB
zHKStci8IALeO4a2Y3h2gakcwZ1R3zogSkXS4iopL1rMrCHKDJkUbtNjfWD16ILFl99k4rYU+xKZ
niKXPdFIsoNdonWoWuNdIuSS4CwXjzrErkHVgbjd4jYOMRwzmx+QHpcUr8wJvcM+2kI6Jr37JpOj
e3iZyJsdpJsQ9SH61iGL3/o1qvsJyh7P+4gyEoKjnhzBCIUqyDJDoTWTl6aMuYBMs/roOfH5+2Ti
mJgW1PuHjMsBc+MQpXcZ8pztbJ/n7pC+uIU4mVN9eMLsU/t4rSj2DwlOQp4j+g6ZEloErB+uClbC
Cvn2BxRf/GOE5Rpz9xZda2i7LWffGdCX73J0w8EQmHzxCyRmBF0QA4zrDcG3UHiq2w2yKdHzO9i2
ZfW8xXZniMV71CFiPvES6tYOSlQ4qQljz/h8he4uaO7fQM9Kgk64ziOTJCLIJ7cY/ECwgXCyJZkO
VSjM/ICiqOn7DSkJhC5xIcEIYRuIY7wrsvjFN/7jn/u7v/jXftlfT5hrrgX9mt8z/uJP/cxPbc9P
/q2TBxeI74unVoIYAoFIiurKiFbmRHmVABdtQJmrQR2FRGqJUgI9rdA6x1QTFBK7jQgf0JlCa0lM
CacjyXlGYclygVYKIRJKSJJIaJURnYeQkAiiCJiqYFj3eKHwg8atgRTxpyuaeQHJUWeGzORX4TRl
ziBzdCXwq44oLXq6j7h4zvyTrxK3XyVt3iV7ac5qc4yaCtKYODi6i5qdovfukqmccXFBXtaM2wEf
JKu3PuTyW18ldy3p2XvUr75C0IaUFYgkcSIhyyluSGAHxnZgE3oWl6ecP/4ydZmjs470cEkmauR8
F93skKQgn0/wSZOmBQEYtKOXjigk3kpCu0GGEj1vkPkHVB+fE3c22OIJ6FOYWYrpIVFrsmYCPoEL
6IlheBExcgd6ib1c4s9PSEVBlu8SZU41Kcl2FNntAn2zgcIwuMAIhLMXZHWBrBNBFEg8pihRkylZ
PSUtPO3DiDya4C5KmnFCWfZXQTP37pFpzdi1KC1QVUbotsQQUFqj8gzVCML6HUgF7N4gm2T0lwv6
d064dRSRj75GfvgJ6s98gqyusMGTmhrBwOb9J4gPl2S3O9RhTlYd0ntFv9pw/qWnlNszmnxFfOkm
+6/cY+wDcmeKGAQ+dehHLfKoYbK/Tz9EpMhID3vc1lLNpow+oJqc8cka5c8RYY052kdlmvWLpwip
ESIjJYfJGvonF5QljIvFy2q+84M/+xf+nb/3X/23fyteT5lr/r9w7XK/5v8Vjx+f70cf3xhejKQ+
owwCjcDUJaMMBJ3ho2R7vkDGSIojqoaoIxQGXTSIvKDeL1GVQsYe+jUprKimOZOZZlooag9GgMkk
wUioMza2Z9y0hLaFGFCZIDqPkpCiRzgLwwBpxDAiqxw5KVitPXbQxJVGrA1qEdELf1XHGhXzZofd
pkGlHPtIYIcjxsuSLta0WrO6XDBoCPMdRrsikHAqEe5I+sUz/CIRWodfdQibGGyH0B47rHD5MX11
wUoucNsePywRGagUIY5oKYnDgEwCu7GM0RMGj/cFk1e+SFS3cBxg1zWrb7yNCA3+/UuUyRBoijKn
yUv2D3fZ3y0Q5xYVAjJY0lozhAmX33vB2JVsnz1Dqh1MaPBJY27+OOPDllzU6KQwItLsVojLjv0v
fBq7OKE7XzAuc/pvnaLtHt1bX6FpCqrC0ExymhszzKyhmh0Q+gyhS8xnPkNnJH62z/b468Ttc+zT
RyhxSlPAzU/v8Zk/d4v5XkH9+T36j+1x/OUPiesLhvOHiLhEbDffj1GtkAjKKif2Pfn+LeLtQ7oX
j1EXA2FxjGFLriz7P9GQjo5on+2Tuh776IQwtCQ7ILOSfLaDn05gZ0J8TxLPAql3oA3FrYZwkNPF
imE14s5G0pCQQC4FpjIUt3dRN48YL0biVl5lwecVbmyJ20cwPCErI/lug/nkPl4YYhvwfYsfW4J1
eNfj+w0JSTQKWVf4S0886wnbkz9rt6d/68n3/uH1XL7mWtCv+f8fkeR/6vp+vl6uIPWoGJGZJgmB
MgVBSGImkMWEbhiR0SCcITM1pigxOierSlRRXbWu2YBftrBsEb6jLCJZ7ZFFRJiILHKqqkKiyULG
sHL0Fx3ussVvLIXMiHZEa5AmkfyAHgMxjWSlASJRWVQzErsV092cfAXlWaDsJKF3ZElhoiQvFPGZ
wj8RCHmf4UywvTScffAuzmWEZs4YAua2JpUJc+cOJy+O6d5/Qjhv6Z88JUmFW62JyeFWLd3yBH37
Y1x86wGiLHHPPkQMG1JrCYNHIwmrJSIb6e0WGzcYHbC0YCLb/UBX7nJGz7Jf4sVD7PLbKBExWpIV
JUbXqPkOzXSHujH4s0gac0Q6onjlVayc0fc5Q5fhLzdICWq2Q94U+Dzity0iVwgdEdKhdw1ME75Y
0IZjWjzdCHQnhLNHxNVHSLsmryTFtCQ/OiTbmSFVgS6nCDFHNq+g9ZQYLW5xRnj0kHixwSTPZG+P
u5/+FPdfu83B52bYWcF2dUz3pd9k+PZbxOUZaVxQFA6ZBfRefmW27BNxCOj6k6g7fxY7SsTKkrrE
bPcGB3dvE7PbyFv/EsPvvof/8DnhcoEmUSYQJqN56RZuZeHhhvBoTVAdylhEiKj9Kb3YY3yuUKsL
uvWGTDhEt0ZXkrzQiDsVap6xev4B/w97b/Zr65ae9f1G97WzXXN1e+1+71Onqzo+ZZddlhKaoCiK
EBfcJDdERFFuEgRJwA7ECSgiURRxAbIUFMsQIxmIIkVAcBwJjE3FLle5LRdVdU7VqbNPt9vVr9l/
/TeaXCzfIKHEgHO3fv/AvJrP840x3vd5VCTRIsZPEoK0VNsLEu2wbUF8OIOdHUobIbYd2/UGMxvi
yxWuuESGGtdY4ukhTZkSKoUqepr5+k+4zeJ//v5X/gdxozY33Bj6Df+/cfpy8wVs/6eazeo6rvR3
88pzrTHBo425Tn2rWpQBV9TX0a2rAuktwnqkbklShZQaPUoRMiUUFf78gvblC7RqUE4gREBbiVGK
NJ6i5ZhkvENNRNWB20AzL5G9gk2LygwmM4iBQg8TQpxi4hjRSdxc0l7UBPsRyc4lJl8yujNGtR5Z
96jeE2lFgsEPoBo7tqOWZeMop0M2xRqZP0RKTSRiRjuvE9aaajvgbK1Z/vYrqk+f0rcW5wOhFdAK
bGEJ+h5unaIGu3TnG7pNi6trhFBICa6ocJuK0FmMDGih8X1PbmJMCNjtisJfseo2LBBcff0rdOoc
V6+RwiJCB+Z63z6ODWaSU2OoRxny7T3q/pJu2FLrl7TuFf5qgUpj8tl9AhbZnBMii6tbRGUJ6wYt
FX7d0IgHbF5MuXrRU+6OmS9f4s2Q9tf/Mapbkw4MKhekSYTIDNnRECEkvjXIfEYXhiTTP0Rbjui+
+lVkUSGqE8ZpzGC8x+G7bzG7fZt1O6Q5+EHm357jXhasn3wfoXtMWdJ3G6KdDGs0ZjTGXXpcnKB3
blN+GPAvOuxySzYQDE1GdGsPPj+jvLjEvjimW6yIpUV3LSodkt+bEPZyGtnQPj+nXr/ChA7fRORH
Q9jbpR9OEasrmsUSuO5Mj/MEqSN8EoGC+nyBsFt075HjGBkPadZzTFeAbYkPDnDjMf1K0JwUuGWJ
iCIAXFPg64LgSxhIVOJRwyGhjBGNQpThP5Vb/scbxbnhX5abN/Qbfs/8+J/7r37GtvVb2+fH+Kst
kXPEsWA4yxCJIUiPtYG+6YiQCB/QMSjhCa5D6IBUAjVQCKmIJjsEoeg3BW67wbfXK2ei6RHCIkSP
0CAzgzMBBHgf8DYgkeBBVw0ilEijUKlBAEEYlInwVtFUlvVVy/Z7K9zzZ+TjEeP7+8RDj4oMIgkI
4cBI5sWaInMUXtDpmPlizdXyU7JBRBoBlSC//xZN7GjlkM3JOa6BUNXkjWTwzhfozk+J9g5p6x4X
GZouYXtS4l2JK8/ZefvzSAqYTFAqpv2oIBqOII2ROsVZR+s9xivmn55hi4h6c0Hb7uJvDehfnjFK
psiiI7t/h9Bawt4AJXNsmNJ2LU4GRKbwItC9WJG+tUN1/htMOs9o4jHDAfnuPbreIoZT3ElJSCNc
YamFJzmcsKxbFss5i/dPCHce4dOM+tkxftMRzgOJg+yN1xGRIxvu0IYIPRpQnXTUn1REtoaxIZqN
KL45Rz95Qv7ld4GS/OA1QjRBZWOQgmrQcikgvEzY2b2Ol9XTCaGNaHyPbztsFzBZTPtqjog0spPY
396ge4v63ACR6utde+1xXUX4eE324BB1Z4zaGSDTGV4MaLdL6lWBuGzh40v056eIOKezklBdYbwj
H/TEux3R4YQ4SyFKUVFG23c4G2jPN4R1ByagdnOEsrhFiYgTRGTwWqHjjHa7wRc1fVWgpzmY66hi
5xy+bFBZCtZBcCgt0cMMow3WWQL8gf/k377z9Z/6+X/29EZ5brgx9Bt+Xzl7efpHceK/r7eXdKsV
vm7QsSKdZMhxgpnkOKVo+4BfOVSvyJKE0DVoqcFahO2JEonresw0RckUkhgC1I0lCor6fImMI4QL
uNUW7QOOnmSSIVyPTEBFEX0Krm5Yf/cUmVhM5giiRukM33RE0Yiq6HFCsb3o6EmRe7cJH5fsvzYB
N79OdjM1nV2jo4xlW1O1gaLsqZGEgaIvtyS1J7MJo0dfYLhzQHXcIvIj6Kb0laZr1qTdioO3P0fb
XWB2dvB9i5eO/vQl5+9/lTZKwAX2sgkybRGzKRDRvXhCtL8PA0BbvG8QicQWNS/f/zrbxtC7e/Tx
Aen+AE4WxGyI5gEzuw2jlHh/H2kyRD5gNEqwraOpW7zpCL0kal/SHx8zDFsG44A+2MNMDwkiBzTV
+4C04Gq8NpjdnM721GlLUfV0S4eXObKaIGWCujxjpG+h33mIiWP0aIxMMpxXBBlTbmu69+bEUQDV
oX1LVF4hD2KyZIScHTBMp7QOyIYo1VJsasy6Qn7360RB4kcTQh4j2p7+fIVMY9rLNa7oiAcp3bok
+AqRCeKHU0LRIMc5Unmsr9EHOdQrtFyiJnuo2S4hKKpijaVjdbJCfNYwfPeQXnv0zFA93eA+rcjW
AhkHdv+NL9LWG8wsw9WSLvT4vqdZLDC5xL54RnRrFyU0HZY4zejXBdFwgAyaTnmayyua4xNGClpr
Mfdu4dc13XKN0TGu7DBxgmxB7KQoEVFWG6RUbJ/8bz/yX/x7g7/xU/9ofTMkd8ONod/w+8Pl8bFp
2/7nQtPu1i+foeqW1Cl0IsgnY7wxpLv72EbSNj3tZYPvPZGRdPOKoDW2bnD15vqdu21JRhlaDPCR
IRATYk3Y1BTfmyOnEuE7mqunyNhDaJBGQyPIJiNiFSGjFGst83WDugrX3d2xQcsYAG0krRPYWLFe
N1yedJQyIOqC3fs7yEYhBkO0MthOIEyM9QKrBWXwbFYd0UZjFit2hlMOb73N7NYOiVDI4Yh2scSq
BZv19+irGjNUjPfGyJ0dVDIEDJ0TLL73KZffeY5yewzinPGRxjyaIrpzkCB3U2QCcpjg+xasva6R
nRdsTy4I6QQvWrpyA64kObxN/+oj0mVK5EbIvZTRnbuY4R4iGxDSBJnHLC8vKYuC7EFC/WxDOX9C
EnnSMCI9PEBFKcnBDsVijrgVsOL7+PYz8v0H9GmEGo2xdsymOKDyM1zrSQ/v4T7+DVJZMbm/h94+
JTk6gp2IOBpQlw1mb0SwJdXTE/LcIqjQRzUszgknv0n2+EdgCHk+pOo1Jt+BHrq6pPWa6vsrhrsZ
yBVitg91Q/HeN4hvPaA999e3PGtPK1vUoKGvL4mnY7zrEZMYHSR9UWBsjD9+Hz2/gN3HJPcOCQ4q
Cy4KzE8ukP/slOE7+9hEYCYjtqcO6xvM2QvM7TGjN+/jlCQb7NK5QOcDXV1fl+nIFvviJdHuGD2c
gIkQXSDUAZHHiDimFYpmWdPOV6SqJOQxyaNbuKbEViXaC4TQaGOg9iR3dq+TApMYXzT0m+lev/34
7G/+yup3blTohhtDv+H3hb/w43/+z7im+pPd/BXNy1eoANIozNAgjETGMUiFROLaDmtrhBZ4LHVR
4SqHHgjEeoloS4zK8E4i4hghBSJS6EhTL+a0vsE3Ht9ucaffpb/6kHjnDna1QacThFFIIVE6AqHw
oacrBJQenVpCWZJEBmt7Ii0ISUwZGpZ1Sb1oSCcT4mLB4GBANjD0bQWyoesWZGlKbwVlvWQYB0Ch
WxhGI+58/jYDDGIMkRAU5x3FBxd0bYycKszwDrq9Yuf+53GdR2cpm9WGVQV+8BrVp5eMVU9iTjH7
Q5SKsfUFUT7Frk/RB49pFhdIFaGyAZtNhx/coWpyejukKyT+eEl6eI/QW6Lak3owQ0v+2mOy6du6
fFgAACAASURBVD5GZnQ6JxqMkaFmtSgIUlI5w9mzK4xI0SKQ9NelI4Pd+9SbFT5a0z39JuJizuDx
D8POhHg6o2sDXSawqabpEuq6wdcB250zkDWR3mIO7hPdvYMREW3fYPIxwXo6uyWYjr7uUWGN3gSU
6nC9w8x2ScZTEAqjDCQ5KoXubE29mWC6HHdsid85wntP5ztC7RGRwocab1qwC+zVBzCvECYntC0q
HoCOMMMJoRJ4e4hQW/xoQPbwNnXf45OEdrulXC7xTw1ismFw+wCkwMmW8vkc9Y3PGD+cIY4yBocH
WBJcktFsCuyyRMYSt7hC5ifo6QwrOlScE/pAMoxplnPkQQ6NpHq1xm5LbPt9kt17DHYO6JUilJZu
UZDs7eO3DXqckuUj6mDxJqZdl7ja4+r9L//pP3b0N3/6l560N0p0w42h3/Cvxfz0dNc5+w/sep42
z5+hOoUSESpTmDzB2w6dpkipEUZCuN4ZV3GM8xadxgglQPSoUOPmHxClRwgfiLIEpRPQCTKb0VjH
plyz+WSFXzlYrel/67dI7r+BXy2JJntoKREhIKTAJ4JknF/XYwagrHHfr4miFGyHSoa4NKcWgqJ0
NEoihUGKlsNRznCS0rr6eu0tBEbpDi7EwIB6FSPWCdJmIAL7+xnpToyMwYwTyq2nXGTIyQOky9Gi
ZzJzxHs9YpiADFTbKyrR03YVXdkTlzXDoSQ50JjDA/ToEFedEOoFevgIESxaDZHGYMV1WEnbS9rO
4aoaek+S5kRRStieEuWBZPmc5N3XGRw9xAIqmSFNThLl2HXF+rhChohwfJu6XdMXF4STJfnjzyOs
AKXRfYPsl+iiRk5vM37wkOA8Io6RyrHuGtZXHeXKI4cxff+K1Dbs3r8PE8n48UPqskWpQESGjRVB
w+qkJOlS7KvnqOQAc/su9jd/k2hvFzlMMZnBtQo5nEEQ1O2WOukpP/bEHyiGX9qjvdgg0wS7WaOn
I7rtBqs6op09Nh9/ALv3qI5foU83RFFE2I2J9ob0ZY3ZiQgfvUTkAyZvPKLsPTodUG1qFpdL2quG
cPI+e2/vUfc9Zn/I9sM14eOeSSLQR5C+9ggbclw6pno5p99uSAYR3eUcNThDaYkyEhXv4rwi0oL6
4hJza4QPCdZ66m1Jc/w98uFtkr19XJ7j1g1+0ZBGY2xpUZOUZJDRComUKV0r8XWgX5Lb8rn6mV/7
9Jdu1OiGG0O/4V+Ln/jz//VfqYvLP2wX5/irAq1SVGJQeYyME1RkUFEOJkdIgwiBSCniNCeOYuIs
IzgQ3iOURGqDaGKksMg8x2TptflHKSEy1LZjcbwmzD1dXRC2V8ihxjiPMENEFAhdg1ABNYxR2hAP
U4KUtFcd7lXAvWhJDndABfTuCKUETVlSHBe0lzWHUjI5TBERGG1wlUFFE1DJ9fBXaylwlJ2lKlaI
rGK05xnfHWFkoKs7fKex557sIMMUAi06JnGKOj8jufOI3vU4kRCsZPXxZ7jYIrbn7D06Qg9b2Jlh
sgOKy68RZa/B+RIZZWBrqliiI81qe0YXr2g238XrGqFqwnZD9PAAv1ni5yckp1eo2w/Z++KXsNaS
D3dBSMhSZGc5PbmiKAsIgtYHVObx/Rnx/Uv6zYdMvELVEMwB+lgT4pz87h3qoiB5eIBSil5Z5pcb
1ssl5gCa1bfJbcytSYaZSLLXP49tJSiNCQlumBBcR3G2JFzUUJ8TTXZQqaP/5a9hdIycpMjJkIBE
JjkuWIRxeNVTb0vUq1dkr1133csJeNmgQ0a7qPDJEG8N3XyGTfcoTxv8yw9QukQ8uos24I26HsSs
QeQpyb1b2ODwUuKsp1mv2D6ZY9aG/HYG04hoOqPtG0QXMPUJox96iJqNSIcHeAzFfI3fNth6iUpS
VBgig0MmO4h0hM4y2tUW37To6QQRxSAlttiizA6ifEV8/z5ax7i2RxoDVY+IQEcR5DHCSxwOlKC9
WtGUBVl29CP/2R///P/+U7/wO4sbRbrhxtBv+Fc7nZ8dfwErfsZtrmS3WhIFgUkNehyjkxFSxyiT
4q0kinJCB0oZTJIQZTnZzgyZDUEpik2DDRLpM/rnlrTtMPtjVC7RiSEkBqShmUtWlyuaV+V16Mlb
D3D9ewwe/DDdy08ILkI4RV+2xJMJ3kK8N6RZKxoE1gZWv/598kmgiyxqKtBpTtG3bLuay2+fMI3O
GI8DSmzIB3t0yxKV51TbGjPIcdZT9D196OnXPVEcYwrLYJiQD1LqokNEApRgcCclHlxnrEeDiO7q
PfLDfVxS4XuDwHCxfI4NPW4+Z3+6gxm1qIM3UFGE7SyyBRVyiGOCEzgVEWygbGscjmruqVtDswgY
uU98f4++2mKXr4iCZZhJpn/wTZzOSfJ9BAorJFYKzufHrMMVZl+gDzK8v6I8eYbflpAOMIslIj3E
3LqHv6yRwwg1zRBaoocxOlWYVLOar1lXFevtGjUZ0JXnDC63TA4/h3rwiGw4xTmLSlJQMb23uLWj
/N4CsdCkOzn9vIK4wZ4+Id47oI9j9E5CrCSd9cg8QhCwakvrtgRRkO9OaC9eYRJzfWtgPFE6ou0t
3iuaeY8tUqqrj/HPP2LyzhfpFq+I924TttdxwapI8AcJGkG5WqFyRbvcsn7vHN01sC4YPLx1XXcb
e2y1wH31lzn48ts0iWJwuE/nDLVy2MWK6vSKOLJweYlKYyIxxCcRZjyhudggZExsYyzVdZVu59BG
ITYtMhsSJ2Naf52G2G83RAOJMjGdatAqorbXHzfrkwuks8RJokIwt376F3/1792o0g03hn7Dv9rp
/D//L3/WdeEN2Vi8bYl1TpTmxMMJWmUEBJGMcL0jyscI78BZjMmQaUac7SKHI2QkWF21lG1L3Tga
a8nONkR7EjlJ0YlBJClCCLrG0zdzNrbi7PkxfrDGTAqifIbtTnDOErYt3bbDRAnOSpAa2QE4xACK
ZUv9coFb1ejXhshY4V0HoqeVv03nvk0snpAfvYU0KT6WSCVwtSV0gTY4rHBIo+m2gf7lFckA9EAi
paTvLWBIdyOS3DC8l+OcZ/nVjxBCYiZ7hEgg+5Su1TgdUz57hd9WDGZj0gcz4ukQ5xVKJPRnJ6jk
Fn5b4vUYk08oi4agUopzz+K8o9gUOCaMfvA21Xfn1PVLGrkmaSwHk5T8rT3k3n10vItWmqazhDhj
8eQTxKLg7iBhMIqpu4ztOsMfTvDZkM3mJUnQDIdjitNvEI0N3eY58XCKkAJiSSh6LqqSbVNTbjr6
9BA30uRFzWyZou/ske/v0bWOaJjiK0fnHNlkTFvWmFsJPFvRPw9kn39Ee/WcdO+A9vg55tFjtDfY
PqBNjJQpUaqpLmrswpIOa6pvfYXk6IDOnqEn+0S7M1olkcOE5eUVRdSxKT/FVhsmbxziyhOSg8f4
tgOjUVITtMX3LXaxwowzfNFTJWDTHvvpzzPaj4gffg6VRVQvS/xvf5PJH3kX8pTk1m2cSukjgy0K
2sstLCrCdokeDwlKI4cpwlzvmRMECBA6gOtRswnxOCO0oAcDiBQBRwgWIcR1GogANUzo254QGfqy
pW9aTKKx6y3G67f/3H/wx375r//8Lz2/UaYbbgz9hn8p6uOXf9TY5C/31ZooGITUGBGIjMGYBKVj
bF9i6y0KQRwZgm3Atpg0JYmGoAUqHiJ0oK3XnBxfMT9uSD4KiCdXRLYhfmMfaQzaKLq2JWTgbEPT
VaxkzuZ77zO58wX6938BoRfoUYZrrwhtSvfqJTIbEcoW0XcI29IZS/L2mO1hTP+0Iro7IEhLpAPW
d4iBZnn5IX6RkN96QLe5JB/cpntRgIH2bANY4jSibXtCbqirHp/HYNa0TYkY5WxOn5EOM4gV0ShG
DgXHH36LduAR6ZhBdJdQFWy9wCU91dkHyN0I6pI8icgO36BXkijfpVoHVLZL98n38aMxKo5pmgrV
tsw/ecKm84jsEFs6zE6G61vE3hCfJeTFkv1NSvLoFuboAJ3vIYSitD1BWKoXHzOwDXemOaPDWzgp
6KoxfTzDjvdZzz8kAqJ+hltviPYMXH2KmQyRZgdpBd2iYdlYml7iKo1MKtLmnOziBdNiTfLaQ9KD
AxyeLM/xBIQxhDjDKqiuVvTrBjsOdIv3kf4cF/WEeoneuYccDUAJpDHI7PpZRYSKICx9rQkhRQSL
JEPmI2Q+AhPRWMeyqtn0c3r3MWmekQ4SkmSGzGfIKEZUHYgGEUeU3/lt5GSG7/z17ylY/9Z7ZMkE
tfiU7IffRegh3XFLdLFFHzr03j7JziE6GdHajG5V0hZr2tMaEcfoVCLaknhvh5BoxDDHrguca5He
Yvua5OA2Sk+Jj24hREzX9ggZYeuOKBrgNmsYRkSTCY2zSBnRzK+QkaZZbLCrC4ayB+W++Jf+wp/+
X/7q3/774Uahbrgx9Bt+T/SnnxnVZz8ng9qVnSMOIBTIvkGZgAs9kTJ429AuL9GyJVJg/QZfrpDS
EWmLcz1ZkuNEQEWB9eWCalXB+x12+xmpKIj3BohcobMY17bIRCCFwUWOZdUxP1foIsc9S5HdEer+
D9KVA7zKqD69gFGM60r6viVKQOrAYDaGWKCOYorPzqmLmiANbefwesLyq9/D1ZL4/jv4OiH1CXbZ
oiLwxRpflwymY0CiB5o4TcA4TDTFnS4xswm28hidoGzAZBEIQe0TbCNQwzG6cPiioLyqcVlOe1wQ
aoEuLdGzEwZvvEM6nhC8Q5gIpcGHLc4M6eqaICRt19HkEetFwXbdII4myBiUDugsQisNdcvg8jmH
n3uEH0UkR/vY2tK6imZzhjifM+56st0B2eeOaNuKq/MtmyjQG0vSN4hyS1ickt65Bb4mPvwi5a/8
OurggK6XbFYrQqO4fPocF3uCEdTnlwTrYF2w//brQIO5P0NrhSMglSKoGISjKjdsly3Jjqd/ckI2
u424vIKVQDUONx1ihkO86xiM9qiqGjWMsPOa7UdbokQDjkyOUYlCTYcYk3K6XTN3Bc/e/xrZouPu
4D7q+ftMbz2+Lq8ZT+ifvaJPFTLNWX7zp5HSINIYOVQIFNvVK/xa4Msn5O8ItH5As6iIN5foJpC8
dQ8z2UckI9q6oSoaunVB9+GWKBLEQuKXBfF4jBgkyNGQblnSrQvktsA7y/jeW6jhLUw+w1pH3zf4
or9uzJMSW1foaUQ0yuitJlgo5wW+abF1h998RLw9R05Gt5LbB5/9tZ/9h9+5Uakbbgz9ht8Tf/nP
/vifkT76k8EFnPcQHL4vcG2NEJ4QekJoaasNrlghJUjj6dqKvi6vi0HaGiEtiA6UQGhFFgmKZsuz
45pikmB3LhgOStJBRkgSTBrjOocZ5iijaOuOyy5QLjx+NMWtclzZE++PEbVDu4Tu9EPCpkQkjmBL
TD5AacjiCBE07qRHmIh+2yKMpGkLmvPvoY0higWJiOiOX5Lc26dbnSPzKWoywPaWeJBft2PFghBH
ICRyd0K3rEizEaKokNuC4SynWlboPMPJiEgZuouPsOoV4cGM+atPaENEuW7oCgWyJDlKmT58k/bs
KWowpV2f0dcW5XLqriPKcjZNydIFVlcF23KOShT9/DNmj3cQoSB0K5wvkfMVB/cO6U4+JH7nbfqi
pOqW2NMzuvMFo5mBOEPfHdFcrlnZimLT41aWyNxFrCxiKyDKKb77HpIRi+9+iKteIUe7bD+7Iox2
KFWC00O2xyW+HCLiCaxP2c1GxM4TPTwiSXOEELjeI5MRcpDSlRsa6WhOPXY5ZLD3Bso/IDQvkaFF
7c2IjIU0Js5T2k4hopi2XNO2NbgVsn9FvJkT4o7kC69jW9hUlmIV2LxKyTcJs2zC8N4t0rsT5M4h
Qil8HEOW0Vye05xcQHmCTg1CCXw8wQ2mrJYvEa+eMvvSXYS+hSjm9N/+FoPXHqCGMcO7hzhpqETA
tVtWn7zCNi3xLELlApUZXOjID/boukCIcvy2o7uYY6IUfeuA0eQWvTC0wiM6T1s0qCzDlS3CQJSn
OAXKDGjXAWxDuVjiY01qDunOA1kCajL78k/82f/wb/zVv/X3brrTb7gx9Bv+v07nz3ad5R8oJ9Ou
q8HVCFezXrwCOmxV4PoSa2vqxZxgS/qmwJmevmhw2xbVear5BVI4jAigHcGBzCS+rzgtVly5mrI+
JT/5FjvjHRimDGdT2rol2hle94vnEZebguN6g00DIQ30p6dE9Ro3P0W/dUT9yS8iZx49GVB8/GvE
0yk2QDoa4FqPGGkw0BUtJs/YnB3jhynWNSg3J/KO/pOvM969jT95TpTvEY1ygrXk2QgvYTwZILWE
BLwI1AFE6HD1BSY4hFD03YZMWUyAKEvoP/sMdXALm03ZXm7we3do/Zrer9GDmmlyyfjem9j6kmjn
NpicnjHhZQVqghSOLkppk47SfUjjXyLVksgsSZMIv93SNgvcxCJCRfZqS2Qd4s2HCKXoqga/KQll
h+xqiBUyNfR1Q+Vqls9aGBnaoqIvLnG+ItQlnZRUF5e4qiLoId3lAscMEY9IBzFRZli9/wzqAt05
tKhR56+YpTnR0X2Sw12UimnaFh0n9J0FJbCbhuqzkmxvRBQF4h+Z4Z59A/HpJ5gvvUv4+EP0w0fX
H1CZwdXqOmSladl8a0MyGmH6DrU3IX34iO1yS+st5dMV4iQlrjXTOuHOH/+DeKeI7+zjlcfSg1Gs
Pvh11INHNO99D3kZQATCbA+JZrn9ECPmZIM9hNawWFJ/5Z8w++JjnCrI33oT1ykaYQitZf3xOXrh
ELVE6A4zkeAr0ttH1IVH7Y1w6xV2UyOTCLUzIhnv0YqUaHBE0BlWJyiTY1f19WxG3+JjTRCGrunw
tmK7WZEMFJHraJsTYrlG55ORHGbdX/vb//CrN2p1w42h3/D/yn/3Yz/xV+rG/eGmr+irFW11ha8v
KU9PwFf0mzl9W2Lrkr4osdstvlkSVMAVFrfeElpHf3kFPqB8i5cW4S191xApQV1vWHcFoW0ZPX3B
eNMT3bmHGQ4JOkbGKXiNUhHad2zWHVYpquOSfrWku/qYPj5F7PaEySnR7eubgOb8CegG4jsooYmj
lBBA6N+dU4o0fasJ7NK1EvoRYWERqiOJYpLZhOz2IckkIx3FBGGJ84goTchHGVIqmsbRtZ7+skOq
hO5JgX9xgYgmRFYQ64xkmhLvznBJRGd73OiApqyQgwgrTjAvS3aiHBk08f6beB9Q6Zhu7WlrR9iJ
KJ5+C3N4h06WbMtj9HAH0RdEk8fYxUuCz5FG4NcNuumQL5ZMD+6h8wh16xBXBLrOYYyhen6OHmlc
EuEFONtz9tEanwhkIvAhYAaa+myO3P8c27rG3N7B3zugfPYZ+miMcy07d49obY+YjulLQZvEdLol
tCcczPYw8zXRFx5e98IXDXGe0fUdajhE9IGuKdFtR7ioSKZDuvlzVHVO9O4BdnGBvneXKB0gkusc
fpvGdCdzim+UDBKBrLZED/ZgMmRtS8qyYHn2KTpuyQY9M1cw+/IjZAz6cApxRIgj+qKl6VscK/zJ
C2Rs8LEjpPsoNaF6YZFFRzSwSGnoX8yRF5+RHu7DFAZv/iguaHoh6NuaxXzO5isnsP2M8RcOUM0l
MtOQDRAmQpoIV9SE1oIXyFEEWY7KDxkmOSEeQD7GBfC2pV9cIYJDSvBdi5M9ttwSPMRpjC1bCJrg
Aul4DMb86I/9qT/xd3/yZ/+P9Y1i3XBj6Df8C+nOTl73Tv8ta3tVzF9RXZ5gl6e0i3NCV2A3Jf1y
hesdtmoIraW5eIK1Z4RgaKslri8pz/8p0uSEckVfN/hmg6vWGK0JEuJYMD87p4sE0izRrz5h/PBd
bAvReEhqNE6ACBKpFda1vHpW0baaoq2pFpd0zGnmr4j3p6iNInBMdPQIV5yg0tv0n85R8QDpIfQN
UWJweFSmsK6jXK0Jakp5fIKIUlA9s8PHqE5hJin5YEroJIPJGEdgNB0Re8Wm7UAoyrMajKQ7P6G+
+hY2mSJ1y3R4C5lqzN4U0hQnUmQyonEVwcc06zVsl2TuEH1qSI4eoif59WnN91SvFvhUUTw/JhYC
s3eAYwfhZpQvAk2ZQPQQEe1dD4adlYi6IilbZvGAZJhhXn+E7xzOWvy2pXu+QN8Z4BND17d0dc1m
VWNUIDERg9EA+gGi3cX3I1QWEGmgXZxhlCMazNBiSrZ7gE4TzDjh7P0lZ8+Pqawj1Jek5+fkT5+R
/Tt/CGEbtJQE6VDa4HyDyQbIyFI/XeMuAjoHMd1FZR1ivkbJAfFhQrZ3ROdAJjt4oD6+pK1XKPsb
GHWOmuVwNCIowfZyyaZsETpjWMDRlx5hJor4cISIFXKQ0VpFse3wYsjlP/lFopBhpjl+uUCqA8rK
I/MR7ckzogkYZ2l+9euIW2OEqEl3HxI//AFCOsBiKJqa5fKS42qF+u7X2P2hIbZ6QXL7EG8s8WxG
23YIPcB1gXZZYrKUtlozuPN58jQmGSqCiShtBDjqlxcE26G9o7i4IB5kNDaQxBm2d7SVReuM0Dqy
fEConFE70+FP/p2//3/dqNYNN4Z+w7+Q//Yn/tLf7ax/s6jmVB+8R/f0M0RX0a5WIBS2V/jOYvse
az2hg+XV/43jJZ5HVNsVXXlFefZddDOkO36JkgNYbfGrDSLOsZ3FxJq+3nI2f4ocWkJ/zo6/jfzk
AnV/glQSLyzSC4LypHjWH6zYftiQGIVbH+PrEp1p9t78tzBhSigVptnFfjpHqz3kurqeQo7Buw6B
QxDQkcIWlqZRVE8cbaGoFh2mm5EWGfmdGfEkR2cpIjhEJIhihUkUOsoxKiAEbOYNlQzUkaNKn1LV
HzFOJePBLYZHCVEkUVqT5jFBgusN/VYTTQ4hKPzTjxneeQffa1Rs0HGM9yAwbH/9EmSJynYRuSaK
p2w+PKd82WHPwCcj+qJCmTHjx58jxPeR5UPM6ScMfEf85bexoUMQ0b4oiW2H0x3sJHSl4/JFxeJZ
iW0dU6s5eG2E8wE6Tfdig/fPcfEp0e6WycPXCRdPGc/u4LeCyd0xcRpTjwBiRKSJDu6T9FuSck12
/4z2eEt254igHVGa0BRr9N4IIQSN6wgDSfM7G5LDAUl6SP/NT4hm4GRLfO9N6tLCZITtWoqLK3xR
4T84RQaFyhraWyMiOWV+1VBfOTgrmF21HHzhPrQl6d4InSaEaYZvNW1jabc126cleTSDSY6VHWJ3
wqb9DJ3nNPOXKL1Anhjaj07QOoKqJ//RL5HdfYOQDGldRFnXHL88Zrkp2BERk1Sgd2fEu7cJaYZQ
iiBi0AbXWPqyuq6UFZ784bvk4xiRgTKCLsS0RU99tUIpB2WB7y0hkUgjcMHinbsOCqotUipiExNw
6ER98cf+43//H//k//pzJzfKdcONod/wz+GLzWtdr/6nrm1YPP0O9Yef0C83wHUEKCgCChsUwQu8
SXBKUbshNn4dKwwdQzqr6eYly0+/RnvZ0myOqT94gsrHeJURLLR1ixeBchVoLwU6e4C/qkiVRw8c
YjLFSIEloHREaHp81LN8VtLXCb1Y4VPF5Ad+4LouMyyJ77xDr3r0vZjqyTdRLbCjsHEGQdAsLSYb
0jUgRikqH3P5oqToJOzcJvWHmDIiuxszONqlr7bofIDvGqQDV/cEFUhjTSAQTTXWBUQ+wvjH8GnC
yM1ITlfs7s1QBmSiiLOUtu0wcYRKIgbpCON2CdsYcRbjjn+V4cMKle0gE4lsKpbf+TXMgwf4rmH8
1kOabcEq7Vh3lxT9nHpkEHrAbppz9/EtZJrjiwyaLYNsTvbuA9pmjZA7VIuOqAu4okLc36Va93z2
6YLFyxISydGriMN3x3TC0heW9fNn6C8+QI5fEveB0fSA6PKMyc4djLIk+2N0/rtX1gNHqQNlJGnV
CawqBlIiu0uSo7ukwylGGrrak4x3CE4jY0Mg4BqPKmuoP0aaLapdIyNI33gNF0ek6ZS+h/ayov3G
ArncJcrvIrJAfPcIawX1oiWsKhJfMug3DCNI7+0hxykijfFe0zbge7j6ZAmlgnSFTHvU3ccwPUIO
7rL87rdAjVHjL+CaS1SU4Z+fs/sH/k10XDF68wewKqWVBtduuHp2RvNqS+IM+cJhsggxzIh293Cb
Cj2ZIWWKXXRgBX3Tko4m+IMjJtMhwgikBiug6VN8XyLrjna5RQiHSBXx/oR2uQYZiJKYZlWitcTI
6xpZNivRNavHf/3//JW/c6NeN9wY+g3/HH/xv/mL/1Hd8e9u10vOfu1XqC+2aGGwRUl6cEBvWxhG
ONcSjEQOcmoJvUqpgsarHBEETaux+W3mtaUdv86iU6zmS7K912n6lmg0oKwrQmSwpaasY8JkjPAV
s3mGUj1qYlBa0jUdkVQ0TYfKPYwcl7agO0poOgiiRXQ9opTEch9/vGQwOqQ/PUZE4N2CThYk0S51
0aBNhjtvMTsxNtIsRoIuVaxWFyRv5ZjXMnbfPCDb36O3AaTGde76T1K2+NATJznOOjQa32hsI+mJ
sC8y1KZmoGN27u2hco2eJKigcZ0ilpo8ycgHEYkxCDskRAl2/Slq2BDyISiDD9CHDdJUGNmRHO0T
jKJJYjYKiniPbdeRDSbcLlMODnOmt2KktcQvLxm/YRBRjyABJCrqCX6F3M0RsWGxKXj17Qvqky2D
WcZ4JRl9zpBNY/oMmqRhW79HaC6ItzmJ0eTxQ4TTJLtjrNLoTDKY5KACPpOUV2t6d0C1LuHFiluD
HyLUhvzt+7iiJZiYNB5hlUdlI0JrURNP+WQFFAx+6Aeof+0XyO7uo+8eIocZwkfUUQaupXhySjxU
yLoiSEP++IhyVRM6SfvtcwbFlkH0nORwwvTxIV29Irp/RL+x9MHRrrdsvrNA9xXi6oRMB9LxA8hH
mGTA4sOvIj8oyB4/RjAkSe/QPvmE6Wv3kTsXZG//CN4aapHQl1uunp1RnPcIPOHFMeOdr0RB9gAA
IABJREFUGDHMiHd36LY1+v9h781+bD2z+7znnb55j7VrOqfOfA7Z3SS7KXXLsWSp3VCMDJAjxDcZ
ECBAkMG5snMTZwASIzdBRjsGAiS+SIAgiBEEkJ0gQBDIkmLBNjVE6lZTbLJJnkOeqYZT0x6/+R1y
sQnlfxDruSlg176pvb9av3e9a63f2pvgG7N1FAwdq+sFWnjM0RHFdA8ZBxDQCYfzBi0z+os11XpF
YjxOa3Qe0bYdKpJEXtOvarJIoJRCJgJoceXiwX/wr/zqR3/j7/3WJzcR7AbYehTdcAOt41fKpma1
esVyvaY0PY2xuCSjd2BVTi8NVmZYkyHiAV6PENmAEA2xOsWbHAYJ0WxE9PjPUe7fZ33wkNX+fU6f
vmT+6jXr8zld2aPqwHgQkRUWK66oJ5dsph/i9TnOOZqrNaxrXFWSaEdhArsTxe6TgMqXsGuYX79h
eXLNclFxfXlB6SyL1y+xO2OqzSnrn36Ja15Qvf4N4Iz+9TWClm5dbTOfAuyOpT5QLAeK4t4eO9/7
HvL+t0gevEMYHqImR7RtTH3tYGVp31xTAKmWxJGguyppg6Pb1VxsrugclKcbfGOJrUZayzRLyIA8
leSRoZhkFI92QA7h3ve5fh1T/eGX9OcreuMZfOt9+o8/IGk3KNdjZE9uNMiC5rpCtrsUzxOoFHgY
pSnpjkA+Llimc1avf4LvLK5aEI007uIKufX1IwSB3DjsyyuyvsOva2TaMprmjG4PGH7jHja/T5f8
AuHB91m8bmiCo118gnAnhNVnCDYkWpGOUyY7Y7Lhbdyd+5w9+hbP+4jLT75g/cOPaU/O6DYVRreE
9QXKW6IoIrk1IzqcUEuoVgNCI+lPoDtr6K+u8FWF9xU+1EjVo480+kAhYos2MUpohHfI0OCvPiWp
Tyh6iRnGBC0QJiKEQEeD7daUV8d0qxPq+U/wq0uiwT5mmlPsDtCpQz5KaNSKvjonxDlNXWPzMdZV
uE9WuK7H+hrXN7i6x5gYgaHXKV00oyodTmwPf8KkiKoH0aHTQJCBbFLQBUcIDusDIgg8gijSDCYQ
7Yxx00Oi8ZjOx8gQ0100mKAQnaRzlmR3hDAaOc3wItAHicynrM5O/4sXf+c/jm8i2A03GfoNAKyX
q3HTiP+2Xlyoq49/yOZ6jUDgnEUP4u1600FKqByhN0idQp7gPfRth+stwXmC74mSBJkm+CyljwS+
SOh9THt8AnpA+9E5EQPU0NBjcSawWa6I3ISolqTRQ6JijHu9weQxoa9RicY3DSYVxMbSqwtk4bH2
GB9d0r05AzHHyVd07jnRg1u4dUZzWqOyb9P/9Iy4OCRsSrKxoUpaOuVoXcuby8+4WDhUdMD77z1k
+vbPw/gImc5gMEGOJ/RO49oWS0V1scaMIxyBJnRUpaXuPXIAvrFMsiGmKUkyTZwIvA6oOGDLFcUw
Q1qHzgV5Yehki8ss5cvPME2H2Zvi8q0t6fx3f4+EnPTRPcg1QmnqrsFdH6N7hzg9J7It0ycjxvsD
Sl/SJ5b26Q8xxzG63aDGu5jBCLuuUeMBvZAsqorlek7jSyblmsPqkskvHJEUMdkgRTWedGeX5pXH
PzsmGaTYFx8izALRnMLqDHP4DvSSIAy+V0RZTOM1i/MWfdUy4CVDvcCMLYwFOI/KDQZFXZeoYYFr
Gsrra9RyjfvdDzBFD/sp6d4uTheEaUFwgfrNOXY5xx6/gP6U+N4+fidBikD55gJbHZN0a9IoMPxz
v0QXHHK8SyCiFYrqvOP8kxVNH2i//ISCitE3jlDjiHi2T9U6gtpnbq/wSqOLfbrja/L730Q+/WOi
W/fIHr/HKnQEb6jqDu8852dr3BclyaNLVH/C8NEjut5uRx77QBcLaKA8W6LSlKp3FE8eYcZ7qFgQ
2E5eKAMuCLoQ0W8qlmcLilzgyxKdGLTztKElS2Jwjniy/T5FlqB0hrteT3Tmln/r//jgg5tIdsON
oN/Av/vX/qNf3ZQX/+LV6xdcPv0SEWUIHRO0IU5zfPCYRGFbh2s6VKrxqcL5wHKxBgk+9GghSeIU
rxXZZEDdWfI8hzijiyZ0WUFbgeP30QcLVLxDnqXERhHXgr7ckFzPUNMMCUguwXhEpMGCVJJUJ8iQ
olSGSUe4ssWdWbQd4LqO0GqcmiDqJ4R4gF1O0GpIlAzQkwwRNpAl6CRmtbli05ScnDa08YxHbx+w
/433EXFKiLe3EDIZbX8Oh6wul8Q6xuQp+cE+dDG1CLRVR0gkaVEQtXMSLjD9OcxiRCzxXU0URaAV
2m+vUEMQBG2xJ55woJHmGuGXmGHC4pPfxmmHSlKKe29hohwnLYmO8XJNdfqU+vg5Wbtmf7CP300R
kWK1WVBtloTLiO7HP2Hy/vcI3qLGQ+ybT+kGHV5kXPzolD6J8B+fMdQ/Zv9n7+KqY5LRLUSUYIyk
KwP9UqFJsW8uiG/foj2do48t6ZNH1FVPFOUQPNPJCALEeUGIRtjn5wx0wL98TVR5hK3x40OMl5TV
kigrsI3Dupb6eEn54a8zePQYaS+JD4bYKEHs7iBDRnm8RswD9kcNJi2Ikz3CboSKDcuXC1hIzPqa
9GjA9Ge/S6d6zM4uVkAb4PpFydkHJ5Qvzugvz5gWlunP38ZkBrNzDysFfatZfXiOUneJzjW6N+RJ
jtq8Rk/HqNkAGxd4H7AJuK7j6mJOkDV61pMnEfnOLUhjfOVxlcXrCNcqvEogTvA6Jr/7GDOeoFOB
Ex4QfxKFbRuzvnBU60sMczw9kQkI0WBSg+hrhAeRRQgEIksJXYfQEuH9z//7/+Y//z/+1//rr5c3
0exG0G/4mvNX/8q/89eqN6++c/3sU9zaEicpSRoTpCIEgdBgGwfeIQKoNEJLSdc7mrJC+YAMEm8d
fdsRK03fWtI4QXnQcuvT7ZXCiwwbKkTVU+zex7YWIyOCi6lfHWOvSpKdnCgKeF8TTfewixriFKVi
QueJdEoQCp0M6GRFr3v8XsTi9QkUt2jrGDO+Q+cbysXnsFcSimviB7dp+IKkuE8yHnHZXFPHKU6l
tDsTslHK4/e/gwsJlZJoIbFSofOC3g5pgibWGrm7z/DhO7hkTNN1nH25QqeSeOAQl08xl88Rr5/C
oCO+/RZdu6G4+xhPgggab6FvHGmc0F9b8gcHhD5FLPfQe7tcvKjo4gFSHDHMd4lHA1ymUDri5Hf+
PpvjN8jJZLscJR+jxinD3Yxyc86yq1is57j5ismj2wS1wRLor17iUoXrJyxrR322RPmC8WbJ5NZb
0EqivbtoXVBkQ+K4IKQ5tYvpB3fgYId2/jnqsie7NQI7QcuIOI4YDqeYPEUMBBdnkqWPcdEGXV6S
NyXY58Tf+AWEh9A4ZJwSEoUXPeXn19jza0T/GhWPyW/fw0VTBgf3aNsIXISbNzgp0EUKu9eYw5zm
ZE779Jzw+U9IA6T7A9STt4lnO3ReY5OUdl2zXK+59oLjj36HSIyY7LcMvjVDJlPkZILShvXlCd38
U7RrkVEguZfhnp4Q7xvc+U9R9++gxrsQg440zdUGRYdQLZxfkDtNdDAjmU3prMGZKSLfIUwfYu58
Ez88wOzeIiS7xLMEaQSdEIiv9Fwq6LpAUyW4TY0tW5JM0LctZDFxnLO6XpKkMaIHMxlCF+iaBhUn
2HkZx2me/Y2/++v/1000uxH0G77GvDmZq6pZ/e3102fZ8tU5Axkx2J1iipTgFJ3riWiwvUd2HRqx
zdhRrFc1sVb0naO1jq7tWS42+MbhekeuDKmIAIExEhUrop2ETavhSiDwuLImKVJWl8d05mpb411/
TJJXiLDBDHboL1tMOkCaBLtpiVSClpJERrTzDOIx6d4j6kWLIINYIMyIkI7o7QyrMnqdE6UT2voZ
0kqygwPwmq5f421DVOwyHky5++AJPhlSqkAIEi8FPgi8jmnTDJnG6Mke0d4tRDokKTT1pub06YK4
cIhrh8kqFEtkKVDT28SHdxi89QRV7BK0olmUdM7SNS0h8ZiJJjgDJqXuPWJwi3axIFl/RD5pSMcT
4t09+iZwZcYs5wPqeYGtE/z6hNt//h0sHusD7fqU9viE0HSoiSIZT3F9jf3kDLP3gE1tWVcl9SJm
8/Il2sfkFxmDb9xGFynp7gzwZOMCkwqqrKWfJpQ1CN2hozfovmLw1rcITctgbw+dJuQ7BaoS6ELj
VILvLElTw4s3JGcVg1/+Z2i/fIWcjbeNlUmEXQdaE+jCjOo5pPF9ZG8JwyH5wUN6DZiI+k2JHDja
5z+F4RuS6W2WP/oYkWfYN1+Qp4rBu9+AW/tk4ymL5Ro53WH9Zs6r8wXL2rK4esGd+IDZ4QHRowPS
IsdmA7TKefrsUy5ePkOM70GVMji6RfkHHxDt7WLXJfLJbaLRHk45dD6kc4EYgbvY0Jz3FPsT1F5O
cfcIu/sI/eQ9mD2hG++QzHbxoyl6OEYkCSoRhFjAV+tV5J+IusA6RVA52A4pKnzpiCdDlI/pVj0S
j4odosgIZU2wDuU8oXOISP3sX/2Xvv93/9av/YPzm6j29UXffARfb2xX/5ny+KNZdfkS3zVke2PS
SUEvLdZ6WlvSNIrQ94Rg8a5Gi4ReOmJvAUkrHW3fsmgqNl3Pog/ozmIRxJFGGEUUa4QMtI0jO9ih
x7GuSmTX4JzD95L22ZK+PyPdO6auViid0K5zKA5wzQqkw+hA120Y5xFJIqj3Ysx8xPxZSTb8Hs2r
DTKOufzwE+KdHD24pHcRIXF8+bsfkU9aQrpBTh9QiJQxR/RFTJRn7E7G1GiQAacEGycwwYNQ6EFg
1UZEoyMSY2jRyCwm3XmbO992nJxe0S87Rg8eYBvP1fFT3L0CMcyYPnyM33sLGSJE9ga7cYTFnNXL
ishqXNsRDzPc1LH4/IpgBlw+fYbRWy/6cP+cSBwhUxgfzhgdWsq24Spp0eefo1tJvbJExZii+LPU
h4+pzRWvX7wimyoa8ZuowhPXj7ly0O0cUJ+tWezew7kfYjYfMDwRqIEkO5zhvcDsZQij6Qr48uUF
15cd6/Z9Ni96+Lxkcrenf/MK9fAetlsT5TGz2YTrynOql6zCbVpxzSY/Iaotw9dnhLoh7nswGhEk
Jo4YPbnF+k3F5tNvMv9yQSzPyR42OFGh8wK36lApiD5gdo/QxmFXPepgRqiqr3wBPM4dE+c/Q0WL
kJq+ramqhq6Fet4TX5akO544vY1WKcEN0D7C9554+JDV+TGhnxGNc7oe1OP3aFyFe31MIRr6xQki
2cNW12RJTqshDHKih0eUwTPJ9yG/Q3r7fUSUYr0gMwIVB5IgCL3ejqp5T2ggMgIrPQBGSlQSGO9L
jNqhTt9m82lAJqdoPF1ZY4yhW62I8hjalpAliADt+TUmVzjfKh3Cfwn8szdR7SZDv+Fryr/9r/8L
/9b8k5/8+fL1BYWRZOMENU0JXtD1HhECy6slfW+xbYstGxRiu0EtSahtS2cUm67mYl1Shg2992AD
XVXTrzfEA70VYyVpRUuSQTSOt3vHrcTVmi4eUL3a0DZPCUOFeGEp3tohNBvinUf4IMC2KAVusSRO
Y/qqR8UpWqQsXmzwo5zO98ipRMQL9BjkrsOFY/xkxMb1NMOMMIxxm4Qo7LHYxAxmM2bvPObOk7eI
h0esjUagqKwgCNh4kLHgohGELKYwht6D1gqpY5xUXJ+fYq9qdrVGRBNen3v8N7+LevceO/ffQo6+
hTcFTk4QaU41r7n8qIHXNdGwJRppVDVHZDH95SXLn35IZA3DfI/i7g7RrTsEpRFWMn9ZsVk7ZJmh
uxWDShHXBjNMEFnCug9YlSCGM/p2TnX9KTIuEP0Gmd6mPi9ZnF9S1xvsToq7+pLhy9fkWYa8NUNl
CTJ4zHBAbBQRmsZ65h8vIewQDw9xr05Jdg3JZITJDG7dIacJq82Slai5bjx1yFD2GPVI4xdvGFQR
DArinSneCuRoiI4zVpuGq+WG1asPGeyuSNol4r2HDCe7LC/WaKNwxyX+0mEySdcvtnXys3Mi50nH
KfrWjOyt96g7R9jbpbxouVhseLMouTyeUyjFQMyZzjJG79zH9w0m36HpPS6NsOUQe94zSDT9ekny
eEa9/AN0qMgeDrDVNXF+D68jzHhGu3Y4obC9p+8906O7mDuPiff2QSl8LkAKvAGEwEuQETgnkHLb
FOetQCoBMiCFQCUBE4GKClZrg+9XKN/QeY/KAl1ZUUzHBA/BZFub2uslUWHw7SUiEo//w7/8l37j
v/pffv3VTWS7EfQbvob8a3/pn/ub/uL6wC1qMh0TxxEh0YQQYRvAWdpuu9ip3fT4siEyMV4LlITe
9jg8TVnSlhWZyhkqQ+wN/WVFc1JhRhovA1JC21uyOCKNU5SUhDbQrSw+l7TLin60xpo52TAliROo
FUrsIOIMERmEj8BaCALfg9IRIkrp0oiu94SBxscWt7zCd5DsH9GtVth4SnT4EJF/A6JvYnYeUpET
kgGzuw/YefSIZO8RJsuoO48TijpYVl6gVKCxAhNpgncEoREKnA+YRCICVHaB0hukKHHascgDm9sz
sru3Gdx7m7jYo7EeHccoE9OJQBe1XD/bbLNn47ChQ2YpV08/YlV6rLtgUuRMHu6idgdEccp63TA/
qah+2tCVEQu/Qp78hDt3PfLhjFI7quqM+eol8uCQxY9+j3DVEO/c3TY5Tt7lzQ8/o5VjNpsN7dmK
OE6xi9cU0hDmc5Jbh/hyK9CxSYhjzSiL6FOB3ikIWYy/vGSQ1ChZEw13WT57hdzN8KFn2TU0Q4fP
I3yoCdrQ/9GnHM6+ARtB8e0HhNLhpjmhh9Vly/X5hu7Fmum0IXn1Bfq73yKZzKiXHaGH7qNrRArK
dTSyJspS6k9+hKhaVJER3XvM4N5bNE6jBmOqRc+rN3OOT9aUp+fs5QVZ+xH737xLsjPbimg+IIyH
SKmoXEOztPhlj9lPiXY1G/cGdTFHjSOEKNBmisgKVJThvKFatJRlh8Ww8+47FPfeJuTb0TkbwBIQ
SuD89i40BPDbEXRCCAi+EnMpUAKUECSxQCjwIqe+XiNDRSQ9tB2xASm3y25MHOGranvAtS1CBSSB
kMcP/5u/85v/001kuxH0G75mfPqjH96uv3jxn7dXcxFJhe9atJBIp/DWIRHbuVmv6GpH3zmCc3jX
EacxznUQQSDQ1g3aKnQbMSlysiwhZBpfpPTCE8mtaYrvFcJBomNiK+k8RKMUEWt8pOgGFu83ZOoA
f9EiGwOnl8R3p5jZlO71Ej1M6LoeKSXWB4JUGAV9HTDGIN4EVJ0SDUe4RQuTh8TjO8SDOwwOHzN7
9C6Do3u0s7vo6Yz0/l3SW3dxSYFKNVUXqKUkFZLeKZR2lC3EsUQFgVcAnt5BFoPqJTKJSEVD1Td0
UlANZ8i79zjcf4gcPyRJcxob0Eohg0ZmQ3SQeN/hfIfOPMQpYlDwZfuKdeLxqWG36tm5e0i4PSYu
9plvPAvfs7iwVNmQ827FsPuct3/mHpgR+W5O2ATKuULKEfUyUJ1fgNxD7b2NzMYsmwZ/MGb5+mP8
aIJPe9z8glAtEJseX21Qwxy9oxF4hAkkSUqWxIgsULU9fRITzpeIaI40a/rNS0I6QgtBnBiUUDS1
oJMx0fSA+sVzBhcbMm3RT27jsCilaV2Dcx3riwtsXSGuv0BdnFJ8/7uIOMJLgdtsCLJDDQUuV9vm
s2en6MkGLa7Q7TXmdg73joh2ZtRtw6a1vHpxzvq8QR03iOefc+/dB8zuJsg8R0UDiBXZ3hHtqqf1
kpM/2tA/U4xvZ0BHdusIsbH4F8+JzAP6Z3Pi3X062xEGEcuLa87WFWKUU7z1gGL/CK81LmV7GFYC
CbgORBQI/VasRQiEsK2jeydQ0baWLsRW7KUJCCHYlBFVvWIYBcqzFenI47sGNSjQJqLuVpg0w1YN
UZYj2g5Z5Pf/k3/vL//2f/a3/7fnNxHupoZ+w9eIzcv5r9bXa+G7bY276zr6toFNiatr5HCCoCcf
GupS0EUO7x2t7xgKwdp2JFlOV1XgBYXUdMoxHeasnWd2MKRqPW1XEUc5HkfcCegsvg9ExkCkCFoS
2pKdJ4fE64Q6O0Kur6lPP0XvOyjPUJdXiHSHoCS+Bd9LRCQJ16DynkmSY4c9VR+4vlWwlgmNh8pZ
huMhB2/tMprsoGdTivsPCH5KoyJcU9PEBUlSIKRh2QQs4k8clwQO4TSDyON8IBYSKTxVF8iFpOwE
kVaYwYz88CHrDvy6ZNBb8tku2fQ2mR6w6R1SaFoPcaTQImf08CGZVCxfRPjqFCHWbBYlcXSAjhf0
g5qNh/IyMGlH+N5TjAqm05Yvdhr0pUdF+3gesT6rmN5LSZOCdd4zGilWlwI1vk/17AWbNzXZ44L+
5TVytkt1coxDgepwyQD7zhNOP/uC3Byy+c1/yL0qJjmY4MWa5GCMGe5yazwjigZ0TcSVlxy/WCPq
C9oPPyBfLUjHERzd42j0HZxy1G3J2QouX3fo/jEvr3/MdCenffoKc7iPw9DHisSA6ntGb+/TfBJT
ngtUK9k8f4556wm99ehphj1dEBLQcUSjG1Qq8CuBP7EMf+k2Ko3RaUK/lKz7mqpx+KVG5hPs5pL4
NEE/3EUlA5SJ8Ikhzkbo8YaBGiLvSMqrOcvVmiKz5GqX7vAQJxv6c0dz8jnJt+/RiQQVV2h6jLKM
RznJsMBr8Aa8D4Sv1Dl81fwmhAAD3m+zKC+AAMEFrNv+XgQPUiKlIBlAdjDBre9SnX+8rcs3PUrl
gMQ5j86H+MoinMC2nkjkGJ3RtfavA//gJsLdCPoNXyMu3nz5K36zIZIBJyI8garqiLo1apQjuw5J
T+MtcQLh2tGF7VaovnNY76guzrEoIiRxrNA6YLuSIstJxzkjYahXCcIrnHP09NRNiROWpe3oQ8Xm
7IcMZm+RFwPydMjCnuGr54T7h1y8/pD0xBJGvw+RJ5/9DK6uMInE2haMR5PSdRuygca2lsQq6geC
sIFsPObhd4548OQtxPiAXiZ08QiT5qSNQBY7eG+Zd4JZ4akrjzIGYy1OKoYCNp1nJ5NcVQ4ZKUII
VF4RR55NG0hiQVCafucRYz1ldXrFcKCRsaLMZhQRlNZjBFx1gkkqGVpLiFKGbz1GF4r1s471smJR
QSd2aN0UK2rqeznVvGRaW3q9YTgYk8SS7I7hcl2xbFeE6Yy67JA6oCcj7PkcG7eU8yWT9+/SPjuk
5g1uJ8FuGryU0FQM9u7RuQo1mRLkfcqTCccbQ1AH6P/nf2fwJEVLg9r7OXQcE6U59oFm19dc9UtW
D8dcd5b1iWVy1aGPnzG69z5pkXKwX1CqM45/uuTlmWX6nXc5+2HJ8vSc/NPPkIOEkKSoOKZbbyhm
BmEz5p+kNATK539I+t7P4Rc1STrEhhK7sJjHU5p5jZ7toZYKl3TIWUnfaXbifZaVRw8mtE9PaZee
eKSwZ+dM40Pi8YS+9ySjEaGxRNGAZn1FNB4S9dfkRxKnR7RnGwYqozv9AjOYoKSme/YMc3dKeXWF
jkZ0Oib0jkEsyIaSUZEgREAYT6jk9iodCEIgDYQOdBzwlcBrUDrgOoEwgr4FqTzdVxm9BnQSmB4o
2usJzWJErDb01xG6MHDtkbcHxEZQPv+MRCeEzuFkIFYTpIh/0Hz0Gz9I3v0LN6J+c+V+w9eB3/ut
/zurTk//O1tXJo00zlpkFtG0js516MjglcdEGtdWSAI+tKggSVE01RoRJ7TLc3xjSeMJ2kMcZ/jO
UqiIJEowmSFJErCOLEtpG4sQNa1dU9dvsOqYKvwOhRTAlGw0QOohGzEk5I/YnK2wIaGbN3D5lOLW
Dk42RHlOeXWMLxLUqqRrLWma0gXPRlS0IWETF9z91gOGb73N7N671OkUGQ/wJqXWGq3YipuCWkqi
SFL1ARkJVAAPGAn4bVdy5wKdDGipKZ1HKFBS0uARQoHUEGU0+ZB8OEIkBTLJSFSERNIhiJQAHCZI
TKQwkSFJYrrygrpdcW4r6gLawnHr3rd5fPQuqZwQ72TovTGu9jQeLl431CcCtxHMloJH92Omj/ZR
44SurLCLmvhojG881YsLmuoUpTRxmtK1gfKyQfUCmSVk9+7SOE0j96jSMdUyQyuN/fC3GN1+jNzb
ZXhwl74PMEoRoWNeVbw4ruhPBMILuvmKwXLN/vd/hd725HdvQW/Y+Bq/H9jUkiTeEL34CbPJADUs
4e4MneVsNi2bZkndbKjELk05J7l4xt77v0i7OcccDGmWV/TXr9F5iqNDRzH28pzg1piwIHpwn+zJ
25S9xaUFl5+94OzlCl8Gmpd/xFu33iY6+zGTf/IXiaYzXN2jk4iur4gnQ1wJq5VjdVbiS8NkPKC7
uiafzoizlM1SI/InrL64Juoy2t7TzEtkpolvTZg8+AY2GiFihe/BBoFCENz2+fE2IKKAaAVBCZQW
eLt9ZITdvkep7Wy6FoAQSBUILqa68ojyAmxA0yC6Bn00IrSW9nqBFBrlQA8SsvEMnU9A+Pv/6X//
P9/U0r9m3Hi5f12v21eLX+77Ou2URUZhu+oyjxEqoIwheIvtOkLbQ2cROpARyIwiHw4wozEb67ju
EpZW0vQ9Tku0FhgVcGUDTYfeOFTdk8cRWRIxjDRplKNIifSUSBxQqEeYXpIEkFVHJg2743vQKHx0
n+XVHte+Z2Et5eIpQnZYvySZTVFhgy1fkUY1oinRGnztWaHQhzP23n5APrtDq4dIYbDKYIxiXTu8
lGgj6INEK0HVO0wsaTuPlBIpAus+UMSKpvVoASYIXPBoBaUFZ+Cq8ayQmERQa0k6jPFpxHSn2Gbz
BFrluGp7kIGy86zMdgDZShBFglcxm9YipUFYya29x7zznXe49QvfYfBn38ZmKUYmVJuOSjh63yIH
LdFuQ2X+Ebmv4OIYSc9wlJGkgtEkwqiO5HGOknPc8Y8w1Snd6ieI6Qov5mgp2M+6jLzWAAAgAElE
QVRykh1N9H5GM4bn6RVfJC95WcDJ83/E1T/8NdrlKd2bVxhbMlCS3TxjtpfTZYpS3mGdpKyPHXou
CfOeiJg0mzHLZ+iPNenTmFo94HVIWPuG9uMPCc0KLRVWpbgk4jp4LuOIN72h+rxCvjiFqkZkGhFJ
ZARCO/rg0Z1FvG4wC0nkI4Tz1E2F9x7f9jjn6JaexXmHs0OsOEdGE6TJkA6k2q4Cli5gy5Ioy0hF
QXkcWD311FcdLtaoyBKPCgY/9whulbTRBa221GefYl+dUSQJAzMEmaAjBT1IHZDuq+t2EXDWoyJB
6CRegZTgLQgFoQsgwVlB10HvA+1XjXMmEqQTSXF7jyoe0RXgowavG5QA19TEkyGht8goRpsBEodR
CW3X/WD5x3//BzeR7kbQb/gasHpz8ittV5NIhfUt6TDBugadqu1SCRUQwbJZ13gUoZFokxFHGdpE
5GmGUwobp6wFLJoOHyRN57AoqqqjqkrsakW1WiBdS7teE8eCWARSpclNimkNhfgZ7NXWbMb0BuUU
o9GAOA7I+2O6745ZqQHLaJeLp6fYVy32eIXwMcK39FcfIFYXNBf/L1ne088v6C5bDoox6d5d0sE+
rdK0SlN6hTXgXaAMHnygDgAe20uUhNh5eu8QXuBdQAuH9iDE9rq9t5AIQQgKpKe3kk0IlCGwFuDj
7ex9RUAFSeMCzoMREosgSEEtAp10OB9wQSLkgLrNoMmJVhm3B/vcevAeO9/8PsXP/Dzq/hOqXjJv
K9Z1RR866voFls+p9ZKrk1eUKqKcr5FOkA0LMisY9Yrp/iHF7XcJszvMz89ouzNs88e4/vcx9h9j
qmMO9DX3ppLRYYu5r6jHA06LnuPT1zSfXbL54YeEl8f4L77E0HGwE/PgKCa/rSlnHZWEJj5k/uUL
pA/45Zxh1nNwqEhEwNzziExRD25xfvqKuhPIJuCcYzyIiL3BVhHtpqcxI3qjuf7iY0yIYd5tHQd3
Z3RNS57m2NcbomyP+M59/HWEECPqxSVRDO31FY0KNFHPhhV2b8absz/A2Y+R5horF9tMPwRMPMRe
rNGZYXaoGB5I9B1YrVaIvR4fr/AjSKeBltek37nH+uqYdiUJgyndZUump3id48W2AS581dHeB0Bu
Rx8xgeAgfBVxPSBkIHiB0+BCwDnohaANgT5sVT0bQbqb0qVHdCHHtYq+N/gVuFognII+EKURSgRU
lhHjsdaiMH/9JtLdCPoNf8r50T/+QPjz6i/q3pNi8V0HwdP0HU4HoijCG4XKYoQIKA+ilwjpidIY
b7Z1QKQgKYYkyRRRaWzn6HuHw1H5llW9pC6XlFdvqC9P6ZbXuM0Vsq1Q1pMEiFXOID0iih+hvUSj
8L0l6gXZ7hAzmIJJ6KND+uw9qnNYffqa+qLFWovIp5hv/RJOz+nXTwn9ArmbEc80g50UE0UkUUwQ
ntaDF56yg9SorWD7QCoFAU2soLMSpQQBSSsDSkPtBCqSdM6jhSSVELxnLAO+gWEqSAi4IEgM9L0l
UVC3HmcksQTn5bYT34etu17jWDkIWlK1UBcj/PQQf7BPu3cbdo+I9h5h5RS5/xi984DzzrBZauyZ
x3SKQWbITk4wEZwuTlm+/gzdR9iqIhcetT5nby9nrDRxnhLkhMX1iqru6MqevpUIhrQnr7kd7bJX
FOzvTbj/zffQk+9QjXZ5HeDi4oqXv/5/Up2/oD15TRAVk9GA3dmA6ZMhZEPE5Hu4dMrikx8j6w1u
dUEsV6SpIHvbMBxLxDTD3nmL40tLs2yRq3OCuCbdlZhBhtiJsUWgOxJcvz1gfvk5dnVOqDfoUQ6h
wvkOk6TUTz9HTFOCkbjEgujpyzW23/5tQcfoXUN0mOCGlk0EIe7g6g2EEmKJMBFCSkLtkQoiKYim
EV1nqT7vUGc94U2N71qkMOjxW7T6FtVmyHp5QFNliLRA5TnICOEFUnmCAxccXkJwIIQkWAFya/Mq
gCADzgqCBhEghO3hUdj/fxubAkwEyVAxvHULzBinIrSJsV2PihS2bJHCIXONHiWIqMCjyeIZ3ukf
XP34N26y9BtBv+FPM9X89Duic0eR9QjroXM08xV0261pvfuqNdcHhATnHFJZUBJUj8kkVkq0ihBC
kUQ5IomoXY8n4HuLNoLQW67PrynXFZenbyjLNeWmxQOR0tBCbhKMDYwPbmNMTnVcY4LAthVFJDGi
IZoMSe6PaTfnlDLh6vJDuvlz6sUHOFsTFUeUn/whZjmletngZEIVCfxeRCT8dgFHgHUfiLSgrDxO
C4L3W8Ma4al7h4kkVdfRKomXntYLnJFcOk9nBL7xdF6gBTRO4GWPs5ZEeTIPOIiDI1i3PTC0HidA
YgkBtBLgALM1JCmRdFKyQbOZ3cLffQf59ncZvPc+3eHbNGqAEwp0hCxuo4oHVM2QdhMRRwV5ccT0
4DbpQcxqsCSYC3xXI3xLmkmi9ZdEWUUxFAwOFSqd480a225wlaRdeJpe04uAm68wwjObjhgMYN22
VLN3mecxX8SOZyefcvXqD6jP/hgtOrTyTHcGTAcpeZcwGNynaabYM4F9uSasayh70jxj90GOUQLp
DFZNWNsB676iXlcYk6MQDO+MGe9l6IOIcP8t5i5B5PfwdoZMIrRUmGyHdDTGrSqSb97HLhf0Z6/h
0S6dq9FRir1YIWOP6mpko+ibnPXVCLvzF+j1ffzpLnF8F6kS4mJE6C3ReEjYWGysUFHKRivK/YLL
D5+x+clL4mRKSAbkR/dxJqL75kPKvR1KCtL9GX48QKlt7VwYga8EQSiU33oVCAW29Ui9zeCtA4VA
9qANhParrncEfbedW+8DdF/9v6oBDG+nRLMHmPF9CDEOjdIJ/XqDdAJFTJJPIYyw/ZBEHtDWMVLm
N1n614ibprivIf/y93/x37DXzS+n3hHankhoutKD1EhlIJJoHdH0DoKgsz1CG4xQBOfRKsI7jzAS
JQROBqQMNKslKiiqq2vCWY+Melb1FZ5A+eaPibMxvuqI4pREKWgcaUgRnSZLC4w0gN+uHQ2Wosio
aOmLGOtgvV4jj47wKRSjCXCCzI9AD+guxtDfozUT1iHjYhBRPNrnzuwOdZzTCWgtKCmQQREIGCFx
AN5jkMQmYL+qgUYIEJLGeWIlafqAAOxXDUs2CPxXO+E2IZCo7fut3wZrH8T2ij0EMiFBCpyDTEs2
vccRSLSg9QErAjYy9FlBWwwRgwnjyQyht0twhJd4odCJwpoOn3bUacem9nQqQxZ76MU1k8ffJU+n
RF6iWtDFLfzpnDAYEUygXp7S+R7f7uHKMVIfIblFIjO0EEwODreZZQDbeep1TdAj6ssLqlVN+/kV
gxPD9Jf+DG1VEQ1z1mXJxfkVyzdLNldv2C0SQnlJ/uQOCPCDlKhqWZwsaV45xLrDN2eIi3OGr16x
/0/9RdbHnxHfvku79lwtO6rOED694NFugfzk94m/l6LdHZxV6MRQXswRIqH/5MdUzz9DjNaIaUJ6
eJ+6FahRztWra94sK5oLz1ILdroBg5dfMusko3/iyda6eDigWl6jxgNwBaumY3HVcT3v8FpB3jFN
rpi++zadmjO6dYflKqFsLF2QpIdDbv/st4nvP0FnOY0HzLbZLaivxtN8QPrtjDlGINuA0AIpAz6I
bT2dr6zdxfbMDNtMXoqvXgsBJRVC5mifQ9UgUoXsA6Gq0UqRT2eYwRBpEoQ2WEq8BCfK+3/lX/2n
f/tv/g+/9vwm8t1k6Df8KUS46Fdoe4Tl/2PvvZory7I7v9+2x10HD2QmMqsqy3eTRXbTDDUxjBYV
CokxT3rQR5Ii9KxHfQGNQvOqiGFwGBRnhhySXd0k21R1V3WZtEDCXHvsdno4mNFn6CbW48UBAoF7
sdde//U3yAhSJFLnCF2NCaCTQmuN1WpMSosR7T1GBixQBEEZc2YyZ0rOVBkypciLir6VNDdrtrHm
lmtCsaTTPyUVX9LvfkjqfoToeggDRguk8lgTEa5HqoSdWEJIFDZDW8PRwTFTVZCbBWn2lM4dE8Rj
ts0Nw7UjXb9kuHmNmBzQvakxHjIhmSiDWHuSytEkdBilQl0Am8G28wiRqBTIIKhEZGgSeabGPOso
kCkSE5RG0g2JZCVCekKKGJEgRA5KhRlG7bpVke3gUAYaF3AWdApshSRTiegjVgmc8yijSRKWXcQL
ie9hNq/QWsNigZkXPO8TSyFoO0ePwO4dsf/Ouzz+3u9ydvoexYNHlB+9wxCfct39DsvbSPNyhQ0Z
nkR5sCBNMqSOTI/PceuKen1CG09ojs55vrnksn7NcLAg1IrpdaJwirlRPHn6gMwaUvWE4fC32J48
4ZnoeXPzKcP1G7YvPiW1WwppmT8+QB0eIB98wiZ7l/XLmv7VPxDDgBlq9myFHTRi6fDRMhRnNCLD
72ra7RVCbigyzWy6R05G/6xmFY65ffUt3eUFUXbEMkHhiDtHkgqvBOngKZw9Yri9JcUB39XoLCJV
RFeSOnRcxw5qQf3Fl8TuW2RmcM5hhcX3HjubggtE6Si0pCoSR6eWaqIp6jPKzR/jryJ5PCHUclxH
WQPnFfL8EHF4iioPcB6ETsR29GfHjYtyKUe4XRmJGEDYkQyZ4tjMQw/CJIQYkbCkI96P+/Q+gI8B
pQX5BA7PLfrxMfLsHbSc4nvQe1NUpaEQeJnACLQt2TU7jEiEeksM7n5Kv2/o9/WbWJ//dHlCWPwB
yeA6gcoy6naHzx0uLBlCjUmJ4D02K4m9I1cGmRwyRapME0ONEQ2iW1NZT2kSUnkGOl5efs5qz/Nm
+IbL7S+o1Zz1ekXdLFg/2yKuM0zbEpuaMrfI0FJNNQwdUvXYIiLTDqsiwXfsLyYcTSvmJzOmsxmB
jE2acHXTcfPqgvXFls1nP6bPBWt1RVffEgtBJj12MDQuoRIMETSSnR9Z51YK1hJcSrRhZJtHwCmQ
KTIkQUoJGQUyJDSJICJKCwYpUTqhpaJJCSslfQSBxAiJlYLSKDyCmTJIAQMJL2GbIkpJmpgYIgxS
sMTjMoNTkJcZuQYhJTrTbH1ig6RHMgRJvnfG3unHPPmtf8nT7/0uDz9+Sv6HZ/S/9z1cPAdVEtOA
yRUoj1jcooqWFAeykwNc5lgNji8233B7YhDvzgnHwOFA111j5cA0ReTFG/ZkRl5UxNkZK5cYouRN
mfjiz/8X/MVzds9fUkXHPHrKYYuY9ly/vKZrv6FfNcTtNenNlkhkeqqRzmE/KrmaK7bJER88Yvf5
P6GzBaGtmRxnLIqEMTX+vTk/dW+gmsKlA7XClhYXA+XZIfVf/JL6MsLiOww/i2TijJAEZi+DXUQX
ExbHFbPTAl3myPmcRXWGPT0kLjcocnyUyNmcft2QJh5tEvO55v1P9jn/7RmTjx5wvS64/E898SrS
dB1B9Gylw85zzj/5gHhySLJ38LgU9L3EiTTa1caESODHfB9Cn+gYLZDDnSzS36Wt4SMkRQwSN8Dg
E0OXcE4RFOgcJgsoDg1xr0LmC1zfYCuBahKikMSYsMIQUkPnd/SpZnf1El/f/ODN3/0f97v0fwZ1
byzzz6zi0P6PbdvKREdSAplpRIwkAtF7iBHhJUoptDQgFSaMzSvFgDQR5VsUkqapEVlPoS2t3SLK
a1zxYxwLwpFG9aes+z36r46xEfL2W6z5hurhxxQyG8lnhUHkCdYdQkhMtGAlioBGQwxMDhekaceq
8yy/3pCZCVL+Aen2EF93ZB/9AaKD9uE5w2JBozVlPuPBg1NMtEgUmkiXIge55rYf3drwkagUpYm4
BFUuedM4Cq0xIuCjxGhoHFS5QviIT4rszmxmpiW7PiK1wAjB4CEzlp2LFBZiF2mVpCBR94mpkTgX
MVbg+kCfFJmFizZwPok0LiCUQhFZD4LSwqYFZRVuiKyF5NAq/CCpzk74YF7RbE8h/BMXStB/qWhf
b9n1PYvfOaLf3VLlD+l8ZHvTkhdHFFVOMJLFdsJ0UnC4/4Duy1f4CpbbbzmavUvne5SQTIbI+sef
Yj76DtWDI9QZXM2eIZ/teFpuiOmnzE9+n8JH8scBETXNy+cMtmT19TNMYZAnH+MWsKgM2Yll+dUS
OylpDkte7V4g/s3/zaP/+X8i6Ufke4ZJIckF9N2WbaFpmx5WbxBpRQx7xJnG1w3bWYE5PmVYfUvy
HX63RdxcY84ekcwBqAEZLFeNY5k6Yvc1q+ElIt6QxCGyAl1mJCFIRsEgUVFw+OQMY3OuFitWs1v6
wy3tuqEZAtv1lk0j8QY++v57LM7fJxb7I7R9939j7HhJRI9a8xRGK9foBaoYiW4pjdK15ECrO/a7
kAgdiF4hEaT+/2fLhzj6IUgL0zmksyOa7Q4zOSR0b7AHB1gzgUwTZKDrd0Q8zctL4rpBtreEeX7v
Hnc/od/Xb94bvv7X7foSMoHMR2Z2lk1RGIzZR6uCmAa0TIhhR2EiQnVEWhItzfZ6lOR0W7TwqGFN
aF6i3RWp+5TJ3kAKO9yqp497rF5ccDvcctX/iuZBxzK8YPfsp5iqxG82mMzA4CiqHLPzpF1Plgr8
aiCPBnHTMEuSB/MDjiY5+3kBNQQqlruc65c9ax95+dU/cRNe8loamEw5Pn2HydEjtLK4mBiIbL1A
iYT1biRijetzAHqfcHrcc3eMBLZdjCQRSdEjJeASgUQhEzoJrGYkFSoJKbHxkS5GmpDQShBjvHte
YNLoA2qTGIlyMbH1IyvaJRiCQEaBI1KkSIyRVsi73x2akLgh0KFphaSXAlNOmJ0+5qP3P2BR7tNW
GVuTEVRF8gqpZmg7RW8Vqs/HSXe5JaaB6ijH5iXdmy39bskq3bDMnrNdfolPX5PtSaqzyPyRQ7Xf
otKO3WBpbkqWl/s8/7Jl87xjaHtM7imOHNJ9TnpPsKw8b27XLG+f03S3SNdRFIKjTyyzdyr2z54Q
Z0+48pouaJpf3ZLaHTYmqqMp+nxBWjygKT7hdt3i/umKtPMk22IPcsJQox5FxLRmCJeEeWDz939G
7iCuWvQkYqUjJYeuHJV17J0othE2P/5bjJUMfktRZLi6R88n+KbDpUi5t0dxes75J7/PybvfY/rg
Iep4n5uNp1l5Nlc186SYzg8Q0wKtJX2ClCS9Y7R37cbPg4qj3lzLMUgIGRDjnRkhEjGA0ILoRmmb
UJIkxkbuPSATLoB3EMQoectKgZoawsEBdn5GWGd3cH6DkAkXPHU3XhLam1vSegnrb5D95gfu5//m
fkq/b+j39ZtSX/3yMxvi9f9gu5pSaKqixCpLPpmT+gwjc5TREBM6QooDslA4BRvfM3Q7VlcviZ1g
2DpE58Gv8Nf/CTG8QIWX5JlCDleEbCAUgdtv/om127Ld7vCXgaG11D/8O9ymxdU1SgDCo6sMYTVk
CikFYtghU0T2HabekVvD4WzKrDCkNYTC0s8q4sN36ENiy4puryKcTzl65xFHb3+XlC9oMfQBVBRY
KehDwpoRnoQx9Qqh0ErQDoFSKvydPM1IgY+CTGo2QyBpsEhCFORKMPhIZjXtEIhilMJJCZWVtD6g
tUSIRBsTWktcklgjkB6M0lQyEHrBeWbRITA3Gld7ZNLMtcQ1kXmmUSni7lCAV0NPbSS7AM5qtNbM
Hpxz/uQxVIYmKYIf6K5vUZlkqHu8h3ya0252xAczatNw036LnvdQvEFNlvSXP0ZNNbX+GR3/EVX9
AxR/RXb+AmF/iJQXKAxB/zb96R9z+48R88tE//PPyXa3TPwawgvUUclVuKAbLN2bDf7NCiPH6Nvj
ec5cakwfUPOnrHcFW/+I1TdXpMsGEQ12UrCYzrDRYj/+Pt8mqF9J5POOGDrMrGQwE4Sd0F9d0/7q
hsEes3lRIw8eM9QdZlKghh4d4fzAUokVMqxpJgfUeFht8fUSIQPJSQQKv9ziYosuK8ziAfnBOfN3
PuLwtz6i0RNue0OXEnXTkCWH0FNEWYxpamLMOXcpjQS3lLjTiZDk3WeMhI+KIY7NOUZAjRO4kImQ
EsmPa56UEsiEj2Lcp5MYwriWDxryGRQH+3iTj0Y6ItG7NML1IdL5Bne9JNQ1REUYelKIdNHf79Lv
G/p9/aaUb9p/1X31claWE/LckmUWYwwGjS3LUZdrJZhIVC1R+XHKFIL1dcPFq2u2Fw3LNy9pNr+k
/fovaV99iht29M9+BDcVJj4gz36XXHyX0EpE/hAfpgzZlJ2r2L3paA6+w/rqGcJq/G6DzjMkAjXL
sWVBDD1yv6Dbfg2iJfQDSfUspgX53BJnBettop+dIT5+l+tnHooP6bdPCStLefSQgyePGYIgWIGP
kSZKciFhkGgD675nEGokyvlAqQWhDZSZpBRQD+NkTYhkFlId2EUw0eNcQMuI9yMjvomBnoQRkW0T
sMIj+4hBkzHq3rVKDH1Aa0XsHU7ARCdciCQZ8AmSEQQZ2flEphKyjwgRiBGiFQiduBWGrUqsg6MV
EZlA2JLH777L40dndBjC2tDsEsFpNj/8Kf3VgDmZIH7vmLTISMWEs+kpM5UxzSXzkwrhGtrtCzbX
nv5lRA4ZiMDhw0fsPZww3S8oVAvmAU2QbH3J5rJh9cUvcF9/Rdk16PPHxAK2hecyXXJ98xq/uyFz
A7OFZl4oJq2ndBIb9tm6j/n66oLV5Qq36cF17OWa86OShxPN5NsWYsXQdrh+i7YGqTT6YE5bldys
B/qHnzCUZ5hP/pDB9+iJRfYDmTWUCLIhMq8N1XaGrXtkP9CutmRR4boGtZeRmi1DvYTOEQgomyON
pjrco3jwDtnxIXFWUYuMrc94NgwMSqNcJApQCWSSZApCC8oIxB36o2TCexClQMQ7q1cBxDEyNQ7j
+y6jIMY7KN7fMeHdaDwTkxh36jHhE2QF2InEFceo+RlpqOh3A/16R9Ov0LGjfrHEq0SUijAcYVJF
0zQ/8F//+/sp/b6h39dvxJvd+X/dvVli8ORiZONUi31cIcmPJ1ApohgwNkHaYgvw3hMVeBVZdy9w
ZWD1xZ/TXf+I/vWv6H55Rdw+YfuZxTVvUX/uyKpTilIx3bMcfDDh+O2Mhx8/oTg+pvydc+Rbkfrb
v0WFgL8NSFHgbx0iCkSuaK5vCP01w/pLQv03CP+GdnNFXiTyyjJ5q0BkBr8/o8Ww6w3rUODznMPz
fcz8jDjTDEjWKeIlI1FJeDwBhODAWEQCYiJEQe0TWhnaGLGMB7VMEYvApURpRrKbk5JOSvqo0EIy
uESWIAYIJLSShKiRUtPh6KMitwIfBMkINgG8NngSLim0EQxIpJQ0g6OUhqlOtC4xKSRDGA/5PiTa
KMi1YDUEklH0IbKOESUSWb7P4fk5xYdz1oOg31g26542y+lvt4RtzcnhlL1swbHeZ6H3iFeCWfU2
0+wjqid/yu75Hu3Nuwz1I9bfXJGbD9FRsihPWaR98l1F3hn8C8/GNzy//hm71Ro3XOC3L5j015j6
r5g8jHTllm5IxP98Tf3sknkxwUhB9aBAJlBZgTt9xNWgELEl/PD/Je5W2B4WkwNyFN2PX+L697ka
WnYvXyBXkagj5UGJV471A6gfOZoiUJ58SLdZYfcPGDaShgnNRrL5QnBUnZKWz1G+IXQ7ui//EXY1
fb1B2YZ+2TE4RVMPrFrHIBK9F6hMolVF8fADzNEJy21BWJS8zDVOJ+Iwkh0hMvhRbx4CoMcx3KVx
Oo/pzuZ3iPiUUGJ0DrxTPRJSJCVG2F3cjfVyJGF6MTLeQxSEKPBizFgvKzCHU8T+Md7ntHXLdrem
224ZNjti9AAoXaEnJwRZYmVB7/v7Kf2+od/Xb0IJ3J+m0GNLT1YmdCVR+4b8cEG1v0+mp9ApRO/w
Q4KoEMZAWeJ0zpYHbPpDNvGUrXifunzIdvYubvI+td2n9wL2DsjEjlk+sAg1p1niVMzZ9wtm6xn6
VYOZvo+qDvChJ+oOX98gbUOULX71higvCa4jCU3oJWH5BrVqcddbykJiupZ+ewHPXyNUh3E7hs+v
aJVjXQT0NCN5gcgMIST6JDEy0rmRWLTsPUEJEo4ugtLjv0JhE83gidJQGti5kdW+6yPGSERK+CTR
CnZhvPikADOjmYpEPyT2coELkZhJGhKdSFiduPae0igIjsIKFIE6RMpMUruBzCRSnyikJhMRN0Ry
LfAuEbSkbnu2LrGnodkFGgQ7B7dq3MOSMiaPTxA2cbvuwEre/M2/49Xf/SU3z/8dN68/Q6sCmynC
bol//g2VecbBPCGuP2Nx/AAjDwhKsdl46s0FyZ4QNrfslR8ym36XIv+YfDpnCBe8iltusoE6y7h9
saFfbZhNPqZ4E5lzRL4pCZ1mnS6oX/wYrSwBwezpjPJhRVpk2LMDojjkuuvZhkti/yPwPaa0qIml
eu8p4XuP2e41DOsLYr8d5ZSqxO6/TeID6uYRXXaOynKk8CA9SInVinKq2d8zTE4Uxex30IcfUeuS
FE/wLRiTIduAMYpMG2yekawkxkBQgijATEpmjx7AwREc7rGbH3O8eMCdRQNGJIQX4568F2OWwCDx
d43eeUYpWgvaSlK6S1mTacxJFyCdJEWARHACNEQ/prTINJrRBCIxjPnpkYQuE/N9Rdw7oi9nhNbg
r3rCdsCtd2STDB3GS4Y9PCbaApNNWDfXP9h9+f8U96fhfUO/r1/juvj2ci8k92FRFGSZQRaKbJoh
jKbaO8BOpmRlhfCKrkmIXoNXzA5OKdSEg5OHlNU71M0xO/lHXLe/zUX9LuvpA27bSDt/n5tnHf2b
Cc2zEvdlid0coF4WTPoz8n5CtjhEq7dpfvjvSfKI9ed/iVeBdvUrfKxJKdFtNmjzkO5NjSy+z/Dq
lHZ1SGwEzWZLFmCxl1Ed7qg+jAzba4rfOyKdTmFiIdNgPZ33eCMJYvRrFwlcGHXgfeeJUmBSIoWI
FIHWOYIEFRK9j+gEg4eUAilEdgpS9CxdGF/zgpAEzkV6EoFAiOPzMiZi9E5x15MAACAASURBVEx9
RIeERTJBIlMkC6AiZEkihBiNepJACEEuBEGO+1iALgVKDQHB3BpKLSFJ5lbDnZtY7wVBSMgFphKk
0iPPwdfXaJOjnCNNCkS5wBHo/I5BWdJkhjzUyHTN/qnmuErsP4mo4hJ1JGhzxfr5P9BeZBTmIYdn
b3P88RnVJDI9q3jw0Tnh0HJ584pVaOgLwbBaofMK0/TYrKDeDWxfv8acf5fdL/6BycIyzS25VBRD
wrYW+/Yfc+UWbL56jV99hvBfsZf3nB4XlOkS7Qtw58hO4t2SQgFOcDCvOFCG+FnELx+z/FUir49w
yxqzLzGqZ7fu6LaezSqQDg5wH3wPJ/cxR0/piwypMtrrDTKTZFbi/YBC0SVNUIp6AHJBNp1y+PRj
5k/eZ3b2Hg/f+T3ccEiDJPnRnx8i7ZBIGfTOEwRoCT4KpBZjM1YggxxZ7ghCSGDGtDWp7l6L41Qf
PCAkKYxQPFIy+BEBGBAoKygmCbk3I0z3cU7hYgs0uG6FKSM6F+QHFTbPUPmElBRDtyYSDu9PxN/M
upet/TOpTNp3QWAnOclNMCqhJhXaZEg7w4ea7BDEdqC9aFFaIXKwRxXl8QyOerATfqUuGIaC9vmG
1L5Ntr/H+mpDzEpCecJQ5YSiJawbpo9KXHfN3skhQ1fT3t4gT4+o39yQty2x36E2z9HtF/j5h2TV
MW73ClOeI2JPNFswrxGZxDU5vt+iy4zpnuHgUUF/uyFUCu8F6fGMyfmUg4MDMFO01nSDQwiJSqPm
W0rJ4GCeWXrvmWmLkIJd9EyMoHMeqSVaRZKXLDQEnyi0ZDsEpJRMpcAHWOQZvY94A8FHMqsoTaIZ
EjMrCT6RpEIhWA6Rykr6ENFWUveBJCRTBW2f2DeafojkRqJ6h5eaKhdcNY5pbgnDgJMCJT2vG8HE
KgYfKLVG+oFWaPbyMdwma3LELqO9bSj3P8LMLijf+l3s7IivL664GSA8mnB185osbDHNHu+e/oBd
alj89h/Tv7rk9vlr9MF7rD77nH1mNKsdRw+nsC9p3TNs8VNio3Azx7DrCCuDaA5p6lcUp98nXPeE
YkeqEvXtL0n1K1q5ZWbfY+stbk+w/sk12zDBzC3bZc8uKXbPNmSPbjHH76DyhDoc2H36BSt9w+a4
xWyumTQdwXVMDhMTvUT4X6AySfv3Lyj/xbs0O1DWIHwkZZa4NxBCT56WyJUnsUGULSFt6esN/eUO
oSIxKKKQWJ0xJAExjRc6HcFqZqdnvD0/IG8bpqUglhVtSuiU6KOANPIfklcIoRAjdn4XgSqRJjH4
MawHc0eK04LkE8kIoh9pdFIKUhpRo5TSGOxyJ3+LKuESiDiqNUQmKI8s236f4boktVvEJmDKOWno
UFGjJguShkxNaOMWmx/QDO4IeH5/Kt439Pv6NS0XhqdSCqQPmNIgqxyZZ+iyBC3IyookIFiFSgnf
9WRxhugck6M9sijQj2cMPnF1u6SZwHCS4Wyiemt0rcofzsc94HAANkKM6Oo9+kYgbIksF+g+oR89
pAlblA7EXz2nzBLDzS8YZluKdz4h7L4ke+sB3n9NOq2gbwjeM58dcbvboGTAyiW73deI03/BsMzZ
f++It955i5Pzd5AxJylN0/VkWQEiUPvExCSCgyyThHqgFgqtIs3gmUwMrgFjDUXy7IaIVTDUiWwu
aeqekBkqBTufQHmiS2RWQ+hovWU/E7gm4q1EOQhaksVI7RM2k/Q+YjJJCpFBKhYK6i6CUWgHUSQK
El1KaDk+16ZxRx8UFCKihULLMcpLmHF6CzGOjaDxWEq8tXQXjr1jg40G4ySFzBFbT1wPiKKkT4Zo
C7IKiuyWQQvmBwWrZomIDSk7IVQ1brMmXEjyaURUc2bzivrhO4TtBa6c4vc6ulc1zZWnOAlkrcYJ
z6BmdO41rVJcPfsJ84N9ik1PtpeRVR0pe46eHqIPjmlfBl7vGmb/+IojfYs+7inniuzE0E9esfaK
m28G5m9v6G9XaGUxdUd20GCefEXEwdtzdvKS4uQRKUSSlmRpnHzVtKCTirp5Q5IO119TmbfpL25R
bUtzewOzA7KsoI8DhkAfIiozNH3AW0GSI0R/MjGklCgmhr53bBmNgvwgyHPwbUQbSYwRFyRSwtBH
qrkk7EYExghwdz7uYRAoO0rcUhAj870XiGqE3aMALRNuGONUXUqjpawWCAPZFHbllLh4iPA9u/qG
g2qOu14j5hZBRBgNwhFSpJqc0fbXR/cn4n1Dv69f42qa+t3UbsEHUtahsxxQ6DxjGHpEPkf3jqHQ
2Cojvlihp454s8Y+PkSoOeV8ysPHCoNmaAt2ZYcSkUIpauew0tJ1HYXISASaoad3gb7vsVKQksRU
EmVntOuCTbZH+/pHTPJ9jHpDvvo5j+z7DN1nzMyfIPstmT0cQz0Ki840NIFgI65Z0c/2iGYf92TC
2x88Yf/8KdnsMUHmtD6RCYOICWUSRgjGgLjE4CKVEvQhIIQgE4I4RDIp6VJkCJEkFK0HqcVo6ykt
MSYUAiNGQlqmJX2MpCSRCpogEVoxILEmMsRAoQQliiZErNakGLHGYGTCx0RhNX0ITLWljxGBoFSC
tveUeUYdwuh77zxoxYlR3PaO0o6mO1IrcjUStNRihpwoQiWZfHJKu3uO3n8PNT/AXQcOp0fU1NRI
Yjwh/8mfMTm5pV+umT5+jFMLylKSLR2rX/010ebsti8I7i26zQ6bTTg6+JCb7BFm+wYjc/rsgtXt
36Dbbzg6/xPcX/+QyVsLxNEebvMNgzC8+OFz9v/oCd3tX5MvfkC5+4Jq71dk00izvEROjrih5fZV
QXnwKf74lNI8QslAdnjEcLlieJWQn62pzz6l/PiPcLsN+tEx2eoJ/U9+RvnwE7ptT1ka1KBQ05y8
0Ny8SGSLRHa2wHf/Eb7r6HXHXE7xIkceVqRdR133kM/Z9QOHMtDERFVGtp0YL61C4jQUAXyQaJPo
O00PFHdBKkZJohMIEZFSEkTCksZpPY5s+CBGNpwgERBoBUGMHgUy3NkwI+526iDuvj9xp1u/+1ne
g9ZABnZR4I4e4G8vUbol9YLYJsQ0QegwMkOKAa0kEY+02T3kft/Q7+vXuUK3fRqvXiP7DcIGRFJI
ZRAhQRj9zJU0I1wYBdEkQuoIuxX6aglzg+gDZaHZ25/RL6E0OWaejzvhXYeSgrKakCkNyTOVkcF1
NHUHPpFmAgnYIuN6aajrli58yGb9DCmWHChP9ou/pDo4IbQ1JElqa1L1CFsWOOeJJtDX19S7gUa9
S1EWvPPhGQ/fe4fJ4dsINUVpQ9NHpJGkFGnc2LTrAAurGBpH0ppCRRrvmFlD6z2T3NDXPUkZKh15
vRs4m+Ss2wGRa8wg2PSKwgZWrWMytyw3jtxqrAy0LqCzO+jeWoLruBaax7ng9SZhc+i7RNQJnRw3
nWKWgaojYhJIXcArSaFh1USGDOjBKY0IA32E/anAbSJyAio6otAYkXCDR1Zz9h4d0j67RD8oWP9Z
i1jN2av2WfcNk/OKkyHjuu0RvUGpx9TDGzbrn3F4eoqIgUn5NlloYAnq0VPI1kCkf/lLjFFMj8+Z
+UjXHrF6dkvM5pjqDOpv6H/5UxhuKMwB7CtqucfmRU1t4DZ8w/yLHeLgHXS/pMoi9e0Gs434d57Q
f77h9fCK9J/h+OySyfkJqq6ZTQvaIbK9eMnuV6+Z/NFjwuYSaTTTVLEwp9xuvyS+iWQHe6S6JZyA
zgVmDvYgUk0l3Z5k99eR3dIiFhV967FPFngJmXf4Tcdt28EQCS4iLbgWbBYZomJICdTIWC+KcWJW
WiBEICWBUhD7OEbjutE4Rqs7YxmTCL1A5ZCcJLr0X/fqooDUjfC6vAt2wXDnMAcEQXCgrRhNaUZq
CylFBBJ0opwLhr09uvIBtt/h6hY1LZEyQeeQ0wqPRmc59XDNojq9n9DvG/p9/TqX7NzT4aJGO4ee
75Gcg7zHba/RtmKoryAKTIwMsaY4LOn70Q3Ov3hF2K5R+YLBeyo6ol+Ta4MpMqS0ZFOFq8f0Nr8e
yBclqszpm57ZpCPWo53o0PSoaUkksO17+umCto/IHkxXok2N2mlEf0EpZ3BxjX0csLOcpm4wxSHh
VpL298iKCYdnC84fv4WYnWGqCXUvMAh2zuOVZC4SPkq0jHQ+YXODBXoimYqEQaEygXaKNgkKFC2C
qRR3UxZkStECuQaSRyOxUtHGRBfBi8Q+EZE0AkkhR5LcTGhuU2JLAJnoI1QKWiIhQWYkLiWMjKP5
jRJ4AUOMCKUIKZIhSMFjkyIIqAeQmWAbAlMhSNHT+EShJNIrZkcPaB7d4JZb1Pkhg9qw/PsVxb+q
qI4nTKcTjnziertl9/BPWV5fkn/+c6xtqf5gRo5D7iT1L7aEq39kOvFcf/lz7OyQ2QeQUs2D/QIX
HLel4PLmhvxSkrlH3N5smKV9+nZLUbxLFr7Fm1t2neDnP3rB02pBfLpiOyiiPGf79beUT38fKPHi
jOV6xVS2CN+w23xFNYl0Q8fmm6/ZVhnXNy9ZLKfsPvsF4r2PMSpDhjlSPqJbNpj8Df76kOztt8kY
0E6wQPP1f9jwyE/Rp/8t9bd/RWgb2pfPKd96hB8804+fEn7xinixxmxb2r4jKxfUPYhMEVuPyBU2
jnrwaQXbOiIyRZbAJ0EpEk0Pdi/ibhO9gf1M0HqJsZHYQ68TNo1EuXFTk1BZIAVNEAIrxq8pCQRI
ZpRDJgFKQIpjApsLkBCoBFoIVAF2nqHOHiBva/rlV1S5xLgcISMiKjI5w4meFHqUUvcT+m/qOX//
J/jncnVTT0MT8ckggsRtamLTkIaOEBt8UzNsr0jDjuB7RKVJyRFcy7Bb0X77nOHFK/yrl6TVDdY1
mNigvcOIQDWdkGcZBRl5gNxIyrKkqhT784rJ3oTJXsF0v6IqMhZ7FdPSgBd0TU+7PmBQOe1WMlTn
DNoyeI/fLYlBM9QtQgg617FZt7RWUTzY5/STDyhOH5FNzxmCxgtFFwIzrRDOExBYLWlCohKCthsJ
aTZEfFBoBbdDIFjBdnCs8CATywEKo+l9QhpJdKMTWGE0dQhMjUYNioMqwwYQ0bLIJMkFcgsxRryR
7ClJ30oKo1BJIDOFjKOUbpFJVo0n2RyZxr2vYsxhXxSjAU2Vj89HI3E6ctUPTI1FxYjQCu8HbnqP
UBIRE/bkLR5+57ewxR7idEZ4a8rmqkBcabqQOHzrMWdPPuK9Dz/h+PQd1PFHhP/mB2ynj/FtIK17
qrP3OPn9/54yHXFw/j0m771FKBybi39L3PwVJxNBUToy+YKbn/0Hvl1dsPSJ5Zcr5OMP8OsavdtS
XB1QuoyD3/s+UWTs2o6rbz7F+y22PCCf5hhdIl5rknpCHH6L9bpi9e0Fm1/+OSY7QJZPcMay3g8s
C4jKs332F8jUE/pE/cqQ5Cds+xZlHXQRESGpGWpvn95ZuqqiRWEGTxsb2tsdwe9QKaJ0gTQTQtK4
IicohUCNE7MW1HcqBI1Ap4hW0LSJzI62vF6MzoYegbKKoRd0RiAU9EkgLYQ4kuLkGHqOEhAcJJtI
UZNUgv+iYVcQ/MiIT4E7glwaI1nl+Jq4g+ODH1PalE5Ui8T0wQyfNLqyxBgZUjf6LPgeiaNrV+TF
Hr3v7hv6b2jd56H/M6jbZ9fVbnP5v7oX3wqlPEJFGHr80IKMeNeCEQzLG9qrS5IIoAIyz4m+Y+ha
YoTd+jWQ6NdvCE2DiA6BR6ZEHAZ0kgxXS+KwwWiH0AKtJdEPWJPhdx1aS5SUDOsaMyTa2x6vJjS3
Lf1PXvHk4/egX1HNjvEv3jB88Q3GntJefo7mlNel5MII1OEB7333febH7zIsnmCKgs5LHImtS9hc
0Wx7OqsxWnLTR4zVDCGiizEkJSaBMeCGRJUb6l2PshYtI72PVEbihoTJFE3jSEJxmEuu6h6jBWkY
9exlTCSfyI1g1zukkfR9ZJBQ6IjzEici0XmUEtA6eqGY55K+SRidECIwCIVNER8E2ghWvSc3liwm
dsBCJqQTCCtQIdJrhUiJTkBlFLKHaCxVNiVph7M7Vn3N9sVr7ONE/uEhRx98DJNTir09qsk+Rw+O
yW1Gu+tJTcDh2LlL6jefMlQXTOsGPVdEv8Zce6q3/5BicY7rIZoFIu4xefodyoMHZGWPrl8hVg47
3cdva1icQ1MQlre4LuFFhiwf4Db7dF95XD0BY0hFjr8LAReyZrJ/jut7mptvCWGJspoiZZjnX2Km
72AO3yckGJ59S/3Dv2CmvmHy1KDfexdz/Ii67XnTNjxfrVhXkaa/RH37KfuV5uimYfHuu+i3niAy
i982dN4R0aTDQ8qjM1zIKSYa30BSAqsjKSmQkRjVCIF3CaPHJLV+AFsIghNEkbBmnLKljLhekFWC
1IzWsHkG3gtkBmkQiExAd7dnN4AHPcJIoxY+G6F4oUC4MSIVCYJR966FwApB6CS7q57SNaTNCjUF
nSdEHLCznN2wZVYd4v3u2f/2v/+f/9f9yXgPud/XryMMo7K3HYciZjNifcsgPVIl3Js35KHCK4F+
dExyPU1IWBzd7oasPKUPVxASUu5Rv/lL0uG/xNVfY8wpsYvUVwOzJ9/HuzVZNcPtVuOUrzx+U5M9
XBA2A7KqkP0OiCgvSLs1pRDMJom1ceh5IPjdyA5uOrzPCSESTEDVS5xoKGwk5ppicsj0wQP2z9/G
5EdcyxwboRWClDRRepYhjXImkYgkMikQafRib4dEpjUxQQoJezf5lNbgSBghETIxJMjNGHk1zzRB
wGZw43SOQFpN7wNRSpSW1DEitMSFRGU1TQj0XpApwdIF9qzF+UjQmtJE2joyzQxtcExNhg8Bj6Ky
gl0b2NMGETxGCIrgCVFyUCiW7YDWmsxHGiRSJl61kbnV7Edoq5Ly/Ambfku7amj+5DFXRxkLdUiX
9pDZIc4FquNTpN+hpqdoU/H6Jz8hNONFJTZ29Klve8xqgZGnpF++wP7hAf03Lzh5cMyQcrbfrbj5
dsnNL67I3/oDlj/+t7CXwZtrbKGZHb/Nsq3wS8mwqumXLaYyDC+28OAj/MUFU51TfDilu1bIbccg
rpBZRb39W2KlyQqPu3TYj7/D9uYlE3NIe3ODm5bklSTTW+TDjF3/mkloiOsa5zyZqzmQHYsTy+Wr
GrG+ZlH8d3h3RbH/iLBziDzhrmuE6yh0xVplxCRoiBgRwY3QuoiCJkWsHFcsUoASo9+6ZmzUgjA2
fQHGj1A5YfQbwCViTAT1X7TmIP0oS/NRIAXEO+c4L0ZypNDiLic9/dfpPCqBimMzFyqR0mgzqzSo
HOxiH1XvE80FeqZhaEdIIAYqW9C7FdoW9xP6fUO/r1/XipF3RYgMwNBDZhRicAw7D6lFlBmx8bgk
aGNOdAM6Tel7j3cZIe1g93OG7Wek2EJ+BPlD0vYC31+z/NuXiL23COfvE0PE1Uvi568pnr5F8+qC
7CDD7QZ8fYmaK6LU5HqgTpcsjmD19Sua4SXu0Qk3lysW05zgRjOQNBzT+4b/j70367ErzdLznm/c
e585BkZwHpLMTFZmVXWpSyW3YMuAJdt/wIB/k+FL/wXf+dYwbMAwbDSkhoxWt6RWVlVnTanMyiST
ZAwnzjl7+qblix0l/4ZsxAIIkEEgGEAE99prrfd9XnX/I3qdmZ9sePTkY6pH52h3hm6OqHNhSNM9
+SYGjirPth8wxrCgMAbNQk/K4LmDd+3IUVMxM3A9ZFytuAyJufe4LhCdpXGKD/vIw6UijFM4ipLI
oRhW3rAfEmrm6fpAbgwnrvB+l5ktpjur9oo6ZobiWM4E+gIVEDPJaeYipAy+EkoHudIQIj2GTQ27
vuArg0mC9oYqjfRoxAo6FcSBzrcnBWMYo2JXCX4A7R3N5gT/5AWnRrH76h2y8cT1OddlQS2eVoS1
MzR5hcxnzJ8G/PeXXPzd1xT7CL3TVM0r5He/Zfb4BfWskOXA8MU1dnNgc/KQe7VnWCWKrthnM03t
yycMpqbcaJbXJ1RlzfzTNYeTmkHd0MsV7WVmHC+oskXrtyx1Q32VqVOZks/ej4x9R3ILMokcjtDL
gUxDef6K/qCQ736H+uTH5NzCAsbrLaU7Ybh8i/24xZeC9BnVTrhU0x6zfvxfUMKB9S82yHmkOnXk
mIn7LUorYilYldAo5k4jo6JpFENmylpHKFGxqKDrBJSmUZAyOK0Ig6VyQuqFZBXOK8ZRqJpIio7i
ClpBSBpjhDAqqqWCUabVulPEYeIllFsVu06QRoWbCaVT2FooWSFZsG5KByxmehnwM83ipCFeauz9
JU4sOfdUClIqVFXD5e4tp/c+uRPF3d3Q7+qHWn1JL7VuSbFFdJ5Y0mOPaebkElGVI94k+jChIm+2
HftYc3P1lm7cMijP1fv/l67MuLn+QAyacf+OoD1Zzbj+3b9m/+W/4cPf/++02y9JwwfaD/+OPga2
/+ff0HUdhz/8DcNv/iXy5d/T/vp/hf0FcvGWejSsu4YVD1g9fUb/7a/p6wN7BnaNcLmAr//4aw7r
E8aPF5x8/pzjzz/FPn5K8Av2SpOUYl+mSSjc2ny8KJIInlsCl0yktqQnbnqfC0oplJ7iS41WjETQ
irEIHdNqMwJGabQAonGiSFlQorE5s7DT6FQSrIxCZ0XF5CFPSqiMIidhYTQlZxwWUxSHMvmIb2LC
WEWSBEZT60KKilobJBe8nibDoDWVVxwCiHMT/c5YlAhZoKksOWd2phCVosdRnzzi9KPPuPfjzxkf
P+Tq6Iy9MlxJpnewHRMDBlPNqY4fc/rxK/z5EdltaH7yjGIfMvRnjH2HOllT/6PXRLXFyI7u+3/P
3EdO5prZyYHZ2bek8Q396X0O9RGDrsg6kvsLmnZHc/Ml7ugSSTfkdCA/qcnb77n3+U/JXUFddMyd
x717w/rFn7H/8CUxj+wve7a/Hwj5BWF/RrP+zxh+tUN9PVCR2L//a+LTQrvM1Po+8ftLxvEKMw6E
rOhz5NvvdlxcCvreQ/rxj7jNllF+i55BnxxltSDFwkW7w4wjYxAarwmhED0YSaDVrbBy2sJIhsFM
MJisNM5MtjMq0AGiTEl7RRQoNwXsWD39LCqQ22OnaP5Typqa+DSIndb1t4m7oKH86T9znu7wJU+T
e8kQC6QiVA6aVU05Okc1M1AJ4xfkIaOzRuPAWFJKdxP6XUO/qx9qpdC9VPlAZRSu8RhvsMs5/vQY
dXJCnjWIVITREAZFd6kZLgrDYcFwWNMHR5r/jHTvv2Q0Z/RjTUiZpA1heI+cLOnZM8Yr+t2vGPpf
Ep/do9/+Hf3x37Lf/geGJYTNCX09EM2ScXuBHip823HcLHn44CMWHNCHRPvmA9u337B7c6ANzwmf
/td0Zo55eJ/Z69e49ekUX+lWHMbMmC0aoc3CsXGUlKkrgwESk087FcFZw82YqK3Ba0VfIGrDkApL
6+hSoVjF2hVcgiNniCHjrYaQcGJYGE0/JlbeYMfpcy6kMGSoakNJQmMMLoCgmdtCHzK1m5q8tUCI
AMydIo4Rq27tRUVNiW1DwnpFSoViNSoHcpmmQQkF48CRQTSzItMLgFWEQ2TE0IXAZYZiarI+5vzj
17SLR6jFfaxpuBoVxSjeD4ErcyvgMxVHL37Ew5+95Pynj1h+fkL7aEX62SfsN6cMsyXy+D7b3/wl
xmeSfEE9F+abGe7BCv/kMeajx4xnj7m+3rPveoIvhO0F5SaQv/0r6tUB5Dvy4d/j1j3K3OBEoYjg
32HS3+H8bzB2h5mvscc/QbcvULtnuPxTVFzie0uKv4ebC/QY8M826KcbWg2HbiS6ACaSJEKd2dsb
PsQtQ6PYvjmQyg3lmwG+X4BeoGYW++CUQ6tR5ghlFhhlySN4o8mjQkShUahsWDpLDAVtwPGnRlvo
A7haiMOtgFFlShSUzqSxoGyhJJkS2JQQR8AIehAwBWMUEsAYkADKTzS5Um4n9RG0ESjTS4CyExM+
C9PpSBTWgZ9BfXpCGTTBB7QLDHFymLSHK+bzR8QYjt/++n+700/dNfS7+kFW178c37zHmYpqvkDV
Nf7oFPwa15yRdp7hEFBRM7wfcfUC6QQ5NKTBw36F0j9DxieY+p8T96fE9zXceKQd0LMKMz9gzRti
+1vi9W9xS8+4/78xr085pF/S929pfc2H775E7CcMv/oCVzxGacyimaw91YD+Zy8Yz0Zy4zhsHIej
Beanr+HFQ9aPP2J0j1B+QR8dSln6IdFGYS5CHRW1ESRlGmdwMRBimR64MSCqYLJQa41XmX0SlIV9
CCQl3ATF+6yxpbBrI1ZBVSZOd53DFD7jFFEywUyP8hZAhCFNJ40UJ7rXMIz0WWF0IUbFdS4UhKgU
CwsmgRJolCYohdOOVmuyUUSrOOiMqETWhSxTmIdmmuSSEirrED0FgFiZMrNFN3RFMSrHYA2XuiCL
GbaqeXn+iGa2pCuKPkEfLVo5iihuYmRUkP2c0x//lOf/9C948dlPePznz1j82SM695jLv3dcfjjl
sP4Lvv+3vyf924BSlmbm+OjRPTYP1vijOTJX5Oac2B/Tv1lTuM8YhOrBP0NuZviTl2QecPPllshD
0rWBa4s/fcl4rYmHQvfulxytP6PaP6TmAcfzz6m/gEVZMmyvsZ++JNstowX96AV9d02/FC6Pv2TY
/2v0qEgmMV9qTk5XnD0+xh9XBBXx5pjhizf4vSUeRtx6gbZr1McfsXzykjK7j9GePk536ThmjDEo
ybcZ5oU2CFIXCIVdgSQwZDWl7Y1TY51pCFlNCX1pwsPJUAgZjIYUp21YGhXZAkUYsyBaJgysKTDK
xPXXE1GuKChMmpASJzEnZjrdxFuaoKsLrrZkGtACcaCkQEk9MQe88ZQ8GoM6unsw3t3Q7+qHOKEP
46t8eYkzoOOInlfY9YIyALljvA50cYeEAz2/xnhPbC/wy8cUvyGQD5C06wAAIABJREFU0A0MY4c7
1pSbPxBMIvYbBt3jZo8J3fdU63OC2YJz+OVztr8dmRkh5BtSEtTyAqk0o1HsP1ww++gE7WaYxqDi
ew7dO+J6SZRjqjRHf/oL6vWc9eo+5fER7dExS7sgSsE5QyiZpatJhmlSMcKQhEY7DmPGGw9monjh
FD1C7RWhTEztNZk+GY6dI0XhnjFYK7RimM2hDVNC2j5mrG8wqtAGg/Wem5hZOI2LgmjLkdNcdpHa
aEKK6Noz14WbQbOsNduQqCtPN0Y6hHml+L4POKcokijeoULPviiOGsf3XWTtK0LKGK0xORELzOeW
my6SKwUp0oph5Se8qHghpUzwFTGN9AoeLy1vty22qVAkgtLMfWIcCiezmnZoydpy7qAfC011D5M7
zj7eMAyB31wN7O9n8sbTvt2z+eQ1/d+85Zia9P13+PM162yZVRuurrbsft8xNyfETSa9f4s+NQy/
/Evs2SvoE8PFgTEek0pFVoa3v/6ax/UMUmLf3eCOLfKh4fjUo1KDOT0l7AIlvGHGfeL7LdXrh6SS
yd/9jmX9kPytx/SF8H6Ddz9HdY4imcY7GmsQiVRHA+9/9QXtouLwbYPezcmXI2mWiXpD+ugcQkWY
HSFGTeS3ItgCYy40twI4fSsyz6Lwt0Q4VRJSBBGDtoosZfo5YApSwUCK023c3M7FtZ1CWpQXyFMK
m7PTOUcbpo8p0OoWNlOBFIXSt2uBrNB2uqf/yaMO0HjNThfM6gRJW4Z0hbMaXTKz2Zw0XFNXSwLl
FLi4ezr+w6q7tcs/8Lq+Km7/4eZ/lO+/0VoyxhqkMmgDyhhSToRxoOt29O33aFcw2pB9A82GLBDJ
KOfBN+QYScYRhyukOmYcLTJbkK0hV2uoI0Xm9MO3tNvE7mJk6I+JNyvkg6Y6+Qv05R4NlCFhj1dk
pejbzEEd8c2//CvC5iecvP5zfvSLHzF7+JL546e4+YqwfIQxNdtxmjS6FFFGUyQjWuOMoYuZxcwx
hBG0o7FCl0EZTcwZ5xy7fiAbQ1MZ3nQjJ5UnhYj3BhMLSRQLrWhDYVZXDGOi05bKZdrb6b/kQlV5
dD99Dd4q2m56AaiLQqzGCWylYCrou0hdOVJM9GJY2GkiM95OXHaj0SFQiuKosVzvI6JgKZPHubkl
3elK07cjwTkK0+eYaUWOBeOmu342llQiQWDlLX0XKVYzL8KQFZKYtgcV7IaO6CtqPX2u2llsdlDN
qH1NfxiwK8Ns6ZmtLOunCwgW+eOXpHiNWi3AnBCHSDgE8lUi1yOH7dcwfAWbEblvYbkirY8YlaZU
K+AIZEm1XDGfz/FPNIfvv0Lev2N2/Bw3azCrY7JtGcw7GP+IUddU85HmyRnlm69wjz4l5hnXN3vC
5ch5esjR55+hjixUDanLfPfNFTc3kXJdM8uZUxM5tSe4T5f4Z/cJKZLOzin1Ebk5IjvPLgnGa4YR
gp+auJ66LGMQZjNF104ahsoIJSlqoyBDXQtpFKJM7oZhnFbxZbj9HpuE5OnFsQyCbzR5zBM+uAEZ
FMoKqkxedmT6pSwwgqqhZEGywvgpqQ0zqeK1UmgNMWgwFep6QNIW7wum8syWx3S5xddLCvK//A//
0//8zd0T8m5Cv6sfUDmRp6WdWZULOkWwCWeX5DzATBO3HWImwIZxx7j6nNR1VKuK0BeSjczmNWGI
mNmcrhjc+oToniNWY5cvkdJTzQBGYlyQVcvQfkN++Jr2i1/BdcAuzqmZI6Nn/8uvWD+CdPNLVHvN
uNqwqw5QVgx6iZprZNVw8vghsf6Evl4gY+BCFpRc2I6aEz35yBVTPOmQponFiiKUyRpUDGSZWOvC
JIIrZWLPB1FomYhvbS5Uyk6JbAhKTdNVozXcTk6ohBJNo6cJ3yqNlISyGkQRBXRlpnU4mjElREPt
DGMWnDPEkqmtQosiU1g7yz4GKmMoOaKNY6EsoS+cOE+USUmtUiZgWFSWoc9UVQUy0ejmxjCkTFMb
9iHirMFKJIhM9rdhxM0Nu5K4UZbRZPosnNSa3U2HczUqFz5kqJwihsS6cjS50Fczjj59hbtYcNRo
1LZDlT3tvGH3rwr9+7fEP4yozSX3VmvSU8Pm6B43Q2H34THp/RWtukSfLSn7QC4D9qgmXG4Rs2Lo
FSplruqO+f1nNHzO4S8vmJ9DF/7I6YPPUMMH9u07hvWWt19/w/r8v2X8f76m3jynOXvK/rCl+egx
bfcNbhHJ8oZBGqpyxnAIrKoVD5Rmj+CPV8TffoF5/Yp+2NFsrzlog53X0AvMGpzOZG1wptCNmlyD
GjIRxQwYM6z0BPFJovG3dkJrzG2YTsGUwqCnCTuLIFlwYghSqLJlAAoFFCQRpOjb9biQs8JYDTKF
9egiaKUhTXjYkibLmqjpvi5JgTETQc6CN+Dngu5m9PM1miNKHlG2IeeM0lMKXJZwJ4y7a+h39UOr
bNQr7UbwCqM04uwU9UQ9oV79DCU1LB21cYRhRDce4yzOZrS2YA2hGlHWoY3DuIo4BIy+Vdy2A9oU
EorYnpLKSNevCR92SPMRuQoU05MHw/D+DzRnJ+T219RNR+n+SMx/gObHjLsdqyevMeszzh5sMMuH
1MtTuj4gzRKPoo1TetRNTJw0FVeHllW1YG4y+1BYGEPuA41xKBFK1My0cBML69qzDxGtHbUa6EfP
kdMcUsFVnrEbGJ3loVN8aBOzWtGlgHWWPI60GDaV5nqfmDeefogEFGc2042KykEbIqapyH1iFMfD
SvFmn5jVFh0KgzeY2LMfHWdzje4g1xMoZqeEBYHtaFg3hqbt8bOGnCNt1CxrxTgIoYEpFsQwQ7hJ
itXCMR4iqYK1SdyIcKQUYyykmUF3iWvjmKkCWZjPNd02EbyjQeiwUAqHUFCVRodIaxvs2X3m84aV
b+A0YKoef3JEqzXD1SXbd1csQ+T+0rFaOB49O+Fm9LzZ3nD97oSbPz5gDAF5f411N5h5phx6YvWW
/SKzbw1qHHi0f05TP2KvHjG+b6bEtz4w3zxhef6OOFxz+Ea46t8xv/iO+uP/njQGEINiRdhGBl8z
/Caw/LwhSIvV0wQbryPu0Rz2J+TDTzjsGuqy4CoH1OkKxJO1JyNQNFpN8bkzp+hiQcsE/AFNY4Vx
ECprSGlKubNGGFJmWSuGQeG0wqpCimbCBUeFdoLLhT4rfGMoo8I7BVGBFoxR5MR/EkNWtUbi1OxV
LeRxYsdLAeUElRU5KJyf7vHOK4pAKFDXkOcade+MKm0Jhz2uXhO6PdVqiiEuttxZ1+4a+l394O7n
qJe+UfRJUSqPawwpdti5IWUwi4qiI/PFGglL9u/e45QF0VT3FpSoyWTWlaU7tKybORSHvlchpRBT
Qd9THLoWpYSwv6ZtQdbP6Ibf4dmjHx4ztJfQ3VB+/Qb1818wfnfJ6Dx7ozCHjLt/n+7ffIMsV9w7
OWJRrxhlSfae2CYGqxnzwC4pllYorSLONN+HhLWwMZoxJmaNZgwKbTQ+Rjo0q0bhogI95UoHk5hr
O93ZK4NDo43gjLAXsGbyBWdAiRABpTTXWahFKGSymuxsVimmj0yQEKf0ZHPTehKoSSZJmYAxRnEo
BY+gtWYXAgOCy1Bph8RCdJPdbRShVoYgE0TMeKFLCe2muFRlPKlkdjJN/7uYcEajtSKLxapMFIUz
hlwm697KCCEqvFHsUkbPPAcEh6Ixmi4X5pUlpcJ3paC1QeuKenmPpDXVwqFloDl3rA8j17MTyvKa
IJl2NefofMPy9JSVX1FdXWPrbwlJ2P0+opoFy7Uj7bbUq2OG7orl0YZebqgeLCZB2Kwmvn7Au69+
zYOnc7rv/5b5yU84ffgZvRzovr3iavxA/fQJIV8wfp3xjx/Qv/sDRRsuvs+s6iOOSs027m5FbDes
nvUMwzX5+o/o7Rtu0gnni+eEew9YPPyYFBpat8CWTFsMjcDNWLi30nAVyZWhKrAbC6uZoe8FaYSm
KPqscC7ThsJ87ig99NowtxPbfeYUQ6ewTSF1QqwslZZbHoRCRggV1FpICbydkvOyATVMWQJOTYCZ
ZARXFPInEI1iIsaNiuIFbkWTYhVuoVD9mvxuTS4zQCOhoJKmyAB3cJm7hn5XP8CGruRlMSAxkCXj
jo8opUW8RkpGG4P3DuoGvaqI+4BSA4KmWswRrQhx8nPLUJgt5+RiJiHbrCGVgCkKt6vJOdAtWsa9
xm48/uYctdwwNC1puaR3hZtvBJ2Ose4Z7f57zLctNp9ha80wm6Ff1ui6YHzB6kIZC6UoSIWampVK
SE7MakOIwv2qQavCmAwzZ4hlwqYeJDKYjDWGq5RQWtHn6f7d5sIoisprDimytA5JhcooNlIYBsOs
MoQIc2/5EDKNMZwp6EahGE/OhcY7cj8waMeqVrw59CxqT0qFbBwrI9yMjvXMsOsDi7mniZO1bF1r
dodE3VSUkoha0ZiMKvCo8VzsW7yvkTKijQMVuIqwrC1hN5LrGlUKF0nxuIKhj9OWYejIvmFF4dDD
6Uqzu+hwsxob0rTiNYXvh8C6qRn7lt5aSC2HUVjPG/bDSOcsdcl8SPDAa+IYWS49sw4Gs2D+8icM
yw/kdouOicP5mo21tPMV880Zp9UjCgtaKfzHD3uOzyraw5Yo76k/MRz3p+i84WjxkIUb0XGPDIXV
qzkX3+7Qmyd0N7/lTP2E+ewJb4PC3F/Rfq8pYQMfL2i/+jtmc8PixQZZnkAaCP6vyNWnxNxPOQTt
L7HR03Rr+vdbTNyQmyXuyceksydkf48c5ozTJprMJDRTShMTiBasmXLNvRckFCozZQOEMvH3Y9Io
DzFAZTQDoIJQGUhZMHZKZ8NqFAWGSQlfgqCNgjETlcJW5vZjoON0PldKSOMkhjMBxANlYsGbRkhB
YQVKhGwF7ORfb2rYVxDnM+phQxxA+QWp3WPXFWDvGvo/wLqzrf0DLyW8TH2i2Bpde0ofMKaCNGK9
RUkAGXGGiax2vMJVFu8EExPOaeaVRuXEfF5jvMPPHa721M2c5foYrTWLzRxjFccPlzz+0TmrzZyT
V08xsxOW7ilzPcenC45fLYgfvqS1S7ZyyuX1miv9iG9++ZYur7F2zXq5YHV8grb2NorUMsRCyrA0
hrYPVE7Rhg6soSYx5Igxwpgi3haGww3XMWJM4jKOYKAbIknDMkZCTlinGUIhKUU3RLJY5jpzHQqV
VcQ4UjTYMNJGoUEIQ2RZTX7zTjJz0bQhkR10BQ5aEXIiFkGrwj4lrNGQC0EgB2HMHpMyrtgJWJMm
T/mcKVjbaKiSQlTBUUAFFALa0quCLoJTwpjTLTQHklgOpbCu7BTdqQ2DTFuD2mouSp480ZKpVGGj
PBbFPTxkh8JjlKEveYKPFIUow9x4EtC5mlYMWzRdvaCvN6QHT1DPX9E/fUV/8pSrxSljc5+RGWqx
4ezFp5w/ecLDP3tEu55x5U/pTl9zuZ3x3W//lna75cMf/h352y8p3w0s9IKmbViYGfnqS2aXI4vl
YwyB1QZs/Ab3MNMf3/D+5it2jxOX43+AcsNstqTZtVj/mLQb8alh+6ZHj6/w+iULdcrp+WtM21L/
41PS44b6+B4mrVDGIX1AiqYSYSgFbzOHPmG8w5RMl6bzUiuCroWhz2QNcz3hg2ujCEGDE3TJZNFU
WohRqL1GhQJK4bUwpskSl7ICO0UXJ6Ymn2+jVVMQgikYFDkLaCHefg1kbkE0kxAv6ULO0+SeUCRA
axCnGWYLtN6QDgnrIn2/J1sN3K3c7xr6Xf3wGnriVRwaSvGoVEhpUrxKitMkECZvtm5bVD5QHTlc
pajmHpUC2gmmNhhb8KZgQoe3GRNHdNljU8SGjCNQU2hsYTVzbI4aTh7WnD+dc/p8wdGqopkZ1q9f
QRwYryNRPyWc/4Jx/YDx7BHh7Jjy+Ijzxw+pjh6S1JQa1YswktiWQl9GrFUMpVBrTbx15hoUZYqK
YUBTa8/SVkhRnLiKrCZ+eyiFQYFXBskJoyHmRGUUoWR6Ucy9pk2RhdeUUpgbjSeQEapac4iB2mpy
ztyojK3gOhVMrelzxhmLI5My3KsVl8OAVJqUMsoZsi5cJ4WqoU0R6yrGkriKCu0V+y5QNwabIyiD
LUDQbCy03Uhd1+gcMMriTWKbCqu5RcbIFZqohGvJLDwcxoQ0hkZlsnZUxjJEzbp2HHYHtLMc6Tid
X4ymjQpd14yxZy+CrzPbMWOsYtcHvneKFs22zOj9ktavWD14xkEc37pTSrXgulcMOEQ3vPz8F/zs
sx9Rr095w5y8WPJhd8ybccPN4Ttco+hXniF9hQ9CG4Xx0Qltb6kv72OvBlQXuF83VH84sPCaNFMM
6or+euT66wvirqL94gKdnpD7R+x3I0pq5vfOOH5xilt7Vo8azp+eYvyO1azhsKjJ1rFNid4rhtGw
jQWdCiZpTJapqTJR2fZS6ErkQ060ZrKmDRZKCVCERkCnQk6CyUJQQrp92cpMmeljZqLBiSKIkFQm
6wlSU27/naI1USm0VmhAAWhFKdO0LnILllEKcgEz/b4IRAoxTx+OGqgFP5uT6wWmWSNJsJWnVg4N
dxP6XUO/qx9SHYooUeqjoiCFTAq3ZlUxKO1RAtp6JGcKAv1A3h2m9awDVQbUsEfLiLGZkjoUIzLu
0blHpUDuriD25HaAdsB1IzMRTo+XnDaae6uKo0XF6dk9zj/9J1T2jMXjf4GPr3F+TvPxGep0gfnx
GbNXGz56fc76ySfo5pQQHBWOsO+YK8uxTYRUmNmJ4GaMw8YJLNM4OAw9M6dIQ480lkYXDinjjJBC
nCbyOFCcQenMYczMvEXlQlUbxhgIKJZeEceCNoYQAsEbalXYZWHpPWos1NZgU8Rrg5eM7iNHRlOl
MKVvxUxAYy2MfaBSk1k4K1jrQp8EUym2YSRq8LnQIdNDO4FYRxFDLAY3CN2QJ+HUKPQTYoaMIirF
TY50KtPHACiSwHYsGA3jUCh6yu0ORSZCXiygpnjW6fIayDnjtZBCnk4aBcganRWlKLoCbTjwbc60
JdBbQ3GOYGoGrelMxc43XBK5KJEdmYSmuA2Pnv+Ijz95zubhEr/0PPrRKX/+j/9z5ssN7ng2AVT6
kXHXEwfB3fscFRu07ZFywLuAU4Hj45qm0/AdGPuSmB8Qr2bEa0NqK/pW094MmHqBW1QcPbrPs08/
4smzx8xOT7ixS8L9/4YuPGFhF2iWaG+JQ8a7yRqYsqLSBRFY1gaVpzPFDEWJmqXV5A6cV2gRQvZo
I7Sh4KpCjEKbJ6/6GArGKUJU2AqkJMYIzhbKeAuW6Qu9AqshjNN6Xg3T36msGHPBumlzoxwQp/hU
pSCN00Ygpwk6k5MmBkh6wsE2XuEWhrhaoRYbhk7h3JKSDUXc3YR+d0O/qx/U/TzzcIjSmHrPqDPj
vmXeWFI34u9tIBlUZaELpJyxh8x4uMJvGlIY0CWgW0XuA365ZNy2mEaThwPFGPQYaC932Kaiv9xO
IRMfDpiTOc3RnNxGlvWCXmkUBjWO2MpS30uUkwPl9AFyvmHXR66T5qM/f8KzFy8Iyyf0bkUfDZpp
bVm0YiGCioKpICbAgSuJINX0nlI0uRSqIgzWoUpBF4WUMrHVEVQWWjReFVIStNUkJuW3R5MTRFsm
ZntROKVpi8ZgyUVP1jbRDKUQpZBILNV0a00ICy2UHNkY4SIXwLB0jiwwV9AjlKIwVpGTYqENpRSM
MdRSKEw57ENJuNspLSqDMUI7ZtaVo5RpjV8xCexsPVnXVrVHiiKqgrOGISuqynAZemYYamPYjyOV
s3Qh0MxnjCmhlGFmDF2MHFWefReIWjF3hSElvINtbFnUNW5saW1DbQsf+paV9+ShsKpnpJR411kW
lea6H3DzCh9bTLXg+fPn7K4vuPqgcJuaSlbcLOM0tfYjEc+7LiPzY8zFgaU8Jy7fc3j7tyw//5x+
v+Xo5Qu27z5gTjOuzMgX36LmK3LY07w4J77/Lfl6i139BeNyzunjp4xpxC/v8e3vv2ZnD1wuNhw9
rbGrJdfJUK8U8UNgsB5XIq2aYmq7UVhtmDZJlWOthVYUMwvjmNCVZZYyA0KjFPsYWS4ayu0+XUlg
SBpfa4Yw+cf1LVGuqRQhgXIFVzTJKOZqWpfDdKePjUInTdYZjZ0mc/lTphuYUhCtb62YE3WwhFur
Zp4EdJVTNDOLrE+QNhFHS7NMQMHpO1Hc3YR+Vz+shj7yUsaIkUTJ4/Td7gdKyqANohylaEQ7pBRy
25K7PbHbUvo9RSLStxPmaoiQChITcuiRmMjtgISRvD2Q2460a+GqI19dIJfX6GHAlcjMFGYWZgbm
HlbnjtN/uuH0kxWNTBPG+ZMjnn/0jPWDx8yXGxJC1tDHhK4rbnJPi0I7y5AnUlxKgcpWWFNo0wR1
kVLQzqNTQkSxsIZdihRv2MXAvKlQMhJRzBvLLg7U1hBCxHrDymnaMEFaTCrUzhLSyIUoFpXhXdch
taIrPcpZhERImrlztIeAZ0YYC4esWZjCdh8wXhPGhGiLComcFQ+cpt91LH1FlQsZxanWmMHiKs2u
7WnVNKG9CwXnYdcnlLOYnOmTxlHIQXNuHe2up1cKI5E2FbTLXMYIVjMbCwpHVTI5CY0RDsNEs1M5
coiWWgkSM1VtGOJIspaZRMaYqK3CR8Pcz4h9mQA0KMiKog15DGgBXzJdmu63YyiMxZJzYTsmqsU9
nj38iB9/8hmPnrzkRz//jH/yL/4rzl+95vTlZ9QPH6Pnx1hzRHgzZ9+u2S9e0b75QO579HzGyU8/
p8nvqGc7tApweY2865DvE+b7e8TLUzj7HHNyjH74BDbP8KuP0CePSG5Bv2yo/2yDPN3Qe0c2U2Mt
Rk0YXWXoEHYF0JY2KkRP7K0pwGfyfjsn3MTAKIK3MnEJrJ7CUpwiqUgWM5HfQqaxIFGhtaayQo4K
bzW6WKxTGCmEJJjbKV15hQ4K1GRnC6OgnUCactC1TGRE6wQZbzPUmQR9udwiYW+f7rMZHK0cya1w
x0ekPv+JTX83od819Lv6IVXsykcqBXJ/ja8dtq4oecQ2DsaAqaacZExBRBj7joKQrvaUbiTe7Ai7
HoUjvr/GiKb0AlGjekXZjjipGN632GTJu0tCf0VqL9j+6v9C4pZy+D123NGMgcrsOD4p+PA1S9+i
4gdyHygLx70X9zhfn5HdY7Q37IeMqEzXRwYtGC18NSZaLbzpR5JVXA097zFoK3Sp4LRiSBmsIfcj
fY4svGHbJQqGphh+dxu00QfF3ELTK5xS1BI4SKQx/e1tXahKpCiwZUo7mztYFkNlFVYMgsGKIReF
MQaDo9fglSViqJRCKQNKU2tLUIIuUIsmJDDKERR4mcROOU831U4KxTra2/Q4UzligZmDIpmihVFn
kiSCCgySplz1kqZNhUx6AKMLKQfULaY0R2iUQbJh4Rx9TBMAxQpXkjAG2tCzqB02JUqxzI1FYmTt
NO2457j2LI0h5sTKV4gI2rvJVaAV63p6CcvecIgjBwFjHBnL8uFz7j1/wZMXLzl++JL7zz/j448/
5dHzV7z+8U949vPnbJ6fsPj8IV23Yfg2UT/7EXHbMfNLqqZm9uw+5vicQ/gV6bUnnF6QPk5ctVe0
+TPMj39Ev7zPbPWAok8w/pxxnHOZ1vT+iOrJIzbrJ4xs8NrSthlVOQ6HDqWEU2umfPpGMxwGZkZx
ZCBJodKJ2Cdm1uJDoUvgMsQkLKwhdhklhboU2kGwCrZDRrxiDIWByRK5GxK4yaYWNZg8RbQaI4Qo
JA05CXsySgn9kIlKIMmUxFaEkjUYRUrCbdzABFMqQuwgFkUQoAJTK2IzQ2bn5EPFmA/k9H62++Nf
nt09Je8a+l39QCrH8Coc3jB++AOKFmczklqU1xRJiBYkj+A9SltSEVQ05KimW1yfyFJAC/vtJTEH
MgXRihwzYz8i3Ui4uaDrLonvfkX3xf9B6T+wf/uvyOMWSdNDTpcDlW1Zb2o8I42uWC43+Lnl9Lii
nCxQyxm6roiZqRGiqa2iEUUNLCjoUjitPGNOiHGgIoLFG8s+F4po2pixzmGVp4/CwlWQNSjFPZnC
T4wuXIeMbibCl9ENcwxjclOiVg4kp6cNgVKcUzh0iUWlIGZmSlMjiFbUFnZjxFb/P5N7ZgqI4V6t
kRhxXuEFlNPgyrSCrww2ZpwzlJImT3ij6ULEGIMrCYVjJhkpirqyjN2AMnCkBJMVZ96ThkTjDZsy
RbDOjBAHOPWOPHbkWpFLoE9gtHA1BqKH/7g78FUWkorsQg9O2Ldp0ibkyHUYmJnMoT+AFWIMuKpm
aYWrYQs+cRE7Yi0cupF3obC0QtvtEVu4HDo+KEWfR96XQtqs+WNpiGcv8OY+XfWIs5d/ztGTz3n8
k3/Ei89/yvHxKeunSxb2EWb3Gvl2Tvy9wul7iLrP8vV/R7r5OduvXxHyL/hwuM/b72a832vSfY16
OmPvHKnM2SdLyY7LsWK/OqG5/wL97CPM/edcqFMGUzFkR9CKRjmCCKVkxqLJEpihiEZATWKzIopU
bh+ZJSGqkHUiSmGUjFLTFG5RWKuIefpzKNM5RqlJid5Yi8oJrTI5TTksSk/WNtHCEDKpTAK7XRdR
RpFCQVk1RbSiMLd+dW0VxClmdeK+TxS5lKY7ugB2XjhZWJR2DDoQQsd+d4nF/PzuKXnX0O/qB1Im
da/y/j3SdyB7VBVwJzUSe9CWkhLMlmhfUxLopiFhSEmTxkQslqI8w9trnJ9RxowUTewT/c0eEaEP
A3pdE9rfcOi+ID7d0A2X+Ce/oP/DXzMOF5TuCok7Kr9C2o6jB59SzzJ12XI6y3y0sbxolmS7uKWV
DTivGELEWg1jSyJzXjtCGKicQuXCwjuIA10c8QYOY0tVQwgdyd0qwMdEVTlyGVlUjpwCIoaF13Sx
Z+YKLseJmx1ahqBYVBbpJ0uYKZmZsRzrQh4LlVMQEtkYVBilQ2g8AAAgAElEQVQ4xESjhdTFKagj
BrLAQgo3Q8JqoR16bjLYEFFZswLyEGm8pomZkAoDmTcpgYtcx4HoNXOl0FIQAhchUxnNOI5TLrsK
k3UpjUiYJvOFNiSERjIuTFO5SQptahZakZSgTCGpjLWJmUqsMRxrhVIWrw0FQ6BQlYJGKCUwChwU
BKXZS55oeLoipcK8TGr/DZHHzqBiZGUdIgXjDVFnLkm0XnEAmK+JbsGNnTHUGw5uQ/XwAf7oAfOH
Lzl6/ojsPGnl6ZXm4q+/wRxFikSquUb2Gf4/9t6jx7IuO9N71nbnnOsiIn3m58qwyGI3q0okCKGl
1kADNSD0vP+kJhpoQglykAQ1JagbNGA3i+Xrc+nC3XuP2XZpcIKEfkKVEAtIxCgTmXEz9tp7rfd9
n/2eYj5lHg/UzZ8zjq+5376GH1zRP3nKy8sXLGworACcZTvw4s1nvPr+a1599glt/xQzBD6OjS7A
siS8N+wMmKY880LJ4Ic1G38uggXmXNl0hmkuWON55hy5GK46gynQeahLpWIZLJRSuewMJgp9MPRa
1xQ42yjZ0G2EUFeo0NayJs+Fdbt1LnB3PPHlx+t11ZWghVX8lq1i/bo7xz9Y2Owqlqt1Ta8r0/pi
V4BgMJ2Q2pqP77KjjRlT5z99PCUfG/pj/Z6UF76fp4StHdSeOgquv6AtBWOAsnrPBQ/bHaHfIkvD
2w3GbsFuELdjmYSmjpqhpko8zZzPZ2oz3N7+mvF8T9QT4wvPcSe8/epvwX/G+cNXmDogfKTVX9D5
G2i/YGNuCB//Pfb2LwnxzKZrPG0W2oBSKdHQqsFkQxGlpszUPFnbCjIBzIOv+mAKIsIkmakpRwRw
LKx0tWot3hq2WKQplyqEJqCKM57SGs0IGaHZHrxlrGvgThZhi8OI4sURxDJVC86vry5n6Y3BirDv
DU4Kg3cr8hRl3wlzVbquwwvrSxxlqbDp1pG3CR1iFNsMr4IjReVZP9BSXOErmrltyjAI90siDB1N
05pQ5iCqsh06pjkTm7CpgsXzcudYYmXXD7DMTGJwXeE6zlyGyjxFXg6BV1aZY+UCw3iOPNsG8rQw
Geg65b4stADneGbXWbRMFCMchsCyLFwGT5snWghYSXzIBeMdMSm7bkteGu+K4YkdmE6JLhhiidwF
w9wWPqrBbnbMU6X2Gw4vP6fbXeB+smf83FB8oL94iWpmc7Ehd0oMldrPLKcj5nVH3J8wV0du9oL7
/JIswtE4jqXydTHc9QNLGOhfvMG5A1U2DOLISQnO0paFWRulTpzagjONmCpqhHGOzLrmsk9VmDSR
82r51JqJVamtkdMaSVxzI7f6cBkCjNJaA2lIzpS8+hNqgZRX+9tqZ1v337E25pw5xsi7D99wfb6h
phOuZlxTLA8v8X80rKg+fP3/aGeKUquSGmRW5Ko6xfQHjH1OTg1tM6XePjb0x4b+WL8vpfTf17ah
pIaRsAqYUkVLRXNCCti62r+MNxhb8d5hnGKl4sIaboK31Nxo9SFv0lk09Jxvblhufsly+kBZDgjf
Q+0BufiC85c/xdQdcpzRu4bjDXVWOv8JNc5oC4h9AmdHuVWQxIYTbRnpQqPUBemF23mmDR1WGqdc
GPpAXDKdD+Qlcl8tvVt3lNI7ckyYPpBKJjbDJlTu5xlnhRITIsJAZXmwoNUqlM5zzguTWKzJ3MaM
dD0xZc5GaBU+ZtjsLLfjTLNCLQUjjiceTgtsO49NGWeVvhQmBC+FNGYugmFPoYoh1Mq5NbqN45wS
0RW0JryxXJk153XvLXZKJLXsvOJY97jxXNj4jlqV5QHluYJZ1uZ6spak679tkUSh4p1g00jOjY01
q8ZABDMlAo5e87qeMXBbEsVWSp25NoXWGlOqiJOVptag5ZklZQajuFgxWpEys+JLCqWtPnytjUUa
S8ks1VKq0kcIgNVGbYaPy0K2hglhSomoghv2fPKDz3j94+f0f3Ig2+/C7Zb6LoEEbL+hu9wyvPoc
ebnBvLSENwP+E4++DsjFE0bjSeqYgMk7xDi031Ksw/Qb6BxnVYq3jCXT+w3WyoObwJNpYA2plhVA
RF1H6mHVJ3TBrtOpCsEa7pvSHEypknvBOMNYBRcMMSrBGeYFZjzBWWIS7EPGe7PrFKYV2AZDmZVa
lH/3/iv+l+M1N8uRt+M3GG+Qog9BNEotYDwQ11hYUag0rDXUBM0IUiBVVvV8Jxy2BiPCXBMmJPL4
2NAfG/pj/d5UFrmywcEYqXnGaiOf7hG1lPt7NE208wlDJDih2oI839A8SB9wXY8RxQ2WWiNIpUgl
BwPOc2KBp99jWn7F4hbUX1AqcPhn3Ly7o+gPmaaF6T6Tb47kY8V1Lxnvf4l5+oYyGY7/8JdMdx85
376lO72F+Z6NF6wWOmuxraJi2bSCTZYBT40JZwXJlaX1WIQYM9F4gq47xEGVqo2NGDpdd+ulPXjD
rZLVUMUQa2VWSKKMTsE2ltZIttIErAimKVkBGsEo9SGwa1EoWlAamQJakLYKDWMtFFmfTbkpTpXY
Ck1Yo2prxmulqQW11IdLhneWVCAYh6lC1XUKQBNC58i1rONVZ1isrur9ErH9w2RAGtZWqq6Ti1NJ
eO+xFo6l4L1nzIo4T84V0xydXcfmV4NnzpnBCUMFcuXKBYZauNh4YhspthA65S4dCYPhPk54v3Lb
zynxJDg+nifUOk5jolrH3ihzrcjOcTtPFGf5Jk6M3rH1nvu4cOxgzJnoApefvuHFm2e8/N4zuv/i
Dbcng9c9NTf2T/b4gyd5pfvuJWNN8PwF3aev+eHhgpY6pvAU1UpsFiOFqSQO28CcG0cjNFYGwOCF
85QwHfgSualQUK6nihsCd6dEs57BwVIaO6lIKqi3lJQ5GxjcaqEMG0suQvYOI5XcwNhGzhUf1hVR
tAZrEqWt4rZaVzum0EhNwCvz0viYMn/x5Qf+7cczNi8sy4J0usKQjCIK2hpiViubPjR0bWtzb02R
VepBUyhAtUroDM32iN1gm6EW87367i8PjyflY0N/rN+HF7qA8UJ2ldRG2ChVlNYyeYq0+xNtXNB0
As0PqXAGawXj1hE1NPrDDtMq6i3GCWHXYwZHMw7pX1C6A81uKOKR/WuabGndZyw3r1jOb0jlM5br
SL67IZ9/izU3SHiLbn9GMn/N/buf88v/66+5++q3+JrwObIVi2uNrVvDPbKCtcKkC/1mWF8Znce7
xlIbG2fYNth0HUtKuOAZvGcqa972sUaMtWssZ7NcemFMCzvfYbWys44dEIvlafD43LjsO1prFCNs
XeO4JPbDSj8L1uBqQaXnonfcjiOd9zTNZGsYukqplcPWU+O6X+9qoWrh0CnLEvGbjpJHil0b+j0V
38N8num3AWsjTYVLb0mpcNlBnO/RJnStcj9VrBjenxJ3fU8pmW9b4KSVu1Ni6zu+fR+5qT3HUrg+
VRYv3JWC3/TkunDUxtYIU5zAGk7jLTVYruPIuUSGQWnxyCEIXTpz4T07AzknQmeYc6L4De/PI+9y
pguWsZ6JXrhNE4u37Azc1MzSW75eClkcX+eFj+pAC9fHxNEMfCzKyXf4fkc4XPLJj76g+9MnTFcN
vb8lvr/FB8FLwxxkRdJ+mfFpoDc7Xl1d4dgySUctq7XL5LZeulwh10Szik2ZXh22KqFZlqYr9tQK
XoWtdWs0sATEKFpBMagYxNoVQypCgAe3ApS8UtekNnJ1BL82eueFVirOGBwKdf35akXXKN5UqcVi
rTAuSvSF3yx3vMsTtUUkzlyFzco9f6AbqrBqPgoYY9C6Rvwau+JaXTC09pAqt/4IIyKrer7b4+UF
y3nB+l6k8fhKf2zoj/X78eFGWjuinYI46rR6umvO68GTJsp0Qz7eU+6v8UOHlYLtGuQZNBF6T40L
/rBf5biAVofB0ncX2OLZ2J/g7i8JJ8emf43vBPe9F5y6X3O+/8D4/sT52xNl3HL7059Txx3T229J
zuC++DEff/1zplT55nyP64W8GIoG7ueR5lfC1ySV0Bdu4ki2lvupsLSA08w5CuJ75jnTDLxPiXNW
DqIsKTG4gNe2eo1rIteKEyixYYEhrq+m581wnhTvDO+PkWNu5JyJsvqCTktBRNm2dfS6U2V5AGxo
sSTn1tGnXV/d52xxTnB13cdujFARWiuUaSHXwtZU5hqxxJXMhmIQsig+GGYaRhtOQKzQY2lJMNXi
pGNonm3rMGo518QvDfzCNN5b5V4b2ULphAsHTwbDk1bZu9XW1hlwLUGeeeUsly3xynh8TnzqHVsv
iILYnlhB6aB13CehlQ03x8zW7ZhTZhMsd85znTLJDLSm7H2HlBU7euE65nHhee9JJfMd1/GyGo5z
5nK7ZU6ZM42kiVGV8OIZF8+/YN89IcQLpi8NegflFx9xy5mduyH+9K+5PBhsS1zsPOHJDg6B2iai
M0RTeQuE0DNPla3vuKyr2vzSCC0X+sGQlkjvHBcVUkoMVugTHAbLrgpzqRysUmKltwYbV8V7E2XW
ytavKwXnhJAr55oIVqkLbJwjJ4NxwuFhr94byEvGiSE84FM7bbQo3KvwFzd3nLXyPh35P6YTLw47
KJBNQyOUplhrWMZGdUrLK19dm6w7egclClSl6noBaAKzQLbdSlw7FXwILCU9NvTHhv5Yvw/laqaO
FZs9Tj0lNmQ2lDFSvSVNE8u7a8rXH0hv3yExUacR0wrkkRpvIDTydIf360tZa0FqQvPEzjnq3Xv6
zcBmV+n3HYOfsPmnPH39BtuPpMOB2/EdH/72HffXA+/+t79muvucNP0x59OPGT98QfQ/wgxXfN2B
3W4YvePWNLJRFiozmUkyYirBCA7FGcFawdWCd9BZOPg1E/sqQO8bqWZgHSd31iFt9Y5bAXSNQY2a
aW4FmiQa+6CMOfN0F7BGiaLE2lgqXA49sWSqWf/MY2srJGVp9H3glDOzCEvJUBxPvePulBDbYZpy
VEu1yoclEl3lF3dv+Tjdom1iTBN700ip4DYCecZU2EtlyYWN68lTpg9bgmG9IHhlKZlnF45lueWZ
7/mXpvJFbXxv8JQ48fyqw5VIbBZnhCUWXg8bSjzT9z2Dg3NTbOg4ZcUOW355PDKLIYRLfn2aiabj
vCyYbsNpXrgtla7r+FgKRwc1zQxuw0vf8fZ45knokSVzCIE+Rc5L5KkTdDrzJHhkngjOUlmYy8ym
g3KONLOqxY/ZsLl4TqqOsj2QLzu+/dVI/Wbh489/w3R7z4snb9hfPsPT8DcTL4cBK5eYrsMtjaKB
PimuCJ86Q3cPznbUmJgU3mviZgYJjpgad23F556roaDEuFCtQXJlqgZrYCkGY+2a8e48BydkBTWV
pWayUUJRjHG4akDWdMLWKtUpWZQzyiwZwa0vfbNe9qpdX9lLztzNMxeuEMLMZOM6XZOHjAGzktdK
U6xfVzHWrnQ4oyBu5f6KhSprEE7T9Vc14KgkrXB4Sc6KM+GxoT829Mf6vRi510aOR1pL1LaAVJpG
sEKTRGmZMU0cv/qa6T/+nOlXX0FdXxFiPOJ6yrjg+oGSZsQqWhN5HNf97nym6wd8KBhbsdxjrWX7
yZ9hWuHpf/lf0//g+9g/+GPiH/4rrk9b0p/8G24+PuXjL4Wqn3KaNpjdM16/eMkfbV5QSk8wSksR
5xw55lUspZZ5SRw2G3JZOPSO+3xmtI7ghPs50rtAnhf2BGxulOa5GjznlBAbQCvOwsYqY0wcBk9p
FeMsY0lct8IQDKcpYoPBPuyc9wKpVjZBOE4LTQ0BqGYllk0RmnO02JjVMKhhKtAZYVkSzRtMWSNB
U6t8OS2c8sR/88uf89OPN8Sb37Lcf6DLd0z3H2gt49NIKg2vjVzA2ML9FPkgyszCuSSCJPISqVSG
OPN1rXRtJi+RwQpdbWytY5NhXFY9wFk9RQxjsxx1dQCcxHGjhQ+lcbaOK9eTJKz/bygcOmGoQq6G
MWfGLEgwzCp4Z2hmbRKuJTbGEYAN0CP4WumcRx9YIgtwNoYPtdJZZfCB8jA9URsYcZyNRU2PDM9o
tuM2jcTXv6C8+Yi8/t8JT/8aZ7/l6jX0ZsIXZTwmdNtjqmdwGzZNMc2y00aaE6FTpGYyloDhoI5t
sExTxQaPt4FFDZ23fEyZ0jnmnFgUgreclsbgDTEW+q1jJ40lKltWZ8LeO9pcOSlsZQ06GrxFk+Kt
wFLJVdj4lbJmwgpwyaJ0wJINzTXeTmc+2xjOcaIlw7/2HeN8ppnyT43aIrQMJoDOun7vtNFMw3mh
5DVZTuu6py9AURhcIwho6PBhRz7fozn92eNJ+djQH+v3oOaWsD7i2kTLBeuUtJygM+vNve8ou4G7
fGJ0ws3f/RXlVMH24HuwHTVV/HagaVrBjGWkxRFblfzVDZ0G9PpLOtPoNwU9/t8r2GMaOQyei8Fz
uOo5fLHjZCNzEN7Wn3O/P3PbnbivfwevJuTTLW9ev+SYArMqJRa0OupU6U3PG+MI2WCy0C+rbzqX
wlTWaNLjNOKl8RTDjtXzm4vixbBvFrHCrJVZGuVB8HZmDdc5N+WgBorSi6MrjrkYaIYxry8sbZam
wkYcrTWMPASFOMhOGLUxGEswBicGawyJhgRD1oZxhqqFrRd2W8+53PJlmvhv333N37z9ini+4cPp
G3K943r6yKIRpTLXRm89qQpm6NFiKNJD5zlVJWw8UynshgueinAuyrbviLUwDD13ywkNlYutZa7g
rePjWHjR7XG5EZvhMnhyrdjecRcnqvdY4xlz5NWwJ80F5wc0Z66C54VV2mniB0MPY0alZ2vXmNow
WH52vsF5wynOuNATgvLb8xm73/HV+cxgLU90oRXl6cZyWibsxlLqTDHQO8dpabDt0Fa4OSuue8V0
OxH2PyGEJ5T2jsPTFwwvL3FPe35j7uBC8TmRjCAsRNcYBst1VIb9QF1G1Cje1nXlsBGmacIEi9aZ
GwpYOBXLEDrqVFe3giq5WTDKWCvJNlgiqVU2oVJKWW1qpTIG8NKYS1tFirVSrKKpEEuhc0qLK2hH
s6GIQx4u0U1WnUbRBW0zgwF18NXNPZmKpkrVRmlrmpzqGvSoqmuKo67UNdVVxFmrkJOSynqZCs7g
hx53+BRn9qRlIs7vf3j/q/9+eDwtHxv6Y/0+vNLztPLOe3DeY4YOMww0Nch2T/fkJcMf/gm6f8Zc
K/G0oGpg6JHNAOGBxmbsg10LSsuUUtBtR4mJph1xfEvTgtDhxbAZDtha2Wxge2nZfUfZ/KljfnLi
2+M/8L5d8NV9x3zxx+w+/YTD05fk3TPEC+eUUGtIJIah4yGqmuA6ck24vqOUyJXvuLSWuURe7Afm
FmlBmJnJ0th08H7O2OBJKSHWMVO5LoqGwG+XRBNHzJlZoTfKMSeuDp7dMuOsIWimIRw65Xac6Qe7
vpoVrGZOqbEbDLfjmeQMtMSild5WjqUybANlzpzVopqZiqHzPXdT41/s9tzGE//T9S2n24/cfvUt
IX/g/PaX5HjGLUdyjIipjDFjNoH300gVJWhjXirGCdOYOBthr5WcLYLlY1Ts4Ek1k72jkTmX9BA5
WrDWYGpiKZWNX61SwW+Yp0Z2A+eU+U1U7rXndhSM2XA/TSzNsA2GGvMqnkTAD9wsIwuVzeDwRbmv
ytyWB+RnI9eC7QOpJIzLbMuC1IZpmRYTvXOEfwTo5EoqhWbW5rREy/n4kvnDFt/+EO9+jNn+OZvt
K2TzHPvJC65DjxcDpeKMQC1YZbWEGWEkkdpMEcU2cNaSqyJiWEqBZrHNYRs8cQZTV+tm5zxWK71Z
VeSd8yxVSUbAyGrHcw5VJTihp4EqnYdYMvqQ/y52Fcido65+9WboOsEqK9rXAll40jlKVYpziLf8
7DwTnIW4juZF18t4sNBypXqQJlRds+A1NUK3UvJUGohZ4UYoamC7c/TDgakGWvGc779xrvHPH0/K
x4b+WL/jFQBzOxJ8j+8P0HV0z54jBNzuQOi3bJ48Y//8Nf2LN2y//6dkY2hGMN2AbAfsZiDOCfEr
yas5h7We6f4W7TuOv/0ZuezJ+SXprsdv/zkl3tBvHSYmLCODLwSfeXl1QbfdcfjRf07dXfHVx5nf
LAPF77j0e5b2gj4MyKJ0IrhYCSoMtXKeC9YbYl1hGk4baipPnCUuieoCmhpFAj4K59LhjOV2iRhj
2DQIRugsTKxAi7ktWO9XspoannrHFBvNWqwaLEJ52JVXs8a1JgtVMkkMrsGSGwEIWWlG8ao0MVRX
OOtMooGu8R5OGoHKK+f5dHPgv3r1nJ9sd1way0/HhXfHI19/8y3xww03769Z7j/SUmbJC2PO3NYF
I8rcGrFkjFFyaZxqRqgkJpxXjCaQwjkvGNtoVpmpqIGlZnyw3LaZZOEoMKVGMJ5trbzsBoLAwTZ2
vuecI7ves5DJznPtHIsRytZzNoV+o3TMeAND6Gi58MluYO9hFwJnzcwFng17ptPEy82GIB7swGVw
TKlyud1AKjizJvmNJbPtApqUOnS0L3a8e+K4Uc90nbD9Bc8vX2D6A7vnr9g9fc0P3/wx87Jh1Eac
b2mtsa+VdDrx6WCppxOds2xFuat5faXnyuVlzxQn7qlcPDS/zsBpmkmdp7aZM4rzlRgzgzO0MaHN
crCG81JotlJLQZzSzZljrvROmOMa+cucmBC6nGnnipPKMi1rLGupRDXYboXebLuO+2VCTMMb+B/n
kSdDoCwLWRtSoInBeJiToHYdrUtbG7uI0NbtEtoEVaVVoaqggB8E2wwlbmA2tPOEU/8YAfvY0B/r
d/7DlQeBTucImw1+dyBsL5DwDL+5xNodZrOnf/qc/skT9t/9Lt2rJ5huh/gN1m1w7kApZs14L4Y6
K6gnOUPuhOP8gaPccVbhdPuR+e6GeDxhTQ+mo0wgqcPXDRf2gqvNEzZP3hDPNxzrO05BaC2sFjgT
WAqIdRRjmTBct8pZDCdrOLe6esQfFD6iMLWMc47YFoLzUAtqLBsDc2686HqOLZFEGFtGxbDB0Grm
89DTysIhhNUa1mDvhFozJliWVvHOceEtHsfFJjAukWYdYgrZCa+GQJoTr7c7Ql7tTKrKnCuv+i3T
tHDRHegqaBE2xiJZ+PzyNYPt+NevX/PDqyv+Y1W+qsJffDjz98vMX337jl9++BKfvsbkD7zcF2S8
5Tv7nlci5JwJXki1cLXr6dOMM56dbSzTke/0Pe5c2JuebSyYWHjmKhfLwrMO/DTiWmCLYTwVemfJ
U8IHoZtnbIXPO0ebJs7ecVxG+k1HaZWvp0J0ga+OtzQHy3nCYRkU6u3MIWxYloVmt/wqLvzdPLMd
HN+eTkTjmcZKUg/SuF8y6oVzHGkGUq68q4AXNEbk4kB4uuG+CTd9x9dzJJvG5auXDJ+/5tn3P6f/
znf49I++w41e8VvpiE35GTMnHckFxBSSZqbQ48StDPPmaKXRqWGXlUtxDKrr+NpatDmKMQQxjMp6
oTONnCOuJqwotjUMglHDVBILlYXG3cMa52jgI41sLRPwPk68TSfOMQEKmh9e0QVNMHgLNJoxWOO4
zfCf+YHz8QYrI14rQkNolAjBG0oWElBEaVURs+rnjAGBf0qUa0Bz0Ewje0+3f05Vh/E7Ur5/FMY9
NvTH+l2vWhS7HXC7LaYP2K5DOk+46nEhYPuAcwHfBTavXjC8OjC8fI5/skU6S1VhGs9gDbElSs3g
DThDt7vAxoX9D/4cbGGuX3LuPnL77f9KdZWbv/m3tBIRXYgffoU1jUpmbxyokuoOW78LcYeIMLuC
CTNjSeTOkltiGwKuLRRtvAieEs88GyymZcQHNmXdUT7vNpxvRwYsxJXEBgtTSfSdMM4LzQpjjtyU
yhMjtHHhYDtCFmyDHEdizew2nnM8k7pGJWGsp7bM9ZRJUnANkjyElJSGF5jj2txbbizFU2slRsEb
QzlHYit4rUwRumYpc2UIHS/7C149e8knz19xIWvk7M/HyLYuTPmGD6d3nI9fc3fzLaaceFYXApXe
KhZH/5AVcOEDfa6UZFHrmK2niqFVz9kFclNu1vggspo1hhbDkjJbrThxGJSklYm65oFXoZTCoMK2
VnYtIIvwBZ6urZe757KhJcvGKb1TrjQxdI6RiPGBqo0L63neBT6OCy+G7Uojcxa1htsC/oH6NoSV
PJeDowTLXUkwBK4uL3n54oKLP9lxfd349j8UFr/j1ITNJ6/Yf/qaq89f4fbP2Rz29FlYNPHCBsRk
9nvlWGf8ZmWHR23svSHWyGHoWJbExdBxEGEqla0RUkpseovLjSzwwlny0jgESxDYbwc2D8CWnRMo
sAlbSA7fdRysZa6Vp31g0xTnDSFH3i+Rqok0L3S9YKtQRAhGWKqFvvF2majeMRlDQzkMln//4Vve
Hb+krxGL0itoUXxYha8iitP1ImkM1KQ0q+tErT283sva3GMzqHU4s6eOjhAGkrTHhv7Y0B/rd72K
eKQbMMZgvcNfHmCZCfse59yD7UuxAkPYQRS2rz/H2AEwyDlSpwWjhnyXSHczdToS85Gw75naQt3C
+XRLLUorT0nLJVU2zLd3TGdlfP8bzn/795RvF47fHLHWY5tF/BW37zybbU8fNsRa6VhRkjvj2JSC
k0ZXG9KEpbU1/1qFsSo3rdGkZzGGWZQ+dKhXMI2xKt54UoOohq3x9OLpJbA3AaWAdqvaWFbgxUYG
SuuJGXK2pGLYW8f2IR3uEDxNBSsGgxLE4gSm1tDOcVsL1a06g39kZ08l4zaBE4nbFrHSiLkSrGFa
EtU4agt81u/4Ty+fMlvDH2+FFmdek3hSZ3719ls+3L/j7du/p8oZy5EkC30Hx6JIcNzPM9l5rnqP
1MaLfmDMGe1Xr/WNFN70PbVELreeY56wnfC8KxRt+E3jejnje7/G4w6evjNMeWTfeXpdaF3Bycxk
M68uej7O9+A95MjgtxzUcVwiffDcnyeyMbxLE9Y7nomx9CwAACAASURBVA0D18uE3wqmZaopWCJo
5WLoOZ5PVOegRZCFrUTeHa8ptrIPHa+fv+DNd17A9oL6xWtu25b3L5+yhKeM/UtkeMGpbNmEC66P
I631XLS6vrZ9YRkXgt1yNS+k2Fhq5GZOeFe4mW442oZtiaUonraKAJ2BdF4jX9tCTIprBk2NSINS
+Fgzi2+cc8FYJaXEqI2NaaSodBhsLogtzNNHljwh8x11PFKJ1NZQDEEspRSyNFKrfD/0bCs8VUsw
ntsp8c34kRK/odQFSKso00EwZtW20CgIqoLK+rWhiCjlH0VyBpqFTWewfoB+T9HC1h5+1O5/7R5P
zMeG/li/yx+uB7EN1Yw4QBPGr0lVOINzDixQMprOOBqaJ5xzGAxlXKhTIt9N6NgwBQg9pu9otiCH
jtqDPnlFHF4xb3ekq+9xc3zH8ZC5ffcrjvGe6bnnNL5F28x4PGHGxJM3lp/8y6f85EdPePXqOcFv
mFJGjXKcRiKGWjMSHJYGKTH0HTEtdA56TYxtZmsDt9NE5wOtCtYEtgI04UXfMc8zg/cPeekOQTlX
x3bjyWkhhLAqkZ1l8I1YKof9gJNMMkqpC6Y5LoNlPmesCwyt4aylF4hVOXQOpsgu9PStULRw1RuO
54nDtidopvoBI8qUlc4L0xSpfsOTbs8h7OgvLrnGUbG8LwVpFWPhm3Hi9v7E3/z2Le/SGZPvSVKg
s3xbI+I65jGB95hSyIuyUY+PwuAD8f7MUi0XOcHtGY9S5kxzhnlJpFrZ+TVcpcPAeCLHhZ1Glini
rbCdG1tjCSWTqsG0QsiRXbAseWECogopW4ox2LImrh3aQmuZp1K5UsvOBSRnTBWsySQKvV8hIosx
ZJPJImSzhswsugb+bJ6+4dlnf8D2z17gfvyC0/aCyV2RzJ6zvWBhQ3Z7olg2pmeQgG0QqsVk2Jse
VysNgzcrIMd4y01a0+6agbPJYA2qlb03lJw5+J4Og6hjcEKuFTGekoVRhCEEltSwbiWlbbzlyhpS
LFwFQ46JinI/LrwbI/9uPPHfvf2GEgpW19+nZOZS2HqLGw0/6q+QLDwt8OM+8OVpYT8MTO/P/Prt
t5T7a/I8EUxD54YP+iAaXSNka604Dw9ZxajKSl0zSizgLYgT0uAxF8+J44gxZhCVP3o8MX//6/FW
9v/nD9dYNGZaqvhBaHPE7fbk0xkZApQVDGIlkKYRWyt6vFkhLkRSnaCvjF//HDYg1qIm44bnRDMT
LnbEJbPtLjFxYbodySj36T0OJXQbys17doeXLBzZmGfcfXlLCFueXxz47IuXbJ89ZffJpwg90+wI
+8BpHnm+3WCWgrUrK3wpymETOM0Tzgaknh8EYBO2OHznIaeV+tUyp+LYDJkcZ9z2gK2F2ix7W1mK
Q7oVbhIfEKVnLDubyCnhgsPRSKK0WqjNcaHyMPVQXMs42WBEKDRqa2xFyDUTpFCa0lphg6VVxVWQ
1rBY/gmKZZSijcEa6rCn63f8QXfgqWn8NBUGCn1RftEyWk6A5fndW55cFNzwBK+Zl37AqtJvtiwU
mlSstZSWVz9yjRycwUtjTEe6XpBSuAwdc1ZmEQ6m47QsvBw2+FI4hA3nVrmfEtuwYckzMnikFqox
XIglzfCy31NjYe8GUkqUVrgaekqeoRM6m9gZh6TMzTJzcdhynk6YIBSdKFl5EhzX5zPPDpfkeSRb
gzGGDwk+2wTm0y3Ve7bdlpYu6T//jPfLyMtPP8eWgWPpCL1wWzND5/l4PDFseyQn7qkM3nBaMq/2
B97ffaR1gQtf+flS6HvIZeFiu6OMM/dYXvXK7V3m5WHAxELylgssx0XY9MIyLWwuNrTzRHGeS6u8
Oxe6fl2z6OCxS6Q0i++Vr+MdXe/J17f81c0NP0sLphW6zUDAodZiYmJU2PqCZoP6QGnwfLvhu8y0
Unl+seFn31xT397Qy2+ow4EXzz9D25bWGUI1qF1XPDWtkbLa7BpbyyqQK1VIqhQrNN+QMODcJe0m
oitr9c+Av3s8NR9f6I/1O1qtKRorZEVzQueEpglpEUOlpQldZlpeKHc3xA/vSe+uyfe3pOlEThP5
fE07/wzx12C/xsg1QsZpZCOGgcDBdRy6PYf9M7ZXF7iL75I3rzk1xzhfMI8XnK9fcfeN5f6XljgG
Ll494dUffcrVF5/TdldEtycbQyyZ3llKKxgLogVDYesMpU7svSW0ShD7AEKRNZmsljXkpDWMOnox
5Nx4thmQWjHGMVApVTi4NSDFdJZUItZanK0kNWxCx3maELX06vBuQKxynyL7TYcphWYMYjKlrWrm
05zwXaCUQmrrTnTMmd3QM40j2Qq2VmJtuA6Oc6HrN+gyc5NX5vtl1/NnL5/y9034CiFJw7XC93vL
lDJblP/z/Q3/cHvHRZtxc+SFE2Ia2fUdx2nmOAtD53g/LYxiuR7PpMFTpoWPdyfUKON8g++ElE/Q
Q/aNd/NI6YRUE9dOKCUxImz7juMUUWOpKSK24yo0Wspc9QOaFi5cwOdEaEIzjhITIQSOY+KUO1Jy
jIvBOc9pnFFv6cSSWF0Yt6dEdQabMoM4XCuIWcVa18XwtetY1FK7S65ev2H37DX9q9fc1satFsa4
MJaEM42mwp0V7mthNh5VJVVPw1GioBiaJgJCzzqSr7XSx8ZQPbauQJOxNpZWGVVpqVGaIRahiCOW
QrHKbBpTLgS7TgNME7SsGNzeGLQWVCMfpmv+n5tf8z+fPjDNt/yrqzWbQbEr1Q3zwKGHzil7q/yL
Z1f8J1cX1LCl310wiiVvN8xO+eXpmg+3b/nqm/9ATO9Z7t+RywRN0Qa+N2iz+KFhnCCslrkS15S5
gqLW0AWoccLtXjHVBNY97tEfG/pj/U43dCe0wxa1hloSmEq5+4iQafMZKRHyQr7+CK2y3N2xnO6Z
Pl4zf1hf6vH0LW33hxR9gbgf4Df/jKI9wR4wWAYR9iFw0TleXvbsdz2bqy1FO3J0zOEZt9eROWXe
xY98wzXLwTJ8cslweIV/+jkLPXd2g1i4O09oJ5g6Ia4iNXFqCd9bru8ixgWoI1kNF6LUpdAFC9NE
sYHWGveqGKeclophoMRMQnCacA32Dsq00IxwkEoRxWjk3Bq+s5jYgI7QKhWh98qojS4YTMucTCVJ
5JrG2WTuY6FKz1QzRQ09lrkA3nI6L2B6RITFwGiFO2s4e8OH0kgqdCIc7Jbn+y1vS+RgG8EYvi2K
NY5ZG980+Msp8T8cI9N4R6oZtRkvKyozqKLGkoqSMBgLg3FkLcQc+WY+cZrfczPd82H+wLGcac5x
1AXjLBNKNoZqDbNkliAYk7gIHVYM3nhEDGNecapLTljjWbSsVBBjCax/h64t7K2ntVU0uOsGlmXG
GEPf1r3uYAxLjTzb7YjLQnbC4B1WDJfG4GrF756Rk3LEYro9ptvy2fNPoXWEbo9Xg2LZh55TLYSN
5WM+c28Ubx0ndQzdwIclErZXtGxYmuVJB61UDt3A/8vee+zMuuXnfb+V31DpC3vvs/cJnbsPyRZN
S7SCJQiWAcoTX4GHhu/HgC/B8NCCh4IBg6AFkhABkWKr3QxN9ukTeqcvVnjTyh7Uvogj4XuGNSkU
qmo97/r/nzDHQm40zlRCTuwaQ0oF2zpCCNySWTeCOSaMroSQKNriyjkhcG0VOQasU6QUmERmbQTz
cCD7hZ+/fsufPB54ON1yFw78y1c7asoIo5GhcgRaW86/VZvZ1MTvX1zx+5srytZx+eJjXmfL68vn
fOl67o0jC8Mv3p74en/PX/zyb3jz8A3ST4RlPLevLRUMKF3PJS5SUGM5P+B8IHiTC3VeUM6x1ECp
6onQnwj9Cd9qQpf6nAaXEstppNRIPhxI80TxC3lewHvmw4GUEsf9V4yHPfE0sUwDombEeovdXmMa
h3YbnN1gpaM1K0rwbJuO1iqaUmmzoJeGbdNgikLkFarr0DuN+c4l03AgvdAsTWR10bDq1hTTIVVD
FGfR2Tmw7SzJzfl8gxJVY4WiVYqxFoYiiKWicqWhUNKCcZpaPEJAromlelpdQURWTqBkJopKrIlA
QWuJIpMFZFGQFLbivINctQ0xZ1JW5BwpBXqpeFhmrNHoKohV0qkPKvPWMvoTW2Ox4ixGapXhMHlW
/YYQI0JKGgNKFtaNJsfIrunZWEdAcrKKb4bIJ6rjLhl+lSRFKX6eAteN5aMKOyLH04nT/kSjBTlk
Nn3P47Bnu+rZWkGMnhetw+TAqm2xecboRNNW/tev3/H/7E8c7w40VbPNEV0S184hhyMbUzHzcBZq
ScHdMJNbxxwT2vXs55HbGLjYON6PJ7BnwRaqo1GW4xxp25aHwYOVbOtCrIlt69nPD8iN4bAsRAwl
FsYpcLlSpOER10ikSHgZ6bXgdjhnH+RZcV8MBzL3WHK/wo8LxVkMiZwF26qZBoG1josx4bA8k5YU
K1lLhpAxXUNPQufMhYAyJjbCIo+ZUh2VwCkkrDuX51QrSHHhGAXOBITwtM6gqiKKii6ZSVqCrAzp
bHdzcNYA1IX3Yc/Phwf+9P6O+2HPd5eJ/04sbHtJJz9EJZV6bktL5/KUWBQWzcp2XK4u+ZfPvsMP
t8/57avv8g+2L3nRXbNbf4bqn+GuPiaYNaOUvBn33Bze4uc9aVoQMiPSWfEujUBSQQtyOQvmSqlk
oSjNilAqK/kRsorfqw9vxNOp+UToT/iWQimBMg2pnMVm/jARlkgeZsoQKD4RvYcM4+EIqsPnCZ9n
Yp2I6QbV3GFcwMlCazQOxcpoZPT0UiNrQoWMEZK6ZNqisafC9anhlXVcR9j1BtMV7KcfwaojOUFR
K6qxCCKNNphSWSo4bVmWwCIUIUWqUWyNJPiR9UqjwkSn9TmRrRScaxnnmVYrVPQ4qVnrikDSt5qT
P5BEoZLIVaEl7KeJvtMwJAQaETM5STplOC4JjCWXhawFvajkGLhuDcsy4pWgyZkcM72QzMHgnCWM
EV8rUUTuo6czleoPbHvJSn+IqBWFmBaedxIzH2m1wFbPlALD4ikPJ66rxM8LxWd8KQyx8oNWcl8C
bYp8Ejxvbh9xYaLuT0gKImZEqTgyYRK0yiDC2YtcQqHKjgd7ybtTZjV6Tre3TMdHuvSITYneZLpS
iRKsKkgjuRAgsyJIw5LON7tGOf62GLwoXOuM0NBbjReVSORBwaQEt1LyGklJAiugz5K1MPQFPpGK
RlRyTFjtSCnTaEkoUGLFKMeQJa3rmVJhlokDiqFCbQxQEbYjxcqpZqSUHHLFq7P9LSqFM5p9ChSt
ORQQ2hJiJAiDlBKfE6veccye0oCQAV8rXSuYosdqQQ6ebWN5ZSolKNbSMvuItOBq5ZQzz5qzxW3t
zklxUSsaLfj7aeZNiPwfb97y63lkroF9Dfx+a1nmDw+TJSGlpJWZJVV6bYlLxBiDFYpNs+OFvWYn
1/xg9wnfN1s+333Cy9VH2HbHj599iiyVF7tnON1yuxTeH8/EHsJCWc5lLtpVhBIoKygJRK0UBEtV
6LajhgHnWkopu6rU955OzSdCf8K3FFYByZDdFbUYwt5TqsFPmRgjaUz4IVOLxZ8ytV6QF4OfZkS8
h3Jg3f8UMd+g2eGMpZYFhSQvCWsd8hSQUeK8Rdwl9FxQQ+b6U8u20zx7dcmnn3+ftu3ZPrum22yx
jeNwyCxKE1PBF4GkMPhAZy1pWjD17A9f5oQ2ggVJEAIZFCk7RDRMqcVJiwyKUDWUs5e4SZDC+Wai
oodSsTGjamGjNUIIQhVkkSjSYAXEcr41uSqIQqCsItYCKoIwxJxopSYXaLTAiXMErFaFmcjOahYJ
lUwvQNXCyjaE5DFFYKRCZsmmGvycaKQlxkBNCp3P+e+bVcMkIaizFckieSYkD0Pit4TkB1mzxMQw
HDk9/oaNzXQ+srOWkiNDychO8xhnMIpx8Zim5+Vqx0+d43+63PLreeYX44n57h3vbt6y1QceHr5G
mYUUDhilWUlJzondylH8iaYzLGXEuMI/6Tu89wi3IedK0zQYGck58/mqPVek6o7LBMW2bJRj8JVV
s2MaA14ZqpAgK7uu4XgaUY3DFkVSDTZpXFFcuh4/RbRcsxPniNa1kRz8mYxLyigMWcDXeaJvM+N4
pO8cW1nIGVZI1BFeti1pORCUoEqBz9AoxWk8YlrNcTjhw4ec+3kmGcm4zIwkVjKy+JEsMod5QRhI
y4QvEiMTKZw7EvISWEThYTzw98c9t3FimiZ+bBquasG4wrOV4fZ44kDm0U88lsiyLBzniGFBziOq
RmSOjMXjqiQXiWklPR07fcFWWETp6axDs0GtLxCuJ1lL1pr3p1um+UQcZnLkfPVXgPzQjy7O3vQC
VDEgGSiyIGUF+bRHfyL0J3x7USWlbEhzT5okfjKkYEkLhAghZXw83x6jVkQhSFIS00JWGSHUuYtb
9mgtETVRzy0PyM5RSsbXmZIWShywdaFOAy6NNG5m85lm12tapbhebXnedewazcYUcj1S4w06B2QO
6CpYa8ccZnarlko+fwZRmJeFVkqmecZoi84Vg0TVwikEtHOc5plUFaUUplhYyco0LXS2Q5ZMVRpB
5uADa2OZ5wllDRRPFZWtS4wp0BuJCQsazuP8bGhU5TjNbF2HzImpagySY/RcWkWdPE1j2ZRCWs5r
h9EnnO1ZloUkDDtZz0UaonI4PFKl4CIOLP4RlY+Ehzd0KvPzcWRtFL+jDU2S/HPd8So3fCZXHH1F
lMoxe26HCbRnDidUoxHFQ0lsm8QcB/pWY9KCMw2NViAtz56/4C423EyKP3p34t99dceb27f89ddf
4o93LPsbSvYUfyKVgtSKNMGUHfdj5eA1jRCU+cNExkd8PdsZhwxZaB7nwOQELZksMkImHkKgyoqI
kYKkes+pinMDWzqHnMw+85AFU6nc58wiE5MP58l0jPggyUUwBcXyocv8VDO1nsVtlnO7nKgRlSoO
g6uFhnNiYo6Jqs5agFQbCgohOyqWdbbshEUlQSMbfC6oWqhCEeT5tzOSqKJQSkEJyVorcs50Vp+n
I0ZhY+ZxuCHGPX/2/i2qJi7wXAPfwfHu4OmNQQePFAlZF1IeMWrmMO1ZypE5PrKUI+SJOZ1otcB5
wcYKOpUoQrJtNcuc6ZsWHwKqwM6t0LZju3rGcbxnSkfKnMhzRQIlVJQ6l7nkXDE1IceIUGtE9Gc/
m+aJ0J8I/QnfViQ0xUEUM8M0UilMw0jwM7Uk5jThSUx+oEhBVpksCkodyP6PQb1jnv4Cs7kCeSLH
BEjSPGK0ZD59TcET68IS7shlJp/e02wELO8xBJqVgP09l63m0gk+udK04h2SW/LDuV3MihNSLuxs
xXuPcg0UQdb6HG9aM22jyWECJTAlYmRmozN+SWgrkSFjhKLnHI21NpIaA1lVck34LFBFEJPEacO0
RKoykM+2s1ISUyooKyFFZLXUXFhKQWlBzOeHC1UzvlZCTYSqEbKcRU5KY2tFVUUjBE2VoCIuZmLM
VDxjPLAPD9zs3/J2/5rD8TfcH7/m69u/5/XDN/zl4T2NTqzkWdAUayLXzEZmnhnJKwkvaqWkyuD9
2Z6mBFUkskwUVfFErLKEUtFSQRVkCa1r6eyGq2bFb6LiZ8s5Dvb07gEOJ9785i0cH1HTPb2KtLpQ
0szWGFZkrq2l43xzb6xjTAvOKHLNLES61nFMgY/XK65SYiOhlZmUZ646Q04jF2uLVglMBQn3IWDX
jmOcSQJ2UhGKotcdD0ulWIeUCi80Ukvu58BVL9iPe2QDjSgwBz6tBjEF+mbFMiX2KROr59F7Nr1k
HEdW6x19tvikkFZyP2au2pbkJ6am0HTnJMG+d+SccW2D8onBQ2MdYYlcdC3FR6RWXNhyDu/RhZM/
Ih18dXrN/36456s08JePR360ctxXidErquz4w+O5/W96fE8oAT++43R6j853PNx8Ra4Ty/4b9qcb
5tN77h7vsXlheHhNjQOkPXM9kMoD7+abD//re+YcaQQUaUmm5TYMPNaZEjwp5HPo04fn45zPCXIi
RvLpgG4KlfN+RognQv/PHU8+9P+iv11FMpIjJ4qYuRIrgp9p2xXFZ2IqZKGIuZxjSnNEOokIiZwW
KoolzbhOU2tLDeeYSVJGKEmMEVxLxTOphO0t5Te/pABKRczLBpUAX5HzRGsTLzcW9t8Q98+Ibsfi
1kizArEmC8NGK3wBJyq5ZBoq5IQPE50WKOkBA7WSs8eZhhAnWiWgJoQ8vx7KeYecauAcKVIIFKTR
DDmxbXuEkGgEhULOirVxPMwBpVq0EEihUSkToqBtW3ycaI2llkqpsNGCyRc2nWPJA9ppWlVYcsA1
MC0D1UmO+YE4ZlSu3B3vMDHxb95+zU9N4eNty88f9zQI/nyeedkZprnyBZHf1ppApjeGfY78aNMw
JzBGc9FZlvlEt33BcTkwVsvaSr4ZFq5dzzAu7Jqe1nt8Key6lt1xz3//8pJ/Gw/8WCm6Gvnru4Ef
WsnfDiMPZL4XCnp3wdX1mvvTgbbZQV1oXMt9mFCzYLtZcXdaMKsdNmaQGiUKd6Pnct1R5onQKOQc
OWZBayTz/shj3/ERFS0bdqZyN1W2u4bhcMDoFYGFWWaet5qHYeb5Zk04HKnaYCm8y4K2UTzejdTO
8kpI7mtFy0KIgX63we8Dd7Xnh06yiMJKQPALzvXIFIjCsdaaiQWkAJ8ZsaRcWbJFmkQqmUUoStEs
QlJSQMaKoiKqIqiCip78wRqXQmQYH7jZv6EsgdfTgpOFq8bxphS0sHwxRq5k4jg+MhRJUZUwnRCh
cpgzKkoeHk4cx4Hr9czoPZqGR7ewzAlRDKVYkpQMceI2KXI9Moc9F50k5CNWN5QPu/mSZooZqKKj
RoEShZQqQgpkrvjMORSKCXRzzodFPBH6E6E/4Vu7QzcZKWZQUBUEOZHbTFGRZQlUoZCl4kRDSRlr
VlAC6E/R4l9Tyg4rPMlXhDCQPWU+YNpLluEW666J0pKiwKgdPg+IV99hPL3GvXyJKUdKUAgrqD7Q
uoZ83HOpP2X0kO7f0TmH2H2Ea/R5t+nWnA6PNI1Dl8hUA8ZYljGhzJrjNHLZaRCZRGXbNnz5eMfa
9tSykAGlNHufuegt8jRh3AYDzMXQO8F+WHi2aZnnmeAcisKQ4bkTnAbJYhR99KSq2CrFY4KmFYz7
A7m75FolTkWxaIijYH3hmMOBqhSNKryfB1zbsr97jdqtOA17wjTQO8tp/8gzo7iZH9kHwXOTMWEh
KcFGRP5x1/FHKeLo+UHXcbsk2oueW1/4ZOtIc6Q1GnN9xakqevR5dVIs5EKrHEYqVLHkbPHxSKiK
a9Vy3VoqK37vveEqC0rKTPPEIQhqSfgT3OZKTpm+b5DFgPSERWBtx2VVSASiCNZaIchIClWArGA4
N5IdSqSpIESg2BadKhu5Q5ZKqQIcTB46axAxsdKKxmmsFjhR8CXRWckSRoysKCVIIbJzklNc0K2j
GMVjAXpDSDOta1iWia5t6JTE10rTWHyJbDZrlnwuQumUglxpnGGKHt20bHNhSYXeaFKKrG2PKoKk
PF1jCSVzserIuWIt5JRZkFybjsdwZDaKv715z9eHme0S+Ss/8XtakkbPRltGCget+LgV/G9v3vN7
2w7rZza1MM8ZETOXfc+X+5HWwe0hMMbE9+zMX76+56OLDelQ2DQNAbgZDqx213x5s2fbNIhx5DEk
dv2a4xCxTnB6uOF4aXix/YiaCtUpasxUJ6hVMgeFqy9Idz+DjyucJ1Avn07NJ0J/wrf1y5UKnUFP
GTEmfM50fUcZE9EpFOd0MyU1yWecAiMVE+psS8sPrFYvWE53IO3ZSz29xdprfDph1peYcUYbS/aC
6YsJ++lLHuU7LktElUdGBlr7gvj4np38hPrVn2GvW9pmw939l7SsWWSDtpJl0dCex4I+CTpRKVlj
nCYuEecMUmtSKrQ6kJNC1kCPJstyvkFJQ5szp2DBaWR1iKJo0AghkTmxk4a0BJywpKzPTVUfSklW
ppJFIotKVJVAIGDOvmu7ImaIWrGoikDQ94qpRKpUxJoxVIyR3I03RGbSYUAME/vjwld+wVUYlOV/
sB1rBaSGjxvJWAu/qzu0UvzrzYqtzFz0PcpXdpdbrrKgWoFt6jmyV3YYZVh8Bu3Y6kSOEWcMPgys
XU+sM0FJnBF4H2majlVa+K93G34RBpo80MlKrpmPHOg6c/IFKxKPN4JnVx8xPUTW6y06HnEatv2K
cZ5pmhWhFJI1xOjxi+fjzSWvj3fsTEP0AYukQxCnyKa3pNNE13TkGWwwZKMZDiO225BToGAwSXKo
ie9sLnn7+ECrFJulMgbBRaMYxsj19oq7t/fQNWw6xXtf6ZqGcQw0TQ8EYtb4mnlcKle9YbodWDrH
VVe5HwN9a3iYZvrecHw8opTi1Srzeu95cWFhPHKQlmuduJkzXaOZxwVnLITCvsDLPnP3cOJeRv50
/8BX+4FUMkNc+PRqwx/PCz/ZtPz97Oli4Tu7Nf/v3ZF1VBy854fWMMXCJiw8361YfOTCaB7DwoaC
rYZTjPwqB9TpyHU8E/opZJj3CAaK1TzkiY0sxHlhKpW2aFg843Qk+xHpHLXUs7peCaos6CpIpwmt
71HhGygvqOrF06H5ROhP+LZCKYUQmpIyOVqkqSAU1alzUlxJCJHQ5nyFd86gcyVFEAKEcQi7QjtH
ChmVG5T+LY5vD6i+QctCThLhLHJj6P6rTxm+eUdZdoSjpJYThUeCnqBecrz5Epl/G3U3U+uBTb+m
PB4xfUOqmb7vWU4nOlpqUQQp0BrGKeCcYY4DQgisUMQqaazmOI20nWbxI8Y4HOf99rUzBD+gW4cS
CQ8sOZOSYt02TMOMXDsMlZBgow0+SS5bx8P+gGgdjRAcQ2XdOpYYcLZlGzIlCDZK4WvgshUcT3eI
RpGmI1MYOeaF/eMjtUzMU2ZKia2SFKW5ai3BJRqMDAAAIABJREFUw0+vL3h/9Ki+Y+Msb04zn60c
x8PMxU5z2Thygc+er3icJi5fvOL942tOfc9PNxe8vT8h2pb4cCSvWg45cusXftK3LKcHri5fcrjb
c9KCtXEc72+xuy0hzlytV/zqfSKnzL/oHLfjyG81jrfeU+fIImf++O0dvycSJWuqzVyGNaOx7MSa
aQLWGpPPJHwXZ0DwmRPkIEirFls9WmtEKRwDyLVEpkrImk4lFqFpnTqnF8qKq4YcHU2NLLlipaDJ
iiIVRUBrLblGYjGcamWQgmtnidmjFWhdaIxmEdAUgbMNulR0A2NMiL5DVMmUzmU6k4hoq6iicOkg
CMmcAlorxpjQwtJIyxAqvbUMy4L9sOopqrLThtfDI0c8f/b4nr9eTgQqohauG/1BN1FgGmlL4Ee9
4W7e8097SZhmRMp0svKzmPjdbcO/OR34uJWUknkuK5LCm3ngZd9yfxqBs9d9KYHeaogj27blopWs
mxZjd9wtA7tux1xnxvUKpOF0umVVrzHGoXqFEoCRqDYT84SyF0zpyIbzROUJT4T+hG8pEpKse0Jr
mXXleuUIeUGFgOt64rRgjUEA7a5BLJGiKq1rSbPEWEUKESUV1UriHDFND6bDtZbxzV9jLz6l0T1z
LTTXPXMuuPoxhzd/h/NXuK5jGX6GfX7N8PM/pKkXuM1zmHraTz5jOM6ou4GDV2x+cMR4QWMcomZK
0oQw46uiXVnG/YG+7yF7QrVUXbhbEhdbRy2BVBRaQaDQOA1DIBqBTpFoFFUVjjWyVg5qIBfHukLM
CsW5P722ElHOoTKmVoIXrF3CJVBGoBXMSbDTghIrJc+U5chCxxD2hPGRhwx5mDCmQilcKsvzpuN5
U9l2Hb4K3GbNlUkkbdCu8Ewptrs1xhzoV44UK0uRUBVNt6GKws5tGKTgWBKLKJT5iEuJfFjoysKq
ZlI+Ykvkbv81x3lG25apJmx1nE4LQ/b8Ko18ISKfdo4v88J133GfClSL1XDjI0MN/Id3nu92HRda
cLRHanPFraz49SVCeKTlLHqrAmEc9/cnts6RysKFNRyTR+TC5a5nmI80naHaQkiVqhOpZlablsFn
qrQYXfG1sLMtp+NM7zSN1GQqWggePFxuG96PA7YxLDkji2RtexYf2KxXLKeRkxBcyML7JRGMQcWI
a6HNMBaNVXDymXXryMcJZMuVkoRcWDWGu2VktV3RPQyMxnK9MRzCjOp6fJwwzqKK572P/LpG/v3D
HY0ITHhUWviDdc8vxyO/v254UyaeOcUhzUxL4vPtml9PE98zhnvvmXPgmVrzh8vEVWv4oznx065l
8HAIlevnK/7ybuKnzZr3RQI9QhdKXvju1Ue0omCaHRt7SWTDbnXB3TSS22tu9gOHxz3fk4re7tCt
piDOqxJ9drQIcUXOhpJBhPR0aD4R+hO+rchUhDNICVYUKpGaPEpAWSB7jRYKlKJdr4jyiMgKqqRS
0WhCTKhmhZCCwpEqKjVGSs3kcaQ2gdqBQCGUxKw7nNDk5Tl1VpRU8eE5cVDs7Q71N++5/skP6J59
l9Y5wjwT7o5MKWEPPc1lRxYTSjUMqSCtZCUVKfnzuLMIqtJQCj4JVo07+6KlRUmwSLQQxBIQzhBj
RChNTIKlajbGUUNFGYPKCaEMVlfGEll1DXfzibZzyJrxpbJ1jlAEutH4GMhasDKSKY9EIrc3B8Y8
IJcBVxNDUhyPE5+sVqSYaXrFqjUobembDoXkWbdmGo7UxrHrVzxOBy53W2oObLYrpjyBNLiu5fa4
5+PNFTf3d1gJ3zeS+X6i1YV//3jAWNgfZ55LwSun+OrG86rXHCNII7mdTzyWzOfbLV/cHfn4Ysef
H0aeA5eiMlGxWvE+FDat4ZslcJ8D19bwOnheOcmXD+9Z9yuepcAxBq4+3nLYz4h+g84JoSRWVpbg
uVptOJ0OZCVps2BZHKvOEsIjsVUsYUYISWcq+6C4XLek4Y7oDK5kcq5sHezHRNdplmGmaEvjFIuo
7JwgnRY6t0LGSo6CKCtTkhgUd0ug61YYKrKCVueeeiE1IhS8qBgpz21krUTWSgGgnst4tCYgyLky
k7FCIIvHCYEWEicsvsAUI7fe87OHI3U49w3YBP9UKr4vKx/1jnci8U2K7KRkqIKfWs1aWRbpuXSK
VOGywD4H/pmTvC6Je5lwRvGIxjYGb3suty3XXc+ExEpITLx0O9bdGiEEq+YFEsvaFnQ1vOqe8WYZ
UI1D18jBe4wq2FDQRmG0ZMwCXEcwlU1ziZSWkurToflE6E/41o7cRUHWGSVGtA6QZwSemidS9gjZ
Uqqk7XeUOGNWLfhEHDJaCqqPuKZHyA/+xmaN9wu60Uz3bymyI5XMfDjgthviOLI2lenhxKbrqCWT
6wpTf8D49YGcv0sYem5/8TU/+l/+MV4X2tWKw2lG6Mz0uOBeJGQMJLchCM8+JrZdw7IM1MYSQ0TR
ocgMS+J6s2KcThShsahz4psRTGGmXV+wPByJxiIV3CyZXRU0y4zr+7MfGolRgZIDjWl4Ny30TU8r
BAlFqypTLDR9yzIu+KZhIzL7AoOAL949YHVA18Dz9ZpP11tUUnx0ec3taaKzhm3b8BACrumZlpHW
GmKY0W1PrkdKXJhNQswLtBY1ekKqLEvB7488FM8Xh4FFwz+wimmo/KoW/mx/5PvO8h9Oe/6R03RG
cRwW+kVRi0JqxbFU3paKDpW/nT05FurhxI9L5UrCLBRSCw65MqjKa135JlXGDEeR+ZvRk0rm+z4i
1oVtr2kPb1l8S98KBIpRFDKKpmmIJVL1uaKTUrHNOcRo4xp8KQghyELga6HXmhwSUhi00AgBjTUs
MdE2hpgqwkiUMfjquXYWvOc7zYqlQEUijCQkz4t2xWn0aG3plWRMhc4aQoG+bYnTgsiwbeE4nnBa
kqYRaStrkTnW83sf55GPug3MHiEVO62ZpoKUDcscafqWaZx4P5wYFfzlm/eshOAuFD6WhU+d4WfH
kd+66DmNM/+wMbhY+SIV1uueP9kPpE7zVT0TulSW//t95n9+tWM4TLxqd3zm1jgl+dFqBdLx448v
meaFj90GIyO3YeT7u2fEMGFdz1r0LFVw6RRzhq5TXIeGpWnZiIIPM2hD9pXanfVvGQ3akE43GPMT
qmwRwj0dmk+E/oRvK4w4h36ISdNJRVn2YBqIb0G9ReofUatAyzV5DriLZyQqef+IbjR5njFNQ1kC
tdNY3bPceaQ2TL6BqzUhKswJTPZkGWhedEh1xNgVerNhWjypsXifmbNjWq2x3S1xvUKvNxhn0Y8z
Zc4sWVCyPE8B8BQBWhpyPvu7axV0UiFLJtSAlYIaAypFjHWYokm1UFJEVkmuZzFTUoIsAo0pSD60
TolMVRU+jHmt0oSc2BjLUguzkKBgzpHOGFJKrKwliEIWEijkNLJd2fO4vyqadoVpOz4yG7QR7LRC
FBBCsLYN0zBgrePucM8pFnoTmZeZXAqn++OHiNsJUiSGE49TYNKZv75P7HPicSn8PAdeVccfThOf
Vc2SJr6bPbuYGH1hUwW/3o88tw0D5/f+rlL88m5kYwRf3p+wVF6XxN8lz8eN5M9jphGSxRcMln/U
av5qKXzetLybFzolebsE7uKJ/yZD9pGLq48RyyNFd7QZ7pfE8+sdf/ybr/jR7hKfMkmAtXAz7Pnx
5oqb4wMb55hr5RAE398qlv2Jdr1mXCYm3bNRhW/mwHcuNrx9f0Nuer4nM4cx82xtmE4Vs3bk4QjS
shGCm2Oh6SUcA6vOsFKFYS6snea0RNat5CHOTFjWKnHInlXXUqdIdpYVitvg+bSz5PGcBJjGykka
rozidlHIVcXERHKKX97cgV+4FxMsE88aw0lmnIO/MfCuSkxV/FlI/MGq55uY+LtieSklf1cSn1bB
L8eZ39aWH2VJr2BnW/7VVUu/e46tmq1subYNE4J1c4Epkeo6mrqwFR1KdgjbIJU9z9KkIpaEEQrx
QYNgtaGj0CmDMgppBIVzimJRhRAmBFDLeXcudPN0aD4R+hO+tSP3rH2pylHdB+tZi6kGtf6ccHxN
qo8IaQnLEd20VAHCCEzbQQxY1yKKQEp5VojHSNO0LD6TTg35dcU8P0emTm8D+hNJmgeULsAbTPsD
rFIElbDf3zD/4iuOF5cYXnJIjvXFS3BrOjOyngPVWeYlg1GIWHECpKpIkShOM5xOrPqGJDIlC4yy
3MwHLmxHrRAECCe4WyIXrSGcZtA9Lhemanmlz9WYqm9YppnqDE2N1FJprWKIntY4hJ+QtkXKyBwS
m9YwzBN922HzxCkopBAUD692O94eBC/bK541lnEpbDvDaRnp2pb9m685WEHuGv703Wv+yW7Nv72/
53Nt0VnwcFj4YS/5/273/IurLX/x8Mh3qyXbysPo8Vbwp/PEp33LISduThPPVwIzBT6xhce48NvW
EFPkfclcW8WjCmyV4O8Wz6WQ/MQ1TGHhpXI8INjVwntRkUi+37RMp5mXVvPFkgkUjOt4jCcmLXl0
gisNx5jJceZmlvxyTPxulbBd6LbPMOLcxLaQ+NgZSlYM5VwN+i5lnhvLqWaMANy5ilWajvtSWQmD
zx4UlBKYS2Br9Tm730iSKOQCnZXEkhFaEWPEVEGu4Eth3chzb7urWBHZh4LVjn1KTBKOKVONRgI+
w8Zask8YpbFFsojElTGEEGiNJKVE01qqyowkuk4Sc2RjDWUZyOnIb8rC//n+N6AjkOkoPK+Kr6fE
51LzZpz4TFtiKDzkyk9aQYgL/8Iq7r3nh1rzjMyF1fzz59esZMfVs4/JpqWIhlhBVfis3XIKI9oq
rKmUJNnahlQEnXXnYCQJWkjmIOlbgQyCzlqqPGsM2kai6/m/UYBcKjkFpps9fWmZp1tUiqjmaeT+
nzuekuL+C0agPkahSDYy5opQW2ItHJfIojKRE0po0uMXqJqocyRbRW0l4zSBtvhpBGsR4hx1KYxi
SR75TOC7iawTdiuZ0pFcItP7h7O62V6TUqBZ91QBtrGI9Yq0UfhXBi8V0RiOboe4foG7fM7m1SuS
NBQBpUZKrfSNYAoeZQ1N1jxWTUwSHzLOwkZKlCwIMrFIcj4neWm7okZDCPKsWK5gSqCtFSsrikCt
BSsKSZx3t6IqFgRrDB0NCo2QLbFIGmWZU4VqcbKFpOho+ai75pP+glYp5hxJaWAZHzBp5qv7L5n9
A/gHpttf8b0wM9/e8s8Gj9ufsDc36NPAL96/57hMfHNzj/ABsXjSKRCWyOwjZfb8YjzyOgysVOKw
HPmh9HxHRv6hkxz8RCyZrRI8xsws4JtSORjFW6X4vwZPUpr/6DMyFb6nLSEkPtGWEAofKUWbBK5K
vFD8J59orOUmJ0qWLBF+ICSf1socF56LzMPyyGk58jg8cjOceL7qicPCrt/htGAjNb0WfITgWb/m
i/0DrbPUAla1oBJh8azWDWX26CTYoCBBKyQxeBpnaEQg5QWnMyGOrFvIw4GUBVYUcgpcNBLjZ1bW
0KSKjtBKOAwHXhpNHQeEMqyFYBzO1a7JJ1xrMMFz7wNXRlOW5eyvT5FiFTItBJ9ZO8UyFxYl+Ku7
3/CLceY/Pt4gx5kfG7jNM79zITjKhcTM59eOX+eR503lkcCFyVzKyJ8cRy5bxxQyt7XwyWrFy2fX
fPL8E6T+iGquceoSrXdc6hVCtGhbIQ2EukA6krJnI8U57c0ZJJokzDnoqUqklOScSSLj1LlGVwhB
keeo3VKh1ooqIKKCdIB6QsgC5UkU90ToT/j27tBl3QudkQpyDQiZ0QisbVBiQ5zvoJ4taTUWaigo
X5HCoEwL9dziRfLIlJAGtFXoDrJayHakNgWxMqhPVkQO5OOX5If3yGmPFAJCpG8ca2N5/uyStc5c
PVc8Hu8Z40xsPIOphM2WQ5Ik0xHKWahlSCzzicZIip9RTqHz+TP0SuPnhdZYZEpoKr0JWCprpYl+
RvQCwYBUiY2rIAtKZw7DAWMbNlITS6VViqXCxjXsl5lZWpCVnAROQ0wVbRwxBOZsQQVOybNbdSzz
EaNgSXven25Z4pHbxzdM/o6b12+5Pxw5ToH/9G5g9J43p4l9DpTqeZgWNjXwjc88Q+DDwlUqyFSY
p8grYVhFwf+4WvEZ8DsCvqcFsmReFsG4RFQ531Q1mUstmHPkIy0IQtALyWMVPOaG76sV+1hZa8MX
i+c7VfLjkmmC5zlwnwI9hcFnHmPlv3U9MSo+F5aLZCC0fE+2dAtc5MxXhwP/7s1vuH37NafpASsn
mCayEugcaJSgLxIZy3lVEQpDdRyrIBT4REkuClhdaUtgyREnPCInnM4UKkIrmgqhCEKtLItGSQNL
IRbFSp7TABEFkaETBsrAyhSaEngpNYaEERUhC1NOCPFBJKoVc8k0GqiayoKuCepCpwuiFlwRGC3Q
AjZOcrcM7P3I3x+P/OrxwArBS1X4XMLHIdMlzx84xRA8Tam8D4FeZv5/9t7kx/I1vfP6vONvOkOc
mDIj7715pxpcLruq3HZ30bLplltt5AUSYtGwRCxws+NPYYl6gwDREupGYAlbbssIDxhju3C5qsuu
ur5j3psZmRnjmX7jO7I4tUEMcptGKqH4bmJ94uh8H73P8x0WZK5Gz3tacz8OTErx/nLB0/NzVsdP
MPUF8+X54cMoTaUEXU4kk1gPHb2Y6IZrLu+vGIYb2u6GuVKY3qOEOPTQu0hjIXigFIgMySeMPDhV
hAICyJAByTRIZFmSly2FXSCVBewDaT4M9Af8xH65Im90mJAhsqwaVPYoo6iqArTAzB4zxjuSOMHt
Arl1SAd511MYge96pNHgAsH5wyreBSrbYCZLtThGKMVIRD+umZIjz84Yu8+JYcRIe3ilV3MKXbCo
Gt54+4RqjNQe2v2GNO3xSSKKgn1MpGJGQuHRh6pLV1AoyTg4ykqwkocIVZ0VfrKgSvadJMU5Ohh8
kBgMvssUtqESiRgdUo646A4paySU0KgUEVkRvGA/xkMvuQ9sFOyCJ+RDZ0VMnmwy+I4oHJmRKeyZ
wsCuW9PHnuftjvFuy3694fVNS9+O/HHvGGLmZe8RInMEtClyViluibwkYkzm66XgvUpilGRlCoTO
lLpAliV7o2nKBicKtCh5Ry+YpZp3bEMWFiUk2hqSlmQpEEZTa8tKKkTUvKML3hAaETLLDBsfuU+C
tZL8KCd+lDNfpMBWJD4j0klPqRzPw3BoDwNGIfk0Rf4qwwupeeYD25zZ+IHf3q95ubnj8uYzSjsi
Q4sXmSAU+5jRqmS973jaLDnxmYuQOCWRpsCssmzbPQLFQgr6mMha0LkRIRUpRHyULLUl94FVoWl3
O8p5ybzKrGNEFZqt96ha04cWIRVZSEYyRW3oQkDUBZ2f6ERkNjfsvKMoKvSU2QvJqlTc9ZGyqJm8
A62QbsJJydwoxtGRTCK3a67bluwHcj/xdyuDmiZ+Til6lznKBa+F4I86x5dnFbchMwjN65C5nhJf
QnM+Kf6D80f822dPqJszzmePGLxhsVySvDhk8JPp00HncXf7gq7b8sXLz/ni8kP83WfsN5/TWI9M
ES/ASkEkk4l4H8hKoH3CpQw5kHw6+OenTEiQUmKKglJa5LhFKgUk0A916A839Af8xKKAjREaOxU0
WhH3kbIpybakNMekfILr78jS4pzHthO6DvihRzclkYwKkZQySmoYD4lqShlSWmNKBWNCzBSysOR6
hmCFv/8+5eOGTERlgc2ZLkXK4FmOMC8VyifSzRbRHJMXNcIMSA41qkiJy55MIqlEyAFjBWOOGJEP
YrYsqYqDgM4oTcoehEQgGFNG25Ld1NNIgxcwJYUUEhcSSh/sbFkalDLsnacuLC4mToqGyUcqU5BE
ph8dM2PYbu+wOeLDntthB8Hzqr+lzoG7+zXGTUwpoqSinCtalfiZsxVEx7nWvFvXhCnwdiMYU6K2
M95jYgyRt5WgcIFHc4l3Ai0UIkmiEHxFN/Qp8cuLirtp4JHWXNhIdhPv1wVTCryZLEElnk2Jc1Ow
cZ5CQZ0z3TjxS1XFp37gG4XkOkaeSMEUMylJnhaaH7qRE6N4GQIqwYnW3E+Bb1nDbsoH0dcw8Wdh
5Ouzgk9Gz7EU1EjW0TMOLX/wfOBXvqrJbYmeXTADSJKjpmSzd8yr6qDi1xoVI/fjSFGV3Lc9y9kK
EyObUaBLAy5ysphxt9ky5YLGJIgCKQTtFBDNDIaRNhUs5tA6ybyqWG9vSZXhSBR0k+OoNLSjYxSa
6ANrpTlWsI6B0xLcJA45AMExOsGsFLQhIpTAuRaKAk1kCCM3BC7bDd9vOz4btmjtedsEPhkdVVPw
xZR5nTXJZy5z4oSSTgTuIzwfIxdZ8GReIkXF8vgNytkZ3hwdEldtTZQQpUVLjdASlRIv2z1jt+MH
w57n9/f0/ci2t/ziBZAmjJoThcCnSMry8ALPwBRIeDQK7yOITPIJZdRBJxMkUnnStEenQPa7w+CX
DwP9YaA/4CcWAbXB1phaE57tUVahskJWJSkKht2Irk6I7o7sL/GhQMUKM6tIIaC1wbU9VkWU1oR+
gy1qppyobcn2i0toHoFpmPyIXsyZrn+IlIo4aty+xR4dA4myNtz9xefEDqq3nuJe7VBBkhZralMw
JseyWtH3O6I0FBLacFi9h1GgTU3bt/RSMxOCYQosyhq3a4nWooVnlwRJC1xsOZ8f0d7vyNWcOmu6
MaGNwU2Coqmgm3BKU2mBz5m5OnRaV2VBdi1TMpQiM/qMLhMvX16xsiX7wdPtd9hC0I8DTdWQo8NW
mrOiOuS/VwXdmPnF1RFtv2XMgmVpuVlvePd4wW4/YEvJGynR9yONVezXI01jmfoJUxqWtuTlfsds
NmM7jSxrzWk3YqTiyVHBs1c3rI4qXrcjaookHVA5sqgUn7YtT6VAJM+RAikV11HglOU6+oOnWmZK
ETnXkg+d55EU3BtBJRQrKfExEUOmyAmbHcdSsheHTIC5gveE5HaIfClJgnfsguAvX1zxdrWiKhfU
UqKNRsYJW4BTnk4FpNaUOWFLQ0qRUmhUTkgpKErJQET8OPFN2YJCKIJOiLpgMoKyqbmPPbWAptLE
7CiMxuWMqWqSlkijqXNmdJlSW7RPLKhZGgUucmpKsk8sy4bbacBLTV0bdm6gNPVB51bV+JxwgC01
V7evufZ7tmEEN/JLleJF3/Jmodj4nlWGe+DFlPj7i4rLqedcS4Q/xAH/8nzGsppz9uQplZozmWNS
lkxBMK8z3ZiQVtAIiAkMnut2wMXMP7/doMeROjl8N/Jte0LbthTzAh0MLinIjtvdjkeLOWG3wVlN
pUo2w8BKaaRvUSdLlDO4DEY7Qtjg3YC7v8U83iPz8QNpPgz0B/ykwmc2GEuuBTvhOK4apJSYxQxp
lkzdNVlbhqt7ZkePQWqG9S12dkRUGa0s3e4ecqYUFdEN6FlNzBp9/ojps1f0t3eod04RqMOKU50j
XIu+ntBqTnNicTlj5yV5/TkmnlIrhRg9phtR7T3FXDGEE0RRo92EqyxSSrISqBhITuFtJLmJsdKU
CITMIOOhvtQmgptAabSElCIIT1UcErByTlhlmaInATaBMZJ88JRRCbBZIPWhia2RhiwSLnpEcnR9
hwsHJXZBj1aZEBMXumJR1qQQKeuaI1MxxIi0BVYaZGHIQfBoNkfgOJUNi6rhqIxc5EiZHXmWidFT
q0RSGaH3mLqmKmoe1dXB8rZckHOitAPKVhgtOT5TaGM5tYl+HJjCyLuNpZ96viUM2ieOTaIQgt4L
vlTXfDh6TqShyp42J46N4rvOc2QUL1JECUljNNdh5ImyfO5Hsg+UynKH4lGp+GwM/IxW+EnxSGWu
g2PvJt6xhj97ec3sTHBqS8a5AlOxGxzL4xNe7df4UlNkxxAnaqsJw47jZUM/TLRSYYqS+8FxsZxx
3baUWiKF53X0NEbTDT1fXj1md7thJzNPy4qX7Y6maEj9lmZWY/zAZkwcWc3dzrM8auidY6vgHaO4
asHUBdt2JBxDdgkfMo9OBZ9eDzyeVZTTxFhWVHniykeEgu+8viPmkdh2kAJ/e37EH+x3NGXBB6Pj
K9YifSSLzDJG/sfB8c15Q5Ek35jN+Or5McqsOF6ek50kygIdA04YSEBKZCMQMRC0IOZAbRVtJ8lt
5LGx/EKZuYo9IThC7hF5gYojkZrR7xj8Na/Xt5RTT5o1xGgY/IiVAqUa4liTcwZlydOESwLvztm/
fE799BXUJw+k+XBDf8BPKoQQG5iIZMyPo08zESElQiRUUSIDaHOM1CtSCAihyMMAKRPjoXg0+Ex/
fY0wlpwTRWnQWaAshOGK2B1W4rK0MDumK95m9+IK6ooYIzIJ8n5g9sbPo27mjH/0ChOAcULuW8L1
LYx3xO41uQhoOZJEwogMCcoyIFxLUSpWJhOFw1pJTJ6qbJDdgNUClWGaArWqGfpAYUqE8KAySmWm
5KiqAhcmspKI7BgnT6UULjrKSpFjjxCCUmb2ydFpz1274bSxGBnRQjObN0yyYjw6514VhLMn1PMT
RlFS1CtctNRHR9xPE1U9Y17WTGhmRys2OUGz4jIInoUC2RxxGwTVyQlZFhTLR6ii5NZ5QnPEX7pA
sjV/0nqu8wKKIy73CXP0mJ1qsIsnOLHC2hPefPQUXZQ8OjvnZHXM6tEJ8zceI1cz3nv7gvVsyVur
Jb6sMUJxrCz4zCNlkSjeMgULoaiy4GtWcZIy7xvD4BMmRlIC5zyVEKyTp7ESYQUf5wlfCD4OHeOw
ww17WteicodUPZXNB8FZktQoCqHQ2eCiJsuCFAVJlSQ0UmpizlReUgjFkcycS80yZRZSEoKjSBqp
Lbvco5QixBEpNSoIUhKIqNCxQEnLGDIuZbyCm+SZysx1diQjgMxEQFcaFwJ1qXEpkrSmEIdWOanh
Zbfh8zDy4bAlSc+/1RRc9jueCkHvPCuYzsMXAAAgAElEQVQEhTDcRMnfMXPugsAGyWzMfLsq+Hce
n3PcLHj79D3qVGF0TSEFCU2hMq2DIGHf7+lw6KzQ0jBbNHzsAhLFCsvLPmNdwdgFLJCHWzwtxJa+
v2Xwez68/Csuuyty95L9/jn4O27uvsDHHaG/xvstwg9Et0c3kuSOaJ/vEX2P328eSPPhhf6An1QY
wa7QBUrNSGaO7ycSHpk0Lk4UC8M4RJrTBSkOxBjRucBPEqMLBucRtmZiRxgddhBIIyhXSyKOwT5m
HCT9buLxbEFXQBCa/mqDGQQMklaMzI9WTINHHq/wF5GYLPVRQffFhkJJRM7MomDcBca3FTpKgpSU
WrN2A3VzxG59j1YVixBpssUoya4LB6+8EIzJYGw6NLEpgxscrsoUOrHOgkZ6chZYo9BO41RCGsUY
EqVV9E6hSPRAAM51pJ08WWWUrSjtMXHoSEpSVg2WgfPZEjdNyMJSk+mkZFCCnesoBNjiINAyUqCV
JQrFsWmIKXBRVrTJMKmELGZMQmGain2OkB19cqQxMlOZwXec6IxSjn7bU2VNmiaOTUUlLXW9oJOe
FsF8dUbSoItAsIo+Bo6KBiL84ik81YnbXvOH28StG5nZknXwFPFQoSpj5C0Bl84TtWYnEmMS/Ky1
jAHe1IJiyMwz1FpSxMT7SH606/h7pWK/33MJvGMFbqo5f/wWQ7+hLgtGmemiICnLGBNHR0tetx3a
wLLQbH3gUamQk6OcG1w3kErJkW3YdRseV8e4rqeoD6eSIUeKomDoJxZlSd8PRCVpSsswTVQN3IcR
W0iOcex95qSaIfqJRblg7EY6mTmXiftBoOyS6/2OZlEzDT2DzCyN4b99fskYPG3bcxYje5F4JDQX
teXX9y3vlwUfTwM2ZN4pFH+081xkxVHKvH36mMerc/pcYJslt5sWUdXoMRz+F3ngdhdZrTTx+jnj
0Sknp4YdCZTmYzfyeGV5PbRIqfk3beaHmz1fFRMiDoy5RonETXfNxjk+22zo5Qxyx3WCt5qG7V3H
adUi2lvU6gJbGsgBUZaMGfyLP2GcfhXiv7ptLaX0nwgh/jHw+8Dvkfl9IcXrB/Z9eKE/4F/7DT2v
lakolitssyCMHhcycdiTzYhcCGSVMWXGSEOSCnRJlBF0RJUJXUtSMbB7+RuE+zsm1xJzQAiBaBrC
ck/e3yLGTK0K5vMGOS6Yrte4eEsYXzHlLT6vETOHeGfE1Z8ydNeYcE1VWIobh7jcUdy3qKsb9LSn
ygEdMioohj7QsEDmgjEIJiLr0KNKwTjtEVpB8mQfaIBuaNEaJIouCqwUDD5RGMs4OLKVTNNAGx1a
SwY3USjoxoFGzVgiaR3UqkJGy6P6FJkUys45m62QSXMxW0BMzOoGGQLbGFmVNXmceFzWFD5xXiw4
NQVdyMzLAkKgLAtUPCTTXViJ6hMnuqYKkrldghd8ej8ho+Q7r66RLvLsbo+aJj7drPnj6xtk2pO3
t1R5BLejLjVnyyUxaJQ9RaSKWX1CiaWxM7568iZGZn7hjQtWiwVPTk75qbNHPKnPuFic8ae55BNR
8Uk23CXJNmaejY5aROqYmYvEj7qR7w6exmr+xTSwVYLPo+cFmaUVFNnzBEE79jzftFy+vOaL9Y69
2zJ1iaQXuBB5LRLPY+J5N3FUlsRpZFHXeDxTjFQ5UzpHVVrWfs/oIceEnzRjSAQXSVpic4AUsRy8
6EZDDBODKhhzZp89QUOZMjNjKZ1iHEuE0lwOgjaCCplaVhSAJCHJNEohCoFQI3ep58rveT0OMI6I
3nGhJL3PbFxAkKhQ1NlwgeZxVlyNkbcp+ZXqiL938pgn88dYc4K2x/gpYHWBmyIhJGL0XLZbEhu+
//mP+PjmJVN7RQodSw0nIvMfPZqj1QTWcVpGdsLRh4n15jkxeoyQDFPLy27kD1/esXWH09SP7jYs
RWTdb3Fq5OOrz3je3TF1O9z0Cj335LqnW1lc8TZ391u0Wf0r8UuX86+NQvynI3zNwX/cw3/TwatX
m/zyi6vwzz574X7t5V1+74GJHwb6A/51fLlRbJQumM1qTOgpaoUUa6abHyLjiBhGKl3inCNwEJ4l
fwhmcd1w8KGLSAolVD/N1bO/JI+enDzNiWW5zCjvkeKONuzIylFpwfG332V8NPHqo/8FJQt8N2Bj
gR0zZa6xs3foPmsRekHSjqQDxJapf0Xz+pp+c4/Vh43Boq4ONiatsESEECiVydGjTGCcWrRMFAq8
P4TIpCmjtcXv9ySvqRGkKVMIRYwZryRBZDKGmZRkn5Eikb0jy0gZPTYZFtJSBMm8rCHArGiwQjEl
idCGKUlQhhgjXhgSmeAFSR4qa6VQ+JDpHBAFYUpkIUhTi48ZIyLT6BECTAwURtCNI3/eR/7g5orf
un7J762v+PPb1/zh1TUf3dzw/etbfnB3y/O7O7phjwyOLAWGRKkKojYgDM7W5Fwg5YyAZNmcIsoZ
s+oY5qcs5qc8Ob7gq0/f5q2TU07mS7ayIEpLKTUXP85irzS8oQVnFp6YzIDnxEiMjDjgSCqMspyW
FW1K7GXEZM/H/Z6123G/vsFITwg7lghOpeEEwZOqYdMPzGxNPyWaqFgJRd9NGFsy9T2VtDSFoc0T
oskEImJmGdzEMEYMGjd65kVBN06IskKTkCFQlZbN0GNKxTAMdGnitMhM7UhVCe7DgCozRZpYu8Ci
LBm6jkoaUj+RRI0Rkg+vbymsYIwjR41mUUgKlbmYFXzcZ0Y0f+U8n3tBnxUfBcdbRxVfO5vx6PEp
s1nNIBSlVtxNDqwkuBv6tKObrnl1/4LJ3fPPP3/GB8Ma3I4p7KmlYIXlrcfv8PngufOeLODZlFgY
wdXNjjulUELSxcyLKPmzyfP0dMl9F5FSIhG86j1j2fBqSgzJ0l3fcPf6BdqWUJbI5ohYf4lujAi1
+Gtzyz7nf9/Df9YHxJBg52GM0E3Qj/HCB/6Rm/gn05g+ebXPL9uU/1nM6ddiTg8D/mGgP+BvdEPP
Yivl4RZJEj/up16T+o+RQ0Z4Q3F0hB8cIk0USpHlYRhOMZGzISdNrs4Zm5/l+vUl8eaWPDqapmTW
nEB8C5eWTPsNSu4wUlGtDPKdL3H7wee0LtD6npgy43iPWtXo44Kx3RIvX+A3N1AOqH5H/uKefN8z
tVvi5PD5xxWPujxkvktBFomQIiJLfM5YqfExIxGU2qKUQSlFFBItFSoaYnIHi20MaHlY6RcUlMIS
UsTqw8/AGEMXHb3MaKuIIlKXkilOyDoitSeJhCoEMWdKY3EhYGTFXClCGFlWBpLHGAMxkkSm0JK9
H7GFoht7pDYo6ej9RF1rUhywJiNDz5tW8qbs+N3nlyz9ji/uXrLZv+aD4YrPhlcY1vz69SU/3N/Q
bV9TGI/VE10cUaWkm3YIo3HOIaWFbBi7RGNWaGcw5YpazXisZ/z0kzfoZck/ePIu3zq54CvLU4pq
yYfUBFWxTZoqSxbZsIoF3yhm2Kz4NxrLIyV5R0q+phR2irwvDSIkRBIYldiElpfdhu9f3dC6e9z2
GhETK6VQQTPTir6LuLogi8A6eaxQtB5Mbdn1PbK0GHHwzqvCMvoEpkI6wTZZClnTu4S2hilmeltQ
xESOYNAwRQqjiX6g04KFAT8mTjQ0MZCkYpomdiFipcQ5RywEKQV6mfhk3/KDq2vKqafvd1zoSEqB
Vka+IPDn3lNaySglLYFIQNrMz757hjxqyPMFYxR8Hjy75LicBj7e33C3v+LF/jWv95d80t7y/fUl
6+mOretoh3tc7Empx0jFvFhRyxU+lXzqM1cRdl6y7kayCwebWjbsI7yFYqlLZlLwyBjwgrksEUmg
7Zz14Hm5WdP3LZKEaWYM0rLPZ2TexGXz1+KVNudfjvBfxJClGzL9Hsbtj/92mewFbgrElHDjRBzT
RUr5HyXEP0mIX39g5oeB/oC/AQod1/gON94fBGu6ICVPyktivznUS4ZMoStyFETvMaZASom1BTpm
DPpwdxYgzJJ+vYUkUMLQnB0zf7Jke/khY/6MFPfUR5amtrC/IdVL1k4SpgrXRcROUQqLGPcUc096
vEVqyLtbdIgsTUl+fcnZZsLc7JjnEd1PnBUFsu9RGZqcUDFRqoycPJUx4BwxZkqjaCePV5rL9R1Z
CUrZwxSREu6nDmlhGDYkA0IM7H1LqSEER2UswnvaJLDAvvMUqmCYBtAFIY503rPQkMPE0goqHyAb
jk1m9I7CgvQThREIt8f4Q5vXuN+gsiP2PZMQGAK74A8BPkNPkAIRJ3IRObEB0+856UeOty1fyYmz
MHKRAt9UcDFOPHEef9/TO49SAhclyQq8bzEaTIzkJKlDZNx5dJQYB95b5kGyMkecVCsWccn57DHv
Hj3ilx495el8xZdnx7xVLylNSa8KPsyCD8h8x3u+EwNbLbn5cUysQ3OXFHdkPooSqQ2vUqIRibuh
5Y/ub/ni6jljd0shPFqMVCqiMoickCmSSUgEfe4JBrrQoq0mKkVHwihN60aiFkzBM5HR0pBSZqYL
QoJSS+ZKMiWHVDDGidKag9BTWippcCmjrKRBc17UiAg2GxpVEKbEWTlnliWFEcipRXc7lnnHZ+0d
lT5kwr+IAYHie73nHSN5KjNfVpkvaXi/lPzKqjlU3y7OmHTNyxgZpoHX6zukavnu60/53d0dX2xv
+e72jiMJn+06vllYTHK8HvfgdvgwUBSCvt/x754fs5KWwgveUYbvtwPOSI6mnnUc2FtBIQM/tZzx
cpg4O12gVcU+KJZNjQiwWszoQmQvI/MiM7X3+MIwoelHQ2bGNOa/zjD/pQi/EQLlsIPoMuPGMfae
ceNxfSK6iOvXkD3JtwTncRP0LuIS//kDMz8M9Af8TV7oQmzS2DNtdhjpUalDqnOUvsCNnyBlIqUe
vQKKV4zjJ9hCkoYdRgeGoUUIT6kMpqyo3v152pAJd9eEzZb5I8HJ2xXRRfoPXuB2nqopqWYF4qtf
ZX1+xPNPfh8/bBBFRJ9W0L0kpu9hLwa6zb8kdp+Swh0i9yxPLKb5mHl/i+y21HEL/YBVCZE6lE5U
pQARUDaSc0SUilof1osxJ7xTIBRWSqQ8rNlzKlAoQpKEnLBSso8OJTJCaroU6X1mCIkqaSxgCDQp
YUKmDhXFVJFHg8kFacqokMnxcN+1BIbRE7zier9jihO7aUs/7QhxT9e/QoWBobshxTWpv+b69hId
O/rxFpRjilu86CnkwCo5fqbRhOSpQ0Y5OPWCbwjLVZuIPvLFOPIqdCgR8NFR6ZJ2v8UnyfNuzxBG
2nHLNG6YlZG2vYbQUaTD62xZCdZjx3xREjOcLI5ZLU74xfMn/Oqbb/JGc87fOj6BpiIWlmgFrUp8
q7Q8aw/37iFLPoiRZwp+z3mclfyVAF0Z0IYXPnIUR/701Q12aDme9symTMXBwz8rS+QUkEEzVxoZ
MifKEPtErQvK0eG7g6r+rg0IVXC3HYmipFGJ7eQprKHtHFkZhu2WmxBpjGbqe+ZGw+gpbYmaHJ1L
zI3kft2CzGz6njEbZjZzuWmxhT4IHwV8cHvHH99t8JPjfrfnLWNYiEPe/VOtGVLmjarij/uJpAR7
afgLkfnS+RldL3mJoN3t2fcD2+0r/ruXH9GGe/6rV1/w3faOP+9v+WDcMysD17HjraXmB9PEh10L
Y0vw6RDXmhTv1A21lBwry5HVxGiwwtDveoYYWBaWby0XfP10ybIumR89Qs5O6OozjhdPsGbJojzm
bPGE89O3OGqeYPXBGVGUS8I0w+07Rv//PA62Of9chN/IUAeX8S4xtJ5p8sRhIAVH8o7gt6TkwG/I
cSK6wNRluj2+b9M/fWDm/+/woHL//zFSVpswROK+x0hHkjsECqUMeUgkn0giQF3ghwojBMn1SGMQ
VlNUAqktUUqKxpBO5qT7iXHXYrVCzwpW9Qll/gXWH/4+j79tYJLYumJx9Ii7L/0M7rMPWb98hTnv
MNURWWvK5ZeYNj8kbSOONaIdKOZzpn5NlRri7Q16fs5Ut+SjGh96lNH0+RB4gpaMyaEKiU97RAVk
jQs9ZWFQCBb1DDeOOKkROqERLI1lGAZKbWmEoHWgTckueOqqJLhANJkjE5l8ZDbTDL5nVs3YtWtK
XVKqxN61WCNx7p6sBClOXO17FlXD1fY1ha242rYs1aEgY/SZXgs+v+v52aZifbtnSJI3w0Sr4GJ5
hMoO7BzXt9z3km/XC16FkUpk1qGnFJGZsVgFj5F833lWWpDcgGvOUDoTtgNzAR/cvMRay5lwDJNi
drHi4+drVFPzVjZsEQRdEYcCu5yRdnvuixqdFFIUhHnFzjt6pXlrqKHf4/TETdfy05Xle5uOripA
BH6EY1Forr3j78wrRBepJBRSE4Ojy7D1jv9tPbAya7K3lPMlKQeOKsHUDWhzRJnAJUMqC+7bDmEV
KwRCloicMFmiicwz5CSIMRC8ZKvhZZRsVKbIku85xZcFOC3pJFQoYkoYkYjZE1FYq2lTpjCa0SSM
NIhS0qaMFprd4PidTcuz/YQfPUIpfPKsiHzNFnjpec9K/qLvuBeCD0NE5sxxY/nM7TgpDHa8oxsz
MSZudhuG4Pjo5nOMGGmyogqWb8jM5W7LL9aSMk844cgBNu2eJ8cOFTJlafnzYWQdIAlBDJJjo/jh
3Q6lNT9XGMacuVie0k8tjxZLmmpBqzreKOYYIXnHLpjrgmL+BJMHslIgG+LuNdaUVBcLrm/XHE3b
/1suuQv5KzHyL3LOy5gE0wTeZcbeI3MiihGRFVlJsmsxWuOnLdpWJN8y9hmV028+eXd588DMDwP9
AX8D9DFuOhJRTwh3g6lPKOoGd7vG1l8+tKfVJbnt0GaJSRPT7adU519FqhJ7XDB1I0LDvJqTtyCK
c6YXe7TqyfWIbBTNTzXcPjOEj17gnr6HflRztqx4fVvSHc/oZzPEydtoKQnrPc3xI7bP/ifE01Mm
v0VHDVcvSPoe89b77L/7x8yW79AvPemRxU2RyZRMPrN1sCoqdq3j7PyIV7trsJYTEwmBw9q97zlZ
znAuMKhAU1o27cRiVjP1DrmwKBdokZxahXKBqlKsx5ZU12hgyqC1ZJwchYbeD4x64jhLhuEVdV2T
dgO9LVBx4HoTcMueq5srLhYV6q7jlYVVlfmiTYi5ot73tN7wbD/yL53lb+eRr5cGMWtAV8So+MFu
ohQCnxV9lKw0nAnPG4Umac0yBVohCVNkDBFtFLXJ9DljgWvXcz913G13nIiJR9nQhy2vuowMHY3X
DEZThxLBiriTRBdRVhFyYJ01dU5czI+wOjLoHU1d8cPNlvss+NA77ktFzB6REqU4ZN1/RRe0Q+LN
KFFeYhF8o5CEJEgqcze0fLa55Y1aIfcDx80pKQ5UZUMSiTFLZPHjgppZhSTjjWKpFa3znNgCERJ2
VuPcSEegmdfcdC1nZYHuPdko/kFh6Z2nsJZu8iyaI277PSIKjpua0UesNqiQWVQV/ejoxpGn8yW3
w4axUGz2a3xsmfw9lp6/21j208CxgsuY8Vnwti35HTcwt4ZdhrdLi8rwB/cj//Bx5O62ZRDwvX4g
TD3vVYo/XTu+Vmk+G0ZGFdDAtQv848cn/ObLa94uCpqU+XDXcpYiyYGrLN/fbGhzIkt4RebnZ5aP
N2tO5ZxvB4cqV1g5J7qCt44fs+93+HLO42bO6BNFrcCNVM0MmyIhObTUpDGhyhKjJbebLW/dfPJ/
ySPP2/TEO34rxnwOAj8mgpcEF5ncFmMMykWEVeAdYwrUKEI6lB+JqQc3UJTNf/nAyg8D/QF/QxyV
dvzen3xv7LtdWXpDVTfkaDHH55AFo/PIaEkC7HxGHm/pb/4HmqMnqMURolni+hsUCr0s6bcdUXm6
9gu0e4qcHNIYjs5WDPNvEW8N7q6lKiWnq1MeHwtetDOmq5ZcaeRxwsxKBBPpZMRLT3i2Znn0JqZx
uH1ETle4v0yE9xLhaUuFx1YlMSaCyqQgIEwsdQlDYh5rgj8I4CqpCPlQwOLChFICRD4IxFTCuZ6y
KgneoyWsrGKMDltk2mmgMCUyZ0YvkAa898yVJPU7Mg7hA9ftnhx7ttt7ihz5UTdgQsTqgg9vOy6k
4C+vdpjseDXCtPesipLfuZ54mjLf9JqPpsCV3/FfX0n+w0dLznvL8vgNSCM/NZtzmTP//ectg1Qg
Im+akn2KiCEwM4pX48Q3a83bhwI5GiEggz9e8Z2PrvnOkBl3PZXr+PdmDX5IZJn5dExMrqCqLY0r
+PIy89HtK+ZlQ9+3+HxoF4ud49HJOR/cvOBrR0smH0nR8Y2q5sNXa75eGna+51xkzvB86iNPa8v/
fDPxtLS8mxWDhCNZ0QfH+3XBn3Y9z3IEIrPlOfPZEW3fEsolNsLWJRoF3eho5jOe3V5zXFfInMBn
KCV7N1DPZsjJcR8dtWrYDI6TxQzdO9S84vnQU6bIk6akHySuEshWIFVBKAXT4JjPG3rniUJiY2Id
FW9oxejhMgf+4H7Ls3334xa3wONs2LmIrixjCrRR8EZxEACeqcykNUMChYBpIAx7Pt9tmBvDFCZE
9LRec+M6fr6e0QrJ+0ayjYI7qbhOmTeUosmSQURqq0EeOhNMhC+Vc+7bPcTMI6V4YiVOGxYuIPYb
6voNxqxY2DkiCo70EcvCUEqNFRmI6NqilQYChakQKWGWZ+zX9/Re4JPg7vmz/xOHvHL52I/89tDH
94iJFAQpHW7nefIYUSG9BwICQ4wdRiQmt0MVM1J2+NRRmPLGZPWbD6z8cEN/wP8LeJE3u0kR8hF5
MmSvMIsVyRiUNQflt7aooiaJGqW/jttdIThUSJqmwBhFGHbUR4YsBqLt6bevcd3AYrHANgb9xjk3
r1uGH36BuOsRFi6ezGh0IH/e0X93h+oSs7pAZTj95j9ESo2YH0FaEV7WmJOfZfikQ737Lvk4E21m
O/b4qgaZkVIzn1l8DAd1uJuobc1SKLKTKAnOOerK4l2HKjWlAVxirg0pZLCWzo1svWNlM8oPzFTE
hsCs1MyEBxFZSUPs9qQ4cX1zyYv9Lc83l3z0+iXdsOfq7oZ+t+ej9T1/dX+DGVuKacC7iZdjy50b
2fqRbRgxYaKd9lTR89G+RfUtT4PnTTdwFBPT4MlS4NzInUt4K7kcHe9UBhTUSrD2E4OAlVH0KbPK
iWKMRAcqSFzI9NYypnxoOxv2xK7ni3bDi+0dYr9ls9vy0W5Lu+v47O6e5+s7Xu7u+d3tFf/r+pLv
3l9zs7thu91zv3nFfrPmemoZ88BiXnJ2PGcrLU+MZVCCS5G5E5lewj2KqjaUGhorqFRmpjJzLQjB
0QfPXTfwxW7Hfr8nTVsKDUokEgltNU4IalsiApyqAv3jFx7a4EOiViVh9OQUuDAlehp5akrq7Klr
zRAnrMyIsuTOOaxRiCCoK0VWGZk80hru3Yi2AhdHRh3o64NgUhlJ7Fq+FTzvpETaD1xkyfN25AiJ
JPIEwXtG8knv+Ftasw+ZCwQEz2XX8aay/PbLG+ZC8kE/cD9O2Bz5Ttvxq2XJ7TCwEJ4Via13/P1F
wXe7gVxVvNSWUM15XK0Yh4QuM74f+an5EW+WFafK8P6s5LN+ojYC0Tsuu4HCKJyPzEqDH3qEStRA
IlJWAiHEQddAAqEwViPQ6NkxLivWMdIHePHq/5gUt45pluC3UuJnhn1i6gVT6/BTIIeIyxFVlJDi
oWvdd4dYaAFDvyGLRBqvyXistf/06f/O3pv02ppmd16/p32b3Z3+dnFv3IwmI5xOZ1e2C5dTwnKB
VAJR8jdgAmJWTBB8AQZ8CMS4ZggBMhMEVrkou5xpZx+OzLzR3P6ce87Z3ds9PYMdFGJgZLCFGNw1
3jrN+249//Ws9W8+fBTenshvAf1t/R1K6LgZoiemg4Qkk9D1HBEqTLske7DCoCeJlEeYk+/hRo90
IIJDr1pKDjB6rDXY5phUPWbYa/yUMEoiVhK+qXhTd+yeb4lXA1rD2cU58+Yevm9YX+6ZRoGQLQGL
NO+iyj+ghI8Ztium5SPK1+6wrxzxgweUsxnVYoVPNb0X+CAoWZNjJudMyoJcDI7DgUWClBKlFEIc
kShSiYx5IquIE93Bu/0rB66IpvOFsRwiKxujCURK7FEiME3XOL/jZn3Jzc0N3WbLyzdbrtY9/+rN
NeuhY3J7TrPnoiR2w0E33wfPKidsTqzxXKWRL9LIuc6IPDEn8UjCvRT5w0pxGgIpRKKbmHIGFRjH
ke/P5xQEJwJijAShWBjDMxeRqRADNFqgY2AMnrqpCPuOD2aW+zKiREKqwBvXsdKBfuz4ME78ppuw
3Zam3/HfP3vBZuy5Wm/50c2ON5tbvrx8Q517fvHll7zu9/jNLZvtNfdzYrfZ8r2l5l/GiadEei14
JhN1nfnUdRxbz1InXoQBReA2eVSteO4T2Qj2JfPlOKHiwIvLa6YSsH5iHwvzVnHpI6aV7PsJmpoj
Am4K2AomNzCrNGo8ZK43RuLGieOZwcSReW2ZDxN1ztyrLespoBuJjAO2lVhr2DjQbc1tcEQjkcXj
VeaOLQzesZWRYbdm6xxDGCF6PqwlQQtiI7kShUEW7ihNKIV3q4o6KR7ImjNRs/MWqSw/DeBzJhQ4
QiFRdBlmdcNPXWSN4VpKLkvhJzHw0ymwFZJTY3i8POFotiKJGTkJSimItkJowa44NqJnVwbuWs0Y
InsPw7jl1bjm2f416/6S22nN4NcEMqUcGuH/88QX5JzRRmCrirY9QlWG0AviPv2bj3W5VLmI/65E
fjdOhZAEkztwAkSGXMLBQppMUZaIwqVAjJ4QPbZdIWXEVHOqaomtF2/H7W9H7m/r796xzTaVXOG7
G8K8oIZA3O4RCmQqWGEhZnKWaGWIukXXhjB2yBpEAaEy0mTy5KnaJXae8ZMipInoNsxrzXIB2zyy
vfQcuwe0RZJy5Oik4rqKeH/4vUHIv4EAACAASURBVNyf0TQVaSrMTj9mjBPh1YBcLtl/ticcPyIm
zaKdMbMtajlnP+6QaITKxJwxtWVMnrqpmSaHJ2OEwIeEVZrkA1Y3dNOEtRajYTON1K0h+YG6rhAu
4cOBtOaco2os62GNMoJ5mri6ecVVHrm57piPjp+OPefZc1cKpr1jpeGLrudMC7IU/Gzq+EgZnvrI
w1bzi+gxKvEbVvEXfuCxVngSd2yFyIlXY+D92nA9DJxfJOoSKWqBC47UjbzfGv7kZsvjWvA6ZZZS
ooTks9Ext5arBNtKUhTsQ825rUnDLRe24aE23EqJEYK7ZL5mGswYQWmE1rxwjskYrvzEu0qwjIWT
rDkzik3I9Drxi2lgpeDPrzd02vB1P/H5AHeN4XlwvKsV7xE5E4VlUXziI+81LeRMLqAxdGXCCk3U
BY0kxELwgufbnuIl8/Md2kiKqckhYYqi5IPHusyGIQ5EYYglMCHpi0fZfMhKFx5kYcqRSKGPPVlm
coYSPBeVRaSMwJJ9popQm4YpZhTy8Ll88JVvUiEbzbN+w1Ue+NfDLa/jSFVBS+FEHoJ9S05UQvNp
LBwpzbMQOLGSOzqTUuEPZorO9XxfR86ypCuZVkg+CfDbzZyNy7xvax5oRV0O4/MuRP6obbCi4uNl
zYOjM/LsmFl1hHeC2s5Yqj1tbkHsWbuB78wXSD+CUvg08qubV6yL4XK/4YN6jvI3jLbig7sfIuKM
2lhIApThIM0QqFqQJsXyzgVn67sMe8+9lQWg32edJv55UvxhGDJTXxBCkKMHrckJoihoJYjTSDGK
NHoKGV08k79lcfI+lAk7u4+05kfvvHP8o7en8dsb+tv6u77g+mgjGo2XkWA1RcB4c4P8Kp9bocAr
pEjYukGGgqLB756R9peUaSJlD7ngx4GmaTBOQG/ISeL6iaZqqeQx+t636fUZwyYhuoDfrDm+MLT3
LKUa6F9dsr3e0No5KfaoRzP66gm9+iWxDuxveiagbyriDLK2h8QyNJMyIBMDmWIN23ywAM3eEZNC
CI3PkGRNTIZoa1ARpzzVXFNZw7wxCBxSRk4qgUqJuRQ0OVPJQvQjg5v47PaSy80Nr/oN/0t3xS/9
hi/Tjme5R6iRn8WRfc7sgL5kxpJZkulyYisy2xRQMnNCxorCd5XgcYF5lugMY1EEIfiyDzxzmTQE
wpQQZOZacFpLfuQ6vPA0KjErmVpKNIX36oZGGZKWbCNs/Yi2nsFtqLXCiIprFLusuY2Ky2R4PiZ8
0VihGJPjwgqi8rwnJasY0SFxlCMuOBoCP+k6muR5MQ78at9TnONPN3v65PmT/cCZViyTIAbJ+6Li
PCv+7bbl2ie8y5yiuAkRKwxThoVS1ChOtKAtid00cZImxPoNhoEz6whxYNEYokgsljWZHl1rVnMJ
IXHRKIgjvrGElNn1EW0qhjEgbYML4KXitK1Yjw6tCjqOSBNR0bHPAWHA9xMntgEHt0Kzc5n9CLU2
zLuOixhRziFiYGULn2ZHXRVekQhC0ZfMX3cD3161PBknmuB503eoPHFHR/ppz++0ipfjjg2JnZLI
DO83M/7breejZobLik2UnGnLSwcPqpaPFkfMj+9z5+TrDJyQTU3nJbFSJBkxrSEb+EEfmM0XTMUy
1DVKtfz184Ff70Z+eNuzy5HXr6/59etXCHfN1F8Rs4MsECajxIFXojRIW6jO73B0fh9hKqSVfPrn
PxNTEP+1C/xRdIU8CUosqJIxUiBkBpG/Ol0yZEfJnpQdLg6EqUdlMKpQN6cslkcsZu3b2/lbQH9b
fx9VNXrTLpbEfHDFiqIQRSKnPUV5ioqUaQcxoGwLskLVcxLnpLGhpJoiaqIvlJgobsLeqbBnFWUI
xP1EHCZmpzWz9xvcO6/Zd/+afvuarByqCujjV+zdX7F5/VNkkeSQ0csVpmmRiwZ/MWN32SOOj+if
O1KqSEUeRnopIEWiRI9LGZkjOQSW1lBCYG4NhoAkYEQhupFKF7LrkSJxoizRdViRKW6iqips9vSx
x5qAiz3KJnq3pqSOL7Zv+F9fv+KPt3v+h8s11z7wYzcRi+eeLjxLkUYlfuZGnIApal5Fw3dnJ1hh
aZRlRNFoy1K0nOcjflOdcsYZD/UZz8qCXC15uDrhqbbMjWEXM94IpjhhTGZfG34wHLLZnweJ1pZ1
hM8mxx1TeBn8QYMfAl5LrEmsxx12qXiV1iiZMbZgVEbIwj5HVnPFpnhcjsRU8FPiG1pxPUUe5EOI
y1AimsRtGHigYPKOkxLI3lGNHY/8xK7veK8UlD+khF0Hyac+k6XmJz7wvBSuZeaLnAlacOU8lbEo
JLpYFkrz6RDpRs8Xr9Zc7jsUkVgsSmauu4GiEiqOB8MYIE2FWrZYNKOxXMVMJypU27Ivgo2ybAOg
G4wGj+DYNoikSFpw6x0vg6LWBSS0VlEBRWsWuiBFOISkhI5fp4G991ir2Qr4VS78QsGXKfIkJ35R
MhsKf9XvORaCr9eSe1pwh0SOgoui2DqQUtMqxUZCMYoXU2YpLc+8IGWFK4p1lPze/Ihv3LvHB2cP
ube6T6XnLO2MyReMhTJG7quKi7ZhkwJ3lKSbRmotOfaZV5sNx2qC3Q0f24KY9ox5ROSef/XkR4zu
hjJdUfKO4g4rbF1JSinYWtDOJO3JQ5rFXV4Ogdv1m//KD8N/mFIhToXoE9pwiCFW+t9guSyOMHUU
pcgxEHOEXHDJY5qG6Pc09YymNmFRy7fa87cj97f191FGpo00kknU1DnTdxPzhcHtb7DLBX63A+nQ
SlD6idmdGWLQxCGQhoxOYE2FLwajIAuDqUCuIv71jvZU4qeOSlec36txzwd8nrO/3HJxdELcj6xO
PmTT/RJ32VJeZLrbLSdfW9GPE+fLb8HrX+OGDeXDu+ShQy4SQhjaxrD1CTVrqTaRqcDCLJj2jmou
EK5HVxrjAzFKqrpit+uxVcs4dOSmJheLcwPCNuyD56RuiN1Inw0nK8uw3TJaw3qzoRTPF5uOH1zu
+A9aRXaebwm49Ik7WnPKIdTjTr3guco8mrd0rqCSJNiGIWpWtSWVyLuNRoSAoOLxccvVNvBwNmPp
JlpgCIladxwpjStziloyxcTrIJmqOcVJYpRsROKxVSxzIorDDnQAWqPp1CFIZQyBICqGXGi15X3b
sq8V164cRv3e4YVgS0IJxSQEJ18xnu8pic8RA+RcyFpwRyi8SzxSknfk4RDfxUSD47dSoQ6KWkRS
EUwZLIof+0RtNa+yYC4ldQ3rBGuhsclznTLvWoVF0pJ5mQbGyXB/s2MwNc3KsJ4y53WL9xFhGoqI
XLtEs4A+DUgpyaMjlMx507LZj1RVRZ0S1A1jnMhJ8s7CsptGiqlJXiCrlmMhuRkCy7pldAOVUdyP
ka4UjkzFq80tn6fEl93ALnu0jMjg+XeOWn6ZD5OTxkiuc+HbJ3OeBcdHjeV59NxTcE8bXrsJrSU+
eTqrWUmBzYVeSdYp8Eet5c99oBHwm3ZOW1d8++KMJBpWx3chSoq0qJIZved4ppC9oJZzbLFUk8JJ
y49vB75/vuK639PFwiLD/+Yij5dzXnc7zqqMKbDu9/zq+c9oouDdxx9xMruLnd8/yNiCQNpCkYL6
5JjqzpybF5kwXv/nw/YNSjwgRUVMoCSEkDC2UMZEVhlKxA2OelaThi3IgIgeVQyNsWS/Y2EzOob/
sVnYt9rzt4D+tv5eAF2wkaKmRAMBfMhMMqIj2CNz6LydR2UJUqDlikzB2DmhH0lDQBwtKHKD5tCe
F1XIJRKqRLGC4AKL1Yp6Sszu/iPyzZpp76HrUN5yfPeU7uvfofvlK95cr1nEmuaDBSVEqsqyuP+Q
/iefU1KAx4+JThDzwd7T5oqBCpEDWmhKKRQtyUUhhMFFAVmCNHiXsVKjSmJRW5wuODzZGIpJ6CKJ
yVNJw7HWFN+x0ILb/ZoXmxs67/myd3wgDqz3uyXRisLdSnBHKTKWk0ojjaWuFat5RVMJTqXGUviN
aomUEi0lTa3xoXBUzzDGIE1CGsmyFErJjFNiquYEn2jmc0IICGU5bQxPb9YsVzVPth0fSriJhQGB
lZJfT47awCYGXqTEd53H7Xccn94lbPd81CzoJ2h0w7ENPA+BDyvJJ8PEXiTekZJYEkHAz4fCh/Vh
n5xEISZBW+CDquLp6PleVfMmRK6S545RXI2Bj23FL3wgiYyUkuuQuW8NQ0k8NpKNF9S50AjFj4Lj
kdX8PEWchAdGIdPEfZO5HifOhaDvGuyq5p36lI1zLJoK4QKT1aQ04aPiWLeEqeO4nfHyZo0wDS4D
QWDmFj8c1BPX4w6i4OzY8sV+opkb2n5PNDVVCagsaWcWNziOmxVpiuySBK25WveMIRHjgCSSY0Rr
zX1b8UnnOFMNOx/JBZLRvAiRb1SG1yRmWgCZ1yLy7cWCv1x3VI1gKQSywIUSVFnwztGS7W7iwfKY
u1WNR3PaPsBny4jhCEXgoEXMUpEpKCUYSbjgEUVyT2qeZ8etiCgF2hakFZx6wV0Fe3nIGLhJcEcU
Xo6Z/e0Wx4/51v2Ruj1GYNAWlBIIA7IGXTckaYljgORJPiEAIQs5ZpQu5BShdAihyXlE1QLyCLLg
44TIPY025FxRze5RikKJ/Hbc/hbQ39bf205Fyq1uDEImYoxokXHjhEgOv20OI7Tq4IutZi0pOHTV
UmRGjkAM4CeqoxnxZkeJEzllrJKI5ZxpO2CqitR7rBDUjSXUNUTorr5E1O/QGsHRo1PGqw2bT59x
8p3vsnvRUx1V1CEyVBH9geb1j/4l09c/IBdLOzMkF1GzitJ3FFUxV4oUCrWU5DEyn9f0fkeUBaMU
cRiZtxbFSK41lcjsYuC4XjD2EzNbo3qPKxXLSrEPE70q/OX1Fa93HV+GiS44/om1TNHxrdowpsSd
usEiwTS8c37C873j/sk5IRdOqopKSPo+cTqfc7vrODs6YpomijQsbM12mmhPW/LYU9U126FjoeDR
+X1eXV5xcjJHZ0muat64gctu4qSuWXdbispcEzjWkpkR1DkiELyIibOUuCcKMjmsCGyGa5rlCVjN
N49XPLOKOEwsTOAnOXImJdoKxpQ5k5qfpokPpOFKBIYi6RHMSuGhqbnuJ+5kw1A0vkQ+9/AkwoNa
cR0zVsNcSHqREEpwnAozMq0SXGhJkQdf8ErCDYpGFZyGdRbURnE5ZeoEy8khdxMXQ89ctTQSstL0
QpJFhTKWPguyqhgFqKpmUpYxQ201kYxUUESmtZZaGXwSXDQtokhmzYwNmRMpiSiG4KirGQlBlpIz
XeG956I2bG48t0lS0FA8U4YfDIFNkfQUklSYInjqMu8bw6WPlCzJEb6MBak0P+9GeqF4Ggp7nfhm
1WCM5TdXR5w1C75bF5bNjFbNaasZQtSs5nN2k8NrjS6S0SXmRuKmgqgUcr3njhv5LSs4Ko7fbmpM
55iM4tGs5TpIvrmq6FzivfkSkSI/dxOnRzN+cb3laDHjs6sJW57x/ZOHlH6OWqpDw69BS7DlHka8
gDEeSKJ1IWogJfzk0LYmDj1CFUgTPnlMZRnHAVk35M0OJSp0M6foJe38gpTSmyjlW+35W0D/f163
N58KpP4nGfGfIfQfFmHQyqKUpjKHm50LkZwPsieEOewhhSJREEIhpMQ7R3QTUlSYuaWpaiolseRX
BZ5CeUqRT4vITyn5cyHE00x5qkW9/v/jc4nJbIUW5JkjiYJVAvfqL7HtirBfYqqKmDXO33Ik56Td
HnFRgzrEqQo0yR3SwyYEJUai71CqYIxkXD+l1l+D6FBCsJgb+qlCZkX/5hXz+3cPkacXR+iPjxn+
7C/YvrnL/HJG9YcPEE4ij2sWjx6y/tXnyDsTtHvIgSwLxSbcZqTXGoMmpIy0hskXbJL4AZKVtEqS
0Ugp8V/t/eoicRGMz/gMIeZD7nYpGDyBkbXvCNOWRRyZu4nfVYVvNjNug2FeW26C5+jsCIRi1ixY
nJ5wah2L1TkpC4IySDKq1SitmeslzFqUmYhoUIJGV0wCrJ2jTUVrAqUojLEsj1YUo8hCknLhKDrO
KHwSHHdN4VgELBkjMx2KhRTURXAG3C+R0fcc2wXTcEltPaX0fGNZM+lTznWDbTyEkY+yYFEyMgXm
JMaUeNxorikH8nPODDHztcqyiRNJF54RSUYS0dymyO/OLFcp8K4uDFIyRXhQFG6K3LOKdQoEkVEa
rrLg40ryxmeOlGSXC2+KoFKWT0Jg3lQ8CbCYAovtnlfXV6wu3mHvRky9pF/v0bZiVil2XYesW4Zd
ItQNN1OHDhV5Lnix7/l4uWQ3diityUaw7h3aWPZj5PSoZddtmXLhOyenfHm7pp3V+MkjjKJVidth
oG8kn/Q9omQsGV8EX1eWwSceG8OrlKiEROWCpvAtXfN8GrlnNSoXFrnwjWbGX/aRbzSGV0kim4pv
nRzTo/no3nvs94n7J0tMEWRZYStJ5wT1Vw3xoOAkZ3IS6LqQU6aoAkjMrKbyS667zO/P55TgGLTk
XLc4ItFacoycLs7p12se2AVbmZhXiYuqRrgdr7cDm9c/43R+Ss5HGA5yT6kSx2crgjsjph1RGHQK
JFEgRiiRkjw5DSgpKSUiBKjsESrj1cFCWkuBEhprj9BaY1T55+1J9VZ7/hbQ//b1+mbf5lj+Y0/5
ZzkesnZFgSLAiYKiMNVQiiAmCVECEmSBbEAWYsxIoShWEp2ilBlCViAkUkgKkoS4pxD3RMn/ECCh
EFkcRlIF1mH0WubnOfFKpPgSymeqiM8k4rMUxSul1BfNrO3/v34+KXbrsd9AiSilCCFQ9IrS3MP5
HqEUQmnIDXE7UEKgBA9CIqyh+ICUNSEISlUTxhE/CaqZQWmDbM+IsYNwiDAVJVPXNcmBCHfo3gxU
Fwva4xmziyP2y8jLT/6M+w+/hX55gpyDWWlMnqjqGeufv0B86xHXt1vunU9Mw0hTzfFRHGwkjSbn
SDszTCGQSovJAYqmtpCSp7WGkguCwkwXYnBUypCYDlp6H9n3E8ZofvT0isspsxw8H5bMe8Ywrw0P
H5zyZvAsmtmBDGRn5HrFPkra5QlZFNrZiq3vSUJxb3bM6+2AqVeknLD1giaNTD5SNTXdeo1sLKJf
k0rCqMyL2y1lVtMkB9qgXMfU3fJQRV5PG75vEjJGkk4MQnGbMg+amhdrx1EWrCKMzlM3mp2LVHrO
GCMzNaPDcFwb7p7MePHmFf941qBjwvuJnXf8bDvwvcWCnw09d5TkjoTOeaoo+TMXedi0IOFz71lI
xWVOfKwEz6aJu1phiyAi6SMMobCwFduY2IhC3Tb4OPKo0nw2jjT1HHIkkFBZsPOZ77U1T2NkHB2T
dlxde6qlR9sKpECVjBJQcmApDuNnAQwCfsuCi4lE4oiMzYJdLFgraYWiF5FeFqRJ3AJjKSRluEyR
lznTBsGHSrEriThOAPxwc8lUPFWO5BKZcUiCMyWBkDxQhROpuIqJI61wMaAFDDkzK3BPVeyC4uv1
ilYZGgVfO7/gYraky4ZandKuLCOJWhiyVJQSqK3C+4ixDUKCywJtBD5EaqsZp0hT1dTHK97Pgaq1
tG1NTeTCKGYaPlgo+lBoZzNspdmfSpZRI1RE6CXJjchjSdx1fPL0Jf/Wo1viOINGY4pAtZLj85pu
PMUEj6SQi0NmQYgTUkpK2CC1QOQRIQu1EvjQUTfHKOcptjqszITGtjNAUtvyNlntLaD/7eqL63hU
4D8ZUv5npXBfZkGKGVI+GI2UTMIjM4hwMFgoKYMUkCNSGYpQ5JJIroACJkXKClEy2gqEO8i8soAB
gRIgkQhZIEEp8uA5nTIlFRuFeq/o/B7hoOcUSpJjOTC7k/C3Y3ze1OqphqeS8jnwNCOelsJTJcpT
JeT094/obut3a5TfoplToqM6+5AwBSq1JPQJoTK5GPYvnjM7uYvfbLHLIzIBZhKtBfuxg6Vmd32D
jR6bG0IBVVuGm8+ZqUeIaoGsFKJANAGyRdSH2/JMGmZ3zjEXj9m++BHzR0vEZqSZNPriPvFXP6dZ
PKR//Rlp7Zm6njxuyGFGc3SKH3aECMtWsxsHlLHIPFKbGcZavFfMm4bYd+SlRaaJq6y4MzNs94FF
Y9BeIOYW57fsosGUyG7dY4Ljs8nxbQuPLi4o8znt/XeotgPN/JR+8GQ74858yW3v4Ct3LK81gwet
NEYfmkRRaXQqICK194wRJrfD9zuEMMi4JyeBtInRdeyFYhY089qS3Z409qhh4rRk6nIYJ4cEtyJw
m+DKC0zJzDIUFxAp4fqRyJyxqtjECFIzayyTEqBqVsslrRbIkFEicuT2KNlRF8fdIrA50+fAsdVI
ZfmgUhwZwTpmHmpJwXNB5jKPLCsoKbEoipnNvAKyFPQpsi5QC/i0H2i04DpGTiqFy54lhTOp8MXx
QGekHLhrC/2Y+HTa8luhRkx7bDPHTyNWN1hpyRGKEaydZ9nUvBk8QgrOmpYxOWZNTc6ZtjYMKXCZ
PatmhnMTR3ULxXNiDTOt6KaJs6VFZk+2c9rkSDlj64Y//vQGhoPE7VzAcZFonzi3il9Hxz3bEEXC
iUgtCgXDo2XDlS+smpZzqRlzxd2zM8bJsZrPeLBYInXL/XrGzjvurFr6Xc9oFfMCN73jdNHS955S
a6ocuU2Rc6PZecdi2TLe7plLwW/ohvV8zvnihGFw3D05Zdtd4bHcWbSs97fMFkcQErtmxUPpcSGw
XDa8uX3DbHXKtXrC5d7gxmuMOcfWc2QRWANmBlqdoxlIw45ianQppJSoKkHvJ4wxiKEQtcFoRYp7
Wr0g9ZcYNEoUjFEYJdCqPNNL81Z7/hbQ/+/ryTq9mwP/qS/5P8pZLnKUCFEQRVCKJJUDSUqUQv4K
nPGRIr9yN0qSLEAIiTCKGAQ5G0QsFA7deM5QlYNRiZkUvSroVMhSHHKcFeSYkCUjlSDHgFASckZW
6nA7NRK0IPkMSiILVgXemyTvGc1B0/nV/6QEFApjKV9o+Imk/ATyj0WRPy6CJ0rI/P/2eRUhNylE
SshoCzlHbHWE67f4oSfrGjufU4QgzECFEXn1FFE+RDct2OYw+pYJISHHJ6TuNTS/g14s8H7CyHOU
XqKVoNEWZRz91RWpqSglk8c5pdIIqai/8w+4/PKv2fCanPaI+QPM/hn1xTlZGcJdzZB+SXjj2Fwe
oc6XpLInlUhRij5EYtGHhkpotAxMKZOFpXcTqYBwjkoVlhRwEwulUDiEEYgU8CWwEoVPnn/JlDp+
udnyroCPjlfISlHfvcOgNe3xOaiaysyZkqRPh+nD4D1aa3xyLK1iZiy927OsNCk7Kq2ZuombbkvT
NFxdv2Yfel7cBuYhobWm9xNHWvPD6z0f14Z9f/Cc11LxP91ecUbhMmTOhSYiySLxO23FNnrOa0gu
MolIVRrCOHH24AHddsuqPiVqS58kR03FdTfwYHmXye0pVnHpRjpVePzuOZubGz6YBfrBcR4iH84j
PgRao/h5P5BNIhTBk5BY2sKbEvhYC145xzpL3hEVqmTuGc1VnvhaI9jFzD4nWgw3LvGP2oY/6RwX
UjAXhV+GzMfLlhdT4kxqRpX4uRsR4x5219w/PcVtCnN7Qp0d12NGzS27fuBicczFvgdZ0xjJl5vE
Yq5oXaKuKqbOkYpg0XDwsl8uyLkgpCIWid9AcybQboS2oF1iMyS2doJdgBTJAh5owbFQPAmB92rJ
1Rg5LYF1Ahky51Jxv254cP+c9ZDJdcu5tAxe8f7dd9j1t4hmxnE9ZxslOQlq0TJEQSoGRKHkQqsM
xIwpghgzISZqbfEpkgQM3uNloRIa1TbMG4uVgrYCIQWmPkZJg9SW5byiqY6IKnEmFAvhOaoVpSSa
pcDFjq1aEGbw/FdPee83HjA7XqBFASMOTfdxRfdiQJXAvHUUpdBGE/wGYwy5JDAWbStiHmjaY8K0
RRtFiQkjysEMisJCiX/xFl7fAvrfWJ9exe+nwH/hRv49kDKVw205pYQQ/4ecXpDjwf5TIQghI0iQ
HfGrPRBFIYQ4kL58wuUIQiOEIGUOt3sO/tIywzCBEuqrn6kOu/aSUaKQBBhRKGSEKCD1oTEoghIP
cJ2KQOqvbvdJ4jxoA1KBMYc3IERBCImCxxQeg/inQhycvoC4LeWXEn4u4RcSfhgLP1xI8fJv89xc
nK2dug/KHaQnVUMKBewROQa882Ahioy0Z+z2N6g4kjfX1HlOtbxHngbahWXYe9JlgLViUI6jc8uQ
FaUIvLsBfYSqFCpD+849hifPKEbSuw498yyOLH1dsfrOP+TNi/8Zbydm976GnD9A5YRe36Lbnrz9
kv7Xb+DeB5zcu6DJHegVWgn85NFG4txEYyH7w4pu1VQMO0dtNaIEnBRUGaIr1K1lPzhmqyXB7Xk5
BAITP77tWBXF99qW95aWo9kRYXHC/dOHvNxsMc0cmSMGTZ9HbqLirG3px575agUuEJWkIjD5CVtX
7Ls10rS4m5dcdxvM3PKD55c8nAl+EkYeZEkEXo6B780sT7ZbToLFlESOnlZJQj/wezPJX3WJWCm0
ErwQktOS+LMQ+O1iWCLoEew8MMSDqYycscs11quDy1gDdTLUpsZNA1LNOWoqehrGyiAWAmMEqh85
iQErEtfDwNnRDPHymsdK8oZEGUc+NoVL3/GuyWzSQJ8KW6l5VTLHCDwSqRSazEmBUgqt0MQkmEVF
JwTCKKRouBrhyxGOW8nTGEFJngTHN6OjmbYsqvPD97Uk2rZhGyfa2rANExgoeuK5C5gq4kOiVooQ
RxY5cFTVlH6greWB16EVZyVxOxWaRY2fHEVJxujp8khpAk/WtxzVmeQCd0viNAuuk0dqwV/HCFLR
pUKD5vdXM06V4fjoDMWCx8crcmUpWXLRLEFpZqsHaDIBxUobuuA4qixuFLhiWKGYRELXksEf0gCn
cQQlWVjJdkgsG0t2Am8k0YmbUgAAIABJREFUJgtUaaiNYJoiy1lFcBElFUetJYdIWzeUJGmrGuUC
KRuO2wWd86zmNVf7gpmfsN5GNt4RCuRY0EWSgSwLQ3bcdJ6iHbVeo6VBWoMvoG1LGTqKblApUEpG
SsM0XBErhRx3yPkR1rboWBAy/slbeH0L6H8zucuJP3Ap/PuiHFBOCEHMAIWSE1ICSHIupBRxCWTx
iJzIxZFydyDDpcOSXSDJUlJK4pCWrUEqpujQyuKmiJLVwQlJCrRqSCmhlELkglYNUoAr5SDpIKFV
TXaRrCpkicRy+Dt1MGgtvyLhHfbuJQtMLVC6UGr51YsoCFlIQaItaA0otBZ8Q8A34LD6B3gZyhc5
8ROl+YlW5cca8WNRypMj+X+9zTfHJ9vzD77N1cYzDm9oTGHc76jnhhgTStaIqEkxIbQlpDlht2d6
9QnLBw3meEE0NaaZQaeo7nyLcbwi6yUlHnZ90ijG4RlmNsMIRagU2ghGcY2szhh3W+ZiiVlaig6Y
d08gnjO8nhiebpGLl5w8fBffOWp9SuVHCDX9bk/lO45KRgGVChRR8CKAcmRpEcVTY7FkIqC1IqMB
cSBooSlCIookENn5kTA5/vj1a1Q/8s2qpl4tmT04Yl4tiLNzfNIo2eKjY140SRycshpdIVJkUVeU
kDAoSj6EVBit2Y1vcG4k+T1X45rPxx0/W08Mo+NqcESZ6dAkndimxBe94F0cTT+xy4mqCLbA71uB
y4p3bcOuOKZYWAoYUuZ7UlOnTECSArxJcL6YMQ4RZY6RUVOkoFKSGDIns4oX/Y5jUxEJyFx4XFtE
LLTLU/bDnuPKUDeCfhx4fH5MzIHfu2vQwAcxMy4cr/qOD01LdBMPq4ZaRpwrnNlCivBeW/Mv+oEs
YCEKr2LmrhH8uAuM4sAAf5IDSiuuYuZxo/nERXoEH2lBlzwNntx1zC/ustn1eDXH1pJh5w+A5TxY
yZzMtc8cz2vG7YbZ4pjdMOKkopISfI+pK3ZjomkbtsOOG6/56KziV292PDxeodzETFj2YeQXr274
GNhIeJQE23DYbdtK8ucucW4bbK745nLFvbmhl5rV43d4djtRr85YUnGVAq22uFDIraXpe4Sxh9t4
FJgaumFCNQJLoMsFIWCfMlJmpmlCty0iJ4IsZDLeFZStqbIjK02VMw5NXQxkQWU0rUhMoj5sEpWi
aCAmjDBoIVBKoWShsQtO5pplichhSxIHn/gkoQBSC7RWCNOibEZrTVEGJQ5nXRGSJDRKKHKOFDQ5
e4psCOMGGQILW9Noy7wSiMKfvoXXt4D+N9ZvPlT/5V89GT9PKf03pRQrpaSUgBJAORwqcNj3iVwQ
fgSZScmBSOg44XNC5nJguguFjxNKHeQbUlREpZA+UNTBj7qIA/u9CEXRAzF6lNCoYknGUUt9aBLK
wUzCi4P5hcsdtWrw+RB2oNUMYxQlZ3IRB1QuGukPgK+sQgtJzFCEoJSMNQLbgNCgq6/mD1+BuZAF
gXic4bEs/FOJwAKiiHidyy+V4OcWflHgh5uBn915/+ODDeeLLwjXr3GTwhoD7Uh2E6OLFCOIErwC
TCTKgVBaxq6nub8iD4GqFtjW4KpLEJKUl8yOZvTXiewuCFuFaRRNowl5pDl+iHvyV1h3h2DeRYcZ
p1XDOLR06R7u+imDXlGLO/SXmvndj4lvNrjx4FLlrj3T1Z50mllUhZ0PiKomTCPGNOymkZUU1EoR
h47GWogDpVKEFPAUVu2C/ThgG0txATclvuz2/MWrDf+ultiF5eLuOXK5pKqPUPWC3f5gTpPcgKgM
cRpwOXPaWG6mHbZSWH9IAVuknt4N1K3mL59+ySOjcG5ku+649h2X24Hv14rRO4oqOKW5TpmvWc2f
dj1/YC0pJZqYAEmS+bDvzZlzLchJIUl4nRlC5NRqSAEVLTYLJpdYKIseG5itwI0EX7HTHboIVsua
l286jDnGIvH/O3tv8mvrmt93fX5P93ar2d1p77n3VmNXucodZSfYJMaJHRtkoVjAhEYMGDFBMGAC
DJnAH0GkiCiMkBJABBEag5I4xIrtuLBdVXZcrlu3O90+u1lrvc3TM3hPhRkQSBQpOs9ka2tN1t7v
Wu/3fZ7f9/v55speW+Y5Ut2GKYyYfmDQipgNm97hjxN12MIyMxhDpwNTNTzaWG6ubxlj4qmrpAbm
mrg/ec6HhrtFaNFEiXzGzPva8bxkvtI4nqvEq1TZlcghFIJYztE8NYWtgMqZN/cjvfXYs4VSC7el
8qAKG2mQojAlY21DCYkK6KLWLgKlOZRKUS1KKtU03OTITlvmVDimyIVpkBxopNKmQG8qxxj5ZDzR
K2HOmaoqAbhOiSc4OlH8tDb8yHbHudly9fARrRZq3zHbLdv9jqgMFaEtjhgznd0wxwSiESylLjhn
WJJHDwpdE6dUsLrFp5nGGqIPGC2YUphjolWwpETT9gQ/UaymNYKP0FlNSgnXgMoFn4TerSY96zQq
VJQYts6RUqYxQgrCo37HIIIv5zzbPUDTkCKkvHqEjBa2dqA+fIaLtxTncNKTSqJag0SPOEUtiaoN
KgcOhxOut4yv79i4lnZzts7QrXpVSvr2O3l9J+j/t+sbX+7+y7/9+6+ea6l/lSw7UYZCIedIrYJG
k3OGukCqVJkp1UPN5JSppZBrpdZKKQlhNX0oZcjEtcAgZ2pMIJZcw1rxiSaQ0NVQUIgYVHR4pdC2
WbGHgH8LPym1MtXx7QwblM2kssbjYqnrnB9BlMFqB349LUAJpQpKKVwS2mwQqdhOqFKpQd6eRKyU
J5H1d9OAL2vSTJX6daX4ulMCBRBwQ8flF77CafuI+XDNZrwmHyesf8X06QvCfEfTKfxhpGqFe/KE
5oPHWNPjo1qLVnxEb1p0EmraE2+PzOdHds+eMR0LtD2pGqwYurZlWRba/gHj3BK/902cvKHsvsrw
7MsrLax9RH3PEluHNwfsaWT33hdpXkfa8wuWeiTdzTTXR8bxns3FQM2FRq1+gMYKtUKujqw0oUSG
XpGLxzhB+ciC0HaaOWVKU5jHiU+XmV8/zDxWmm/s95wNGzbbR2jdUtQOVYSaMzVljK8oXSkxoasl
xAnL6uZXdUGonE7XHHPi289P2DdH7rTw/HTHOI4UMj+UF3pvMMCxaj5OrBWf1bAzjsfG8KpULjvL
dYFOMieBkCMRxZVawSefxMhlqznTLRWLzhoSnOmBGDK6T/h8j9EVpTqqGCyZMkXeaxp6BTUnGhES
HtMqDulEwtBpg68R27cEJfTbHVoKItC6lsXP7PearGFzrtiEhHOZJRZUTTzaZIoW/qQ1iBhsiUgY
mHLhR5ylpsxYPI1W3KZMaxLf85mfaEBSQdXK17VlGj03mxF19wo7nPOgBb8cUFbj80LTOGqM+Jp4
aAYOx3uMsyQ/M1rYV4/3FdNu0HNg6B23fqarhXOn8acjTxuLWhZyaxjHE5wWvtJU/srNyNMUGWvC
adhox+8Vzb/xpffQuSENZ1yd7RkTPNteMo4e0/e4XPFiaXLkLkR2e8v99Qls4ax6rmPkbKM5Tif6
3Y7p/oBrBlrJHELiweDI04JqDedo3kToGrsS4AZFnGEuih2FmBVdCyqDbjRmjIxFI03B5IrjLZ7Z
KrQpZL/yAKRUGmfIwSLtBc4oFIpUK+EH6RSBrldYech80GAViUSqgsUQ0oRogy2JpAqkET+P5FoJ
YcHsL7HtDus0WPlbejPUd/L6TtD/H9ef+tGHv/Ybv/PRLybJf00r+yjn+e38u1Ako/JqVjJkcjoh
qpDSQokJpQyqsh6v54xWkGslp4C2huIzqlZyBW0SNUKqHisNpiyIbckFklZQPForqg6k7NEmk30h
V4MulhAj2jWUXLEbRZg8OEWtQkyy9l9HS99vyEWhnUYwRBGstVAMIplaISWFshDDyqIuZc1gG1mv
oI5Qf/D1KYJVsNQV2ShSQQt6cPRyibk4w4T3STmQ7z6jM39AsM9Rdr1hVAL9vmf//iWiKla1KNNS
lgPKC835nu7Rh6TvXxOvPfUy49qGmBZO9yPSCla1VG3IOiHPvgrn55w+/R22fo+UZ7Susnv8iBAn
Tq8+Rt8E+i/+GOIE11q29gr1piXdz5R5RB9vMH3P3u3wweMMBF9psOvIpVa0NUwp0jWOLAVtDTuj
yUS6XnPyC+D5726vebl4/tmd4/2HGza7HW2nUY1jqZkxZtpmwxwDTdMQckRZzVZWU+VgDcnf0xrH
cTpyez/ROcPnz1/ySAIfnSZehhNaEt9LgZ9pLX8UAh/2DRfWolJm7xxRKl+zDd/J8LQb+CTD90vi
CwamFHg2DJS0Zp8Dha84xbnWTL6y6TqCKviqCVa4HjNffOrQx4loeho9MY0LQ9PjD4l2t2dcDvTK
0pjKcRl5uNvx3Vc30G9AInPIdF1ljJGL8wccX1/j1I5ZEh8viUfDhuPoCfsNN3cHejPwYGcZ7w9c
Xm14fXfNo+2j9RnyNPHlS8PffP2GP/t0w28/f82fJPKsb/grL16xawuvRo8ohbaRT0KiSub/OIz8
6w8WLuZb6De04kll3W3WZaIMlnJ3RDA8eGA5HQOpM9zEBWlbCB5T4YHNfPc4c1MFZzJ/oKBvI/5e
0WvDeQWNwyehEwESc/YkCRzIvNcZPtgafthd8eWrp5xmaPZP6LV7K5DrA1rFQg6ghCrgXMs8JUrJ
FNHMJSLWcBdnqtOkt+kaLWtj2WAMKa2gQ1TlLs4o1zPVhGscJSuS0TRGk9AoW9Z4qBFMLMQa2RpF
CQFRFZUFDHRVyMt6v0u50howsdBQ6JoGIwJm9b7kJFQFItCfC7k1UM/IcaKWujYwBg/KokqiotBU
/DLTNob58IbeOIZhT2canNH4nN8Z4t4J+v/79TP/zBd+6zf+3m/9cznk/6FQv1KVXmfLUslhXkVZ
Kjkv6AKEGUkZRFMzJL1myH/Q/qtqXo/mq6Ki31YFVpQURMlbY12lZI/WlloVFSiprE1GUskRbFrh
IKQFoZBrBlWZ5gWrLSkqVFXkVJljQmgZCWgtRGkRDKIcsSRQ6xe6MZolVyQKdXWtYxXM6/MBKsOc
IZWCEYUooFS0CPbtrN6Z9cElOoVESF0H0cHFF2hMy/7R+6TlDfMff4oqI1z2uIfPsP0Oox2qgM4f
Mb+8oWSDWgaSn2h2G8K8sG0sEiC4QhsrTJ6+HZhPnuH8EUdfmOtDhqgop8Sj3SP03RvireP6kyOn
O+E9e850WDj70x9w/d0DVHBDy3woxFcHXne3XL1/zvWrmaoaYow02jGQmXzifO8YpxlxhhoTxjl6
23BcKk235XBzy/fvEp8eZz6Uwp9/fMV2s2d79YiQFWLPSMtEyIoL45gO9+uxcxHEtux04rAkaqe4
uzvQnu/56PYVnx1PJPH8pesXPEH4mit8xTm8KHolnFtD0Yon/cAsih/ftjx0lt+bKz981uDvAz+8
6aDATy6ZJJXjEuja1fDZNQaVClPIfHi146Prid12z1zWGObOVXTj1ox+FLLRLCFBhjmvtaNFCjF7
BiWkXFBV8DHS6rqOAfAo7YipImhejyd8rXgKfans2w0BzzB0jCXyYePY9xu6WsjtjiqGrjvnzghX
Suj6M0yc+ZXHjoeNYjkrfGCFiOKXzxRhmfhOOeGJ+Ly6/t/UTKyF3335mqvO8rTJCJFN0zDGhd4Y
mAOZysOh5TiNDF3P6Avn3YDLhVyFvnMsy8K+aehUiyLzowLJRzabLWGZqL0hkFCS2bUNf3iX+WLT
Y+eKiGXfb6A759GTx4yqp931iDh8MVglzKkytAOnyVOsQRvh5BN9b/DhhGs1VheiUgwFQkg07Zbx
tKCUZieaKUR6K5BH2qYh+pEqDUYKJ5/ZaGE6racTQ47EEOhaR1oWWt1h5oD3nq7LhPke022I04hq
W1oic7a0Q7tGAJ2jxBXv2wuM/hrXPCRHCH3FZJBaaVrFlEAajSyFkCN97/ApYPqefPeKbDU6ZGaf
UMbjx4nh6hzndlQlRBFSkr/xTlrfCfo/nKh/46e/9zd//X/7eYG/Vig/LVoTU4IQyDlTJKFlFbKS
8mpoo6K0kGJaZ9fIWg+s1tiItZbgV8yhlLKCY4ymlFXY1919geqhRrR1rEFZhYqQFegi5CoYq8i1
IFUIy8rxpiZireiiYVkotlDDidJodHSEqumanrloSrulFENwjtYaYhG0s4Sc6arC58KsFS4XUlFk
LdQCpkKMoFRlpyFEMHE9dcBCg+BF6AfN6aRQFx9C/z4xH3D2IfPxBrlsyftHuM0FUg0ljaitp3x8
DSXRbyHvEkIkvHzO7ktfwGZYDpH5zS2leUh7eQ6pMr86rEL56RHZf4h92qzISLdBcYmylWgPjN97
RffzPXIz0b/XcO9G7r7z97m/vaR/8pDBa5riaOnwVdFgcApSiBhrSLVQtBCroHVHVQ6kwVlFSpVx
Xvjm/YROll/Ybbk6v0I1e7IypGIJIaKqpreaEBfaxgIZozW1LoQQ6ZqO43zHUhe+9+qe790f+Wwc
+Y3DyI9Z4UMFW62oBhrT8LjrEdPwpbanM46tsnzQ9tzGzK9sO5pW80omur5DKUWbKz5VHtQCUllC
5KxvmX1kK8KbEnj89AyfhRbFpmoSAWlb7qdKsoZWKWot7DrDGBd2m5bn8z0702JUxzQHjNEcp4WL
7RnjFHCNQunI7CP7fuBuPNHZhqQCuQQGV0k+0G8a9GnkYAznTnO/RGzrOCwJvTlDTgf6doO1gsTI
w03H9XHha2cP2ZpISZUz7fj09iW/OFg+Hk98Z6n8iMDfO44YX/n1MPPkYeZLB09oFXYQbq+PbPZn
fDKd2Lqez2vAhMzF0DPfHtBW4ZcDh5Kx+4YyTmy2W6Y5EU3PxXLkJmUeXSVu5wnvNmyqZovj4xL4
63Pi52zPd5fEz5/3/In9Bb9tei4ffJnxFPiWcXwDjS8axxp9bTaV0+zJ9LQlcQLaXBkjmMEgZSai
cRKJOdFoiNmzKMcDnZkNaFMIKWNMhVRJFM6MpobCIJWeSskT+6I4hcAgDmKhCQWdRvo80U4VExZK
vqcGBbnFGKGzLdrPtHE19yox1DRTS6VVGqpFmYpRa/+8bkAA7UCjCcWsY75c6Poziq4EUeQY8TGQ
RXF/O5GV5sq1KGfBNixS7pWSb76T1neC/g+9/vk//Wdf/tr/+tf/jJD+q6r4lZwzKa1gGb8EnNKU
EtEocsnEEtEYiAWlHDmtc2gx686koFBqjaQpJZQMRgy5rBGNTESLo0pYI2vaUEsAvc7FjbYkqYhu
QIMkQRvB5UjNBaUq1IKIwiHUFLBGEX1ClmndDc4jNSv8MKL0wFIacm5QqkWk4pSjVkEhxFxZ3kb2
fKo0SlgyGFlfmwrEWqmpYpRinAqtgNaKxUMSQVeNaw1NOud0abCbK2Jv8a6F2tIaTSMtsb9BdmcQ
J4qLtO+Bf/UdWrcnzxNm6CBV4qcLm6eOdFxohhYuz1nSwvJwy+0ff4eHP/cN0t1E08LlV1rGT77P
0i68yX/EVjWc8khun9E+9Ezf/hbh9MMkCWwN+HGFgEzTRONaYlpISti2lrEUTO9IWcANqBxYUmXo
t3z/xSfMBV76E39u1/ATD7Zot6c9v2L2R5pWkWJgEaHThnkakc6R8kzntkhdOfh9V/n2p59wM5/4
6O6G5AOXJL5UMr902ZMD7PY9GctBHLaxvAiZDx8+JISAa7foWhmC5dHVlld3N5yfbdEp4FXD0FSC
j5zvWr7/6gUPdpdYXUlSaBvLNJ1o+jNOh4mh2ZElcQqe5AYOfmLXDeQ4o0XRUpnTwtV+4P5+xLVb
WgqnVBCreJktX9RbjuEVnWqxreZNDYSaqVJJTrMpiWPSxBzwOdPqSiyZ2lju00LMgcYYYtZsi8MV
zZI1g2gMAxvdcO5aFklsmkSwFddGppq46jU3r675yblHR8/ZAktYuIiF0xQpKZCkoeSAsT21Chdt
yzFGuphpnOV5WtvNRgpeBG06fIykqvAhk5TC1cxExVlNnjNGKVRK+BpYcuGj4PlK32Fq5ssXLe9d
bmm3Wz60HSlmjG14msHruObFvee821CXhFuP/zjEijOVJXha1xBDYq6JzrTcLhFRjmlJDM2GpmSm
4Dk3jpP37PuBFAOI5ZweWQpngLk/YWzFhCPaJ656A/dvkN6ix/Vh+twUwpsJqzxh9DSNRRZD0pnu
4oL8ptC0DuWhtI7tvODDzNWzZxiVsU7xNjO0nrlXEF3JVJLSdCIUMm23IYaCNJeEu8/x44jKE/mw
cLa1DJuHuKZHm4rK8r9vz2x+J63vBP3/0/rFX/gXx1/7n/7bfznV+hdL9f8mVUAUzqxu8VIqOSUy
lVoUISZEVuewlIpSCilgjFB8Wo1pAloEdCbniLx1wiOWmkGplpoLtViKVuRY0cqSMj8YXCO1YhtD
eWu6Ixe0dZS3GdC+6Shv5/iqLNSa0KJY5sN67H43Qzshk2Jutmz7jhwbdv0lOWuUFnQpiDYohLI6
A6h1PYXoVs7NGq3LoDV4L4gRFJU5FVxVqFKRRjHnijo7Y8hbDiHjtDClwlYUmkxttwzPnnE83bG0
CyY1hI8t6lFPOiZ0r7GmZdlsMQXuy4jed8h8QPfnaPOU8Zu/RTnOLOU13YNn7BDs+xF/k1nSxJRe
sNx9C61fotwDNmcaM1xgXKazmtPsKV0HFOaakRxIoihWMR4zg23XTnSErijIipwjfpqZpoU/ZeHr
D7dcXZyRVU/WghH+QfIg6UqnwKqGKhqjIlIzlkytimWZ+PbtHS/SyOvxwHmpvO8sP7vpee/qnDeT
ZfPgkta0tBicEfRSKF3P0FZsc84UF0xjyEbhmg3iFDo6rOqhevbdGSHPnG2uQHUrV9xUGhT9sCHF
wlmj0NZRRa/JDCK6bdb3WRJGG6YQ2OiW69PI465HAxWPcYnRBx7Ygdv7G1prV+tFipxZBdHj2oHj
MjKhcMbwej5x2XQcDndcOYtkRU0LjXScxonL/RnP76+5UAanM9FXHjcWiYFm05CmwnVUnA89t4c7
Hl8+pcaZr145Xh3vmI93fHix0hibuNCGwM0y8uTRuqNuunPuo6dtWw7zzKAyjzZbXl/fsOt2hBQ4
M45SK9knnu42fH6/8GCz48U040vhot9yPx8xzVpvK07zUs0oFfjzj3fcHRYeNi2PNhuy3fKkdxwX
kK3l/u7ApukxJMZcuLKFu3Gk9A6VPL5Wdmr9fO62A/H+htwYVM0cRThzmmUMsG3QSyB1HX2pqASt
OPw0YxvHXhLJn+iUYrm5xnTQS2C6u6GdDek043YNMi0Um3DGEj96jr0a4BSosram1TLh8kS4T+hN
Q5kCbDeYxXN/c6BsM8q0aNVh9NsxIfI21fODn0CcUcaitZCMpirNshTuT0fsPFFD5PyDx7TDFbYZ
aLRQS303P38n6P8/Rf2XfzX8j//zX/23dDWfVFH/Yc4ZMQZCQZsWX1ckbJZCTAVNIVNQItRYMWoF
u5RSsHaNosWqAAe5YJo1lqaqkNXqrqbYNdIhmpwq1TpKTYgyGAWpZmwJFCVI1dSqSCGjlIO0fmFE
Muh1FFArOBG0qmSVSaGS55lUIZwKLpxQpiMKGLUjGYOqK+JWEBwVJYoGyBmqWaE2QVVECTMVY2V1
wxcB0UTA6sIxV7ISlIZiDAHhtlY6JRgqTRS0PkO2I/bsijYkRCn8A09I16iXE8ODH6V/4shETuML
zPaKpDLaKpyCuQT83ZGbjz6meQ/EGZTbs/3az3D4zW/jS8/3vv1HXF2ONFKx+buoCLXcsxENIXC2
V1yPRwZtmUsGYxBRzDHRDz0kj3GrQU9bixbBT56Tsvz+kviiHbjo91R7Tt8NTGFGnEWXRLGy7pRT
ZRg6DvOB1nVUMnOBg1Q++/QTxrHwO3dHPhDNF53hynV89ekDolieXG1BOkyz47EolpT4sf2e5/cH
ct/TasWgDIMYbqdAu7ni0+M1D5qeMypL0mxax8ubA0O/55gije0wkllC4Wq35w8Pn3O+OSOvOBDO
esU4VXbDwHR/i7ctMzBFxbDtGe8ObDcbbAxQoKsF74VnZ1t+95PXbHY7OoToM8UowhLpLi3Pp4Uv
dwOtWmFIujUcp4AdGvoItcDgKipktiVxHwq5gSzCHGR11ceC6hS3U6F1LalY5mzosLQV3KZjKpVc
KufbgQfB0odEi8WoPWnOqGAxTVqzVUXzIFfOmoGS18/xUoW+qJXaqBJTSVxTeZ0X9jJgCRRVOZaA
k4pXGVU8UguNrnzYaJ7uzqAeMe1AbTaI2RJLQitLDgUtK+0x1TXeOeUF7TJLmWlqwmhNKR7VK3KZ
QGVa3SI1s3MGBbTdanbrG4u1Fp0qF6ajmwJbpdB5oskex4L1kbq8xs0ZSmKjI+p2xJqK3CYIM82+
RQ6BJt+jxoiEQkkCOTBoDZ+/xIqggiamgk0zfowM3hO++z2G/RMcT9ACooVY1yx6jWv4t5bEEifO
Ng+oqeIaBYeET57TaSKOI5eXnmojtjPr6zpD1e8E/Z/gUv+0/CH/wi/9K/XP/fK/+h/h2v9YTFeV
bhDXY9oO1zq0s7i3pRKqVCSto/DiMyllvPfkmEgpUWIkR09JE5mILxMpLaTiKSmuu+wyUaonholS
IilM1BTJS6KGghQIIaxIWjJVJaqspjalhUyiarXemIyj1JUiY+1AzYpWWcgF5RM6jBzfvKEe3zDe
v2BJt0zHa8Jywi8nQvYgiZgTqeS1uKKA1ZUa19OGnAqiQdVCKHmtUc2ZojT384q8jakyh4wWeOUL
J6V4PRaeJ4hGyMrhnj6he3JFbg3q2RmHF79FfPExUgTXd7TbjnG5xWGosWBtQxsyym6Ijz/k9fV3
KHYL87qj2OpLhv4LmMdfI2/eY7x+xDI6pteRrEC6wLZt8KHBtB3jSRFpmVLGG9C64oNi33UYKSjr
0Fozi6FxPVOqIC1EXKdrAAAgAElEQVQHCQy7gV23wesNphtYshCMXdv2bIutFZUzaKFkj2gwZHxO
XKd7/s6b13w3LBSpfLE1/ImLPZeXF/RXT9D7R8ztFdgtmB0WSyNbrNL0YrE4Sq6UaohRULImAV6n
QtaCSCUXRcgJZTtG0ZyyYsYyAaMy3JfCDYqoMqiIMRBJiNGccuJNqsxYcrZs7Z6hajZDz6kGcIUo
GVM1G6upIfHUWVqd0USyqhxzgr7lkD2NbQjGIqXywDpMqlw1HbsiUDPOauYYKE6IObHvDa3JnJeK
kcQYZmgUx7Cg2oJr4N6f2LQGpSu6a/DVMLgNTx+8z7a55OuXT/ipJ0/40uOHKOe4DzPJFU7xyL6F
ti7sWkc1cDvPbPuBkAM0milXPlsys+u4Pp3o2oZ7H9iKZqiVZjnRWkEtE1kVxlDxFS7PHnHKmu3u
McrumExHpHCXItvWcTgc2JiGmjJzLLQWXowjxrXU08TNHJASuA0TgzXc3h9QyuFqZfaRTanEeWTb
G8rRk6tmL4qcE3udaeYXdPXALi7Ezz7FTdfkj7+LO1zT3N7Dy5e0pVKe3+Imjz2e4HhHnyPx1S0O
RXvvsbnQhIC+vWE7VNLnn6LnI8qfkPENOk7km5d0JSH3E+XuHp0ThnVzsQrBGpURt96XUjKIrJ6k
/DZxE0QTfGU8BboS0F2DazuM0VQlvtb6m+9k9Z/c0v+0/UF/6S/+5b/1b/+7//43U66/KsrZmjPO
NhhjqSWjjSXmShGIIZLfGuZyKtRaoIISRVFQakW0MM3z6qKvhSqJHN82R6mCJ5NKQcp6pJ9SppSV
Cx9zBBKSC0ppVM3UFLFakVN4+9/XBCVIteSsEOOouWCdQyOrw9xUVI1oycxxBleYxjcc4i07CSgp
WOOQsoLmS6nECo0o/MrIXQVXyzoHrJVOBJ8rotQa+VOVUtbCmUkysQiihINfqVG7ChWFbSxa8lo8
Q+X1370hfxJof+wZpjHUdMv0yX9NY59RxGE2Daf7IwlIO0+cP2O7G9HS4zaX+HEkDTtyLWA30L7B
+0+wl1+gfPA1HnzwI+zPn9LsnuGVwldLemvkAaEvma1rabWgpKKdWccQ2hILZG345vPP+CES7286
zrYDut2ucUUMGUGJo1RFzIJyG2pNVBxGOUAR/InPn3/O3Xji98c7frTR/EuXOx6eX9Bv9vTuAq23
qKLY2gG12i1pXEtNK8WwEcEoQ6qRkgoXw5bxdMfOGra2UErGSsGoyqZr8cG/LbkoFDJD60gpcNF2
mBRRklAlEUJi3w98fHfHzhnOBdoo2JJJc2S3sahwBBqKgefLzPnQIMeI6lt0iswiTDbxPEfabcft
MnPRWu5j5rN5oW0axmPm4W7PfH9EibDrNrye7mk3LffhiG2FWgOvl4WrjeHVdI3eNPze6Q7bdBQr
nE4LDzftmsnebFjGhd+Nwg/t99Rj4v3LM6wBuz/jXCmOQdNvtrxeJvTQoX3lZc086DtujwuXvaMN
HrRlkz2fLoX3zre8uZt53OxoU6UWzcYItRR2+y3jNLJoxzYrbhfF435D8oV9v0PFgihDnwo5F856
TVkCfWPpBTLC1lZCDminSDkQaDhrLCEnuq4hhIQyhtkvWO3YiECNOAOEiUEVdibR58CmTKjlFrXc
45Zb8t0bnD9Sb99g4j18/hzTFnScqMcjrtPUN8/X6mKB4j+nxEq+/kNohHzzOdL21ByReUFJRCtW
wFYIkAp5Gcn3t/RffR+3u6LtWnwVqgZk9Q2lCZIXyB5djphuTy3CMi2c5je8un2NlIULW3n4Qz/O
sHuAa0CL/O2+V//5O1l9J+j/aEX9L/yF7/w7/95/8L8UVX41owZR8tb44TCmoVSNKOG0eFLKKKMp
OaCV+r8C3VkoOYFAThVVKyFkaswrnrWskTCKWnGyta4AuBSoaaHiKXGGWjG1UkqGkEhlvUGXVKgl
ktIMpSIlo5VaHfhKEeuaVS8iaOewUimlogssp5HoJ0qYIM84Apq19jDlQkWhalrFvKxP31VVclIY
VdEKpixopQi5UPQafYsolK6MGXqlWHKiswZKQhcwSmFqXbO0jaEsC7MeOD3/mOapxe0awvI5tb8i
J425fEyNihoTqmZOr15y+PsvkNuR/is/i3IN9/OJ0+sXvP6tv8EiW/z1K8Ls2D76EXbPnvHw4QfY
s0vUeU8oQmyEMS/k1mFjxuC42J1xf/JUs4VkUAx0xZLSOm749mcf89hqzruOvrugMy3304xrNqR5
xmtDTJ67Ar1rOB1P2L5HkgdV+IM3z/nt52+QtPAA+KldzwfbK5rzp2z3D7mbHZvdBcfjhDINViKx
Clu17spk6CnR41VDfGtkO9ta3hxP6EYzCMxJ0YvgQ6XtHNwcEaXpTCVmz8ZpbApsnGBCoOTCBWDn
xGawuHik6zSNJGLJ9K1iSZ5+EHLy3CuLGM2cC9EKVQzHRrPkiLcOb1fA0aXpyEfPRhznRiHR0WuD
SnrNGC+JrDRGElOp3FJRUsmiyVMkNWBtphAxBC6LcIZQS2RjuvXaqRUzesoRZw1OV1KtmE4h1pDf
nk5FsyHkxJzX6xhLQZl1fNY067gp5DXJEUtm5xyFwlZrNgp6VYGMjwvbocH7QCHRvf2ab11DLZnG
NlQSWQvWaXye6Jwm5UJnHJS14c2IrPEx64hpgSKc9ysiuNUGSYWu7TCpUCtcdpYcj2wbg/gjLYF9
ret1lII63GHCLW4Zqbev1ya+736M7QLcfI7IjLs4J37+xzQm4jpDKiP2s++ymEyzqyyvX2Mu36Om
BKHgri4p0wGlLEoKpekQ11C0xXQDfvaY3ZbmC89Q3SW625ALb/kW622yBCEmRQ4L43hHsz0nTCNj
PXJ7fMndeIvVwsZqnnzpG7i2ByPULH/5P/tP/5Nfeyer72bo/8jXz//0T/7G3/nmt37B6/m/n8fp
wxorUtYCiaYr1KDIXcBXz7R4tFp3GK21oDKqprewmYrSCh/XCUUVoaa1/CXFhGoqMbG6zgVKKSvb
3SesamBJJNOCGHKuGKNIk0drTUpgZM0b87YwppSK1Eqsgeo0VSrRJzpjiXFtZhLv0WZ9GpvnmY1o
TvOB2DqyHnDtA6xtmILCND0+KZrGModItQajwedMb2U19BlBh0KWTGM1ekm0jVnRkA6kFK5FocVC
MKsoWkd4cMA9uaV++UuEjxPlDIr+EkUWjtNv8lR/HX3Wcggzy9Jxf7xjOde8ukqc+ZFuv8W0is0X
38N99ycYT+dI/AB/q/DzGU8evsfw9ENO2wek1rL4hmDX+I2Vlk7JPyjmsdaStCBFo42lUYkULSGN
vDdsuOwVF2ebtdyDhd615OzpxBBEkxFa0Zhc2dieWipaa67DkT+Ont8VYVc1X2ksP3y+5+x8T3SW
mGDreuZ5YdAdkjW+FFIpHErANpYU5hX3W2ZqDuyd5cXNHYnAgyyYVNjkSEie3vaU0zWDzWxUBZ/p
ydTDSNP1iA/MaaZToENgMJp6d8ulNWvGukBjHdMysXOWZQwoES51IpTCg9ZB0bSNZvaeqhRbbehi
ZdM26Jh5drbnD+/v6J3mfGg5ToGrweHDjOk0WiqHEGhXwg/7ruPmtJap2GoZx+UtmSxz2XUsi8dU
xbBRvD4eudxuqGFmsAZbKtFH+r7nON7zYDsQwsiiLE0LYU5cuoZ5KVx2PZ+fTlQNV/ueVze3YDtS
jjRW02rhblqZ6N+/PfD07AyN5xgK587y4s0bmqHDxUrUhuwXJGbev9jw4uYaGQZy9RxS5bExnKaF
R5sd5ZBIraLmwrfHma8+ekQ8jASnuIoeH1b2e5k9m4uO5fSGM91ybmaWww390BEPE7iGM0Z8LLjB
Um+vEX+A6MmvX2JcoMTPadIl8fDH1KHi+qeEV7+JfPhjlOeBtO3RzhLJSLkinl6iL/eQrinOYWzE
S0Ltdxij0JdXJKWopaJUy3wcuXz0BNM9Qrstqaz59FygsvpoTA9DVDC1hCNMb55TomepEyUsmKpw
Wmh3HardgF5jsiC//k5S3wn6P7b1sz/59W9963s3P3U0b/6bNzevfi7UmdEH3Funt7Yroa2nwSdP
TnUFTpRK06zQlih1NcBJXQ30sjrJC4ZaK5IcaV5LW8rbXbTESiqZqmekQtOtUZCSFeTKHASr3QqS
0ZpERlRBq4qQ13lWXCBbtFhUXeM2jSqUUqhSyCGjjUKCYr4/Ikbw00JxM9V7pN0Qk2HxHdbuSLkh
V4PXUMra5BYyWC3kIhhdKVVxSJFihbtSUUYxVhClaCVTc2HvHA+lopoe++ALbD8M3H98S/r2PdHO
mC8O5Nc3OHWFn2ZMo9b3lhM8+5B0uyPFF9SXn5G2A/ttS3r1mv1XLqnpktu/e8TrLaU4Nk+uMA8f
48ye05wpqiOPC0ZajPcUKexaYY4HXLelxEjTNDRSmEuhaVpevMk83DxEM5H0Fofj6BP7oeV+vAPl
6JKQq6OnEnzAtoYYRoI13M0VYs+PbwvjQfNTFx26aWjaCxA4hciTC8enN2/o7UCXMxlBFCzes9n2
nMYD2rQraWsO7NuW+uaWy0ExhJFcFIInLTPn3UgaJ6rtMKdIStBrIc8eexmQKbKURGcyIYR1R3ny
+F3Dfo6cqtAMFjVVdNdxmk/0F+dIrdxEKMZyjBPuwQPuD/foYctOC7fRk5zDLplu3/H9e4/Yli/o
wsdx4Wd6R54neLsDRaC1ijenkbOzFn84IaLJqsXMCd1YbFXovKJ0O9ug0CyxQFLkJYHV+JRIBXa6
sgWMMUxTYps1Owq3okAUnW6oGIwxJFEoqVhRKCsrLKloFgQlDUUM26bBtZZ5DkTbcMyF837Dq5y5
UhqDXk8FdMOUAtoqTmo9zZrKapBtXcMppLW1L1aiqvSbjskvDM6xENc+CJXJ00yvhGZ8iS4zGwLu
1cwgBTkcySpTDwHRb0t+Rg/jAtOJskxYoygfvUDbCscZ3hxw+x3h1Qvc00vy/BwlTzGnmbFrcBfv
M33+Her5+4RyRPU79G7PiEN/8IRws5CvrpDOsZRKbSzLtND90Afk/owgLU7alVInUKKgGlAFjKvI
AFPX4oYd1599jOkVUzgRx5G2BvpO8d6Hz9Cs/o9aVaLyzhD3TtD/8a6vf/Hi5qM3+ZfQ7r94ff29
f+31eEcXNJ2A0g1ax7VKtURCzUgVJK8YxUhBq2adL/EDIV8z65VI4xpiXFCiKXU1wtUMqVZqzfhU
MVLIJaLUOoP2JaLpiSGQxa1sdqVBQwyBtnVvs/QGynosbzTU04RSK1bSqoIp/yd7b9ar6Zqfd/3u
+Xmed1pjTXuqvbt3705PdtvGEQ5OIsVI5CRBSChCgmP4BBBxAkSQAyIh+AggkJAgB0hIEZZsWUrs
tonTdqen3b2H3lPtVbWq1lrv9Az3zMFTtvgChJZS98mS6mgtld73uu///7quH8TJY7RmHAvGSkKV
ZD/BFPFmIjvLGA12GdHB4XUDKPri6JylZEG7tNwcPVUadPFsEygNY0icWcfkj2hnaaTiZko46zhW
j6Sj6zSr1wurd65In+44vP+M8/VDbD9RmgV5u0M2lkY0GNVy9tqvEZ9/QU5rDs8mVg897uQcQs9y
I+k/zLhViywCt5Ho5KjdGlEtYapo07Dv94hGsiyVSSsaIRijpGscuXpGoVApEapBSbDCQWtoiqaq
JTklQjZMZU48JK2gFopU6OqRJWOwjH4CadFKcL9Z8k6rOWrN5rRlKRQ5SSwVk0D4gSZFpMrU7EFI
XAVSIh13dCES+kBXAyYUzLBjcdxhR0/38nXU5EzxEZsyrdFM9QblBUJJLIoweeSwR2uNShFbA84q
8iEijx49WFydYT4qNaiqyb5nLQR5/wJtHY1S+CA50464v+J1JVAqY0rEqkpJkYXV3O13fMs4OqUZ
wsQbOpOmI0pqSk58mSL3nWOIntPFCh8DF8t2Ho+HLcIp7vqJpbJEP84gH6UZRs/GdcQp0klDCgHr
C/fWS7b7LY3VDMPEfdWBCBy8p3Ud19PIYuF4kTy9gJPGcHs8IhpNSpFjazkkzyoUHm1OebLfc79b
ILzHZ81GCfp+4Gy9ptne0XUdfYjIVDhbdtwedzSdxdTCU6FZtJl9nnhwesrtXc+utZyICVESF05T
p4HT9YqT456aRi6AcLvl7LJFPz+QZeLECeL+jm7Rkq5v0bagtWHc39Kt1tQUQWbq7o4y9th7J/Sf
/Rnq0UNqk+HkBOsXjOIF2imyl6T75+QXnxGlhYNnYMJ2LUUvoWtRdkPenODalqAG7MP7+MORtFlC
VYxmxOk6+3yUI4rZS1SK+H9vGtFKUA2IxtKnws3ugCuSfhzwPqJLpjUGszhHa41Rklr5wclCHF9J
6itB///8PD5X/qPr8B9kET85xsN/RrBzc1IMCNkgTERlha4JSGSgCD2zgl/S1KrSCEDUQqmVmMG2
giLyPGKv8y7daAFeII0kFYmVlSTCnPNBUlKm6ITIIFUhx4JEIpSgREhy7mQQcr4cSOaaWj8FtJNz
s12uCFGRpSIpTD6AUHODk7LkFCghoFJLrJqqBQVDcA0lQiwrUnYs9AIRNAshCbWShKJTlVAijYCx
ePTLTPtYE1pLRjJjNVg5m+7U4pyTt+7z6et/RpJXLMUaeW/BdP0B4ad71md/B6KkUYZSoTlf0l8X
DrefIN2vUkJm0a2J+0K9fYEpAp+OTKFDNRYjFL42rG0hkGmajiQSzhlsrVSR2LQd5Ii0lkpllAmB
ZBczi4UjTCPOdLP3QRQWUhPTgHGOXCNFaKboqXnidLFgGg9ULZE5sZZAAzIL3r1/jxCHmdBXIlOp
LLTlxfUN0kK++ZLBKDo3X7ZWVpOe75ESViFTvGetBVM/cVIP6Bwo08CmWuQwoHSDiJE0TKw3HeO+
x3UGsa90KiOxhHVmsXaEg8cuO/xxopbIydiyGya6TUOyllYbfMh4WThLaw5hx3ppmKLGnK4IafZm
yNEzZsPD1YLnu4lHDx9y+/wOowX3k+LLXc9y5RimnvubU5682DEUTbux3N0mlst2rv+0Fl0ruiQ6
a0n+yL2TDc8Oe5LQbETiri+YpSb7Eds4+v2BKRscFRUTuXMzREkqzqRhOxaMETS1oKnUGFFS4nTF
+zhf1oQkG80x9Uyy8lBPHMpAg2VVX4JHcoVq2MfCbQjcawyaCasKgkgnK7EmTIEzZxliJiRB8RE/
TvSdwqSMKwFDQWWJSBM6TmiRWMcBJRL26iltTDMbwibEYYvCkI87pFWo9ZqWCLe3c71qjISf/RDz
7mNqHNBuj1T3yKsJ2V4QxmfI1ZvUekddnpLshiA7anfCOGSKeoeRFr2+QK1PyG2HOblgChHur0h6
SWwAuwahcXJDGHaYhQWz+MuJ41+Yf0lzT7wQIMzsfo+lkKSkRc6wp1KpoXJh10hxStvOpMday6u6
11eC/q/ufOWercDf/xc/+cVVzfa/iz7Lu+dXHMfMeByROLTOxDx3nxefKFIhdCHjkcx1sUg5m00E
xFSgGqqSSCEoJKQUKK3IRSBLISuJxJKocw+7sIgqKWoWZikkNUtKSS9NbXO5Q8oVLQxZQEwBdCEJ
idKCXBI5ZVSVpKnMP8eA0YmcE7kIhMnkknByjh4Zu0LlxFAUWWZueok5qxhRUNpAjtRiMTJwPUyc
NC3HwbOyhsFPIAVrZfA+MhiNiZnWGRaLU5TZgHhMroagWnS3Jn72f2G3Dv03LPmmJ19V1Ink/N4J
40cnjE8SMVbq9pb23gUvfvER3bswfnkg98/oV2fs28KF9DzzZ2wWie3NgYVpqXnC6IZaPFPWdMsl
V7d3bFYtTdb0UrJUhd0AJ4slNszTihwn9kJyz6mXfe8tcchMWmOAPgeUUvhQmJylZcQJyZlTPO8L
rTNIP5f51P6Iz5LzLiKGHklBTz3Ho2DdZcLk2aRKuRsIIrPOlcPhSNtp1MGThWepCsP1LTbMK3a9
bqiHHaZb0IyB9OGH6K/eh8OEMBrzIsLjJWZQyOMOVS9InzxFNy3u/kO6uEWPK9I4krSGIDFk1C7j
csIsBFIa1LCjKY7atqhWoKUiJclrpqXbeloJ+zx/Bu4bxeQ9TS7Uw5YTkVkpgfIjayuQZQKZSSXT
jwOni5YUMo0yeD9hpUAAbhy5bBp89CgtiWnC2oJsNbEcaVaGmiOtsnMPREpsFktKTiy1QSHI1szi
GwPLbsXkI0IJVrmiRKXtWg5x4nLpaE1EFTUXLNWKFpab8cDjbolGzqjVJnHwnmVj2flAI+EB0BfB
+aIj9T2nrWEZA1pmWiU47g9cblbUuy8wQnEqA+n6lrZG1OGACJHlumH63gfY186odxGtIuLuF8Rd
xN17A3/3KbZ5m3z7BfXnP8e89wb+J3+Gbl+DEKhDoBwCQRqWy7c4/sn76He/QToOjOIEwYah1Nls
udzAo4fEbJHrCwpwKJb16pLd8ZbQnWGKpliHoue2QNNdQJFkIRAZahYIW8lxpjfWl0RHVSv7F45W
OqbDHl/AGEUOmtXmFCkUSoCZ7wKvxu2vBP1f/fn1b7z9P3zyIn2aJ/m/NO2q+9hPlOipqSJoETkQ
Q0JLRS5zk1qVhVgTjVOEPLeLOa3waaJr7Ms+ZkvBgTJIBHUKs/ElgpSSUiKUStc6phRRQjKMHqkA
VQkRMpLqoXEVUaGWSBaRKUSWa0MYE8pYlBTzmIw87/jMPLVPolBiIr0smZl8YakqDRbp5pysEpYo
eyigF5FSTlHNCaQAJaOdoFOVhoLVikRhbWBIM7O9VDnvPqdMrHXGs64vWbx9wbH27EvkteUKcXkP
9fQK5QPaRgg/Q8T7LE8eYkVPyJb9hztOTluch259QpCJ4fZTpuk5jQ3omsgFXCNIZGRjUWJugBO5
YERDkAYfHUatkaIBIekQlBxoVSUGP6caisJq95fxQiUaSizz5U1WEj3LVjP5A0ZXcqoUBKVkako8
alqq32JTgHBEZYHL0AwFKzLp0wONU7j9gBWFpS243UAoPZsUSNMdLs9FKdYHZK7IVtGViXL7BLPe
IG97yu4jzDd+k3z7GfbSI/trBJr8TJK6imm/Sf3BH6Euz5Gjo12DHCL5ww9YnS0IX9whpMAsVigk
er2m/3KHbQ26l9jWkreVYhVn3nHcVtYbRxwa7OmGeDig3ZJlDGwPnm7VcEwRmobxMFGTYrVaMV33
tF1LOIwsGs3d1EMGu6w8ve1582SNTxkrFITEdfa8tmrZ7Tyrk46+j0hlOHHwYhywpuHJoee104bs
Bz71nt84P+dq1yObjlvvoWloc8KPA2/cu+THu+c0yxUxTwzFc64bbvcji9Uppg+o1qJFT5wqpycL
xttCXhrGkJBV0jWaZ8fExaZD7Y/IdonKGZ8FUmqmGChdg4uemApr4WmzZxUiaj9ATSysII4HnE6k
Z88QVmEM+CdbzKJFVU3qBszzK/K9NWK6gt0fwck5xKfItx1i/xx5qRFHD17NKZf0DNwZefSUYyEH
Q8qFWDQ1GQ6txTQNZb2m2JYSFFq3yFIIVrD1E2MBikbqhgT0cUJoiaRS1PwoqXVGPNf80ukO83dP
nImGUkIkI5WhNZIwBlrXzP4huyALQa1UVV4J+i/DUf86/tH//X/7D97/+//gv/w9pZq/o3W7eHE7
MvgjWgmMsXTGYuoc05LMLnBZFSLNZpocoFAQRc+d7tIghULnObesq0ErixYaWRxKa6Q0aDRSKSp6
Zp4bQ9EKY+cKWWMdISUqglyYxatUFBpdBBpNjpmUZgTsWCq5RgKJIY2UWqgUjNXsfWaaIBUJVGoK
tMZQqkfKglOF0Q9IJMfgOaYKSnEbPY02yJcVsrkkYs10WrOLE0ZpShFoDCtZ0KWgXSQdnjI939OZ
im4Kcvk6qAXheaagSFuDXZ0wHSOHK4ngHkJJVudn5FSxytFv78i+EPaVkzcuuXzzbdzpY7LUlCBo
mxW+90jnqLJSjWHlGsYxs2xbai5YY1DVE1NFGcU4jWy6Ds3cBZBLoqZM4xpCGF6OGgeoas7tB48x
DdYHtFSsU0L2nrVK5OfXuBBZbPeU61tO/UB69gx52LMqhf6zL1lFj9huacsB3n9GfvI9lpeO+Ef/
E50aEE9foH7+lIUU5NuRNhjC93+f5vSS9OMP4NnnuIfv4a/+ACE25M+fImWA559T/Z7mq99h/Mf/
M/r8BLm01OcfondH0uJT7EIz/fRPsPdb5ADp6nO6xZL9Tz9B94X69ArTOER/JPUHlo1g+OmnLFdg
pkyTM+6QcUROpkz64o5NWzCHgRWBVT/SpcClTHD0LFRATSNKRqbjxJALCwNt1TROUUoiKcWX4YiR
kpUW6BhAaVKqROYLFaVSRCGTuVJgS8G4BicSvmbuRMEohRSS43HgUrV0tqIiSC1xBZoqIVRctVgh
8VFQpeQYBnohqKKQtKBQUKaijGDnj6wXjimNVAmOQkZQEQwxkZUlhgMLMXCuK23YspSBbuoxoact
gbq9RccJMx6RacRWRe73yBQR4gbOQcSfE3fPsF95h/j0+wi3R9g3QB2QUyVtnmPWa/zuU7h3RskN
8cc/wZy9zni3QzSKOPSMyuGbFX016LMzet1hHlwQi8W7lkTF14xBEcKEMJaSA8UoUvIc/MCZa9E1
0Sw2WNMi9SzqJQm0rVTmiUr0ld1tYT894XDY4pyi5EpKlaVtWC6WnD54HW0kWov3m5X8R6/k9NUL
/f+382gp/uSLvv7NTbj8J28+Tm/98F8+Q2JnIxMZJwSKRFGCMIW5zUtJSIJcFYyzw5ZBYDqFAoJI
KKnwwaOdgqqQTkOd612T0+RScUs3j9ilRJZMLpGlazj0Hte5GabysqFdS0F9KUJCFBAz3CWSCTVS
XmZqJWoe0ysJsdIWgdYB7wO+NBTp2B4EbWdhamkWCmJC6R6VJ4JtqDIxhoRdnhIStG3DECaqlayY
kZtdYxliQmN/gP0AACAASURBVFhNqIFQCtasEDjyISKWhTIllpsFvrzG9FGlVPA/GnBuRS2SZtPQ
95Xj88pwVrGu0HSGJp8hjgFxe6SODpMtVUictPQVGmmRwiDUAq0iMI8AXVNx1hBCRQpDlZkoM0tp
EapSssAqTRQgZJ3hNgo0FaoC3UAR6Frp9BqtFFJFSplYERD+iDr2dP0WESpm6qljwEUJtwfMAdrL
lvzBc9puS9UBmQRx+0NcF5HhDcRnA/KhR6RCrk8pU0WfFup4gv31x9Tzc+rVl8j4bcIhIt1fhydX
yMs3qOqcfHOFulwRP7pFnL+G7ED0z6C/I37xBebdv0b47ArtHiDkY0Tc06wuKB9+zNmlJfzL95GP
JLJfQIDFekn82RecNYn88xvsYqKYA/JkgY4LRCxcyIzeJmzIxF1ELDtWUjJc3XDaGmo/txvuthVH
5cR1pNGz6jri6KnLhn0YKDmzMfMe3jhNKCNN17KfEocgOVksuN7esWxa1lVzVQUPtGWIFWOX5L2n
WzfEXFgZR9s13I09rrXICgHFkAs1Zu6dLLkZelRjKCLRS1BW4v1It9jw0c0NF+2Ko4gchEYriexH
dGOgQE6ejVD4qXBx2tFfDygCrVLkPrB2kvJiTyo9nc5Mz77AdQr6z6njFVWfE4/X2ChJTw40j94m
fvAj0uUzbPe3CR/8APeNr1K236fqSp064mefYO6/x/Rzi/qrD0ifS5L5GnVxTv/+D3Fv/gpTHukX
Dp8l+tEZuJZ9cFjdsdvPXhdVA6EqzqzgOE1YbfBhwrmOGif6WiihEMJEOslUBKX+heF3tvtS5o9E
yRDrS/d7NRhryEFQVCaJQlWSqiWZTK361f78l+TIf53/+NcX4qe649cWZ8t/JhaaXoI3BtM1mJM1
arVEOkOYdRyfM2NMxOgpJUFOiJxIfmLwE7Wk+d9VQgjIL4nrBU2uau4PEwppNMpolG3RtkObFcKt
cK7Dug5tW4xzaK2pWmIbg7IKrKBoQdSZrCJJRYTKFObxGUWS81ycE+rMxG4kyDQRwp5+vOE47sAO
aJPpGgF5QtREkybqsGdZIjEc0RRijKxMw0LOTVgL4yiloLXEp0jMGoRCCIU63eBXksP1DVqAaTTq
jRPKqWYkM3QT23Qg6Ei9Z4gXL5gu7rit1+QLmLpEiZXujYcUJfB5YlQeIw5ING1r6OOIbB1FRLKQ
VFnxWWKbjpwz2lgqGaEsRipSBqPn3xk9152mCK1u8OOIMHYGzwgBObH3AbNsSWFAW8FKBlK/x01H
4hcvqHc7mmFP2G5x2ZOnHqMjzZTxd7es3mjIOmPubyjPtqj2kvbxbzHdFpp/49+llm8h3voV6rvf
ppw+wDz+bSY0nH6FJNfUr74Lb77F1GnK6X2mQSDv/Qr5TpLjfdRr7zH88T9Ff+ddohgociT3A/H6
M9TpO6QffYG6tcjbPRx7hL8jhmes3nyM3g3omxaxbVC/OKCGW8pP/hTTj8jr99H9NfrqM8Szz2lV
JH7yFDdMqN2AHO9wfQ83X7JUR8SXv6AZnmIP15jtFZv+GtvvuIhH2mFPM03QH8BP3L645ZNjIsXI
4AfGWjhOER8LNRRKiKhayH6czaBxBhYVMTCljFMaC8hq0FS0aoklI6aZaliLouqGbYJRSEZdGUQk
akkhMjnJRhQ6aci1EOv8Uo8CRlHJOlNURVuB0hkhoEmwrolm7DkvmZMiaENiWTJ6f8T1I+t+Qm9H
1M0Nqv8UMX2A2H2P+osvURhqyIiiqNVS9gVd3yO/uEasXqPuLpDiaxAeEZ+OsPir9F/25M13GPol
+94yXnyD7bDE3/s2d0Kz35zjlSE6QzaKfYo0a8XusCOaxHE80odEjJnb4Y7sLH7sKVTK4JkmWGfF
3f6GWjMyRCCjKohUUUpS40ueg5wjujH1pDDhGoWoimw0wjRk7WjX82RNa02kvBq3v3qh/3Kcr17K
2z//xP/Ow/sP/sfrFzd/T0iJaAztusPKuZUtiOcMxxFZKqSMIFFLIFWNEpLkJVVIhIuIMhPZSpFI
aahkihIkQJeKVoISZmNVyQJV5/CnQNC0C3wJOFdIKaGLRilFniK6U6SUUAlEnV+9UhjGacBqNUfm
REHgKRFMFXPsTUCJhWEO0JOA9crSqpasNSUkdCsxVXATMlJk8ILmbME4DWTTUEn0tbByjmmakK5F
ipE7Ws4MlFwxFxvsg47h/RF7lJQm0n7rhH3Zs3++JX+lY0ovaC/O6RYNff8zvJjw6j6be/8Ow5gQ
JwLrLPX8gtpsSFVgMKSqsE4Tpzy/FGKkGMeyZHxQnDhD7zNSSezLStfOKHofEFaQx0KukhILsQpw
iRACYWFpSiLWFps9JUh0Zm7+Y2Z6Zz9ipoDyE5WE1orRJ0ynqVSEU6RzKI0jKElW9ymrDWGxRrWK
0iyJ8ZbczSNo1QmKOCEmQ0kOmrfQ56ekMFG7dwhPbyhrh2gWxL/yHl4lahPIqzvCnYc3l4R0i8w9
tTtFnCXk648heBQGMYIYEqIzlOkp5t3XKByRFzfo0wUlfUhVH8HtKe6djtp/hgDMSUs5fI4oLfVq
R3MIiDggVxacp/QDcpkQ21tW8RPEiwuS6SA5YrOBIucplDaUlFkoye4ucJnA6UQ5BhbOMg1HtLDs
xy2t1HRdx93Uk9sFKVeMhBoDL0Li7WXD7rhj0ThUDlgpsHa+HCzWjn6YCNKiCKxIXNgF/a7HtQ6X
M1FAVyRHn2kXHS+2OzZubnnrRGVtFKnv6ZqW4+GAQXOhWsQ4snCJ+nyL1RUnCnm3Z9kqps+vsXWg
ceA/+TFm9OSrj5BLiQznhLsP6b7+dxn+6f9O82/+GtNwR5yOLMo3Gd//PzHtY/zzLcbfx3/0giG+
oFv/DW4/+t8Q3/3bJBHZPfCo5QIWClMfcYgDy4dn+B7UZsMUJZPSLLWmHwJiLTgeI90KWo68yIlN
e0rZzxdg7T1HoVnXzM1NYOVazuKBms4p7mWLJnXOrAEiCkQFLRI5TZy2lhrmpsFcFNVWlHWIOgt/
qvKVoL8S9F+e86uPnf/DH1z9h067rffpP65ksl0gVIOfFNWOZAXaVKz21JeimnNCqEKqZY4UTXOE
TQlLyAknJKkWRBbIVPFV0CwVJU/UqtBKUgXIMudHtHLEklHO/mXFpZSSUCxKGnT1ZCVQcn4VixoQ
QlGloFYJJZFzpBRQKELJSClBCkwWiFIQvuB8oZgRZ5egFaWCkZmULcfogYQfPEgxG+2EYMyRI5lG
SCqZkCNLZUm5InOkadcs2nu8uL0g7TTi0iCtJjNSww2qWTL86E/h5hz97iOMLUxPnpIWlcyO88fv
ok+OXH0xYr/xBnKzxOmOhGZG2Gca5yhVzJAN5p1q2+qXlDyH0AJyRdYZAakbzZg9KMVUEllBg8Rn
ME03GxW1wZRCtYJOabzfIU1FloRPFUzLWD1RW5YLh58mzMWG6ArZV0SjqIvZbLbdHzGLDZiW/Iam
lsqgFOLygmEccc4RSkI0Jy8pgIn6ZsfYGjQnhP1IvnSYZcuxZspbjioFWIdcXRHGAXPvr+D/8B9j
xCNk+xrlyQvMG28x/d9/gv7ud4nf/x5yO1LuItVcY771G8Sf/xD77XcQvUAct5R1Qwo3NF/7Hcb/
43fR734HsTtSnn6Iu9iQ//QjzOl94k8D9dEFeu2Z/vxHLP6936L/4/8V88aScncD7VPa818nvvgZ
5yffZPvkgNu0JGGpq45l77jrHA9sy9AnFmeOw4sDsnH0qXLbdpybBdwWwqqjDJFiDJcIXiTDSbfm
7slzlmcLRPLzpEtOHEaNXVoO0wRrQ8yRIgxHIZBTQiwVIgUiAlcqOQucESSVyNrQUBlSABGpcaI2
hif9yMa2XOaETBO2TKj+iCyZpSwcn91g1hpR9qg4ouQOP3wPp1bQNtAZyqFSHvREuSWeHDCLHVkU
6rnA34yU5owwavwHt4TflvThjvBIMKaR3Xu/Be4+WcBoJVkp3NKxnQp0a2yzYBcic0DckKskjwMT
Ej0ERC1EX0g102pNf/McEQ2qZqL0VCW4OhxZaMnh5jlbKbCr19DKUBXUKtDyZbq2ZkAh0LhliyyB
2kqsUjSqslkalOnQrZoBRoXxlYq8EvRfqvPXfuVhAv6Tf/b9q7O73e2/P/iMxxNqpWiL6Qy6htn5
7mcvoc6KmAs5ZrQs1DrDDYpIiFwRZaaBCT2DTixzXCoLgdAtZS5wRCiJqJJa64xWlAIp1Exoq/N+
WAlNVpImO6oaZkEvGeXMDJdhzsebwtxaVwqi5vnlLsW8kS8FUQuH4ci9kw4lNFIocoZSDUpDGhPL
NpPDCKpFljzHf4xlO0RyI9iHiBEzE35fC2d2gYwj3b0HNF/5hN3TW87eO6eWRD5t4Bjw/lPEGxU/
fIARI04uCGtBbgcChcWDS8rpPfbtHWebicVJg7Un7MsCrQSHqWK1ocSAVA5ZIhOShS6UXHGNIscZ
/F5yZBcq95aW6XaiaI32gZgVQk1MXrFatZSpp7qWhsAxJVzniMcjyjXEfsILRaNabvWEeHRBngbq
qmGlK3c5sxAwDBN5remiZGfOONWSmyBoN8xEOSNxsdLbiWAMqWiEFhjd8lxGzkskikorIDYrhixo
CxSpMKYwpgmrR4RsicPcMR/dJVKeka63pE889rIltRPyZCJe3KLPljD05I8/RXz3QLztcaevkdNE
cQ1lHyBdQi9h/xrqY0NNEXlrqB9/Sj0k2DxAfPrPEcu/Tr06oodC/Oe/QOV3EP0d+foT1NuX5I9/
iqtvoE2iPc6+kLIQcNejXOWRUtTs2ViLmAZk9ezGxJaGM5sx05FqGpZEvK60uhBC4ryx9FOEhWGf
RzZWU0RmTBm3XHGYEllIVlIQi8RqCCWzWBii90QJG91yO/Usuoa995y1S8ZSaBEMslBKojMLSh/4
qm1oDajjHRsdaLcHauxZ1AzesyLA0WNqxUwSf/UMd/arhKf/Art6jOiWFP8c99XfpPZf4N76JtPn
AbVUlMUpB3nA3v9Vtte/i/zaI3Ir2P7m22De4ticYs9eZywOYSwBMEpzIFHbyr3zFfuhJxpJqhNK
Sqaceb4VPDhb8OxmYL1oKCUzFUGjYQiFhYZh37M4XxBjJKeENAJ/EGyXI+fjnqA1GAVFoBaKnGZx
zxlqMSyVZRoG3MogQ0JKWLSOXBWmETPMqvBt4FWH+yuX+y/f+U//83/0u0J1f+92e3c6hgQ1MoYR
6+YXoa6SKjW1KoxpyLHMo+w4ww1KjdQicBpSTiALUmREyaAFMWWomZxBookRcq4YMxO6FKAEKKGp
QpOjwhpHzXNrnXrpqKfO9Cf7Ms8eo8eIGY9qSiXHiJaFVPJcZlMyqYqZyCYFq3WHNt3sRK+V3iu0
nfvejdbEBFa3BDmShKZtJEOYXubAI1JJFlowlUprzQxDyQG135N+3mNODtjzDdthYD8e2H74E0qN
WLeke+0RaesZr8BefJflg69z/71v0jz6Ct1qg24aTh+9gTt7QLQnoCxUQyx5NhMqgZR/MdWos6FN
SmqRCFnxKYKUOC0ZY3gZ88tYqfDZI+Tc8RlLRCtFzYJSJdM4d+znUhlK4igTIcJRJbwFKVqqbchK
I5qOSSom2aKblikZmvUJEUtVC/oA2W7Qpwu2x0zs1gTtyLbF25ZJaGrr8NUgmjXHqPCuJTeWg6pE
5/BWkq0BK+hTwq4XjLeePD5E+vuEG0lt19R4xLz+iPjhF5SfPUPcf0B8+gT15neJH/8I5TaUuCe3
BpaKurtFXzymJIc4XaAvLYzPyYtEuv0Q+7d+C//+n1KbW+TDE5K/RV5YUvkQcU8TPv8h6DP0a98m
fPIMIx5R84DOE/X5E6RsEDtJHAIdFVkiCwNxHIgxsB0SBkVTMgK42Kz5bLfDakefPYfiWWrFtu/J
naUdRxqrULUw5YaVEYy7I+uuJYWJsRbWUrMLe05WLU93B7TsaEpm8oW1Mgxj4oWzuDDNhL2YSFPg
fremHvZ0Ct6iIPuBUz+Sv/wSsdtyvjT0P/6CZdfCdY+UGb19xvTx9+nkiuP3vo977yHl7jnp+inu
9e9w/OT3KfKCIJekbkn/YuRweYlafoXnZcJfvslBbzg294jNI8rZJWW5om9W2MsTDkmiFw2TtOAs
slH0IVGMYMwFZQzTNKOenRUce48pEZPhZswYodjvBDZVbHr5mUmBEBOLznDsE65TbBYO3ayQGKSa
64pLnAmMJBj7yO7mGaJE0JmQRqSp3Ds5Ybk6o1lbnAJZ65//w3/4X/3xK/V49UL/pTtff0vu3n9a
/yOf7v/BZ88+0wcfkNJByUgctq0oKlOYEGnO0hZmB3qMGV6a4nwyFARVJCQNUhpSLBTq7EWUkZwD
oiZq1pQoqHJ+oc92xTpH5YwmEyjSIGeAKdJIdFU4BKIIctRUXWdBfRnNKlKRiHMNrdDEKlCIl79T
nb8Emog0CV0krZQcjh7nLBiFlopeHlDKUFVkFzzOKqSYOdGiFnxOKF0JIVCt4PRsSb/QjE5wvC7U
iwML29GIh6xf+1tMxw/ZNPcxeUVvnuJee8xwJ+nvEsNwZPP6t1i4U04Xl8QiYXWJRjIVgTWK4gtK
O1QFlMRKQa5gnSJOGanFS2KUwenKYQo45ziOs88gl0JUkqVz7IYD1klKmZ3xqmZSdhgnOB6vCUJg
qmOnR+yqY+phOFOIUBmwbNxcub1YOq6PPa5tUFIirUXlQj9qTjvD8/2R3DmskpRqsVoxDoVmaTke
Ar1tWSvFoWRaq/ExwbpFh0gOkbXT3CSBWxRU8uR7HW7dMn7okfmU8uwpw5fXnH7jlNs/+EOa33gX
tjBdHbGXif5PP2bz9Q3xkz/D/ltfQ27PyVeC5dsX7P/JD+neuySuNLneAT3Z3NDair95H2fvkRaF
+OQJdvmY4wefsXznLXY/gMVvrMkfvyBfP8GevIn/6Ae0b/0O9eo5YdzRrn+FUBLNhaYeJzZLi06O
cYw8KBVfphnbWxVyNbIqsFEVIcrL/PTcJR9FBSlJ1VKq565IWjH//08ioVuDrgUZepIs+BqpsiLM
3GGglOCYA1q13O1HVmp2bysqVsylOcpoWhFQPtAFj7y5xe0n6tOeaRhxPsDz6xlOxERYDohvvslh
+wHq3Q35/oL8w48Qlxf4/oh032X44kvyvTOqeIO+GGrzFb7sM3H129SVpbCCtmVSDYtFw6EEusWa
kOc10DFFJp9RMTElgQFuh4QxBjFGdmPP2lkOhwNQ2fpCUyMxSa63A61quRkTVlZUnRM5jVakMXF5
seDsZEkxllwEOQSsssQgXpIf568g5ypoxb4PCB8RpnDaOCSZptFUCigIWX77lXK8EvRfXlF/IP7w
R5+l/2YX+v/iybOBhVsyhJ6T1tE5BxRU6BmOI8lEohCkUCgiEtNEUwwlVaRWyCwIIlO0mPflRhLL
jDCVtVJICFGYpkrbGXKJCGFBiJllbAVp1EjxMlYjQAqF0JKVtQx7jesMSgiK99QSCNHjWoufIkrO
xrha58tELopUKmEK8w1fJiSKRmemWGlPloxTAmPQPlO0nOlsybPp1sQ4oeqCwzRhjGFtGsI0Upct
RijEumFcOurhBeI4Ip0g757TuSXhI40TK/SDUyYl8H7iICRPKpxNE61xpLBAnZ5SoifoFp8ToUDT
CPxQMFqihJxTArJwSAKhK6lUJBpRE1EIWlGZisQoicyCUYAsiZQVJoPNYNCQMxMVSeRQBNZYfBLE
VtOhKAkinr3MKFUQObMzmlQzQ7FUYdiJhrU11FQx0lFLxFtDrQJfHVlIWkAIwzFXikwMCHZC0ovK
PmSKMOyTAgTW1zneluZccK0NSmWStAihWYmMes9hdp6cHyHkCeOfHEjn3yWoBXSQ3n0LT8V/95v4
jz9DPNjQqhPkYUSfrNl99CHmuxeMn/6QeudxXz+lfHCFuvd1+t/7fXR8hLj3NlxJ7PJrhI9+QPfb
Xye+f4VdNsjFKfGDK3T8Vcr7S9rLv0v8yTWpv8N85Zuk/ac0C0e9jqxO7sPtlkY2PIoSpyQvRGHr
e847GO9uuVwuoHpiEXRKcRUKl0tDComoF+hcCVXwoIGUEnbdcHfccqLXuFq4KZl1u2HwR84XC6CQ
lCHawidD5J1LzYuriYe2pWRJyHDmHL0PPLCO03hEJc/SwXE6oG62dPuKD0es6onP77APL4mfv0+x
E+b+t5h+/HuY09fIuy1l1aDcCYfd+2j3VY77TH1wSlZL9o/fQCxPiK5FNpYRh3QLDsnQ3et4Po4M
Gc5I3B6ONChC9KRQUbpwewicr1rGYyZbQaXgaib6HX0qKGUYs2DqE1U6Yi4sGsMwHNGt5uALykqs
XeBjYH3/Aa3dUFQ7w57q3DeRwrwTV0JStUAZzVE59pNkOiY2G8H5QiC1QVg1g6qSBHgl6K8E/Zf7
tKfqv770l//2cci/5acj2kpk0yDbFVJKHIE+vsCngMxxhrMog0qzES3mTI6KUVXaWtGlYEVB5pfB
8VQQNiCLRogEdd6JpwhVezCKgqGq+aWOkJQMUghylSgj0LIiZcVKgwWyNMQYKAU6qymxR4tKzhkj
INYZxqBeZtZ3hy1dE/HSoLXF6pZGZbQRoBQHVZhKRgjNxrbzKkALkpxv+0WIuTFKKyCjXEN7vqD6
iCyFchgxpWPTXjLtj7jFmjRBGjSynpA09EWy1S2P9Yo+af4f9t5kybIsO8/7dnu6e6834REZTWZG
ZVOw6tCQJQNhECGRklEkpUcgNdEUD8GBpDcBpxpoLBoJo1FGiIIVgAIKqEJV9pmR0Xhzm9Psdmlw
XOQroMxiT3zmA/frvs4+6/+/r7Yt+5RwrqMqh7D+vEKpGKf/c+YglYKIZmMVSywYr4BM1QqXMyVq
LpzmZloQo7FUiq40trCkI7ZVnOIdnjW7UCqYVnM4RJJeXwenkuhKJqXKA9txfXcHojjTQsgRaxRv
polN23JKkVw1VgIpVXxjCXOgsYZaCovAoC2HJdE1lsNxwjuHVoo5ZM6MJuSF1humKWC0oKtiP627
0CVCYx3WVN64gm1adGuojaJfDPWrinzwB0xdJDdCXp5hGgfPNxxf/lu61jOoc1Q70+pzyi//hCe/
9WPurj/BP9ug3CXzcc/ut77P8S/+huHj31mpcdsBlTPzdODswf/E/t/8Ef7xJWUqyDDA2SOWv/qK
7bvPOf7sK9RVRmzP8uI/Yr/7IfGrn3NW/ltS2WPbC3bec5DIcNFR0fRLwyEXml3DIY7UZkMTKpTC
TmumEDBNQ0kWZSzURM2CaxviXMlNpZZEwTBozRQ0uvFIqQRtyGmhsIa9HonGZSgCuhq0NqsVsUYG
pTG14FLGxoQ5VIx5RTYjtpsp4Rv0lODFF+jBYM8F9h51ZSlvMrXfEcbE4q6o6ZLR/jbq8kOmbYt/
54KpQm0sND2aDbgOlsQSKtdLpKpKPN2Ra2JMcBwDrRZytYRUOZzCisSdF7RZUdGiKqUKWfIaklMK
ZRI6waEcqKWQ0/o5zVE4auGd9hzbOUzX4cyGggIF0wSajK4aZSsWg1aepu+oRigWpgwiHd6egRgs
UDJo5IeH26h3F76+nRxvB/rfyfPRVuWfva7/si7PfvL5yy/PUgokLNiWtu+pKbK5rIzlwBRmqi5Y
Uaj7CpoxK5c9l4SNBq0tqgeyYNXa9yQLUPn/+UylAHWlNmUl1PtfkDOWWCLKGKICqkFhiKXSDAN5
jlTfUWqGCm3fkUrBDQMlZTARyiouEaUpJVOzMI+RFCo0ayVluxVIQtNsqDXR+oZYAvMUOT/fcoiB
bdtTUyYpy84YbudM3xpUKlRj2T64wF12zH9p6B4H0hG6sw3p9Ui7fcDpmzvCF4L/4fvEZcb1Le+9
f8XTqyvIltIa6pKo1lAoJFF0xpBywTf3QUCjMBVirWy85bgInVmtaVkJXkGsCq8VOmeUM1AyUyk8
cAoVNdZrwpSwxuOUY4oLjfKMYaFxFkkHxlhoydQQabt745lALkKtFd/BMiu2dnXWW6URKnNIZOPJ
tbLRQq4LbdVMEtcMQ/aEkGi0Zs6Qc+Sg4VQi50VxLJW+FEz1TEsia42+Xxck0cz3vE6jGtyl4zDO
NBcOOSSqChSlCXGgdX79dP2D/x6IxNZjN5njVLF/7/ew+ozl8bukd84pr2Zks2V6PZOGp4zzgHz1
Lf6DDZy+hQcfMt8o7OO/D9sGUQ2cv0e5u0W/94ikr9FPRvR3zinXnyP+RFkO9O8+J9/uyafP8R/+
N+T9zKZm6PRa5QwLj/qGJS1oGhKF7BUPaLgLE13bIrXQ2hXeJFEYvEeWwlnf4a1jrhFjLOQVbjMt
GePXNzkKxW8MG5b9iXe6gUMKDEowCm7nEw+HjtvDgQet5qoqwpvjakDcGuKbBbvrmP7q39O8d04a
v0VfWSQ84PQf/i3uN/8B4zefoB61zJ++5HS74H/8z4iyYfwdg1xuCbuGk23ohpabOZNK5dm549Xt
niTCzWFEpNIY2MfEoA3jUuiahpoLoVQ2bUfMEaUUXilKrVAg14rRlus5oFEUlehcBqXJi6yrqCRI
rmhrOJwmfvzRu7hSKGp9UK6i0GjGqdI4wSMUZdAVqoLgDEUyu4semQJjEtAGpRR2FULioHdWfwT8
7dvJ8Xag/509P3ioP/3p1+UPD/Hsj26PN4SyECTRIGA8tt1g3RmNF2q6gyXRGEvJkcZZikSESogR
saAXjUPTNgaV6yp6sevOVxtLCVAMlFqwKKxO5JoxTtDVUJVZv+r1RlxReGcJi0Vpg/IJnMFYxWme
KRrsKUFp0AIsha0397vvQir34JuSCUWQXPD9Bn/V0LgG4zRNtMyxku4hOqkWjAhWLGMpUDWhqpUa
pRymHTAfbbn9Y4O6M3QGjKmU1OC3jvK+Iac96hR5cGbonm148uwKv9mAgRLTarVTa4BvdS1Dbx1L
zTj969SziQAAIABJREFUX3KcVq+WOGvU6puXlaK3FE3jDFMueOMpVAoarwylFNrGk9KMVEVWkEks
IuQcaZym5BlRBacqY1hoG8MS1n1kTpCj0BmhzJVeKZZ5xKIwVljmRG8rWRYUmbIIslL6CaUidVWL
ZikcJ5ioDF7zZgw4UZyKwig4xkIsI5XKbc5cmcKYYKqVSzGootlYh0ghmRZcRc4qKfaINkhfOZZC
KYnmec+UAl7WPAZ3iU1zyTJGmuf/kOV4w+3NS3z5GP0f77j8/X/C6z/+95jSsb0+Q+6usQ8fM/6f
/xfD732f5evPQUbk6UeUr/4fdv/4n7Hc/JR6dYs0Z4TP/gb78QeEF4nh+Xc5/PHPUd99gPMQ44K3
Hn0o9FtPul1w5xf00RC7LSFl5uq4PFsHbb/Z4clkZ++Hk+Xxpueb13t832NiwesGT2G8KzRbR1sq
ufbYWvhisbTeU9LIrm+YQmVjDa0WQol43zGXiZgtSilCjHjTUu+OxJ8bzv7RJXd/+hJjG+x5hLs9
7sl3WY43lGoZp4DlluX8N9g/eoAfzhhNi77YrKjZwZNlTR8XEe7GRK7XfHmY+bJE4jTy0GqujGEK
kb4f0FWx8YZoKqYIm85xmKBWQUoh1kKpildpocURqdQgNM4gUsHo9aEka5TOVDRLUJxvO7QWTNuh
WWu3FcNcEqJWwmXMEzv7mGoMVlculOGoLU4BTtFvBGMCqimI1VgBI2C1+s23A/3tQP87f37zmfnX
P/lV/OdKqX9xGO/W/mqKDKoF5ejac0yuJDKLjEhuqGqmOkWRiiqVOQfmVEg5cu4HsGYlrBmFUhoj
jlo0Ruv/XC1TslbRGmeoKq0EOq1AC5Z7U5uzxJho/IZKJVeBEllSYmg9qS7YzqJSoaTKsFMoZWi0
kGpGSSZXIeVCSonxOGOUxYUJv92htKDE4IzhVAJD11O1pnoBKeSSOOsa5hRYXM9WBDOcc/7eFYc/
eMTyemR4RxEPE83jhsPp59TLhvDNn2BmRTe8y9OLlidXl0jzCOUt4xjpfIvUjMLQKWGSdVjmeRXd
+CrMVRisZo4r5WoJGWstpSS01nS28OZUwDrqckLQ3ObILAtPz7ZM13e0rieXwlgq1haul4mnuw2n
6UCjPY1k0lixVjGnQNv2jGFBp0w1C1Eym23L7VjxG8urKMy5stMwhoXHnWU8LVxYRyyJQ9LrrUYK
m8ZTYuFCCYrKJlccjlfHmQet4apR3CyJoANnUtgoxU2IGBzZOl4vkWedI0qi7ywhJcYCu7Oe2zmz
aXrmJbE3lXc2hlfTzLk1pDmxfUeRUqXpFN32DKUzy+mIrhF1d0v7nXeYj7+Lf5O4u3hJfvVzNs13
CXpExz3zq8/R3/N4+4rcjKTjDeWQoBOU85SjQl8n7OmEfPEN6uWf4n/wT+HFEb3XLCkyPdJEW6HV
SFTMkmm6zCCG6iw344md9uQIVIXTjpgWqim8nke6rWepmSoBVRRzXhiGDmTmy+XA886QcuVZC7mM
qE5zE9fanDOKHCO9tpyOE944ulhYrvfAQn55RL69w13uyS8K/ZOB0hqU7DCPH7AcR5r/7n/k+OpL
4nVL+fu/Q1Qddnu5cufPe6rXKKOJwKIS0yjclsqgLNN+xMeEhJkaApNW7I3ikW9gKbRa4UpmyYFd
A8ZA30NZKncx3L9aN9jcMtZMUwzoirMKJcJ+mdi2mpDv99wrdYqtMYyHkbPHZk29q4TGEkuhGMXp
9ls23rALI4WMBGiyot9u2M8jbd8jCpYkXFiFVYpWcx+ik98E/o+3E+PtQP87f7bn5g/h8ve97j64
Pr5knO7Q7hwlha4dsFo4SESSUE3BK0WtCVUtqc4oEayCmBJBAlIr3rU04jDakbVQELzSqFQx2qwW
pPtee8wJ4xtyTvdhFEUphlatpqRs7tPdzpNKQSuP1RldFdVlkIzyCkViSTBsHeUo4HpMCEiqOOOo
JVOPC6Nc41XPbvsIrMVI5mbOuMYguVCMhRSRAo2zxFiIXQsSqM6zefaIdPoV6fORx11HefUS94MN
Vb9ibDacXEHyLf35c8yDlrPdjklt0MriUAQRWg1VNFkKkgWUxlmNtQpdFY1WGAuuQlVqJcTpyiCW
UColCoMzTCrdrzUKF0qtJitZtbexaKrcvwVJma5qluNIDQWrC0uasVIoKdDpwt00YUoCUUgtoODF
uFCy4TBCqYKriqUWzoxiGVfi374oqIFT1VCgE7grC+W+XaCCUEsh1MxAZjoFwpJxtdJJxuVMpNIK
KBV5SWIWxbUuKJ2JOZFRdJ1lFGE0cB3HlXNvLV9Joe97FomrIMh6XFCQNKNZqAqi9dQUuXx4yZvT
gvr+BWpayHPEPv1dDr/6lPYf/QGnr35B3T7BzE/I1y/xVx9y+vQTbN9Rr4FXX9N8/w/IP/lPdI/e
geNLmvceQPyWWBLFP2QBSruQqsLUxDQG9KMzchEKFSuZaQo8vbri9emI2B7SgihhYyxlDrhtuwYL
XEPOgTej8GTX8uZ44rLZQYIZy6kE7By4OO/48uY1d97T54pJCeM00zzz2BjiXMihMnjH+DLSLAb7
cMP4pz+h+fHvEcKn6Msz0umW0N6g2h/x+fUfE7//DL3xNFdPmMVTjRCc4TYEBtvzel5wNHglkCqp
Bo5TYPDwHQW1dUjJOKmUlNiXgHUNL28Cbeu4sAaVhU3XcH1aVpGKUtykxHtDy5xWxsS0BGoRtFuz
Fr0xLLmgvOMk6zuiomAqaVU0a8haYWtlypVjPnGcJ0qsPLIOZR9BFZYKstlwN8088h2msbimwVhN
q9YBUqloXd8G494O9F+P8/EDs/9kL/+zsu7fHcPe3h3fQIEeg7Ee6z1936MlsiwL3naMx4ppHDYI
WtmV866EYyh0KNB1HRxEus6haqWajDGW9W4uJBTGVCQpSsoY1UKuOBMJCZSz6Jwobv0jV06x0S0p
CsbqVQlrLLop1FxBO3Qu5CXTaE/Kq/60c4aiIOf19X9YCvl0Qpotvt2ypMzGapY4Y02HzYpZDK1x
nEKh94aYA8GwdubRNB9Y+AbS9QFrIL8B4QOqHsANlO4ZIVWWKVLEYRshpopxipQrRVsUQq6K3ilS
Ffx9ow+t1n15UfTecDMFlDU0Ims332pyBesKNSyILRgyOY9snCedDvRes+RAymDj2tXdeE+cFhql
kFQp96nzU6q4RnMdMmd21dbGIIhazXidEaaQuFCGMUdMBW80b7LQZcMtCUkGpxVVZbbWcjMHWmeZ
U+YkhkUKIUYuq5Bzpi+FxmvGnJCaeTVllLbclcKhKJxXXGfNhVtlQWKEy1R4FSq73vDzUvi+tXy7
LLRas/OVY0g8Mo59iAzaodtMmDK7znF3UDzYdWQKx0Fhi2dMPa3boEoh94B/QlhG3Onlati7e8X2
yUCev+Vi+yPGz480ytBxxel1j3vymOmnv8L96DGy6wm3v6I8KJz0QO7OuEsRL5WUFrocOc+J6gdK
rvRVcZJCzpnRgTaB21p4atck9quacDVRq8EgRDyD9UzVg1ZMkhBtqCqiVEWInKvKVIUHZc2nHFOm
zWkV95CpViNBUz5u4VXAiFB3l8iLlqx6ZHNO2kfiBx8xz5H6u/8Yu31OajrmbkOoayV1lErXdOSy
wqcIlaIDW6NYSuHcZIpUWtaVyCEnGqu5PhXGAMpWvi3wvYdqfdtCZYwBqZpR4LN94FHjOeXKk23L
EjONdsRQ0FoY/LqWs41CtKWnkJTiNgV+o1WUcgR3jlfCsUyI1hzuDhzmI+SZG6d50F8SQkW1oA6R
R5st3mq063Bdj1k9LgAkpfCi3g70twP91+d8eKb+wy9v6//+bLn6VzUGxnkmF8W2V2irMc7T+AFV
LbkmjO1BPJ3OlLoO+iiBqtdAVckRJRqjI0lpfNdSi1B0pmoBvcooaganDFILmolGOWqxeF2RqMAo
pK5fjSiK9rQWYqlY16KUEFJA27qG5qwQ0hGxipoLuVSsEnLRbLZblrmQBeZ5xuWJVrXYommsIk8L
rm9QJYI2OKt4FUe6YQelUKxDS4OyOxQtpt+Sj4HhecdcPqE9U5i7z0lfvUBfPEbGgk8dsTgabUhJ
rTfwULBWIVmItWKdQ9eKcoacK1lrVK5EFI3Xa7DHrKz0ogQt60OQsprTtN5U2xRRUYhk5jGwaR15
CVTp6LUhlkBTFa/GkU3fkKowlnV/f6iarhqOSmNQKAMLEZSgFesdpWQqK6J2Smtl7iYJ72B4nWau
xNIAU1iovsGEwBIUxSgqGl0DN8vMTmuUquRSOUa4XiI5CfuU2WjDXVzDSscMWcOp05wAL4qldcyl
ombDTuAkBVcVX+UCztCjuK6RGaHThZdFeKQ1p1wQZ8F7qqxriqIKZiOEWsghoy4veXMK8P7HNOWS
fjPi39GM179EJ8fx9hvqmLAfPCV9eod//hFlPtD88Ack+wX5xa/I/Y7pxZ9Stx+TfY/yDaclMZyt
NdDkLGHd8uPadiXcYRmykKuhNZXTtOfp7hJZRqrTVJtJKXM2WG6WW9RWM+cZJ5oLXUgxMLSWfJzY
OsMPjDDmicEo9Dxz2VnC8cRcCt4pYjS41lOfGm7/k+LRh9/j+Nkt+t0fwjvPmYf3KA82vFKR7uEH
KN+jOsMigrWeL+5O/OI48bHvMZKpAjWtHPqaYS4Jb+EU12T7VBKFQkwGkxQDiq3RPDTwGE2eAkvS
HJdARlFFWKbEIpWj9nzYDcwi9M5x1ipiUTgL+xwZvCVIxRbLpbWcqGjTcDqNDHaLTSdiVYx55sXh
Bq0iN7e3bK1weXlFqg0pT4zHI7VtOMey7TZ0XYOxq9krAkkqTuuPas291nZ6Oy3eDvRfi9P36n8r
Z90/SeHJ73+zvCZIIgTB5NVylg3Y3hOmBWMtQ6cwUgjxwJxXHGzSAckZJULnoNz/CnTv7j2oBqU0
KEUVRRYDao2TWjJLXitu1VQqDTihmtXhDB5VLCiFqpriDE4njNaYFCFDNolXp4hK602wlIKTStM0
NL3C2A1LFkQKeYxEPyKqpyAopchloVEGpwURYWdXil1GyAIFg242tJcDpwbKYw0bwZtLTHyB3VX0
Tiinr6hbTXAJYwxaNI1TlLz63EEjumLUGvBxxlKkglGrMQuFsYo51bVKR8Eai9TCUoTGaQ4hYE2D
SFnpYNowp4j2cFgmlDY4ElUS1iliPXC2MaQ6gwKlCykIXgvLLDjWgTfHREaTc+VCW25TWgE/VlGK
xgjcxsIFlSlNSMk0OjLNGZHMm2lBl/VhpWhwWhND4rlWEBPWgDbCEgs5FQ5TIYmgeoWxlc7AoQiN
UuiseaLXzvu5CJdGuE0zpgpf3WWGzmMEPrspKKWIi+HqTDMrzesQSduGNsOlVXy2CO90nkEZiq48
2jaclohqV7xxahx625Ee7KBJqPwe138htI8Ux9dv6C8ucWcfET47sv2eY/rmZ2we/h7LX/yUMhfa
f/pfcf1XfwnDu6Aa0JqqFcpbDpOQrCFkGJWjdj1nxwXdWZgrxSlmkxhL4F2XGe9u6ZoNqgYqa/sj
p0Lne95MI++4bq0iak01nkOKiPO8SIGzWDFaSCmRrTDGiNaKK20oRuN8Q7lqWR485noWltaz++FD
4pmlfnDFlAXbNQRXiTS01VJyoG8dh1OgzIEv9pEkkJPizBTEVFzNaCNESSCaJZ84Ho98+8Uvee/9
7/F09y7nTY8SEF2xNa86zCKUmDgulTcnqPEWczZw1noGpxBnKbiVz2AM2kEXW7oGTNQ0ovFW00hh
jBVTEsLEWCKpaG6OB7xN7JcR1SaUjszxlqp3yHyNUxNWMg93j3hwfoFvNFZBLhDu//7QGKXUD4D/
9+2keDvQfy3O00blrxb5l8Lwk1LV2cubV8S0oAQar1YOe1mxiViNtZbeO3x0BIHDfKKOiUjCloJV
UGvFCMjdiO0aTLUoZSiiyfco2PUCvu5/dS2EMIFTiBHClHG+QRWDSAIMoj22c+QcEClYVn8xSjGe
ZpRS7McjhxhINdIaeObPCUvHpm9oilBLpMSZsO9odpVmqgQ84xyIbc9gDClbtPMcTyOPtgNGEkky
3cZx/njgzaDJunK4TXQfPCVcL6hec/Fbv8vx21tq9SQlGF3IlRWNG9Z1gb6n3XmlSQJtA/lUwN8n
u7FYFZmDJXkNS1h/5iKkorAOYq4Eo2lkZimB3lXCGOnPBvZxpFrHQCalhLWV/b6y2TbsTwu1ajrj
mNPE493A7X7CCmyr4VQ0qOY+5GgJOUKtJCmcQuaB0/Qh0RtF1oIrGVMKh5BoTYWqoSicCD7DXArz
qaC9QrRCNYVjUXxzXKiqsgeYVzjIUjMTMzu34cI1pKp41GnmUhAlNEZxjjDFzBISNU0sOE6vEtk4
3KA5JsuihZ7Kfkp8NlWeX/ZUu36PB0ZzNnQcaiE5g/ee65gwjUdyou07tM0s+4b0/R+DFKS5odw4
6m1LdzWQb76kmg06BqLR2Oc/IN5dkC5+wNxvmZ2hdBa7afDekgRGMscE4ixqmVBekyRgdKV1BiUJ
N7TcTSdU45h0pVFmdSCUyqZz3MQTV43DGUOWTNKQw8R2O/D13YHHpjJohaREkzXzlKEqUqlMVJwx
zLqydJr+vx54+e3C+W9eob9zgXGO4j2NdUStCBJwWOZ5ok6V/TESfxHoKnz61xPNk8RhvqPfTXS9
5uvP/4z3P/gR8z6xbc/pUqHeHmn3jkdPL/je5ZbzfkOkUnJmmgOLEm7Gidsl8NWrBTGFzhbQM+/0
V6gM59vNStezHoXhGAIXm5Z5Sey2ls4Y5jBztd0w5UrnGqZTILeOr+cDX9/d0e7O+eky8tw5eqO4
2d/hXObmxQ2qZjql6ZqGYegwK4+J+VCoqrLdGDQCK2Dm7UB/O9B/fc67rfr0iyR/eEn/R3dzw10Z
aVAgmt505JTpOkeMgcY3KGvRKC4eaJabSkyZOScaqYhUSgrEGhFj2faeIhXRQlWKKi22EUoQmqZH
8kwWR1VCLgUkM86JQRw+BvAWsZkSrvBK0LIGwhqTiFVIdWKcFuY5UkJkvz8SS+Ss9+hNJKeItEKt
mil6Wq0pWWOroGJgKRZjMiUnxBmMtihXKcYxZ70GmozDND3nVw85+3CHe6UJfxawJhLHV6iHLW7n
iPVLcvt0xdhqIamKBloDsQpKNIqKoPEachKMMQgZfW98K9mgV4ouiF692qWia11v+gpEWQ5zZNCW
EGZa5UlzpNGeDEwhY40jh8TWOeJSMdnhrWVeEkPjybI64F1NxFypRvBUiqlMEtC1cMyJc1vZubXi
53TmFCI7V9E50lA5K4mvX5zYbRqqVoyFNcyXKqdQcd5x3q/WPMmacyf87ZeFYCrOCRdtS6ssCy2N
NWjWPvJWYFCG05yIGlrJxCWy08KUDnSxx7eFWVsuNopWlTU53SqKgkeNpeq1gicpMollSIkvDjOd
d0iGbd+tSegs7LqOmzkw7DpqM5BrwT16yOlmYX4zob59Q789o9/8Pca/+Cnd2Q+x5j2W1xNqd0m4
S9THloQwdIbbsNB2a0MBq3FEfjnPPNyecQqJ0lj6FFhKRXnP65sjm93AEirGavaiOIWJp5vHfLa/
xXhLrIopeR4Yi5snztoOO+9pG0uthdMceLbtubu7o/OeIIlvF8Omd+xrg32qiMcT/cOB7YMds+vw
u47xODNcnLFbMi+Ohk2n+fbFnuM+kmLkF18H4t3E/OY1tuwZtoE6jvztX/41Tl/yuq638jcy8ejq
Azoc7/Qb3nvY8YPnl7hmxykHjoeJb/czoSqKdjhbcVLYVs3Td87o+4aHQ08WS7TrAxFe0ymLV5az
vgEd0JtmDZN6S+M1S1FksdzOqx/gs2nmiGaOE78QxbPOcjdHhnJkZIYsGAn0vuXibLtWSyuME8Rx
pt04EM2qYH1LjHs70H8Nz/tO/etfLfLPz4fzf3GzTOQ00Zp7A1FjqUtGGUGMo1qPxtI6z24JpLmQ
QqaoxJQimorTDSWNxElhW1Dc3/bJWDxiKyIJ0YWiMlUXRDKpKLwW4jIhuiKpYL3CmgMiHiVQyqpU
VQrmOZDyzF048Xo68H/f3HI3z/zDZxveSQ5fW+bpDm0GHAotPa6FkjJd19CfTgiw5EgpjsbDmBLb
vscqCKpjsIKuPbv33+XBJ5/y5pMD7btb8hQxX90wXP42ZswM8/tMLz9h0L9HUg3OaWIqmMZQl4o2
BlPX8FBnDEsWtFMraQ/QGuai2DnNMi9Ypak53wf9MjEojNPMb/Yk8VQdqSXTGsc8juhmTQ/nAiJC
CMKmUcQ5ghZCyiyxIspweyr02nG3LGw0aIFjTHRKSCGx0YbCwjxGGqsoEtFV+Pk48Z1GoaiMMXM6
ZaITSlNZjjDIGvrLorjoPPsboWsBFNenyDEYkhEmNE0786pEvnu25TpozqTFVo3WBn0EjfC49cQc
KUXTFsM4FzbDA8Y5c37Zsy+VpxtH5wxGCUYUYxYuty0vZiGXyueqUvcz6asTs1NcXTWkRfiRc/Su
weoG1/aExeNMpSgDTpBOs6iR5kmP+aijpGVNrdcN891C214SNp4pRcYyY01PtPCo99xGT5SGb1Ml
ZDhvFIOx3NTKK9GcK00pcFs0F3GhbR2HHKDA0Wpsrpwby8vxRL4n8jlZQ5SdZJIznOaRc214FYUr
D71vOIZE1pYgcIpw0TRcx0w0mgf9gG4bNhc91TfkrDnNiaI8c4qUVGnOGz775g2fHUfG68zL64Wv
fvWKdPoL4vRXHE5C3Qlte8XJGuqpcjt/yXjYY+vAm6nh4/Mj3/2N7/Lh5YarZ1dU1eNSZsoa2hFy
oTfw9GpD195xFyuuazjbDUjjaRqHOMvgG5SzLLFw1nVkEWzrAZiU0PUth5i5Ot8SaiAo4esy8kU6
4K0h5cBv7xr2xxN7P9A6xd3djBk0+RS4ePYY126pDpZYqfsR5yvdxmONhv9yQ3973g70X7/jLX/Y
D+73Nyf3wV2CaNYeudUNSUas6imyMuBc41Fac375kFOYiZLI4UAUoRHIZcJkCLPGarPqU63Cakcu
90pKZSl5ZZhbC5IKcVEoFFVgmR2ZggkT295gSqYqR8oLGYs2gTlklM6EdGBZFsZvXvPNp6/4k/iY
s6rZmh4XwWwr5/0WRNg0mhAL2a6+8BspzGHhuhS+86ilLgJeU0Q4Ks0FBqkJc/6IzjdMqmAuMsZf
M3z4O8xhYVquCYNFNc9Jp0pdAfVrHUwptF7reEZrclXQCpwqSRsqazfes+6gq1boImircEaRKnhl
iUVRzZqCN0WhKCxKsBqqqihrIbC+RlWVSSWcNSwqkxE6rWi9JVYhZyEjbLS6h+poCmALCIoxBUop
1LqifadYV9ZoUIylEkjMx0Q+RoZWMY0JXzS6KobeMo2Zw1x5+qRDpHAXFIVV0HFziLitwlrDohIp
JR5qixJQZa0dvfwq4mwlDaDbsu6hl0JRcN54rt5v8VbTlcrVtmXr3SoSEkUvFVA8bBTGGHyoRC98
MlXu7oTiFpKDrTnyuI88HgaO05HLoSdETdAdQQo3KjE86GlsTzGWhnPmmwX/bMediagBmivLqVaK
EZLX6MYRsmHEE5ZM13oaB3ep8MGu4ZgCV9bxBEUwhq0XFAVnFSYLKIOtcBcrD9sNc4h8vDnjEE54
5bDacJgjjwbHNC1sHfRADVCysJAYOs/dMhIdbG1hCcJZM5Br5t2HZ5w5z6kKkxF++eaGK2s5mw2L
FYZ27XXfvlnY32V+/mfX3Lz6W3L+c7TWtFWhdYt3HrmNTNcL3balzT1d07KRwsPrK3a3DY/pMeJh
aKjXkThrlPaIyjy72jGVwtU7mi4k2tbz8HxgqY6rd64Ic8S0DTFVYqq89+Scm1cTm01Hipni1oX3
5/XEdrvhcPuKQ9X8JEX+Jkf+h90Z35xOfGdzTj2MGGXxVeODwrqK2Xq6zQ7dOLKGsBQk7LFDizYN
Xsv9f8W3kpa3A/3X9Lxn1f5PP4//S982/0bMhdamhVTQzUBMeaVT5YxIxYjCmZ5u59YbhnfcXVeO
UTBakJKoZUV8hmQRDxIAW9GmBe0oRag4jF0lJJ21VB2J4ghzZNKVFBKdUoTlQNM6lPaYWqhlQUmm
uaepSczsrye6oDi7g+Vne34ZOjbWctVvuMyRS2tp+h5TM53rOUmldZ42L9yVRK7CGBYumi25VKrS
eG1JkrG6QeVIcY7jjUZYuPrxFUEfmU+v0OfvUQ8vOJ4i10vgYyI6r7vzlNfqmaOuViwjzONaRTNZ
UAqyFOYsNFoYp4R4Ra1rEtqoypQy28Zys4yoxmFLICwVbeAUZnrniHNcqXFWrynpvifGSNd1qzEv
FQbnGMNC7zXjtNBrRRYhFMEYBzXTa0dkQasV+jOVBWwmZWj9shYQl4nBNdx0wuuxoE+O/hKueoP2
mvPWUERxORheHYVvx8Q+L8xy5GResDENVVrGqWNSGxrvuL4LWGsxp0IYZIVqz5lBCTpaOpV4dNGx
u7Q0xnITI5dOU2NlrgmjNKclsuksU1yoktDacWU1ebB0Ar9QmV/eBt68Gtm/3/KjRy2uVjya3QA3
KCZn8LoQRPG4aznOE8PFlilUorX4KkzbxNZpghXSHFGNoJwg1jNm4WFn+WIGFYW2rp+t1m05zgfO
+o4cC0c8Q6dpcmG72/Lm9TVts8MXodeawYKEhXO/I4X1QTdV4VThHMuSE8Y6TjWTClx6zbLAWdsQ
5gnXQKZSdcZ4Q9809Oc7VFxZ8S9eHfj2eo83ho0VlsbBcmJTEt+5tPzlPjLPEWU26HIBaia7C1x8
TAo7inLUxqOkQQosJ0e3ZPy7PefvDfhnLZnE6XDD9bTwOiyYpuVy6+nOzqBmigi1Rh52DQMG6wzZ
aVTU5JyRWug8LMcD/b39rxpD4zxzXXi+vWA8LRyS4pAqba586Hr+/M2JP7gaeDEd2VqNdoXX0wk3
v5jjAAAgAElEQVSthBjgo2fP2Q0XiF0hMsuYsQKEW3QZWHULglK8eTsZ3g70X9vz4+f+3/3JX5/+
10bHf1W1p7pVT9puNoRU1p1vLvesdotBcXn+jMU1GKW4C5kXhz3neiU8NSrBPFN1xTerlMVpoYQF
LRqjKjprlFm5761vsKHgnSMtEahrd1YyOdd1EGUhxgWJ4PX6fz8UxZ9/k3j1qWJ5ZdiPgdgcSVeO
J/3Mb8nC1iqedC1FGkxn6ZJQDAwJmhTZ6gqxogfwKaNthyYTFeysox4SoTToS43cWJrSQj3RfjKx
+eEZN+4NWi3ENCF5XG+3A3BYfcwNwsIK1Vuvwwo1CdUaai2rYIPKaQr4bYuu+T45XShS12R8yiRr
6EQjTlOTMM6JTWc53R6JBsQbllrJojktle3gGHJBFUvjFFOp6EYRSqXRmtsQ6ZWhMRVKxKlVbWmN
5hQVtyMca+VmWViWwLmJxPkOpwdKtoSysgW+s23XMJdVPOh6YqlopTA6syGjbcaFCe0CTbDYg6Xr
O0zjWF9aWFQWbl4n0IqvTwcam7h85Kl7D71mmxVphmJWyFDOlSlEklI0lvsuceHrU+BmvOPxtuFB
N9Aqx2FfMbHwQBUkV2Ta8/X1RDzMfHg5MKvK0PQoXalocoEXOWCbFrGGXDPaeLJkjPWkWoklYoaW
WQlVa4JtMTheTpGsDEEKpkJjDPm40CnH9ZKoJXPRG8KYcZ3hze0NjbM0rJ/5c+eZ5iOXw4Y3p8O9
cMRwExduleLLuyMfNQ1fjSOtrgxWcxMj585wOI1cGI2SQkgLna2Mdebx1UMWRl6OC9YYfvb5V9wc
FzYeXO/oG8XLfcYZy5OLFu09X93MfP6JQPwu6eZnaLOBewpkMQPWNyzLSiW0OiFdw+YDzbvf2/x/
7L3Jrq1bmp71fKP8i1mtYhdr733O2edExInMyCoynaBUUkhuWDYXADKyZGjQMkimRYcGEkr6QCe5
AAMdQIYGMrZIS9iAU1nIaSIjMyJOFKfe1apm8RejpPFvXwES4Mg9LmBpaWrO8Y3xje99Hm7DQChH
br4Y+PIU2U+C61o+urogq45N7zkLgaSXifoxJR5ebLg9HcldQ48hhoCmcD9mzh41HI4DsfFstcZq
w1mz4uXNK7oifH46ctlaflUrvj9FPmhbvn+35xOn+RBFGmd6bdm1ju2jjzDNCryhVqAavGSYX6Lr
M2BBNQN/511VeFfQ/4VerdW/o3X7V2KW345KM89QjCLHhLIaVRb6VS1QsVjr0GuPtobb08Bwf6JQ
OQyB2CUahDzJ4ujWmeIi5EqtglJCTA7lZmJp0JIIKqMbQ68M5RhRJRGnBMA0CSeBkBKZSm8KUjLe
wsYX5ExzM94iOpDv7jnsj5yHHXcK3iThcrOi25xhjDBjaGgpMtHbSM0zktMiM8kJZyxVLcOBCUHs
4lXPphI2J7I1eFdYP4Vp/h7rbUFZi00n0v0LuPwYUzxGg2WJq3kEVStiZGlpq+WGLqIxOhIitN6S
Y8WoBdySIjRGE3LCdw0lL3rY1qwYS6LtIj+6u+XmtOfSaXICbx0pFjZNS0rzQtDSikEyXeuJObBd
OeI4o0KmNTOqLO5uJRVIi2gjTVgnTLFinWKswqgM2m4poliZhvkerAHRCwd7ZTWgIBfuhohX8OzC
0Jgt1uy4OTzm65sZ5z3KGz5+uOUwz/TeMs2J8lyoUyY0LYdD4p9++oaz/iF+Vty/HjkbC1urCcOJ
8ZC4vgmYBz1vjvDgScOb+4jqDOOgCbeJz/PAZe8xKHa94tmq4dhlhlJoTOXFZz/iR8FTmqf8wtUl
xjeUrNlax+sE39mt+NHhxANjCLkguRKM4nbKtK55q8uNZNHcR8W/7jU3IfPtjUYJvE4Z5Q3fnzMf
n5/xv+7v+bDp8DpQ8siFOSedIue9JsfKaC2hgsxwtnIcxoRrelIVLIZzX7BzohHDg1TpjdCIYoqa
jYG700jbQskTxIkHnSVXzcYYvnzxhleHiTdTYn888rx1PG4MV+cdIkIFWm3JjSE/bpmu75nbihqv
kP9rJEyRxiayCP0Oag3UKMzjHSaP0M34i+/ggzAFQxkLP/n6ms+mzMZ3PHtwzvZywxgbdL/CjpHc
NIyHA7MJRGtRziNWU6PQdoabIVD0IieKYhHTULXDOssMeO8ooaJF0fvK6zLwuq28KiOXXlhrCCFg
lMKL5smDK7puh9OK4iEHcF6QeY9yniL5n2+FBfhv3lWE/2+XfvcR/D9bv/tf/mflb//t//gfKqX+
XS2qEQVTqeSskLq86yJQVEWLxhmLNw5vG8bTxOvrA7fhRJGMcoqoMsKCirVKLVz3olBVlglyMRSp
aDHkktHVY01DTJmaoaJItVJLQRRoVZGa0CVRU8CVzDwN7GxmtYXm0hLNzOnNDzhNP6WNjkuzYWVg
s/ZcXD1Ga4OSHhFFEcsxzLyZA23ryLmAa5YMrFJstCz5WZt5/ZM/4+WPP6OTG1Znd9hWo5tb5vQl
0n9EyJWZnhc18uS9X8CpnvrWWFYSIDCmSu8U41yoRoPKhKQoZA4JjFHEMGLEYDXsY8FYOMbMbB1N
TiAabzyneaR3kd/54Q+IJXJRT9yngVYlhjnwcNMyhcCJTNaLt941fqF3tS3XIQCC15r7EDBoSs1o
gTlFrK4YKpNKXK4Ubaup3vG47VBNy4O2JVjhzBsaJXgnbL1nToUxZ/70i1vu54lfWLc8O+/49e+8
x4U2bDrPqjVc9I7nD9bsup5Vp9l0lg8uNnz4dEOz9ihj+LM/H1lfbhn2e9YbzeE2c3r1FXfBc30z
cfvmwOF2hFrQI/ijot5m9q9PpLEyF8X9S+H9nadfGVbesHUWRuHNm4FXr7/PKY7c2zWnojlGQVEZ
Y+GTOSMCX8sCT3qRI7EIJzK3dcH3/rAmjsrwuVYcjeNR5/lpLmy0oRcNxVBzZaMNpWZcWW7znkKr
DCtt0FiKGEoVWt9hJLN2HbEktLI0xuGAlTJ0BTZiaEqlxMJKFIZKoytGJYxO6JJRZULnQucMm65B
V8PL2yM/eHPif/vTV/xLa88vP9pwvnKsVw1iNNYa+sbTtY6+0aRxZqh1+U0cWvxWmOcZamHVt+Sq
aPoVmErTR/LqnkePzjjbbEm95+s3Ay9uI1ZrPrza8sGjB7jmIf3uAam2VGlR2jDnzK7viGGmW7Wk
ENFWqFXYh8Sq7bmbZqpxqGqo0uCV5mYIbFZrXt5dY9/Oqfw0Z5p1wzwcif2adpixU6ZPi+Hvmx/9
Bm27QTqNOMip0BRg/ITN9jHOdRhjAP2PReQ/f1cR3t3Q/4Vfv/TN7qd/9qPjv18Kf8e9zYobtShO
c2HxF1OoCmIqiBWUtJw9+IDz0x0/+ewWn+FhjvQUWqUYwoxUhwvQd8vmBhVlQM2aqgtSNFkUpWQs
HgzsU6XtCmkEZ6HWQgGqZGqNTHmGrHDWIi4hdUNVhtJ+xeH6Kz67+4Jn7Y6L8543x5GrNKN1JeuC
FosFVr3lkCu6FsgTUjuqKhQBMYIkBRIRIiW/YXsWcdrjbE8ssOoztRZeXP+Mgz7HfH3D+OanrLpL
tHLYUkEvHHstQigFEUFTUVVRBaQKHUAVHIYKpJIREqEWjFXEPBNyRmvLXCOiDa/uJ9a50pSZz+PE
e2p5FvHWMh0zqlp60zHNM1pgkoDSlpwyTVUo5dFVsaJSy4wWC3qRxrTOokvmcSysV5Yxg1eKfcis
U4VSed4K7cLHQVKljoVVFVzWfPOouPnDL2j/covb9TzYbnHZsN5Gbg4j3rcYKs5b+m7DPC56UcQw
yorDlOifP+blvjDdOebbCX9IuCRwPjCEkTc3t+znO9brM07rDU4bpAbCPGK3Qqs0V+99g/ZMeP60
RaxhDJFX08DoDYfmWxx/+BPUm694o0fee3JGOT+jP7N8s/N8/z7zqDN8mpbP5KQ0h1B4z1r+0TzT
a2h1ISfPpdL8/ZsZ1Tq+kTRvqtCh8GXp0hz2Ixcbj8mVMwqt8xwPI483Z+yniaqWXPxneebRquUU
A0OnucgRgGOGr06Fb6/XvLp/g20bap2pOWFM5XiceXzW8fr2DpUV723WHMcJs2p48fU9//jzG37v
8wP/mji+vVvRO8WDpw+YThPDaeai23G8PSzRvmngl1rPqT3wg6i43m55cz1QxhGNplaPANP+K7RV
RDuQg/DKFj6bDnSnjqTg2dWOrvVcfPAe/eacmwCX3RpVEtZp6nxP4y3bVrjPBuNXuCGQTQsmMqXK
eb/G3N6grGIFiKq0TtElTVGBfRyYS6KRwiMyzazpqiHHQixC0ZW7ceSjfo01Dt0orF888lYUSEL6
c5qmhZoXljvlv31XCd4V9J+b9YvfWv3Xf/zD/b9RtfsbIhWthTkJWkOj9UKNKoVQZqiWXgvb9Y5v
X10R7t9wc3+HxIlOWVRU5FhJPmGsZogDzhlKrYSQqMajyuI0Vk4opSyT71TWGJx3nORELJUsZUHJ
VsiyoEnbzqASHIbKj65vUdPIZXdGY3Zsz3bcmRa/aejWK4bxjnWzQqQhVsFqT688a9NyOBw5X+3w
FVwRGrMMIjVGUceJSMBeJsL8Bc48Z9VdcDg5kH+ZeVqy8nWwhPvA9ctPuXjvV6joZfagCrmCs5Wc
Qesl/hWrJlE55YKzwjAnWquXA1MVIJNjYte07MdA0QYjS7a+0w03Q+Tf7Fd8cbjB5kSjM8cUeNBv
uL450ruWwS7OdWMU4xDZtivuhkxn3BLVO2WUdbwOgZVZJt4n72htIc3C1muUMrzfO8YEvQmYDFNK
uEYxDYHWKDbeMpwCUwycxkTaeuLjS15cFx76hLyInJ1fYsqRTXuOiYVjSjQ7QzgOtOsNTgniPe93
Lcdwx7eeH/mTP7xGj9dM13t0bDjYa/p6zjwP3I8HUv6KN/vXXN+v0Bc7zAxKCYcpcTZH/vIv/QKP
zzoenS1PBYecWHc9/sU93fqST6JjepmZj3fcvTyx+kXHQMPjzqNThKAowLFUrqxgVKHUQCoZJYox
FmwJ2AzbVPlLRfH+Wz1wyZkfZeFZK/y0Rp5mT6sTaENVgm8M1Rv2h8zUKS5UpcVCqdRieKxadDqx
L4q1VHqvKbagG8WXUvAZ3ksVS6JVBm8dW2sopjLHypSFL17ecXd75P4+88vV8L7WeO9Z9T3WN4yj
kEvli9cHag7sb0YwmVAzF53lwftnsDkim4e8zo6cCtdzZLOqzByx3YSoe5x2oBzWbGi0Z7Xb8vTx
JUoa3GrHMSdWmwtKiGgjqJyYJNM2limObHeXRALVr1G+4xAHrs5W1JDYbreEXPDS0NiOUxhxXc/+
+JqDaJJKKAofr1u+Gice7Tb82eHAZyHzXeMIwNl6g7YtqhVELb8vqYIShVs9QwworRFIlfTfv6sC
7wr6z9eHqeu/l6P6jrX+109zIqsCaIpAa4UQEoJCwTIVrg27/hHffPCaL2fF4bRnGiZEVYwkZkY0
lWoMpEUtJsqjayKXivZumW4VoWaNNgprO6ZpojcNlOX0PFJIAxhjqGppW1unWDWV7frIIe+5fvMa
E3sOo+L5t97n/GLDxYMOjGdOM+RbstliRaNVi7IzYT+SlWMaI9p4KJmUQTWOfJqIQdien9HOHdo3
hHiD2v4GjWq4/8Frnm6/RQ6B41j42aef8+SXvqLtPyKJfsszrxglqCpkXalZCMBYImOtrLRa3taN
xlE4pkKuhWHKbBuLqYVSNWuTmTN8nSK3pxM/nkc+izMfxoBftxxr5MTEFJb27o/nkSvl2BiPyYVY
CpIyzlu00eQ6k6tQpWHUkeUV3CCicHbJs485452j6pmoHB6NDQH7lg7IWyKZ9BqbLN4pnj9acfbM
YYri/rpwd9zT9h6/6mjblnw3I84gKlI01FCpfkF6dBoerNY87Q78pDeo1nEcvuB6uuEuD/TzFbVe
ofstaRgQKrpvyIcjtmvRqieMisurx3z3wyd0Fxsun11wd3tkZzUqCpftmp9c3/NBb/lHv/eGF29e
cwh7vv5swznnjJuOh40wjAkvEMl8HeA3G8/X08QvC6hiOGbDui6dqG9qi8+ZJBVtM7OqPOlaPg2L
A12pgncerYVDiWzXG17NR+zGsXWWKrDTDSkKV+sth+lIZ1Y8s5qb+cCT3pHTzEXvuMiJOCls41Fj
4eHFDiWJ9XaDLoFhGDAu80cv7xiPI6/uRy5L5snFClTGrDVJKerFivmU+MH+mjKDqMR5K9zOiew9
V+eG0njU2Yb6eEeOhRKFVge22XJTZ3q54vHqMR+/9yHfevKE0m24evqA/enE7sETlFKMMaKp3B6v
8V0PKaKUptTIEGB1dsb93WvErQkEtHH0ynCfRky7Iu4nJt/R0ZOBEcvrw8BNVryYKo9Xms0cOU2V
rW04TfcYNLZYYoxs3XYhVMoSK5Wy3PaVrrjGUvXCgwD+nhL/6l0FeFfQf67Wr35jO/3xn03/lkP+
0Ja8LWhSLUxUjLZgLEJBqiKXgioKMT1Xz76NxfLilWEe94QwUmoh5YlSIBWhFIfKFSlquZUVTQmL
YrWi0V5RaiWRUAtPApU1NSuc0hS18Jdbt6BhQ3BcVsdj9ZRctqSuhVjpNj1Pzs84261Z7x6Bu2DO
lZoKNAktGa81W2+hbam14ozFoqhVo7Vanhl8i296jEREX5NiS5XXOPMxOWnWbYOaDHZMhJxI9yPT
i0/pn19hvKUmRVZLtttoRSmKUhNWhLkqWsnkmFl5jRUIRQGZISQasZzmsMwglMiYK0JA0pFqCl/X
zM9S5alS3KXMyllehMAoCpUC1xFWThHHzFY5bvc3NGLQquBo2XaO69OE956MQrTBqIrUysponC60
rSIrGGdF7zVhmlFWE3NktfKMcXlfbhthniKPNg2tES53Ww53A2VTuBVNHAcatcVMmTlW+tYQB4Ux
ijwdkWJZ03A/jjx7dMntmwPTdx7x1ZueL1++4cvrG4p23NYTvlHo5gqJFpFC01qqjaje4WvhyfkZ
v/2bHxGJPHrvAqmJzbahogg58X5/RjGKZAs82GNvHjDc/ojV4Yav/3xm96Bl9bDlTodlUj0nDHCo
FYmRIcNYK07g0mpuU6TbOJTIkjhAuKVyJPPDmPkrZxtCSsy10lrP63kmiiaXQL9dL7hgNLZW9rnQ
NJbjoXLXWj7QisF4ehaPQW0d7WHi2jrOTGaII+3WM44JWXcwFtJUOMSMTRlbFe8bzYdrx3rdEpY7
PVIsJ2vYa82LrPintwMPXOY3xXKYC6MW3l/17FziRVqATOdWUFnQNXLmH/JiH3jYe55uGh5fXbBa
r5HVjma1YayGqCykQhFDyAHrIJcRRUZ0g0Tw7YY5ZsR2FCrUgFKWmiqd2VGUQXuF7XuC0lRtmacT
h5z43jTTUvhQW2Yy25Xn8/2Ro9I4hOvhyM4IuITyAiyaCS1QRTBOSAWcUlRJpMK7dvu7gv7zuX7j
F5tP/uj7h785Gf5uzVmOqRK0JaSKs0LNiiyVGAVVMtpYnDrj4umHKBX46ZdHUkgUEk4r7scD3lsc
FZkV2lpq0Bg9UyooLKkGUtY4rSm50nohJci1IFUgCQqLxEIrDVkCnfKYMBBOntMh0+UrtJ2ATCrC
zvd4u6P6DeG4Z64KFyuzAtEVMPRnZ9wdB0bbsNJLtOvMKSQndHvGwwfn3H1yRdr/Gmm6w217zMUZ
Zap0VxtOLyJ+htZDOiRe/exz1k8+pu22pFRptSLkirOKMlRENFIKNQlaFSgZ5wxqTgzF4JQiR4d4
jQ4V3SjK2yyyoXI3jRTr+dNZ2FXNE6+JZCZd+UEuPPaO35+n5QBUCpXKt3Pk01D5oHHsQqGIpu8U
t6fIuvecpkKrLUPNOBG2vWUOJ0zjkJLQymC9ZkqRimIu4LWholAIymlq7ug3GzQRVwtiOmKqzGtP
iYKYhtMhUaqj3kVkdMSuUItgMMyHE/M8YNst59sVZy8P/OhGU8z7ZPuGnD5bwAbuBdInbJ7o+g3v
fXTFMMyUqFmdec5kIBI51pl23TGcDigllCw0qzW6aFbArsz077WE6QpVE+P1S7bnqyXjnpaERVaV
kjKdVuhUWEXFIRR8qZymSL/RdFbwNVOxwNuDZ61oKr/SOW5U4VYVvtsJkYy3hvsYsU3Li6mybRTn
2qBTYtt31JDompaT1owVtG05zQPn6xVjGRlMobWK/XFP01VCPLDpDae3+GWs4hgmnvaGpCrn/ozz
1oFxhNbz5c3MetYcyoH7+3s6l7EqsLHCXZi4Gwu+MdwMM5uu4UyEBw8aHji7dGViRVH5Rq9pnHB2
tma16VCuYbXeMo2V4lekmpiAhsQ8Ks62O6ZhTzYNvmjGImy7FcMY8NYzHQ8k2+G14jRXLs9WnI4z
rl2hRchK6Irjk/tXYCxfkXniKp0VPhlmfun8AfvjyMftGnecmELk3BpCzIhbWPkg1LcpE2UXEU5R
kLIcofzddzv/u4L+c7v+0nfW/9P/8af7/0Ix/4dzKZSqGLJCGU1VUFgmuUFYG41URW8umeY99u7I
8XiCnIk1LiazUMliECKehFRBMNQkiFYoXRbfuclItVAEmRWWllLiQi1TMNUT3ijICms1m42jdcLx
PuB6zepszYuXN7w6jZSUltu/CLk0y/BUEZZReoszlsQyzQwwxogzdpm2p1KNp9k+xJgn3P5gQG+2
dN+9xPSPsM825DGw6Y6EU2B4c2A/JL58vefR4ZZu9QHaKPJc0Ag5VKTCkjyvixwisbDkRRNIWKtJ
aWl3KwrWagxC1tBWxWGaSLXweZgQs1DRTho2unJdFUqEfxYSr4BnIvwsRchCEmFGEUNiS2CjRoaT
YBuL1oL2irXx2BTZesssla5fkyxLccpwyhG7cpgCIhWVQaNRaGrSnDceqiZpIVWoncUkKEqje0cS
z9w64jBze5xZ20w8jGw6YZ4Gprjgavcvb5a/74WLh5bMjpN8m8OXlXm4o9YR70eCS1w+2VGl8Pjp
jnAHWjfopBgPiXwMvPjxZ7gHO8JxJFrFRhsO84DqOlox/PrDNd+f4cXwhP3Qsnr/Ie896LgH1lqz
UppbW3HGkBJEWQ6KOlfOLbQ1ctF7oLD1msPbA2HvDV8F+NXdiu/tIw+bFUX8Yvvq13w5KJ6eX3L7
2WvcxY6tb3k5HrjadNwMR3Zdy9MaqUqxEs3nJ0O7WXH95h5vOxpxpLRE3FyM6G2HPR04jQWjDJ3y
tI3jPg+0nWfdeU5jQlnDq5sjZoy8TgM/Po3oFHm0MVAzr2pFuSXlkAughFoK266lF8MUC1pXGmW4
PFsRa2X18IJGVUbV4FNlP0bmjcLGgNKeGjPMdQEdpYzVQn2rac1lRpQj5sycE8Y3pBCZ60IZrDqi
nKUCWmu+2L+hKDiVyn2GZ8rwaUz0rmPOGdGGx0pznTJrraAsT14lVOjqsudkQStIcQaVKQVqSf/j
2p+9U6a+K+g/32ulh/8I+M256n91XwKlCIdYaYym17K0wSykUjEatChW6ysePZk4Hidu7vZMZWIK
R+7mwlbGRaMq85I3URptK9SIVhX7lsCilFCzQeklI11qRtmC6IArC8I06UQ1oLxi+9RyVTYcXg4c
TyPrcOCyGEpZBvsomb5dsrlLFl4RcsRoS5kCtvUkFchisCJMqdI2AkVRt08IV5fcPH3D9onDfPgB
zZNzVNOQSuTyiTD+7EvarDkeR8IklPs96TJiGk8CUAtvPRuFpEypQCnMsbDrDMfTiFeeGAOlVDqv
OU0FtGIYZ5RSeJU4HY6g4R8e7vnAZ0KF3y8Tf9U3jLHwWAsxVZISnhVhXxzvifDFHPlFbRlS5ESl
SOL2GHm22zAE4cHZlvvTiOksbuUZbhKua1F5QlmPkshhjGz7hsPdns4axhgwGtbecz9WknVMWaFX
nhhnZhQfP9mxvz6y2W2ISZMbS6j3DNOC2czJ0FlP6wp3xwmGE3NMHCSxFxhMRZ3dc6En1t0V041j
c/aAITjiLvH8+XNeXcMHVzt+mAKowuGokd6SCnz1s/sFXVoTo9UQFfdJk9JIQnO2a3lCxbbC6lc2
PF4bPjxruR0DzlpCrbRKQzWMkgiiCTagDQvyWGekemBC6BYffFFoGi5Mw6oK5woeK4OdQBnP4Zh4
4DqGaWTXWFpVkBh50vSMOYIz5Fq5mQKXXY+kzANvkDqxcRrjNCXO6M4wy0zXaUQlBiqudeScOd+s
CdOA956qFTEHjIHruyNhDNyfBn6YJ74aIq2O3O4jH3aKrVbs3HKI7BqFU5mHjcdkGGqhKE32wtq0
iGtoXEvvN9zPBWca5qHSaku9O6JXstysmenXa8Z4R7KZjMLZFnJkSgplPSkkdNtT9SJo6bUQUsA3
PaEcKb5jTCP/bLrFmsDfO+x5r1P8il8AR72CH0wnfuvyAZ+8vMW7gnHCOGV0o4hzwGOpFSQVMJBz
xDRCKhGd5nft9ncF/S/Ae/ovPI5/9L2f/Nu9dn9ctX8wIswJrIJZoGjQuZKAub5lIbuOy/P3kI8K
r199yd3hNW9ejfQk8gBDHBEnFFcoKbHaKnxnGSdFlbjQ5Lwi5YwxQqoTUYEmIxjER6bTcvM8zJFX
40TylcbMNH7A7AfM8QVl+oDT6YSyjqJW+L4lzCMZhxfDVMpiKKGQW8ccJpRUeoFBFBtlUTEyeE18
1HD/TJOfbDFXzyjPP6SMgaDBm4aeLeX0PX52n3g8ZO73mU2pqCpUFCIVasGowiyVXBXkikaTk6CU
4VCXeFjKBV0KjRGqVFonTKWSJGJ84fp4QkSzZxFEPRJBVCWbzM4q3oTMB0bxsmZ6XWnF0NSK0oEQ
MlY0cZ6wuTIfRrRyjONI22i0sYiyqEaRRRHF0WpNzdC2jsM4kIpbbm7KoG3lJCBOyCRq1UyzMIWC
bTyv50RohJxmWm3R4jhog37kkQmiUYy6UqtGfCZEx91x4sU44YBvnAuKc262mvnRyP2NIx2lXZgA
ACAASURBVHiNmxtqNJxvOy4uHa02nJ9pIHFo4NgqPh0H9kDzImBRuHXDyUZ2/Rlfvj6SasH6hk0b
OH9vQ5jhzBZiFTrnqWhaXQnVUSo8bC2BkSu3DHH+8+5EUxUrsyJFoTWG51oz14qzkel0z0PbYGVi
QuGkp9bIeWv48+nAw6Zl4wSpkalmShA+2pzzYn+Hcw0pFoZ54rLrOR0OrOyaL473rEvAaZjGhHv4
gMP9ayhLHCuEibYzlGRo2sz9MPJZDFxZw4+GE4cxEslc749EEapKfNwphhKootknxcYqTFLkMaOt
R0Sxalakkhmk0q1ahimz3nmmBEfb0pnKuIduVzkeT6xajy2K65BotsLdqxnpPN5MlMbTSmE/a85a
A+OMkhZVC0M2nPctUyi4zsDgGPOCrn0VEztdeTFN/Namw6vMIEKyQppmTlLpayIBnyahHTW/rVeL
JEovfoWFBpdBCws+qryqRv6Xd7v9u4L+F6P1/ssfffFP/uSHf73q7d9vtdXXJS2EqbqAY7wxZCmk
UohzRhtF05/z4MqyWjd88uPAo5B5fXPA1IwqgTJnZuPYrFra4ChojPKUqphjRbQsmzwCJCiFKVVy
LVjlWJvKMUZCvOcwCa/2mbt9geuB7ekFInuG2xMxR6RGjFk0o1SDsR6lNG0tUBJeG/qcqUXQKZLQ
dM6Rc0UbQ54URW1xjx8jV+fEx8+wbre0yLWjKqG9qDy4esOXr+7YrjxZVxwKiYsvPsSKtZqYytLK
pBBKxRhFKBW0w+RALgqlKyVXOmfJOaOMoyuJUDVVG74eZr5pFT+ZM4bEr7Udr3JgpTVDEa605mWt
KAU/ronPS6Kxmtc5slOVcwomyMIGPxVWTUadIl3b4K1HsrDuLBIjm8YxzwMSI+u25SZ6ug5yrNiV
pbFLBHGztry+n3FGLW578eyMYthHVuuWFCtVevbzxCELT9zSYt5uG4IaQGt89OxTRB5uSa8K3mnO
asPOCu+HHS+PI/PFwKd395RsUWqF1YZnZw3HsfCrTy1VCtcDOCopFk458+p+olEKPRZUk/jqmPmT
DB9vel7Wwou2oSeBqXy0sgz7mZVvyQWiVMZQuFWJrnGMaUaMYq0MOVRasczK8qjvOUQWja633E0J
ry2v5sqjVcOgDGINptPcDIWnrvLRZDk5w6out9LOGE45o1ViZypJJVrTcJcNe5WZxFKc49GUCThc
jTBHcqy0es0+3tG3hto2aKmUZhkumw8nvref0X5GhZn7cSaT6EKiUFl1FV1hhaDS8l0REqeQKFnR
tAlbOgpHOuPonMOhsNqSjyOzVFqvmE4Txq0IKSwd9ikRrSKj+fTFK7wI5XDiWDPNemYv0KwuKWnG
GkURQCxtC2Ou+K4h1sJgBKM1pyHzvnP80ctP+WtG82GauNOFq9by+8PMr7WOOJ0YLJxpzXg/0TSK
/XzimVn2FGBJ2ZSCtgaIIPLf7dzj9G6nf1fQ/8Ks3/q1j3/vD77/4nemav6TjdXcxgDG0jqFqgWl
FTFAUhqpFZSia7e01vDxN8DITxjmQplO3MWZhoiLGbEKO80IDu00pQhaFCFEtLIUYwhVoaQsWNSi
mMaZ1jbYmLnwHWd1ZjcBnWffdhwPa/rGYzYen2bUGNAbRw0FYxu0VqAFqxasrDEKhoiTBg9QEk55
ciykVnM4RKayoV/tCO2Wsl6xTxnlOhSRjMZsdnTPnvOvWOimQO7X1FqJuYAoKooqC/muoKEUDimz
clCyUP3bQataWGnFfkpYC3Fe6FmtEmoylGw5i56sOv4w3vNcN9xn+FlOfGgcL1LEW8cPh4HWNPx6
1/C944nvOs1hYvFq14roypnXvB5HnFUonZkl0DYNpyFhjIda8d7CSaOyx1ZLk2fazpJ9wnuPIkAw
uMbjg2LjDJspcKqCJxOToEKm5Ep1gSksN/UaAw+7BqUjqTiU9dQQUCvFuTKo6pEcyGHEGlAp0feB
w3FAu5F9ShgRWq8oStM4TUWgVi5aTwgTxzkzKUVh5pQ1cy7UlFjXyi4p7lTFVeFjLYSi0O4tBtUa
RBWUFDSaxgiPRfMqBLI1XGt4XRLrxrFH8bxtuasJtCYp4afTRMFwnGaG6pinwpdp4tcf7ohz5CPr
iNNE03TomEimwRnNYc5cdivCCKgOI8KYhc63DCmy2fRcT0eigm3TMe3vaFdrcilo71l3LYcw0jvH
OI+YVQcHwDl+cRP52e2Jh2RW04xXiUe94vZUMECOgawKk6qo4tEVkMjGdZymhJNI4z06Fc5bRZpm
lDXESSNekLDgfhtRpENlJwvoKOaBwzTx+Tjw/qrl88PIbDVXpxO7ruOjfs043qL6c0rKFLO09/dT
4f2V5/owMHvPMJ343vHID8PEHwyJv/WwQU0jU1HcW3g1Rc42a/bHey5dy2mKPAYkwZvDG7IsT/ha
vxUi1opSGUpGeDfd/q6g/wVcTXrxn4rY35ps+1e1ygyp0iiP1YIBYlUUlyEIplSMUqA8Z+ff4Hms
aAyfffUlr+cbdC6EOWCqxuuBisZTUN4ibnFrF5NJuS5DZCWjCnhnoFREJ7CQWjhtC3eh8PoYCEQk
B0rqubkVEIuoStUZ0UvSuipAQIxGXEWyY5aJEfB6ibTEWjBayFVQTcNeZb6oMw8NpJRQtiHVwsyS
LwfP9uw9fnuz43A44DrLXBReC1LBq7dgmWUMkDktco2SM43SjDFT84LXnXOltYZTTIspqk7o3OKc
o50sD9uW/3N/i0JzWQtfzBMfOkPMiYcobIl8KNBIZhrhNxB2ofChUdgKYyls1ILXjCpzlzJ6nmmj
R0+RVbdlmiNe94RZMbFC98J9mNH9ipFM17UEiczRc7bpGUKkP/dILIg2NCUypsCqMdyeRlrjGeaA
SMUSmIbAetNzPAVU0xLGwjRbHm/XxPHI+uyC+XSkaToaDccxs9tWDukGXR06R1SOYBTHbGlUIcVl
aNKUwlwSWeDFmLhYOXJatLZDrXx+feSB93idaMUgBtYaNtYsA2Crhq8PI14rolnMZZ1RHLNmqzS3
tTBahxPFEBXOOe7nxNZYahFW2XAS4Ys58d2zniklinGEVJiypnaWNGfs2qDzBFiCKhwoPFRwCIWq
Lfsw4rSh0Rk7z2xXDWGemNVyoz+iQHvUPNI2W4Ic2aNpteNYTuzaFj1Ezvr1EomcZnZVeNlM+Are
aDYeTgmGVJa3eJ1RKrOxGnB0znLKBRFNTQtH4TjNmBpwOEIuJGkwSlGURZnK3TGQjDDFRFWVfzCd
0EUxT5l/cDzxzDfcjZXnQ+Bp63HdA0QyWilEazIVbw2pVPqmYcyRmzHxYgp8Mo38ZmsxejEuPm0M
umZ+rWspKaF8w11MiFSCcbiYWDmHyktXzKjlx2+cIs0FpdVPpab//d3u/v+v9Y7l/v/C+t3f/a/q
f/C3/p3/ec7xr5eid0aWW1EVBbqiBCgKZKGjZUAZQxVF41f0fUetE4fhiFChZkIumEX4iG8E66HK
4iUvUihVsEYRk6Eog7KGxmlyycSauM+RH49HRiovrgculGc4BNRcOWtbnr+35tFHT3DNI6p4KhCp
y/+IgFXcDQO1alKZMFVorUaK0DmLCpkpVz47fcn/8NXnfNBanq229Ktzphgo2iECQ0xYaxDl8e2G
znqqcjijSbkgZrGkJTQQmXNFKYGkaL1BUiQAO6uoRWidcDqNZECnkVIdXaeY5kS0lX9y/ZoQE5cm
85M889hZ/qAkLp3hdaqsteLbSrNOkQ+NxZC5bAzHGLmj0FnH6xBRYvgqFbatIxeFMZb1ak2YCn23
ZkqJ2QrGGWIqNE3DXArtdst9mJmdZvVW/NJ1hhILYhc72ZQ1q67lMKe3TygBdKakCUIBWzkOCwWv
pESZZdHMhgStJeQE3QI0OqhKVoopCdZ7tK60ygEaJYJRmSSJRKaQOObEzSzcH8E3np/Nmf1UuZfM
TUxkExkpmByJZUaUQqXC6zFRcyUWUCLEt/MPRgu+GlqjucmFTmuiOERZLk2Hk4XNjii0styLYmtb
HneWfYbzzqONxliLKOH/Zu/Nem3t0vOs6xnt28w5V7f7/fX1Vecq24WxsXEsBZFG5CDkAGQLCYTk
QwQSOcofiAgg8AFEIiDMIRKEQCQ4sCIixYChYluWq8ouV/eV62v2t7u1VzPnfLvRcvBupPwChKg9
fsA713w113jGeJ77vq9t07NoaHNl1+7INdNqh1YGYwwjlWMtnDeWVCaUCEoLlIhRHlMSoVZyWnDe
kDUMKSLWcJgHppqpuaClYKVipbJTQqPWObKX9XdnvVljeJXQGUvvLSfGoXRFi0MpjVUakfXOJEBN
C8ZmpmVGyMxxYY6r/fTyOPAyRr55e+Q2RW5z4qO58JZW/NlxxlbhvEJNiZ7EIc6oUw9hRozDSceQ
hZPOEmJBNcJhGLkcBr5584rr21f8+h3LNN4yqIXHvWHKmbe94XrIXGx7lmkmAIPS6Cny9YtTzs7e
oekcVgm6VqypxGVA6/r3zvy9f/xmd///1lJvXsH/SyK5n/3alTs++w2droImQKkohJyExqxzW20E
bYWIEJWiKo3qtvRnD7j33td58PYXiXJCdB2TFA5xZs4Tt+M1w3QgpAiqMs2ZmCqhFGpZNzqUwrUN
bWPXVqxONKWwT5C94dn1whILqu1QQ6KOefV850JWUMmQWMNwqsKiaIpdqU6lckyZXM2qNgOKgFPC
hWjOYmY6zoR5WFPnSmXJhbmsrpxYFUoM1lqSWlOpSqnUWimlkgWyKkxZU8rqb9ZSiTExLwmpEPN6
MKpJ4cTz6c0Nn98eWaSQkqb1HdZadsrR2MR348SpUVzXRC6a59HyNDpugiEtirNqaSvslFrz5LXg
nGFU0LSWo628UIFneWRKw0p/SyOqBbzgugbfbygYdtsLjPU0roWs6M0GWxxxBkuDzZ7Gr3hNbTq6
pmcfQfuOMWtKbZFsUVi00xyGCUVBlhlKAVkYxgVlhP1holDJObLUjDGG45LpmpZd19M3W4rvKa+L
2acxkiRjnZAQYlakotn2Dc/HxNNDZkyJmBOPTeU0Kk5iwcRCDRWZEzdzJFV4ESIvUiKTsCTOtOI2
J7yDm5LJytA1PUkbHvuO5zGTW08y62e21qGi5q5r+d5V4MRbci3MZI5SWaaR+23LZl7QDoItZDKd
NoSQ6L3DpEpvHKZU4gi99YTDArrDSiUAO99yu1Rmu4EpEaqlt1tq8OzMCctcoNkwWMViFZu758S2
4f75Of50y2XXIX2HtJ537p3ivee86anKc1sajtZzmxWDKFKppBK5yQvPl5mg4GWeuE0jt3HgJs3c
loFn8cg+D3wa9nwWBr4zDYxxZJ8KP0qFTjsKirt2tW7+YDjy2e0rfvziObUOOIk4BUoXoq4EClkU
1hjmvJBCZlkSJUP1ho9TAd/wLK6C3K5Ah2KrV7eMmBU6pIBaVt2P0kCpUBZyOLxpt7+5of90r//m
t//rJ//2v/WvJsT+ZSUdGaEAscpaAK1C1PpfJBSooFgpZq3fsnEdNkU6r6BmUi5UMiUnhIorllY5
VDSrMCxkPA3WGYxSGK3QZi2Q+2HhsCSmkpiuEuNNYnhRkBDRXvONn7nDo/ffwp7eX4t00RRZZ9ta
V2oRilIMORDVShsRKjtnUIBWYIiYaeB+HGhL5v69ezSuA+3RAqlGqlSkZjqnyTFgjcUagdcktVoq
SivykplXVRxSC95ZlpAYciHEgVSgbxxDWp/56e0Talm411sUBWUKx2ngQRn5yfCKEAsfKHgeFt5W
wvOS+NAoblLioVK81SimEPBWeJUiBcWgDZ+lwkPtmFLhzBi+GxY+yYmvOEPIiZOTjhA1yu8Yx5mp
Vi42pxzCiO57SqpoY9lpxZjBdZ5Xww2u26BzJmhFq1uGCNtmQxth01mkJnJdb1LPXh5p+jXzdbSV
rArDUugax8vbGd287tIURRTFfso0vqWmzJQS+xxQNbM1lR/MR6aaGWNhHyr7xHqIiMLWKu55xYlT
nOvKA2/ZAr3S2GLYOEMjBpM1vWhsVWy8QluDtppZwSWV08bzOYZHTYvzllMcF8YzJTjRmlQrVmmg
UrPCUFAVbhvAKAYjiE5MKJLRHEOg7TZcxYVGPE40SizWanLKJC34AlNOOAW2QFKOUgMzlrlEUiz0
yjJPE955QszkkphqQZzCOU9MCd83eGVZCrSt5ZgD0UBUiYMUto1Fe8NZ33ETKxvv1oRCqWBWqFHT
aJIuGA/Rwg/CyMZoqmRKEa6WmagKf5rhCZWjZRWi1cpNLbxdNfcr7NB80XrIhfvWM4eZH6bIe73C
ekVj1eowcA0pQdWClsr5PPCQhU7gxFmUCIcCjWhSKJw4Re8N+xTpbKaGgJkn3uob7r/1JWxjUALW
CDkvlByP93bv/PtvdvQ3Bf2nfv07/+bf+D2K/pq07meUGEQ5DqngraJVghLWaNhcEVGQCiIKpQRr
PJutgZoIpTLEwLFUNAFfNb1rSLGSjZBrobxuE8YSMTqj6qq+TXnieAx8djzyapjR+8p4Ezk9s0gH
3Z2WL39wxqO3HuBPH5KSELKsJ/WQEYSa64pTzAGhwRnhGBd23qOrrNQ1ESie89MT+rbh5Pw+ulbm
amlqZXkdCJNzAK3IJZGBTtuVIKccuQrolVI314oTIVIRW0klsU8BHSesFDZtQ6mCd4pnV5/RSeJU
R6xpqI1hnxLP057fvbziugaMW28g3kAnwi9Zz65WHijYKU0ulWZFQ9JKw4tU0Sh2RjHVyD0DHx0H
3jWKTQFB6L1FoRHtKARsY8hAyq/RnkWD0sxhxgu0VlFKAhFqLKA0ZKF3FnKGEuhdpcQFg6HMCzFZ
ZltZKChlcEvFa01N6w2srVBSZImZnCuUgtQEeWGpM5IDLYlaAmcFbKnUuhbSrQh3nWIomVOvOW8U
nYaNK3TO4nQlUogaeqOJgDKQxGK0oJ0jKsO+KFCGU9cSZX1/u6rok3DXOExe8aaJFTV82jUkpUi6
ci2Vs06vuFQDj9qOpgiD9XSl4Oz6jk51g0azLJn7fcMcC84YeivEFNFaCKHgvWcOI89K4aTzHKcD
vTGUZcS3nhASOVtEe6Y50OoNcclsjaPTdoWctJ6QK9k3vEqCQXPeNOxjJGrDUkCbzCKVWyoXnSdh
6I3HYEgKZhEuw0LjhOcxgRamAt8vhXdcx6dZMMaiMHjj+br1vMjwL+62PI2Jh52nM5o/LQnbWv7X
w55HImyGBessm6ZlyRs2vWM6Blrr6F9jYged+MdXN1ycOG6GA3e04rGxjOPAl+5eEOMq1vx0qbwY
Ju5qy7224eFbX8ZbizMCVFQpQP3z/+g/+I//7pvd/I0o7qd+/epf+tfr//G7/+g3JR+/PtftV7KJ
qFIoRShmjQOF1fNZ6po2ZkVRsyZhaLcPuf9IUFYY0sR8fUXKhhgTx+mItcKEsBHIFLAZh6VmA1pR
JYAsGEncayzPD2BODdeNZf+TTGcV7swx50JKCzUulCTUaiglkWqlpEpVQgiwMx2QmJShM559yGir
0EUTS6ZuOryD3DqSrAWgSGDMazdimWZEhGlO6NdZ0jlXrFlzrEUZYlhvyJ5CzJlGG4jgjKfEAzfT
ngcnZ1wf9+zaLUtKXHQXfH64pD9G3ttqSIXOaK6GCFHRFcX1GPkL3qBqRVfDEAt3ReFFGF9/x0MC
pww/KIW9gqLUKvfVwiyVx74hZeFlKDQmYC/3PH7YkvMtVjsau4q6LjYbjnPA+A6VZnLRa7DMfsK5
LTpprNEsOVJKZddZXix7SpN4sRzIKWCVJg6RTjniULGdWbsAS2XXeo5zoFFrix2lSVFxnWZ2Rvhs
mrAqEnPBvh733M6JThSmalKO5KQB4Zg1vbFsVEFrSLpyG0FJ4qL1/Nlxpn3tTVZK0yvNmAu7puWQ
BG8trVUEEXZtyz4WzhvPGMFFS86GaUmc7zqejBO7VvOsVK5KZec0ZUk82DRcDjNtXYN1rmLhvb7n
yVLQfc92mriNinuNZSqF6jQ5RYrW6DpRRbO1liEkOtdys1+4No73q2IqGm3WhMFOW5SqLFXYOk8d
HX2jqNERa6axa1BT0whG4MJpXFQEGVAWpBQmVaFWavW8THmNbBZhr0BbwyFmnhXBGocXxSPnmCRx
5i1/PhZOlWKUlhMrfNB6ijJsnWUnwuIj543nJMMe+LRMfKQDl7lwr/f83mFGLZHt5gVnXcO221EX
S2MKRheq8tw/u8tSZvane17OA/90Dvwb3nIZZ7a7BlRB7zqOw8gmRbxu6JbESdtiSsGUNfGwljXf
IkzL0zc7+ZuC/ma9Xr/2F//q4Zu/909+vd323zwG1TV6RSyOUmiNkF/PoKVWlFHEugpSvLVIFvzp
A7ReuN0PXB5HjnGmLQq/FHQNqCKoqvCdpowFMQml9Ro3WzJSDG1jOJ0sj5znpZ354K7nahTsGHh4
NqEkEkwg5wMBBzIwZI2SxBQKtm0oRUjG0VrNOK3O91qFIoYpJhKK1mrmsqFreo7hZs0xTwtJwKuG
GBasbcghgO9wUsl5pcGVXBEp5FyJtZCZWErFmAZdV1qdDhmSYjm8QmmHeI8uldPdjj/aX1KWkcd1
hmip1rAbIj8riqsSeZtME2GomY0X/nhZuGMMXzaG2xw5cZpXobBFcV0rT0vlV5uWH80TD7Xhsxxx
TcdYIt+fE1/XgWfhmr71NHaL3zV4sSwpYJuGBo02jhwWlGlQviOPI631SCgkZzGlrHnZXjHnA9cV
Ph2P2CVyqaAJla93FZhZombMkGvFp0hKlVwi6ErNMMbMsCw4I/xk2fOwJlpd2UjFS+GQCiZX2iK0
yhIVOK3IVoAArMhdlCYYh9aaKxT4nkUpniF4ZWmspZbKSbulFcNNqlSjiaIxzuNVQrB0tbI1LSll
slbMZR3RBFUYaqHXmstYOVctT8bEWBqojnEImKZlmiJvdxu+Pw9kNG81hiFknDcMc6azmqkkglJo
K7ycA83GcswrZOQXmoZlHuitJoWRbWMoeSbJwsmmIywzZmOYamX0a6fjKi70fcs4HWn9DkVk17VM
SjOlCdv2jDGgzerCsEvg3BokF849bLRmKY5dshyr5cxqlgRNq7BOc8dkThXMCX5+u+W8aeg3Jyw5
EVLkS/2Gm+XIW1r4p+PAvgi9bfnWFPiN8x1/cvucQSnm48CzF5/zpQ8eUkODNYKplaI0J67jTnOH
L5wk/vvPv0cnjtsE1MAvnp1jq3Bx9ojrw09odIs1M4fDQN9oTE54tXZ+IIMUagmfv9nF3xT0N+uf
Wb/yF/6l73zzD//g3/O2+e2oLZRCLpUlCSlXGgO5aoyp5KVQBLwCEY1WDp0uOD2/5tGw55MXL/BK
U2JBu4BkoQZZPe5ZAMc0B4zzlCxINOvG2lSkL9QBml3ithxA9qjRk0wklcSSBhblIBfm7AjLhKkW
bRVGWbJWWCk0zqNzQZcVDZsLYISAIjsh1UKSdXauxaJkzaiuNa8RkspBCdRqMBak8lqdvMI6igi1
KpRawzwckFLkfr/h02XPdBzpmkKJE63boILln99s2Y8T8xRpXUOzKg04rZqPovDIwVQyd6xwqgtf
aCrfToEdEHXmMkMpwlIUhcJGCZ/EwBPJPK2ZUIU7ShiL5oEoPhkVj7zls8uRs42wU5aQCrvujOMy
rYezEilaaF3LEGZ2mw0xLThnURK4ijM71/DscM3zFPjWPMA88g7wcpx4q1p+dBPorKwJg8rQJvjk
OPIF0zIu0Nh13HEYCg2VYQm8I4KOAS2VKnAsmVNtmHMmqMrOmPXwJIa5Zu6f7PhkmDiwQnLGlHm3
sVxleKhXKtonqbKRwlWFr51smZRh0Y5shEUZNk74OFa+dtpzvY8456naoYaFvjFc5cRFv+FJGNBa
uLCOz4eF7anl6bFw0TpelozH8ba3XC+Bx6cN94eRxjUYhNuY2TaWmjLGO/pp4YChUXCZKqeNIQ0z
G+doa2IqBe9gOg6YrmdeFsZc2VmYp4B1lmOcWXxHvdlzKIrtpmFaJrxxpKjYbC9ou8wnN7c0KjFN
C7tGsZ9HHrUtrdeM48j9Xc9+qSjjuV8LMQrb05bnL468u9vgdGWjV//+5VG4d+8CN2Xa/h42BUpJ
nJ+eEG4uuWs7NgjjcGQshUfacEeEHsOJ0vzkMHCiNW+Ha6zdYYxHlYoYgazYbU44U4nDM8/VNPF/
svCXzrc83pzg/BlNc4cT/5QnqbKf12hnUW51F4hQc8DoSk4JpdSbG/qbGfqb9c+ub/79//ILSpd/
17XNV0V1GPHkDClnNOBE4+zKAEcJuVa0Uhiz5rjXXCDO6HlEh4iUjNWs80U0gqJiKHnNYNfGoI0j
pUKpFaUFtUZMcX07MQ8JVRX2GrZReO/tOzx8fAfdblnCyDSPxDAwDbd4lWm9x7sNSlbPetHCdSwY
YxhSwltDpRJKpkplnxJWWw7jNSB4DTEsiAixBMQZah5Xa5JvSTlhRZNjoqCZwpEYC73TqFhotFt9
86pwM41cv7zCU+iU0G22pJShNpxrg9RM0ztCXqjMDIdrvj1O/KzTHFPly60j10KvFFUpnubEhfX8
4WHhq/0JqlqKFB57w49qpLWKH5TMB95zDTwpil9qG57mwqnWfJIzTY3oOZLTwr2TnuO8UFyHk4JY
izeOZQHrOsoUUW1DzYmrZaGKcPXiOc/izHeHV2xC5HKYOAmBewLX04KVQiwVHTOv4sz1MnFPVa6W
IzknaowQZiwZFydyDOvfUAveCEMpKIHvHxNnFoyxUBWDFLSzdL3jD+ZAdIa9CK1V3PGeJcGshYNo
BmO5VgZrHT93cUY0hmbTo7SlcS3eavYZHvQtS6xoZ7AWilaMBkJl9XnnSKsFkYSQsL6glbA1wr5U
zrSiE4VzLc6q9aDrWowxBFZfuNPCxqwc7943lLyqt3tjEVPRWhNSwJk14lXqqgGoeNs9/gAAIABJ
REFUBTZ+g1TBa41CaKxhYzxpmrnYnqAVOAxzjoSSUMqQS2LXNVgFvXX01tBYx7ZxWNdz0uwwpiOp
hr7fYrTjfLejs5Z7fU/XOKxv2HYdTbPldHuB0ZaT9hRvPY1taF2D1oa2O+FQM/uquZTKn42BR67h
egq87SxnIvxkmumLQtfEw7tvIxmSGIwWShHEQM6ZJo5873jLNAz8a3cveLA74fTOB5QkHEviMGY+
f/mSdwy84yr3Hn0Ba9c4aWUqIQ5orf7H//Dv/Nb/9WYXf3ND/6lf3/2ff/tumMLfTqn8Zr29Nbp9
Tif3eWUFTCVMFSwsJbFhFVRFAa/XmbQRIUUQ1dP6u3TtLc4fQSIlwZxWsVjjNTknjFKrUp4KKeAa
g4qGrApsDK6A3nU8fXZLQFDK0287tqrBLpYsmmmaeHaYySFjlsLpow1Uj9IGqzRBKQzQKb3+oOrq
p9dUTFnJcr0orFFk0WTWzSXVsp7+VQGdWCVSiZIiUjVZrd8nUteXgKNkoZBZKOvnSCWayr7OLIeR
YmbMSY9VLc44dA0YEUqKWAKmRp6WyFc8DBWQVWy3VEGhuMmFnTaEUnHGcUiRHuFtrdAx8wtak2vF
iOMsK56kyrvKkYugKtgMsUYuQ+CoAh+kxPWLz7HNDqRB0yBimFLF+i2ZgtgNThsO48RWDOP+hqsl
8I+ON+hSuGXhJmXOqdyTzEEt5LTmnucCTuBtIzyb9gxhBcggYHNGCoQauSVxNAlvFDcls9OKm1Q4
bYWkFJGEbjVOINnKR2lBWk0QYVvhQlaUrSqVoDy7ornbaJxzbIzGimZ30pKTIiZh4y01K95pLMcp
oRpD0nBMiU3rmMKC64TLZWFUeX2nsXDiNJ8dMx+0npsQSWJBVT6fRr7YNUzHGboWSmEaCsZoLoeR
L16c8XwY8NaicmSfEp2z7EOm7SwfXV5x4Su9c3zvxQ3vbztujgPSWBoD45K41/Zc3d5wen7G/jii
VYdTa2EvtuFmOlKs5TwtXMaFn3l0l49eBtymR4WMNsKF1XznZmR3tuX25YF3756i8sTLeeGtkwte
vBph23OhKrVv6avwk0PmKw8f8fTlNcE6dq5jpNDaNfSn7RybpfLV0xM+rQJXE7+86fnWqytia3hb
NMscmHLhx59d8t6jZ+zsI0q7/r6zEnprOEkdX7x3we7zH/NlZ3i/bdn5O1i7JebKTMfL9IRjjWzK
iCRZxbSvRbU5r5AZcn7Tcn9T0H+617f+wX/hjPZ/U9n+b5k8nZVciAVsYiVzuQ2pCEVXplIootZ2
8xqCRpZKRViKIAqU0STfILsLzPUzQupBL8w5YZWsc2ibSLkAlhgV2hR0sYjWGCOI97ilMormjz4r
PFbQaeHZfOR6f2BII/bmGdeHwtV+4qP9zHsnPY9VoXEaoxURoaGilKY4WGLFGY1SkLKh8TAtGacU
JRYwDpUTqVScNixpwWqNTjNWOzSKUDNWKWKMYASdV2par4QUEq016JgxTlNnuO8ayumOj5+94G7w
5GnBdRs2PhO1xijIZLxv+eG4cCyFS605LZlf7FpuU0IhWK24kIIW4bOSedBYjFRKFq6WyKk3JF35
Tkx4Y3lSM15gyTNXVfG1bkVevlsVn4TETQ2M+yPfCQu//F6mmSuqfwghsS+Oh1vP5YtrTjctNc6I
aH44zvzO02e8owPHYeKxjrRE7ubCB60nhMgZhj9eIq5W3mmEHBODKD46Zt5qPIeUuUrw0AhTWti1
lqspkp0iO8dRQ1WaZ5L52sbzKsxolWgUPCuFL9uG2xT5wHqUUkw5MRdFXxu+frHhyX4hGsdZYyne
cL7rCSmy25zy/csb2s7iPQzDzFsXd3h+c0N0BosjlEo2hRCFd89P+J+evEBEcceoVfypDX+YZnoW
fIl8XB2mZEpRPEgLFkPje5Ycsc5hLHilsYAWVh2A0gRVWQclK92tLVDF8SIsOFW4nl9hQuJutyUs
kcb1XJaR0RiauuacbvqWVBJiPGOeSEWjQ+DFNOJ9y7yA0j1UBzqTpPB8DvR9x9Z70mZhVsJGepxv
uBozu/6CIsKiBMOGIIW3LpoVVtP2eG8pUnFoUoTWtORU2dgeJZlfbXecnU28nI581XpKTrgK39j0
/Nkwcc2R26sntOeavn+HUhXWGpac2fU7NuMpzpzweOM5aXt8e4okwWlLLYEfzIEHxnHCTHuyfqbS
GkMlhAWjNEuc3xT0Ny33n+Ji/j/8Z39d2/Yf2pOz35C2aXW7QWmL7TpUf0K2G2ptoWoQmGNFVGXJ
Fa8URtas7FyEnApOrUrwLIYcE/PthFRFKQonDlUUjWsoFKp+DW9A0RiNFMhRg6mknBEqOQycnkYq
C5HE+CrQnDvu3uvJGS73kSdXn/Oj2xu+0jveOb9gc/cxYKh6ndWnWsnAIRa0UUgMjKXgBKYQaIym
pkjSLTUeKEvBmIYpZIzRqBpQ0tJZz7KodV6ZClprltcq915XcgLjDLW8RsCWyPUcwAs/ub3hwUm/
vrP2BC2FQ8lo1zLXjLGe7z59yvNx5OUysiuZB3oVUm2cIdWKV3DWGL67LLzrFMeaWFRltpWnkrj1
ij+cB6Q1xCpsrPBIC69qxkgha6Hxiu/lwA9jYqcr3yPygVegHa7bUWohKocToS4L2lUgcxNu+f39
C745vKLIEVj4IoEaI4+9ZiuGghCM4llN3HWGmwpGaYwxeGNoreGKiEhlLIVLXfmEzJ9XjWo9QVsG
LBZDEMOihU+K5lo7DtqiXbOOOsSxcY5OPI/8hp1uUNXT2ZYFQ+89F7uGO9sWrTStbTmOARcLnTRI
AKsbYhEa61fXRgZrPD8eAxvfcAyBmwIfimWn4G2j0SXzrlf8aIlc5MIdq+hS4qEzqCp456EIU7ac
+oYcIltrsWKoWhNLodEGqzU5w8YpyhLYtZ5OwTIfKaXwv98ckQRtCsylcne7IcdIZxwpRhrX4Kow
SaE6gSUSpRBjpubKHd8gxdDbVeSnRMgp8yJX3j29y5+8vOVht0EKLCJsjOYYBd001DBT2y1SFVdo
dq0jRMF2lmVZUNqga2UfEyet42aYUNrQqsy5cSQV+KNhz0mj+N+GkQe9Z6+Fb8+RVBXTMHHntOOs
OSeisEoxxUS3M3x69YqfM4UPVKFvOra7h2TpCBp+/8lnfDwc+Jma2Y173nr3LU5OHuKco+TEkmeQ
Qgi3f+e3/tO/9+rNzv7mhv5Ttb793/3nPyvG/xau+8t2d4benq7Kbd+i7JGsLYotJIXTC2OFrDRa
IBfFXDKNUojRFF0wVVGqEGsFAa0U3p/RdW8h8pRSK3MccEaYS8YAqRS0WfOepyz0TpGKQSewIiQK
W2t5bBtu/MylyjRbx9Nb+P7HV5zdibxIhk+OA5/fBp5uDuS65rZrteZHK6XW21BSeA2hFpRotCoM
CbSySMy0RVHSRAh5tcAtEbWa6ygihDIQEhjdEtOMiF3tWqzPXzJoqwk5oLRCJ0gUnNeEfeaL2y2x
RKoVSrkloWnM+gyvDeMceK/p+JZoDklTrOLTGOk0LDHj1DqHvT1Gfr3p+SRXUqmc6cKnKfC48fxp
DJxqQ4yZTalcxsKkNb/kLDEndlUTlsS7WTgvimdz5K4zvLwdeLi5i0+BKJ7zxpBiQm0dr+YjDYXP
99d8fP2Kd2vCLYlvKEWTFIvx7BPMKrMzmssCF03DhdZsK5wazSZbQqvZh8jWNaS8cJsVnarcUvg5
5/msFq6BiuKVwM83HX80T0iv0AgvlObUCN9Omb9x0nMvCLEaNmqNFG42jv0SaPsGJ5bkDAcxHKaF
TSf8/s3IuVI8lJmmWs42hhwL7bZhP9yitKM44f6iOPOGaT/za62jxESNQqcN14eB843hk+MBp4Q7
JTNpw10aUlq7LIe50DrBlcyQA8ZYrpeF2ll0KpSqaHTmxRjoraUlMKs1ZKU6YUqO67w6SV4cZvCZ
D+8ajvOe7aYnLZnqLEpFjlHTNy3TcmTrG2rIVFvx3nAzDrRbT4oR27boCB9P8CUq7/uOxm3Rc6BU
jZVA6y1957kNFVsMtmlWXoFoZlFkMtZajHHkNCFOsVCwRph1Zise3Rk+5A7Pc2Yfb3m6P/A9ESyZ
rVWQE59OE7evnnNsNnTn7wKaVhv0DO/393g5z5y0hnZzAkUoEihT4XyuvLsUjscjbRuxXqGtIhKY
ykLWQpiuUSJvbuhvCvpP0Y387//du+Lbv12V/c3qnLGuR/o75GpQ7Y5aQboWHVe+t5JMjkeMjpjU
kNDsY0CM5ioLJ68zpMcCHogV6jqqpjSW00d3qbcLUc3IOFPCWlCNVswxYrCUuobNZAq1TiwVdNWk
mth2Ldud4/i0cjVGNiWhjsJnNyOzEp5luBoD75Mw8UisR6wqiBW0CLGCtgoplcYo9ofVDy01M6dM
ZwpDjJyYBhlHtCo0jeEw3GAbT0kF5Xc0FGLJ7Lys1i4NKReSrBqAmMBZQ8gLziqmZaJWwRRHTZbT
/hSYsWpDWirZaBprGOaZ5AzTFDBGEUVIuqBV5RgX7mjDWBLKNLwk8K2a+bJSPFkij32Dzwtf0IJQ
uJ4Tv9I4PimVh6ryg5h4EoW/uFO8WGAvwp/GxAOnOVD4yXDkHTwpWVprMDWQVENT4baAsZbjMfJx
Gfmd/Z4fl8xXtObPg/DQOEJVvG0tYw2UWnhgNWEKfGPX8U57QhahqoYhFO72HT/eTxxLXg89sfDQ
aYYU+ULXcZhHHmmDQvhxyUjf0ivHe86zAz7Wind9RZbEydbTDAqrPS1CcQVthb6z7DrPnGHWlauQ
8FpzPWeuauGugYkZYzJJJcQ0LCzMpdLa9R1uG4NKC04yJRRKjDhtmJYZI/DiODKkie/mwnkt/Mqu
x3tBeU2SSNJrWt31MoM2XM8Z5xqmKNgs9KpyCKsNbloKTjlCKcx5YWN7bpn5hV2HhIE/uAn8siv8
4NMf471nKS9ANwxLJinLw+6UOYyIbyk1IaJxTvj8cKTtDLfDDVprYkyUWvm1bcfxeKT3HTpOYBWG
xGUcebi7T5hnem/QUtBkzgvMi2LbGS7HQDGKRhWOVUONvLg54hsLKZKsZqM00e74F+56fu+TH3Gh
O0JcCXrf2Fm+d1jwInz/2ROOKvBX7+6Y0xneNoSQ2TQec3KfmjrafsNcKmLgePOcmG54yIjWt7z/
xYf0/RbtLKIUscxUKSzj08OHH/4rxze7/JuC/v/79cf/4L9yGP03Tbf9W3S7s6zdShSzPUV3lGqR
2pBSAQy5VmrNlBxRtdJQWJYJZzo2GJJShJAYBCqGnF+TzLKglFptYlZhtx1D2NG0B2IYmAtQEkUr
vKzhIE6vMZPjFCBrdBR8qylVaDpHdHB6x7MbDPOriZevJtSPDVpbrmomDzPXMXB5qsnLDZID0ghV
KqqweqcVxAQpC4tSlFQpubBIwtTEQmQpabWglUxRmqorJmtKKeSaEfGkLCsuVWVSzQRR+Cooqykq
YcuKcawCiCKy0HQdWnkkNihjgNUVUEqiMUJVFd0In8fATZ5oECaVqFK4lUKkcCyBl0pRDPwoJ0Rn
FtabyYm2zMBXlNDlzJdrRQMdlTu68DzMaOCawLlXiMAhRD4whreN4v2+Y2s7FjknKlkDWBrD9TRx
bQr/5OUl310GUJXvpsBOVfa1cmIds4JPE3xBFN8ZA4333G22NKcXXImlpMruvGMIkfNTxz2EY0pI
XlvE//K2JY0Tv9i09KLYx8KHqqKK8MsnHUvMnHjPI7uKq/5aZ3DzqvauokAq2itup8DptmMqgagF
pzQ2Bk6U5jgm/orz7EOgr5qd00xT5OK04/aw4Krhge+5iRWs5frqitZahnnAI3ROuBkCW104DhMf
psCmFLxoPuxPGGPizmmLjomehlbWGfPGO+ISudcZnk8z3jY4CYxV6JzmZhJ2refz45FOPI+dEIOi
3ZyjD4WvNpHvpYkX+yN/5eyEZhq5OD1DhcBgWk79jutlgdasnHDXchwmwuI43ymuhgN953CloJTF
SOJVyLS+o1kSyhmWaaJqhQOOQ0T3LTkmqtKYmplqwvcw15ljNq9ZB5nr8Yb9q4mzE8t97ylOU6sm
a82Z6fnq9pTPj7fM4ZYvWEVeCm+J473W8Q9fvOKvXV5y8+Jj/IlHrEXqCsvpracYQVdLppJC5Xa8
YR+P1DjwoHXsdlt8d4HWmjGu+1TKRypvPOhvCvpPw638f/lv/7pt2v8kO/2lqizSXKCVo1ahSksU
0BiWFMi5sEY1K0qBWmesEmoCT4EkVN0gyYBUXDZkqaDWFqhZmYYoo7G1EkvFtBtUtyUvI1YPuJpQ
dcaJxSpAKrVUaqxAwdNQlzXVa66Zi7bnQbvn+k7DohIvXkVevTgQ3m7Z9sJQE4sJDGFmurmilglH
JSGrJmgBI3CbKsYY5piISbHVlSkELrym5HnN+a6Fw5BxviHNC9prQjwSlOZC90xpXAtJDhRlqWVm
rgqvGsYwYG2DpABKkePMIpl+awjTEb9tX6vnPUZbjsvCqfPM84ztHL87jlyFRI6RQ0l8pfHYWjgz
mo9r4ZAr/1y74XduB36hc0whs9v1PHCe50Pg5zvL748jd1Xlo6VSiuZuZ/hojHzoGpZaeU9b/iRk
XhbF10zDlWja83vgdmS/Q8WZISnudZYpjkTZEI4ZOc6Iz6QFvtE2PB1XItgrAlsjZCv88Fh50HhO
ux1u9wCfC7fzwoPz++wvX7JpN4SlsLjCfeU5LhMPzs55EV/wcNugEGSZ2XnLzdVE2zW8PO4x4jHV
MOeGu43ndoz4Tc8SZ3JJiCrkbAlBcQgBZ1rEQIya0QI1r+zskpAqDHFhouLSRCirRUyVgqVSQ8Yn
MHo9/EHm6TIxLAuvloXbKXKRMvtY+aBbFfOlKMY8YcQgujKkgbbZ8P9E4MQKMVQ2rmCxbKRSqJwb
jRc4UxqvNeTCO/6Eoia032JdwzevLtFknh5nOklgChvbcN50LMtEq/zKTWgb5lTBTtztO4Y8I9Yy
IrTO0xqHlYauamysLMFw2vREgY3RzCnjWkeSyFFBlhkfFrqu43AIqJJwVRhK5UkY+M71K27jyM/f
FDbnp9wzW2KBrbXkLLy9u+D94zXfvp75nMBNKfzqznEVAu+Zil0Gnjz7hC/195DJYnyP5ETRso6z
JFM1HA8jz/cjzf/N3pv02rqlV1rPLL9ilbs8xT3n3PpGkeGwI8LhhAxbNiQ0AAklLUsWPSSqhlNI
pEiB+Ac0EAIhgWjRRAJSSqVt4SQTY2OnI2X7RnnDt4gT555yF2vvVXzFrGl8F/4CYXPmH1jae0lr
zPm+Y4xncEjvuLtWVMpizYyQC2PYEcMe331Opc3rDPprQf/re77/j/7Xf7kY8/elrf/VaDVJGUTS
KHlCSSOZ6bVYBITiKamAzIx9j1JmohcBBQ/KUWFJKVFEIJUEcgYl0LvArLKk4lFKkmImIrES9imh
akura/R8QdgmdEhIDcF7mlZNFwcJ2ircWEBkdKoRlaEcNFU03Kl7PjpE1D4zi4G3zgWkkdVY8Coi
jMUkyX7b45OfLh+NQivwAZCJgEAbiYsOKwW1znTjgKfGhQSyQQRHHgRaVvR9RImKuhQ6C4VAytPe
nZhRSmKLwpORIpFzJospPpWkJSTIGIoQZFGDsMg8/Zjn4gGJK5CUoijFswIoT1CZrCJDSdymzLMi
GaQEaqqhwJBomJjy99SMs8Wc2kr6lJBdBgQL5VhowdPOYTT0yvOTINhFwWUJ3DdwhESYJW27wGtN
lgmDRlhF5wsF+NnQ8WO3p+ApKbFWkR2GT0Wiy5FKZVIpzIvkvarhFxYLirVoLVlKy6KesvLzZo1Q
EkNGi4yIgfViiZKWZnVGNgVVCkvbEPzAcrkkyMSsqmm0paTM0bImAPXckkokMmFxd3lE6IJPCW0E
Rk2RuKWWHIaR2mpciujGMChBpFBbySEUZpVlTOBFxApwImAbuHQjXnpCjLjbkT5EfrI/8DWreO4K
i6XhXtVyuR05zDRuCDxcSZ50I6da80Zlue49y7bh1nvmtaHK0DswGq56x0k747rvqJTmSEs2nUNb
zXDwtNUMkXqW1nJ3dsR/8fgpv94YzLZwu5TMw47tIXC+XuP3e47mMw5x4CmRoi19F1jUSzrnkdbQ
DZ4uDLx/+oDnr66wbYvrdhglWQG3bs/RasVHF9es1ms+8TekvucX6nN22yvsbIUIHUlrbg4bfrDd
EFNPnSIz2/NN+ZDrpFkIxW0qvLE8Y3z2OTdKc51uoAROj+7wp8+3tDPDk+DYXmxZ3t1z3jaY2dRR
70phZQS5aJLo2fqXBDEydgN3UuJuc8SsfYA2C1LW+HEgxS2kW6rm/mtBfy3of73OD//P39Mli99S
7dF/HGP+BSkUSbQkGaFU5FJIUX5R6gIUj5AFQiAEg9IF8lTFWmICEaFESpoELYdEMgYhC6ZZEAFZ
JDlBRKCloggoXyBIpZQIJKJdYEREjRGyR6BR2pNyZogehaTzBRHBSEUxIJKnniuk0mz7irU1/Oww
sDlImmOF33jUbI+sG2yyuEFyOGTyfoDVlItPWaAUmKhpVOaVDzgKtYRDztN+M2ekKZjscSIjZhKH
R9WaHDxegEXSuZFKaVLOaDXxwUsuWFXjQkRLg0wFiUYkD1JwampCdLRqjiWSjZpG+iUxr2aU5Kiq
hpAH/vX1kv/ulabkgbaqOIhAqyVbBD4Xisxc5MQ71vAkJj5QFUZIVvM1zWnNk+cX/Mb5Md/vD+Rh
+oxeFR4oyfeHwNpaLqNjDBop4Zmu+c0HZ1RfTBhUGPDFYnPgenfAR8cnF4/Bj0jpKSXwN9cNv7fv
OW0N2xLJFIowHEn4jfURa12xaJY0KFyYICc751i1C4ZhQNWGkiJDyLyxPMH3HXZeY3PEZYHKA0El
jhcLNlfXzPQMUTIDEWElP9nseef8nNvdLaMtvFsZ9ttC1dY83/TcX9VTE10IZGV4VjzvnKwol9co
ozltW150Pcuq5SYkzKJmHgu7lDhpNJvrkWpecTvs0SFxGSKq98zILHNhpRV6qVmd1sxWLT8NEasK
uzFy2ybuC4OX4ouo2GQcVWlKdFRaMGZBkJm+SDQJXyRFCYKMYC0uHEgxoGcRqwtfPlmxY8v7reG8
VvyBi7T9iCYzFwPqdmAIBRkkPo00RvMsBroEJ2NElELOmRfOYZXkZXeBriRBDOQsJ06AHzHGsN/f
YtyBeiwYt6fNns+vPsMKwyfbDTZHTrTg8a7jmyJyOfb8cDjwnaVgu3+Obd6EbFlqTcqJf2E+oyoz
fvfiincEDDc3fFDXZFf4sYtcuIHNq884fzRHxAEpRhpVUQooZdj2B4zwvLi94MLvubswHJ89Qs0f
Epha4kQWZN9jbIMy+vXI/bWg/zV5jf/+P2xE0/67RZi/S1W/naKiFAN2Rs6CFCEKhVKFHDuklCAT
lEQIGZELRkPymVIgiYmklopEFEFBkJ2j+EAIPWINtqqQLFC2nqhPxtDHSCMkCEGmYKWEZDDVklQ0
YWFw8ooUErJIYskopXExgWQyy+WMyR6dJMYWRFWoqznL+Z6DPFDPNBcbx8vrVzx4r8EzjTPV6Oi3
jjyO5ASqSEqcIGElQaMEh6GnlMJxVXHoRlQtGWLCqorsd/hQWDSK7XbLrGoJYwCr0KlnH0AvG2Kf
oJqT40hQNYgJ2lHVDeM4ompDcD1DyqwaTfADpm4QToKx5NQTRWE2q7n1A20lKc7yUDacougLnFrD
0zHy9UazGRIVmq8IzZgTb1eWDw+OTQ4spCUVzWrxBlUbkKKgk2QWBK+C4FAyM2OZJ8dCQSiFIjxa
VhxVlrRuyNnik0SVKV1QGcGhdzzrt9h+4L2ceAE8koLzDLWC+zWEKPjEjywoKF3z8HhGSBVRq8nk
KAw+e6zQ9HikEIzGMORAMobb7DAmY7Ukh0IWCiEERjb0OXOjYN0aghsRWeDSyFu1Jg17xjJyZi3P
3IjUmlfjBBSptKJ3I1Hk/7cr4HZzy0zCSklc8By3FX30JFF4NXY0KXDUzNn0B2RVSGHgJMP3+4GL
secdkbkJkbNGE61gVVmMUXzqCy9LjR4iR1rjXccga46bFpcd65kliIiVmjEmdkGyagRXY6Supn71
tlX4CEOUnFeKjS/oxqDjQJ8D92Yz9NjzW3fWfNqNfKuSPPXwJ4eOR8Jj+p6l1dwbEmjNECMhFd5q
FDZ6tFIQPT8ces4qw62L1G3DoYscCzjWgi5HjheWl7sBKWGzG+nyyD4M/KDv+deOWv6sO1ALwVoK
ftI7PlCWj92AKJmPrg48OL7m/eoIlzXLtqZzkfP1CQwDOl8yF5L/7SbwL95b8qLbcR0FX5GZ5xev
eOf+DXZo0apGFEcSEMvI7eGGm8M1h6ue2nveaBYIaTHZIItCFoUgkdyO9clDVMmvX+ivBf2vuNnt
n/zOqnj9HwVp/32R6jvKaGTRuCApJVPSHnSN9w6kRyhFCA6tp7y0UBIKpAjK5MkspiaaGl9E0NKY
EMIRnCcEx9X2FhtuWOQDsn2AsaeEYoCprnL8grksUkEriRQCpQUyN6QGTAqMJEBO83ARUSiEAlPp
ycVmpwlCLnJyxVdzclNx0yqOHlnEYWT39BrNA6wMGAJNrnHdOOFdc5l4DQVUAS0zPhRUliALvgS0
1rg8fbaPCVEKxRp8CRRlyTFNLVQxUkTCyoowFnICETMiGwBcGhBCEcKANAKSI5aMEYU+DKhKIolE
FacvLSe01hxch5SaUgpVbfnEjxym/QcEwf0kORslv5QVc2kYXeZUaTYxcJ4zJwKGHDitFM4NzOZr
tm7kS0vBrVJ0w8gvtC0fuoGgM75kdJZYprXA35q33BUNybYkIYkZKqO4comhsvyTz57xidtzT3l0
KpxXkj/yI1+uK9osuMmBo6i5joVvz2bIXLNcHDO3aw5IUPDUR+4tWjaHDq395mvcAAAgAElEQVQ1
K8GUc28Kex85b+cU5whSoYSgD4K6XbHd7WjbJS4LWmUgQ/aRddvyar/ljdoQcqKmkIzmvMCsMhz6
jkpXOJN52fcc6SkxsaoN5Qu070xIti5yspjxF/uBRSNRnWffHSi6cNkNPFTw5/2e+yUzCrgVhTta
8CIK7i8MKlboUJBG8VkXeO/EMg6BPJtxB8neRTCSFAp6pnApT/G0nNn7wqLWjF3C1hV5PDDmwvnC
wiHS1A1iPHAtPadlRg6SenZM4za8u5jz7OKGVwMcVYV/ut3zt49byIkbIXAZ/tng+bdP5nxvu+fe
suWnveeTlHjWjVyMiu8YeN53/GJV85NDRxMTD8uC795uWVaSlzEwCMmYOy7GgZ+Mib/sd7yhFJdS
43xBV9OFfYHgx0PPm5sr3jk+RdslQowYIZFVy92m5lcXc/ZDpomZuTCMLvI1CasYEaOHeEAKhxSG
hEOIlv3QsfMdF4c9Jt3SSMe95RmzszPqukZXGmRhNEsWy0dUqsJa9fqF/lrQ/2qeZ0+6k8N+8/eG
m5/9B96Py5wySsQJikEku8QQPBiFtp6cMyWB9DWIMhmEiIgkgIyUkpQS6EQpgpRGhMyUkCglst9c
4VzA50R/6Bi6nt04sL7jaURC1w9JKSGEppT0xV1AEnJCfVE2IyqN9AqhG2q7ouQDqnhSDAgSQiZM
sSgliFGQZWGIkIWmmlkeHi95580DF48Dw1YTuhm7nWEhWkSx+CPNZvCMMQCQQgYt8eP0Pxtcmly0
dISQaaSmdz21Ufjck3RmpQy3+4G2qUhDj9SSGCJjCNypDa4faEyD8gFMg8wTba2qLf2wZ9YcIxKo
LFEMjC4yXy7wYwZr2fsOZQythJQCtbHk4BFNy1U/chMEtTZ81gW+aQw6S95QhiQKF75wVFU8GTyu
SJZJcJUCDwE3jBShKH1iUS9JJfJN0xJMQG73CBJ/se9IIhLJjFKyPppN0b15RYyBLCrIPfthQnD+
6HBgmTti8dQqcdCCn4bMN4zkMCZElGhXOEqKk6yQwdC0S1AanwVXfscfjSPfqTW73Q2L+ZosEqKA
FpIuZYaS8aGjVBWEkdElsgpoEkW37IaOWgtkUZSScQp6EkMW2DLhfJtUiD5NnxuhEgKhBLXWKFvo
+kKMkUpmSioU5TBlumzFEnk+Rj4bPbjAy+w4hACVIMrEWkoWUnMiDY1StMpwkypKhj4Xop4IdD5F
grHMJDgSUtSQC5WeYEAxFYRW3IwRZTUuF0wt8UxGsLZSdKGQWoNjREiFioKr3W5qsMuBB80cozSn
i4ZoFT/eD1QycX0YkRo6JH+RIveM5pP+hscp8OntwEUWXEVB8CO/0lZ8fLNFZ3gaJD8aA+9LzXdf
7JkbwUd9RsmEUHCbHe+Yij/c7JjJhE5QROYBio+Gjl9dVfz4tmOTAsu+5+r6gocPzknOkJSiCYkP
Vmtu/BG/+7Mt71eWp9ueqAorVVgWeLQ+QvuCNHNECEQUKMF1d8MuOl7dbJm18GarsUWwbO9TKYlS
CV+grWpU8wakA9pUrwX9taD/1TrDRXgwwN/bdvHfEWo2K6KdeiXL9KMhifT7cYo69QekypiqQUqo
dIXPBW0KQmqkEMjgyWpiJ8eSkSoSPeQyInMmxQI+cbsdEMERfWDodmyzpmw7wsExP1W88f4pWixJ
ElyAXARKTuUnukxkNSsEQijQDSjBYchkLUgChFEICoMXtJVEpkyQhYQHbVi2khNneO9Ow9OLK6hA
NRX9zYH+5in14gxtTnhwvKakPTl4qCrytFVgjIK9D2QExED2imAyImYGCft+xEo1gVtyTUiKmAux
eESeDGqDd+ScsdZiEpQSiSmRhaFPjiQkCU8jNI0W+KEnDCOlqhEJTGlpSeSsoAyYIjGikMjk4nFW
IirDGBUuOrJRdLIgZeGHKSO1oJaRqlaUMZERiBQoYUTbluwDWhWkhLmtOa4U0hbuiBkhO0JW/Gh0
3PQdytQMSqOsRRWFUoJKqGnloD3/+OUFkFkjGVPmq0ZxkQJ3pYKQaGPiLaG5lFNDXEiZ9ckcqSbE
bmMUcoAvVZZPXj2nCZGrOLK0ijvWghGc6hnd/iUxB5wYOYyOFoUKI5VWyNSzVAlfEi4GGlWxc551
XXE1erQSXMWC8nBkNS+GESehy5nLMbPQmtyPnGvJfgwUUTACXrjEorL87HYALXg6jlz0I0el8LI/
8LbRdDnxUEseac1YKs5rwyYE5jPNrhuZ24ZWWy47z6PW0jjHrK05EZ7bseetoxWPd1fcaY/oXKBY
jVAe7xWraupgqOqWy64jYnlTw22XyLVhvO04MjNO48B403P3bMnj5572aElOnofzltlsBn6gqRt+
tOu5pwTzEpFx4O2m4vf3ji/XhpsIKzQa+HzoeXMl+dPtDe8YwyYJZjlyrhq+O478om7ZBkelJD4L
fIrcbxs+2nmOK8WNBJvhbat4PEYeqoo/yh0VFT/Y93B1xf3zLVkrom6pSSxMTWnmSKl56QZ0F/iW
yszosSpztJ6jrAJpyCJQkOyHLdtxy8+2PcUXLJKzeYNdrKjMHKETQgpESRijEUSknZGyej1yfy3o
fzXOy89efLmI6j+96rrfjElYHzIxDIBEWQMxEtPA0HuGcWQ7drjBA5mq6mmtIWmNpCeYKStujMGH
QqKQS0QhiNETQiDGiMgBmHrLbw9btvsDVmWutwN/+YPvoe894tP9fb7qBeenx8zvfYlQFF5kkhCM
WVIriRACXSQlJFAWXQuCA60nepcsEaEMlEgUmagESMhlcsvXQmN1y3oVOd7smJ80PPlZh6xB7p/A
ref+Ow8ZL8GdBg63l+TUYcqcHASZTIyFVmkGP7Xe1UbThQGFJsVAqypcdDgSRknc4NBJEN0Efqh0
ZsyReaMhBaKVpNzRyQpFJPURWxnG4DC1pjjPlc9YGbjcPONoeUb0PVJZVPB0PjCbzdj2O1TVkPoD
RkrO9f9jYCo8HyLrxrIjMBOWZV3zJ7cDX200lVSsFcxS5ObyhvVdi9x5GtGQXaBWFdZYnPO8d3TM
5e0Vv36seaPvuJAVj4wiDxlxVEMMWKuheK58Ry/hd7oNKHiSAm9rgZagguTbleF3h8AvCo2VEy3s
njBE1cBygciCUU15ZSIsSfzui0u+NZPMSsC1LVWRfHoIfOPefb53fc19a4lBc+VHjpTgqku8t1wz
dp6NNCy15JO+4+2VIbspXbCImc5HFkjSkKiK5lnvOK0USWSOUmFQmYtx4NHM8sL1fElpegUfdj1n
oeZPnOPXFg3Pux3RO8aSydnxqNS0SbCuDUppbJI8/aIToA0jf5AFc5d5K0Uchcc+YhV8A7gcIydz
y20ccEUThQBZuC2RsyholcDEggvT2qMIMBa6L1oBK6XojUCrQFKRdi4JwbGaycmYSOZUSoQLnCzn
vPKefwb0OfKhG4l4NiNUKaB95mYMfGU2o4+BeRX4/uGWeRo515muJL5mW54FRy0SL0LkVY48EJou
F7TQDH3gfWMRTP3zb2m49j2/qBWfDj33jKKkQh89xY/c3HzOyXkLoWC0RcqGb1UrHjdrxquRu2Wg
JI/SkXfvn7E4WqOX98g5gpKkKBh6x25IfNQPnInMcYhUiyOOHnwAUqAM5Fgmb4wQ+JRZVDP86F6/
0F8L+s/3+fR7f/YVqWf/SecOv5XzaLKYyl8KkhADURViHIhhwLuesetxQ2K7P6AQ+OQpyZF9RQoR
qywCg7QglUHlCTjSdwPzpSHGiB8DLoYJpyngertnf+i53h4Y95dc9pFLoRg+/ZjxtmGuDXdefsbx
+RlKnVCEQRcgJaSSuBixStH3U5GMForgNFW1wI0CWwvEMBDyJLp+9BPgpURqaVBFMQ6Zpak41po3
ZpbbVYXyNcZBagKXz56R77zL4+eSy1cH7h12rOZ3pl75MpW9GKk4RE/KknWr2I+JXBmUi2gpmGtB
iCOV1sTQMVOGXYwUU1jVhtRnZCXRJSIrDTlTi0KtJCGBFAKR8xRL05qoJHEoXF9fUxnL8UzjhAaT
KUUQCISQUFaiybxnBM/twEuZeM8ads4RgCIMlyXzSfRcG7g1BSUyCMXWefJ2i1xVjEmCljQJupA4
9ANaVQRbsHbBslaovOFMWR4WSVvNqDEYPLJYXOiIKXG9u2U/Jk6BvkgaKp5Hh5GGJCwxBW6A5yJy
WrXcrzRn69nkOA5glMFlR5CaP3v5ksdDx3WfMSbxnhv54xypKsOmSP507/lm7fiTFPia1vwoTWx3
nxMuRN6ZzxmGxDmZ/eEGoSQ/GzzrAtcxch0SjQdTEjo5ZC+JsnCkBTZHGpE4DJ6uRAYJn42eXDwf
DyMrMj899MziyD0kT8bACZNzWmrJo7omochS8SRl3tEVY8gcxcw7CmLMnGrJSZYoKTneO8xshpSS
fh+pjSWMgUVV4UNgyJJFNRnypJF0YaCWglI8SSZao3i1v8FYyWXvKAlOq4rDOICUHPqOZtEiY0Jk
gV6s+PNXF5hFzT/vPDFH3raKH3Qj7y1qvusKJ1XNT1ykj5nvVBV/6Do+qC1DEpzphseh8CQkfr2e
8b/0B96rKrQAmzLvSMGH3YF/ZVHzOHoOJbHLk9Hy67bif987vtE03ITEp4PjrT7y05c3nN+r6LoR
bQzzWnDH1Hx1seIfvPicu8py1kjurBe8/9YHRFsj7TEhwEYFdIrcbi4wMfAwBO5UhpPckqsldvE2
UWVEFhQSWmgykRwTZP6snt993RL3WtB/ToX8z//8l1HNf5bL0b/pc5QlMY2LZSanBGqglJ5UevaH
Db4f8N5zs9kRA+Tkp1duiuy305gYJFFkOr/HaInVNTlnui4SUqQ7CGYtjOPITbfjsOtZr+b0h8JP
Pn/OxZWibSqebHf89KMfk+Q5j9Jn7J639HcvGa+e0J7NaKUmlswoMrlMzHNyJmqFKIIYI0VN5CZZ
GcgZYTIqC3wcyWRCjkABOWFZ7BSZp6lqjhoDbc3YnHFsKnK+Io6OM7Hh1M643ewJ/S3BZbJkclCn
ws0w0KXEXGt6N9KaiiEHlFKI4nExkWNiPzjqkidUqkzonBlGx8zUU+ROa4qP5CzRBvo0UrQguZHG
SCgeUxLnsxkX3Z7bCJubAyu9YGnn+KwIlSX6HmUkVksCCm8UT4qhFpZPnedrSlFlgVSC+zZzheOD
RhNLoi6CMWY2KdOIwu5iZL5cUCgEEVAF+r5nWWcubyOyqVjrml9erRiSJY+R8+M14zCSjEUwktPI
jet4dXXN+9nxyh04kZEmQSMK72rJ74wd51KQi2TUljvzBqNqTk9PGboR6iNyzDxLkcfJ8QeHPdYU
ukOPovB97xhFoQojn7rIWkr+eKoP5LG1/NQl/vbM8j9srvmS0cyyo+sD+yx5Hgu/cTTj+zcdn6fM
G7rw2eB4ZCS/t7vi32ot/0dM3OTCV+uaP/OBX6xq/th57pqMx/PhuOM9LXgeA39nMecfbA+EkhmV
5hrBdyqNQ/LuyQofClQGdMXziz13W8UrB4+KxhSBjIUTKfjRmHh3NaPfB05N5MRHxqixQmCLxxrL
TAhehMSDteTV1jOrDZ0PRKW5g2DrMwul0Ukj65Zr9rx0im9bTRcktrYUIemzQLiMjYq6rnmkpwv1
kxDxyrBRgV5oem3IERa2oQ6JkxwoCb4kEm8rxac5sC+GQyl8yVq8FKyUosqOrCYza5cKlMRV9Gyz
Zy0lQyxQCocE39ItOlU0RL7aKF5lxdu25uA3IBqkUNPFQ8I2jgxW8KbVrFrLw7MVZr5Ay9nU36At
OMHjl8/Yjzs2/YGlH8g5cGTnvH33KxPxEYkPCRCk0jEOexorCOP+v3otma8F/efufPbdPzzLZv1f
Ypa/lYskFkXJkkSglEIOAykl8rDH+8Buu2FzdUV3cMQ0IjNTe1ZOhDCZ0XLIxGFACU2pAoyCURc2
8UBMgus+MITIqpbUO4hD4OnTp4xX19SrOWK54ruffY++m7E6rig5I2RmXjU8+/gT5OWC1ZFmVdW8
qxrq5ZsEuWRZFW6dpzF2coZbyDGRkqBaWqLLGDUjjAWvM5XIJAQySVIOaCkRKSKyxDSKQOZ8OeMb
4zHurme3loSnms8+fY5qB567a+zmmJcvd/Sba+qjgdjU7MdEj+TWB0LKLMpIzommtsSxn0blPpGL
RaWOYbulbmo8I6UUvEsECwuTGUfP/GhOSAEnLSkP3IyFddUShgFtZ1SpI0hFZRVFaYKSfHhzzdG8
pl1osqioleL2kDCzesKtNg0zBXWpqK3gxZA4V4KrmLmj4EWCmVC8mSUXPvAlpRAFsneMUuJFYr6o
aKQEqRn9CN6TpWA43HByd0naO5StaWQmKEtrG7rbDo3BpQOv3JbPhoHf31zwN+vMp2HPo8ZgBXwa
IudZ0xSBkbCgcF4ZzmYNdXuHZnnGZusIKSKT5+XYs9vtWA+BVSm8yCNfzwWE4sOUqLLiNgZOtOXg
PAAhStoCN4NhEQOqKP7x1cixkJQsuPCKpzkwftHd38jCoxQ4yhFdoHea65xIUfD97LkQgY/iyC71
CBQ3Q+QdrSixcLdonveBFYYhZ55nwYk2NFrzhmxpnGIIBlkarlLiPLdc9RmRFVYlPk0Dv1JbonCc
q4qrbscLY/i1lDj0e45nBikzRSgyiS52LNo5m77HGiBlVsbiYuLgPHebGSEE5pVmSCNtMdyxNU+H
QGVaroZAq2pmZUp/zCrJ2O35dtvgReSjlAjR8c+7gb8zX7AvBVEJPrCGpYazWcXnneMb7SlP+o47
SnGqJB/GxCMj2IbA36olB194GTILJZlJyZfamqvk+KBUnElQCN5tGm4jLBYzLuN0aX/TVrRacbas
GfuOZjZDysg+TrTFKhh+rWp4y0revX+H+3fXBDnH6Bn96BCt5eXmKR9fXmOCZ9OPzLSgKomjB3dp
VvemeGgR+LFQVwXvBghbtJzdDGn3P72WzJ/v8/8rfOpP/q9/Kn/7P/z3fjvLs/85y9W3s6xJwpCp
KMWRRSEnR3B7xm7DsN8SXMd+c40/jDg/THv0HMghY4QixoIIArLEjxGhFD5HhjjSp8xudGxDYBgi
zz7vaWtHt7/ksH3K4fopV9ufcUjXfL6Hi90n+Fc9QtYsFi2ahlL2VPI+B3+NtnO8KYTimNcS3SzQ
2uB9QgpFTBCKwBRJJeQXbV5TyXqKgKypdSCVjFASoRJFJrScWqOkKpSsUAWqLLg/qxlGz36XOXSB
wY0o5RC+sF40vP1gTXvnTbzWHLyny4Krvpv4aWUgy4zQEpE9KIHKgRxB+o6w3WNEQpU8lcBn6GKg
tQIB6EoghSZJjUAwlkyjJSIkspmQkEUkaqHRwhDGnm2/x9AzbxTW1qgCFA1FIEqFkJJZjuhh5A9f
bUjBkWKiIjOXhRQ878pCKyXnTKN+ROGQIs9D4LjSOB+xQtHU7XQhqhXj0FFyYiiBmEYGN34hHDU5
9iil6eJIGPd8vt/z0WbLUXK8cI4lGUphCAWKwCG4yZHrlDlIyzfmcx4uzjhf30HImlEYfIzs/cju
0PPJ1TVv5shmd6Aujq9XlhclogSokllpSXSe/TBikqf3DiMCV8FzX0OVEhfeI2PkJ13PsSg8945z
Oa0DViVxX2QG1/FITEjPugTu14qrNLKmcJMc9y2oDJLAQhSuS+KOkTxNmT2CRZGcas3XbcvdYjmb
NQxJUtmGnsyTEDmpBIMInDeSx8ExF4Uzq3g+hIkTABxZy6lVJDTrec1mcDR1RfIjo9a0SA5DYVHV
7EZHMgbGyOAVR1ax7zxSCUJwZCmxqePjcc+yrdh3gVApUh8mdK/0fL7vMLWidIEzZflRn7hx8KvL
JX6EX2nnyCS5t1wRbMVGVRwfrfmk99xfLLlG0yjD/dZiUuTtWUsYJaey5r6okEHwblPjhsxCGo5z
xZ1mxbJpkbrm0YM3uHIeUVe8sVgwm824uz5HqjlSLyEWxqxw3iH7ji/XhvPliuOzeyzbuyRRk6Rk
CIWxDPz46TOGwXEsCo1IzEthLQpvv/d1FrMzVF2D+CIyyh6RbhFlpLD/r1fnv/KPXkvm6xf6z8d4
/cMPv5xK+99naX61iCVgyQVyzggFqQgoHu8ObDeX3N5cknzAu44wDJSUKSFM0bQS8R6SnbLkLk/d
6kkJSnEIUUhasOlGbnaOgub68S0XH+/gumDqa1y+wNcjL8SGatRcHa4Yu5HiIv14w6Is8Tqy7/Lk
MBWFz773Gdu94FUf6WPiW7+0wOq3WFrDPiTEF6JehEBKcEkjtCCnApUlDp5QZqAlMo4kJREpEEok
kYhhQkxKaRGqYrWAb75zTqUFh+YOy2wYrj/ms6d/wvGN4GfXdzkZnhPLI6K37MMtIjv6NOKS4N7c
crnvmBmNGBOtrGm045AKua7YxcjMVvgSJgwritElTtcLZCxIo2mI3GZYzWriYeqCr2JGqIaKwjAG
zlZHxMMFdmw53NxyWd/y3qMjuiRpmoah68laYVKBZk199w7Hz16y6RKbHHjTwhxJlxOVhKswMtMS
LxRDiUgluB0TPiaG/QGFxRhDIwxto5BOoGrFk9sdzimUMmStWWrJ6CSzqmbc9wQ38vm459ntLX+D
yPOx56HWOCb/wSFlXpA5VSByw/t2yZfbY2J1BKZhDCCaih9vX/HJsONit+OH+yt+ScGz2PM3asmr
kBgFnBTBsxT5ihZ8OI68UTJVgecx0SrBPguOreDHMTKUgioTCndbRlIUvKkE1x6CDNQILhBoXfjB
mHhXC45kYVYSLkd2OfOduuUPxp5WKjoym5ypUQQ0MRV2wfC2argvatwX33VIBS0Lt8mzAFo1McV1
EbyhNfs49REUFBRFDoK1FkifOVsvCGSyFKAFQki0FPgSWFUzYk4gJUZpeuWpa8PAFGsDmJuW6Hq6
JHlX16QQabVkhqAyGuccbkw0RuGcY2UUIDkVGhpJHyULPccFQ6sNy+aInArnRrI0hbu14F4tMdrR
ENAE3mhaZCp8hUjIio3vuVGSndDIZs5QCnU1Y7Vs0Epy1lqyULx1fIegCo0wNNWU7z9b15SxJypN
raZmwEfHc3SE9XJFO5/Rp4w0mv3uglE2XDx/zOGmR6RA1oXzWcPldsu9Rw+YN2tiqdEIoisoCTFs
sQQqGdOhf/HfvJbL1y/0nwPD24/s3/3tv/+fZ7X8H4VevBNFC8JMY7oCyEKKPeQDfX/NzcUTbq6u
ePHyAobAvtsjYiDFkZgDKTsyhSSYiGBFkWMk5alhJeRMKILDkHj6oufZs4Fh49l8esHmxV/wav+C
6+GWoazYd45tV7HtHONBY/SK9Z1H2PqcxfKY2+tbiA4xj3g7UqKD3BJzomkS7x8bFrMHUDWEWMhC
kIpCIZFaMKaINoqMosgvSmmEQdeajERoQxaKkOz0NxVBKRI3xqnKVQsW84rTI8Xz1LPRsJqfsHux
pbZLHty/w927Rwi1pkPQjQMZcHHEx0glJLhJJEsekTkSs2P0IKTCJZBSQymInNEiUSnBfF4hRaEo
ARFGocki411CakEpUKRiGHtSkczaFSKBVYJu7wkxsdQGpVukFiSfEVJNkR0BIjnaoee6eLauYxc8
l9nzTm3xCC5zJgvJZYIgCjIKToWmzgLv49TxXiLzmaFShVwK81kDLlJLjUoZnaAWAo3EpcC+H/jL
seP3txtS7DktiaUoiBxJX0wDBhKNFvTC8IY95l+6c8bp6g7FzDGqRVlDKD3Pumsu+4EPr15RMXKU
B4QMrHXmtgRsTrhcqHJGp0DKiaUQ7OIk9qIoHlUSETJPnGOZFSoVWqEgJu5nWCPZx8hA4Uomoha8
EpILAjfC0KGplOFQJHdtNUXaMqxkzXXUaGW4SooHpuKqRHoleWQNtRF4pdlnQVUUz4bIPhXet4rb
4NAUKpWJKXAQiS5GYlY8SYp1YziEzNII3jw75uBGbFVziANNXbOLnuuQWS4qng1Tta+PnlobagUX
40BTa7ph5Gg+Iw4Dm35EVy1xc+CkqlG+0EiBipFu9NxbtFxtB6gMWkgO2XMiJMJJ3lkseNF73lwe
s6iXOFHz1fMzXJd5c33CzGjO6vlU2lMk984eEjrNsjpiVc+RyvBoPec2CL58foc5ivlyzfl6wZgl
Z2dnlCjRszVrW5NljRSKgwucL+5QfI/PiVZKXByZmRZZYH58gg2JbQ6U7LneXPDxYcvHL56RnefE
SCiRdW0QJfHOB19nXh9RbENhukQp1UG8oZKClLa/c/Lo3/hvX8vla0H//3ZX/qNn3y7q6B8WMfvN
JCqdhSULiUCRBQg8OffksONw+4zby2fsb3dsNlvGOCJEBhKaQhZfAFakmJzr2iCRyBJJMUz7d5Fw
JLISdD7yYu/Yv7xg98ljDtvnfOmXv0o+nbE/vMLUZ2yCZH+zob9pCJyxOn2bxeIYY+a4vtDdRHK9
IsyP/m/23uTnunQ97/rdT7eavXbzNl9ffZ3+GNtxFCNERJAgEUhICAkmiAEDJAIIW3FoYmUAI1Aw
seWQATCFII9AChJBKAjJNMGRzYlzyj6nzqlTdarqq6qvebvdrO5pGazPfwCdAel7xu/g3Ws393Pf
93VdP3ilNtfZ8vL5ga5r6Zzi4nKDbbYoNIgiFzBayEUoRbCi0aJQWlFQeAVoTUTQVY02FUUyKSek
CKNPTN5jXVlSwlqDc4pOEiUlTHHo0xmHLz7lyaP7XG5XdE8u6RFiLjyde34yL/tDYl6S9MpM0Rml
YEgegyJLodVCJQWVE5ITkOkqh1aayjqUWLIotBFiWv425sKqrpeY3JCoXIWfJ7StEGUwKjN6TxRo
XUOM6VXcaaIocCVTcuK8NRxu93wxe1Is1Lkw+cLTEFgpYQiFqJeo1qYoHljDMSyOhM/8yFQiNctK
5f3Hl/QnT1U7RBTTXKiUxvvIrlvx8njiZd/zIp347HjDm6bwMs88MPOvw/oAACAASURBVMJtyljJ
TKnwMiR+sXI45fizD855c3OOchuy1lzPE/fPOq5vv2SfJl5cX/H0+TO+YSNMiXMKoRReBmi04plP
fGdl+TgGahG8ytzGwqPKcsrwLVvzw95TkuKBsszZ8At1g4nCd3XNp2MCLTxymqe5UFWaE4W3q5rv
Vi1eNbzfrnkaK/6xe2f89x62qsEpzYjmPd1wDMJlWS5l33UVf+ZshQ8ZpxVthkYpfjyMPFRwWcE0
e9ZGUXLBWEevhS9z5GgNX0hia4SM4cnWUTtFToXGNuSQ0dpxe+yx0oK2vPQBZyr2wdOqCpUSqQhJ
Cf080VSWwY8oQOJEDJGNNeSYWGtF3w9oMoqyXCCt4fmU+PuhsM3CubFMEvneGPjGqmblKs5XHa3S
NMZRVQ6lNI1tEIRds+PMrbBJs+62hFBY1S1KG1DC+XrNVtXs6h2NrmnqDaIbgqrIWEzW1LYlh8Ta
dtRK4UOkqVaUGFC6QiSh2gZMYZ5vycbwcv8VL/d3fHpzzTQc+fb9DV0F55sGkuf+es29+++hXIeq
HRILWidUuUWbglIT3l/9hV/7jd/68ety+bqg/79yfvS931v90i/96n9YVPcfZ2UfFbV05Ckv42hQ
lBLJORLnG8bjC5598TnH44HjsV9saDkv/GDJLEyssijJ0ZAVIgYl4FNmKomJwhATJz/z45sX+Bg5
nJ4xPP2A+fB96gKnmxuEhHbvk04Gqi2mvWAYM/XuDNs0bJrIOB0ZxhPT4SXT8Tmzv6XpNNPtHfv9
Hn97jWu35HsNK+tp6ha3usSnZR/tM4SSEauZY8I6RQiAVQhCSBCcZgwz2mqmlMimwjNznGd8SoQJ
tDJYl/Exs6krvhoGPjqN3Hx+zbH3DPcD9zZbLt7YIbkm0nA8HtAl8obTJJ9wNVQ5opTGSIHsWNWa
m9sjq8rQxIAiLVGxIbJZO0QJtmrwJZGcIkvF3gd29QblE8parCpMSpAqMfqRummxpiXZLT5l+jmx
WneQwKxbSvYkUeiSyGTW2x2fPL/B58LzwRPGyIUVphx5pDV9zDxyhlOEOhnOimIoGSvgJSGScZLR
IjgLMQiTXTjdjRaUAdGZrnUchoFSIj8aTtzNM9/QimsfWEvG58wmC9NcuJ48qmT+0c093nj4gKrq
EFWTUsCqQG0zH918wW/f7fmD62sYe2IBJ5CUYkrCuV4uNRu9hAxFCpMqfBI8XWNISphzYQ/sEDTC
SmueGM1ViFRFeKe2aFW4rCquRHje1NxpS29W/InNjp1p+GbdMIhmp4St0XQI/2BV0xjNI1mIYJda
o5TmVOAdVdFkQwzqlU7DEFNkzplOJUoMIIVUCmNZkKh9Vpxnw0UyEAqrCEPl2HYV7WbHrdGMOYO2
ROAuZZKpaYhsjKESxYVrYA54HzlzFdM0snaOVgQtQh8mTvPIRWvZz0dqK0j2hOyxWhFDoK0Mpixp
jVWeGXNgrQp345Ld3wkUK+xqxxwKq1XL4BNJVSQUSjs2bsXUD6xXO3IOtHVNZQyHkDjv1vjoWVct
VhvmsOQAzEOgWjXEfqBgaAwc+wPrumMcJjIKZzRDXkbkkz/StCvG4zP288Bx6vnk00849QO+H/j2
w3u8e7EmiKDqihdXe9554wHbzZtI1aKVoYSEtZ40P6N1hpymH8dy+uW/+uu/9bpavi7of/znow8+
+cez2f03Ra3/iUytEppcFJnMgihbkt5KmUn+juPhOVdXX/Hi9pqcEzFlcs40WqPKEuVaciGXTJEM
ImhjQUHJmkxk9JFjmPnkes/vfvgx3//RByR/Yry7osovWG8q1g/PKW7LuN7RHzS+KFxXsVlrqtjR
lBFHQ3/09MeekAPen5iNxqWC1TUZRV11kAcO+8/Jqx2x1awbzYOLM7RZ4cuyS5wpRKXISpGUIEpA
F2pjCEkIFHJSVNaiS8KoCi2J2XtmHzj6Ea0y1kB+5f/enyLPe/jyThNsw/VwyzceX3JWW1bVFtE1
x3FiSp5cZqy2Cy2tFHwslJiWaUFeurFKFDkt0wHvPRTYNg5bW7QuS1RugTkEalWTQiCESOMMojLG
QEkzTilUSYCmcit0LnifkJxxVb2k55WICEwh4VxDjIW36gYliU/mnplAMYLKkTe1waTMtggPi6ZR
QhKhU5m5eGYya4G7aWKFZZpAcDgjZLGYqiKkwmbdEkhEFamNwSaoJfOTaeZchNtpiQB+ZBTP5pkQ
ExfW8ItvX7LrOkS3KGsIOZOVZn86cDsMPBsGPr47QEystPBu65gU1AgXWtGpDKKISlDK8HEAVSqc
WG69oohllQ1bpTjXy2fxZ6sKWyrecI6rUGjF8vaqIhrDuq55oSr+5O4MLS2Xq4Z2fcEOx7ZaQ3B8
zW2485m9N7xZ1bycM0ZbvkxCVQx9Ucyz4ESRY2anNTfzSEwerRKHNNPawsuUWVnDR3Mgpsylthx9
YieKkBQ/1zW81Ta8KJGuO+Ond3u23Qo/jNyaSOMU09CzqxzZj7SVYX+YmHPi/qbii9MNTdviEiRl
GJNnGidE4GYINFozpoD3iVXjOA4j4jQ2R7TKqJTpcubCVpS0XKYsgtgFmCK6oakrDt4jrqYmMybo
rEHEQq0p0S+7fAWhKM66DuJMZR2NWchwRgQo1JWBkChSUesEGZQVpBiMMxgViVphrGJMJ0KYuTnc
cRgGPn7xjKvrAyV4HjSKn/vWu6xWG2K1Zn8YCH7kycOKVfOAompKEowqKHlBSi/RKpLTzV959MY/
9T+/LpWvC/of6/nD3/3ti1/+pX/7PxF98WtJteepGLIIGVl23Sm9QopCTiPZHxmOz+kPt5yOA36a
CSFQXolydClowOqyjOdVwRhDLq94KqXgk+du8nx5feSDjz7n9m7kdOjZqBrjD0y3L9htOnRxiOvw
x5nz9SPqnHHaMR6gnAxh0EiuMP6cGGpqfYHTFyTX0bbnzGbCyzPOLjbcO++4v7NcKkO5vmZcb6kc
vLvZUG8uiNqQEojWjDFjlEKVgkLQSphTRhtFTILVihIyTlW01pDmgFFpsd+lSEWi5IA2oIxhXVd4
SXxZJnIwcBO4qAqmc5yfraiNQbLG58VvvnEOnzyt1sx5EUKpDOMYqMRSYkYk4+OIqMh6ZSlE2rZB
i6IoyClxComqNvRDjzUKlQuTKBCIyeHqjrv+jpkWK4IRg7aWMUSqqmbyI+Iq5hgZQsIqw/50pHHV
on0omVNMlAQGzYtT5CxbRGkSGk3hs3nm3kpzEzwha176xMEbttry23d3rKzDpABaYSkowDnNqZ/J
xjBHqLVDqcXn+2Zdc/KKS1tRYmE/Jc6L4q3G8jPfeYIuFZNsUFbTx8IohS+vekJWfNjPpAg7J1TO
8g9tOz7NmY01bCqDMhW1tdxmxX1T0SewFDq1rF3OFGRRvFc7xGlq7XjUWoqzqNZxYzV2VbFyNbg1
F22Hcx1/5vIhBcub3ZZdtSW84tYrDx6hnxJPxHJpLE0Q3rGWNmreU5pVKTxQhmPJ3MWMk7TY30pk
SpGVyvQhU7Sm0pof+WUK0okiFDAiFCPLNILEalXTaOGYZvayfCk9cKZAaeEYZrbaAJk5Lln1fZoR
pTDF0ChDzAE/n2i0pR9P9H5ml4VcErWD4zzROE2JEYkQ5sQ0JmqxvBgzrTV4NIPSNNWygjvrdkwp
UrTBaMNUClZbhlJY1ZaUBopAY92y93YLh94rRymZ+Cow6RQ90mh8Sox5pq0Wd4OtHCEmutUasieV
wqaxBN+jJHN39ZK7U8/t/sQPXl5zNZ+wOvKn3r7P44ffIlc7stTcPr+lJnF/u6bavUlJFtFCZSI6
HjEyUdLdYCX9C7/2G//F9LpUvi7of4wj9j/458Td/68xF/9wppacFUWZRegVZ1IayWkix0BhgjwR
48g0HIjBMxxGbM5AIUZPLktXlaWQdaZyBmM0IUEqy5jUCPTzzGdfnfjsi4nnT0dOQ0vbdLSqxoev
GF685PL+OX6G4z7RXr7Lxp2jcoWP4EuhjBkkEUUhkklp5nynaNyebrOnS08hX1FreKAd97YN66rD
kPnykz+E9YC4FQ/qmma7ozLbxVcvijFBbdQCyxAh5UwUECWMqVArjXiwonFFocUiShGiB5kZ/cgU
A13jsFrRWoPLhetTz5cf9SQdePnFT5EHW56crdm255yy4RQ8qWgao0kFKuUIBWLWOFVIAZQqpBgR
DCkE5lLYGIeuFZumXQR7GGaf8FkvDPgRBCGlRDELE17rGjGW4DNZL+9TURptBG80yShCKXgjxKIW
R4LkV6QqhxZhK5ofHgNPj3dYrQih8HarmIicVCHozDMSPfCyaDAwqyWMppfCj1PkZU5IKnRKICec
MvhQKKI5TQWtCpU2hBx5q+qwSnGhazbaorLBZosTzZurNefdmqIbVN0y+kjJEL1HSyaGyPfHiW+0
BmstDytH1BVfq1YoFEkctXUci6OrHXvRNNqyMpattXy3dtzTlm81NY9qhcfy9mpNW2+h7bhRhnu7
Da1rENfx5OKcbBqebC8xUnFen7OxLSbXy7MfZnZi+OB44iLBw9oyhcjaOjxgc+Y2ZQRhax2fBc9p
4X2hdeFCFdqSubAaAmwqzbXPfCKwszUvfORcKUQirl0Qvqk1PLncMvSL26H2BYXjLBaGELjXrPii
79k0NTYGgmS0KAYfWVcNh2ERuTkfSV6xrh3j7Z57RqBkoipoIjl6jE6MfsCpwjEmfMl0TridZ0yr
OaRIqtzCF0dxtqqYfSKKkCOMRagF5qzYNop5OJFKoVUQS6ayimmM2NpS5hNO1xQyUwi0VY33I05b
iEvQS2c1c5poVw3Fn5hyYmUUx/7AcThxuL7h+f7As/5I5U980wirpvD1995nvXqLQRynKfLF82c8
bIXduqPevEHOoMRhlUJlhVIRsv8bj97+c69n7a8L+h/f+fD3P/rniz7/raxXHaomqeUllZJfdeYj
xQ+kdEQRUSWSmfFhIPiBNHv8NJJjwqeZnCJFMqIKosBoi5YleCb7TPGefpyZhpn+bubpZ18R5kh1
riG8wFQvyPIlOp1Yry3r7X1y0OwQhhLIcc+pv+MmPCXGAzGMqFKz2WyZ+0AJhVISSV6g9DNMmamK
cDYXLtWKtW3x85Fb/5LPb264Hl5QbTtOVeG8UezWj9G2JgACIOqPFABopZACpIwUhSmCiCwaAaPI
ujCVRE6ZIS7PRhTYIpy1FVYpdEi8nEZ+/PSADz1zKYzVzPv373GxOSeohYrlsxBTotKKUhbUqk4R
lSKt1QvXeph4cTpQwkxnCpbE5cXZ8r4pRSyJu5jRxpB8QmvLHCJTzGgdKapwudniT6fl/ydRVKYx
FQmhW205DCNaNE40JgtWCjJC5SryFJC6ojKGlzcHnk8zp/3AmRYyiX1MbJ1CtHCuNDexcGYMW1vR
YDiVxE9y4rut4sPZU9SSxf1sTpw7y2kOrFc1KgaUNmhrUNryYLNCMuw2K24yXFY1una8RPOdizNc
5WjXZyg0fVYUJfQnz2VjmU+BCyd8t7FsxPCdbs1Pg+Xx5RmnDJd1w5tnHR8l4WtnZ9TB8nPdhlks
b9ia91crXLZ88+yM5FueNOfc786QuqPanrEXxTcvLpBi8G1HqTrulOO83mKTpq0bgo+MITGEHvqJ
ohLXw8C5glZnBj8xlcXLTcl8FmZqMhWZfQ5UwEplnjiDjgWXEgt+JgGGYwqsrGVaruQcRfgenlJZ
PgbeXa+obMsYMlkZxlQwxqLTxKAtjdXczZ4HrsEBUSuGELForK7xKXJRV7RpoRWqlGCe8GTmmFhX
LFnopSw6mZgJUjimhGQNUtiIQmsgJZoidBkqpVBKYSoLSmMVtFZTiqfYhCuJDDhtkbxMNWL0GFMx
l4QtCqUtOSW0UuSScE4v31dJrGqNxAlrFVWJ+DgQ88RpvGMcer746jnzOHB7PJHizNvO8ta9He+/
9ZgHF2+Sm5YxJe6GPbqMXKwq1tsHaLdDMBijEF/Q1pB9QqnmX/n13/yPnr4uk68L+h/PmP33f/hN
zNnfLLqrijLLoLOUJe2NQg6eNPeE+YiURbEe00wMMznMMCemcSROgZwmYo4olVEqL+NoIq1ZrDzj
yTP2I7fDRD8XPvryC6ZU+GzuMY2lW0NrRlRVUZuKxjQ8vvwWMhtstIhozF0hdXfo4Zozd4+m1+w8
tNLRrBx9eclxfsZNvKJPd9T3G+7SCQ5HxGmapiOFmTlN5G7D9XRFGiacG3nOiS/jmgfbHY/vP0Qp
g1aaEBc7Vy4Fg6IxMHpNpYUSCtYaki54EbRNmBwoksnznvF0oiSwWXDWYlBIynx6HPjge3fUZ4V4
6OHmK77xja/x+PEl2Wj2MVGL4vnpxHldQQo0TuF9QqvImTX0hxM/vL3h753u2JrEudMopznbrlEi
ZK0gFU5JYXPCRUOImWGOKF1wRVBRUWOI04BUNTlFMBadMlEJaMXoJxrnUNkT8sJqD7Eg1tIPE3Xb
kHKgI3M9TXy1Hyii2Y+ZXa0wKJwstyMnhaQU1zHzSUz8ZJ5ptXDPGD6eAnVW/GBImFzYhEwuBWs0
8xzItmEfC0Z1ZDFoqai3WyhCcI6kHW1TcdG2YCvW7YoxFrIWAhGjFGNMXPnE27s1ShSbylGbmre6
M1pjqbLiwapFGcelrWmrFU3OnNWLZ3/rHFVV41zNrl5jbM3ZaodrWuqqRUnh0iyX4k5b1k1LRqic
YaMdnasZYyKmRCmGeZiZYyLEiSYFzrUihgEHhJw4lMw+Rs5KpiNT54TLHhcSZySuxwkVIxWZuxAY
UiarjEUzsmgu3tVwDIUpK+5EuFQV71YWHyK7lQOfuLTC58PATZjZrdZc9SPnrqYpQlvXTHPgpmR2
6zVf9XfsnEHCErDkKPgwoC3sxzvIEUmRkDKV1fRTQItmDoo0gSOTS+bBruamH9lp80qjUdg2jiF4
6nXH1e2JjWtwSujnwEVVcxpPXDtLFwo+LwV/Pyd2u3P2hxOj0mzrilNcRHPTMLBb74gcEQWrumHy
J7arjv3xmiOBF/2J25fXfDIe+FtPrziXhEoTj84bfvbdh2wf3ufy/jsYe4G4FafbW+6mA2+u12za
FW51iTVrUBpBUXxCFyEG0Kra/cov//m/+xt/7a/tX5fK1wX9/9Hz/d//w5VS27+dZfVGRi8sZxaP
MhQkFYgDJU0oIkb+qDMtlBCYhp6x3+P7CT/P5BIgR5xZ9pIWUFnQJTFPnqGfeLHf8/zLnzLlFxjn
KOOMOwUug2bdN8ipxsyO4/XHNO6MdrNluL4iygGfM0UKF298i1W5xz25x9rsqGZh4pqiR66mH7Lu
bjh7WLD1C95Y79CnFXV+TBN2pFLj04nsDxTbMzhhToGbLw5kZxm3b7JS8LWzc+rqbBnjk4iohZWu
CiELMS8xLkUv+8YsgCx0OF2g5AQ+oKaED4kqC1YUThmyQBUCpyng9oI9OPLtyM985yFv3TvD6IYU
Cof9hNMOjaBEY4wlqYIWMJKRPPH5/siH45G3tebNbsXldktdtaSsAbuoeJVAjmgyWc20FioFMS0g
EykF0YYSwViH04YiBaU0MSdqa1DFkwQUmZQSjbZE7yl4tAjoBYt7k2auomcsyxRg3hceKM1bjeNB
VXHZ1HwRYdaKp3OinwrFGn7gE3NO3JUEJTKVwN04cV4S8yuB1ZILkClWkKI436wZpowTg1MVtWje
altsXoA6fvb4lHBoxnEmKMfcz9wYy1cUZg1bWzNOMw+6DX48cr+u6MRQF8WurSAkLjdnXE0jjWs5
X3X4LKy7DUMOrHdrZjJFNzTNiv0UeHj2kJfjzJWuMaaBGDlzG2TImLZhmo5MKeP0zDAfubCyFHGr
0VJ4NiW8M/yvfcApzYsEkDFkPplH7qvM3ezRAvuY+GSceVBZrpKnIIw5ktSyExddaI3h85zonOZS
KTZVxftNTUS4WO04DBONa3ERNtLwqK4RL6zrihgiYioOfiSh0FZz3Z/YOofLiUCiKplQIsoWxtN+
IRfqiNKazhVqH4GI5EinClkiU/aUtFxWTqkwhkRXWXzJaG2pjVBHMOLIJUIuWK1JJbIylpQilYY8
9zhjEDIhepyDmANozZhHSilgMod5YtNUZAK5JOY4EeLIF7d7Pr++4unpyP94c8cqzbwjgTfWDV97
7xFvPX6Han2fyp1T9IachMPpgNGZy2aDq1a4eoPRFVoJJWZCjKTxQA4RkfKdGId/7d/6lb90+Rf/
wr/+v/z6b/7m/Lpk/n/7/P82KU6p1V9PVN+hLOPkJAmVFQKUHEklUEpCSsAoAePQ80ggE6aBeegZ
DwMpB0RFDHlRj75KWQsxkXPkNM+M/UQ/nSjlBSH9AWmciId7rMrMef8W9aZiyEdC3vN0+pIv94on
jSJ/dIWbHU1ZOq1KIi8++JgSagYiY/GUusPrB5SqZu0iq4tI0Sc47rl7+gVjVODu0+QH6HHE7w+4
ZsvNfoadY7d6QtzcYmNBXj4nnz3mJ598n+/+/BlV3oLSjLMnZ4USTSmF2ijmBELmmARnBCmauyGy
q1qIkOxIqu8gQCyJaRowOlMEuqbhZ7/d8Tsy095fMTx/DDGifCLWFToXfnxKvHPWLj+W4sgp4Ei0
JqFmjzbw5kpxTxrOjEZpWDeWGCbSqsZ66CfFLJ4S4ivh0kTnHLVuX11MZp4fBi52DSoIYnZoKfQh
01aL/aeuayRHSqlROnI7Bs5Wlv3pJba2NHomGaE70/yJVPMob/jPP+upXYG08NCrbLjXVLz1xgO+
+OkzTNGsVOIj7bkEbvPE+8bwIi3BKCEJszXcFOH6OLFzFRdjoMPQmBknNQSDSwlfO3KEVglFhCIa
LxadPaKEkDyJhLWB21S47xRjWkSFeS40eoXKBYMjY6FkpgIpCgrzKo+godUrppSodUsUhakNqWrp
8wxmyTBQdcchJ74SzUPb8JxEwtDFwspW2JyZfWSr4GY80QfPWdF0UkGK3I0zDZowFx4bzd4ntER0
iXw4TaiS+SwJk2h8EioMlw5uYqKIYpJMLIKEiNjEPe0IKVFy5FwMbyqLtYZTSLi24dkwoJ2joIhK
cVFpBj9T2+UCaytHKBly4V5d40KGqsYWsFazNYZhGim1EKaIaWtiSqi8xOYeQ0bMEu/cGEPMCYmF
zglFlt+hkApFEvtpoiaz3rTM80BnW0rpmeYFinp3SmzbmmkYQSsKiWIUiNBPA8ZaajGcckGXZaVx
vtvg725RBkzO+GlABG5Pe+Y089svb/g71zfUFqq4YGrfaGu+/vW3ube9j+gd6/qCwzAhteK0/wof
eu6vDUUFTLtGskacwkThkCEOE4cff0hrhW23hlWx6kz9khbzz+6f9r86xbv/7ME7T8rr0vm6Q/+/
7Xzwex/8i0j375ZSUZSBBBQQKZQcIAeKn5DSU+KIVmXZnefIPPYMx1um0wwxLt2iRKR4nNGIRHxI
9GPPaRwZ+pn9aeD28IJp1NwdT+jqm4SrSDO9yTgeMfcu2evIi6Yim5q6PucNeZtLv6PtK9T+jjRC
r24JpxpjI9WmQo3Lrd3HTLdJJP8p7Ram8TnRz4SyjF37K4iy46Cv4fwesWvIlSGZDUpvOB56Ti+f
se0uuTI1hzDz/rlm12woegVKEBRGFTRLtnuJENEL67gIYjJRLeN5HaCURVXeD4kaKBnGGFhc+YVK
MusmYdtAs4I3zmsuLs8xdcuQErUIzhoqV+G0IapEZTQ5QyyRUDL7udA6h6oddtWgrCErUPZV/roW
vF/Y8SVl+uCx1EtXXmDwEznNzMNAxC9Ajryo+HNZuqIQJmKJSF4mD1oJczzhCQxh5hRONKYwjBOu
Utgp8WyeqWMgnAJNDJw5w+V6ze7+FrJmcDVRF25zIOXAk1fJZlsSb2lFTaROketxIkhhSomfTh5N
ZoxCrRSpZBAwRuHIGFMRYmTT1otfH4WoxbPdOEsJMzsriPfUpXBPGYLPGKUZQmRfEsosRVF0wvjA
eVNDyqxQNI1F50LdKkoKbOqKISxEPmcaBl+wlWH2nrfqipQCnRjec45h6JfndrxjLYpDHAnDkY1V
+GmirRS3fiG9GSMcQ6IR6EzkTa2Y0kwXA4+NUEKgJrN6tRd+YISf+kijhKksOf4vs0IpzcYans6R
oRQOxfC4qngRYSrC29sNP9h7dvWKQ/R8KJqGxJXXlLble/sjTbdjFQWdFijPaTyxdRVpHDBakULg
8+i5WG14dnOgtg6rCrpSdE4TJlg7yzAG1m1NVztmZThfrSh5WUdcHwJjgXdrRSqRd5+smXyhOMdc
hKGAtXaJkXUKmUe8Kqy0ZZ5m1q6GmGjaDp00UylULpF04kHbkk9HsgHmI6f9wBeHE89vbulnz9/c
H7F55g1V+MV1zT/y6AHvPbnPxYP3sWYH5oxYhDkKGTjuX1Ak8qBucPUZxrZosRhrWchqievbWz79
6EeEl1f458/I8x2VmrDrs7Wxq38mi/sn/9K/+Zf//n/wV/+9L16Xz9cd+v/l83v/w9/+btbNXxc0
KIVmSUWDSE4ZKZmSBor4RYRlBMikPBPTjPe3xDCR44hSCa0FyYoYNLFk/FyYvOdwDFxdP0OFnizn
+L1huhJW+evkfc3qdodpNKukKVNitW5Y9TNtWFOS4yIHKgpD6YlmYugEtT6nKVtEnmNCpCiFZHCr
kZvbO9LmyH66Q6keMNzNRyTeQ9ee5L5iOsxoaxCz4tjvsc2OoM/R1TtMVwNfffAhJUR+UjT/7e98
jz/3C/D4zV/AmAtuS2JKgrWK2WeKEXJewCCNFqQIlVFLQWwttVTUzTlsBBtGJI/0syfFQK0V23ZD
ztCPM25jSaZmILPSnqAV7VnL3SycdSvIBRUX62DKoIvi5OG8W7FRoIzF6IyPgm1X6FktaNjoCXNE
A8M8smsqcvQU5WgEnt8cMbbw0TDy9fOOdnaUSqNiQZRQGUs8IdhwYgAAIABJREFUTUStcSozpkxb
K/Ynz9oZhpsr+lSo00zOBddUoBX/9MU5f+tu4uldz5rClfH8yfc0wyHwYHOB9ZGtOE44/m66Q0vg
RfJ8W4SsClWK2CJcTZ5vNQ3/Wz/T2MRPUubYj/zpMMGx552zDUOasTg6t6yCXFexP3qUqchFMwWw
WjNOE5ddzTzsSU4oynJMkZVRTCmgG0HSjKfQSeEQJmq14nqeiXWNNhmXDJUBHYWq1pxOM8+K8MBq
7lJaQmYoJNGsKQyiMKIZQ36V6qeJZWYOEcmFBs/zMrBVlpvSU5fMWltEeazAbZxY2wqvEqaCY054
HSkpkRaZJncFOlm0DedKUzKQNdsknGaFFeEYMi+KsAuFZOEf0JqYAg9rSARGImjh85DQOCqfqLTD
JOFUIo1Wi3XPLZz0giZLIkngXuXo5yOiNUoVnBhq0Ujy7FzDPIw0LB7+865jc6bRYoi5wV694KOX
zzn4kR+kiW9fdOzvJoxZkfwCJKIoPj3uedxtOc4jWhJWNH2coK3Yh4lmVZOTZ8yBlW2J8ciZU/ih
pzSKY3/Lx/s9pznxP93c8k1lOATPJnp+xhr+9LbjnSfnXO4u2e6eoE3HGBWVqZhHT6Ywn+6YU+D+
riIqTVuvIBZUrZBQyGYRdPbDiYMfef7sS1ZSeDRX9Icr3t+tGdCYeveLsfB3vvr88Des5i9ePt68
fF1GX3fo/6fO7/xX/+XKbh7+d7q+96SIBVFIKgiLkI0SgRFVZoqKSPaIziCFohRh6pmHkVwSxQhW
L6OzlDNTzJz6kcMw8/zlLbennmm8ZjxcEYsmF0+aInVl6YyiloBtBbupkEahJJPmW9Lhik0FXWfx
eiZ2E5OZie0KXEMumdM4MmthrBWzUri64aavGLjitp+pyznjWBH6FUatMHmDjzvCnBnniB8SHA7E
MVC5gmSFyWekyTLfXNHVG4qFNvVcble0m3sgirkUkipMqRCW8C1EFdwrFby1wjwtMIwpZHRV45oG
r2uUs5zGwClAmBWWirPOQYxYragqx253RlEtTq/QtsEX2HabZXRcNJRIiIVIZkiBrjZYC0VrrEqI
MbRdSxoDRipiLPgpkkImz1A7jSIubHU8wSfGueeDuzseSGZlNOIEsULRixd/Cp5IQlTC54yoQI6F
lD3j1YFh9GQ/g4/YnKhjwebM8/3AECJrUfgCjzrHqm0Q67BGYWyFaRwvNGCEK58wuuAQTilxTLBV
miEnppz4jrMc/SIIMzGiMtiU8fPibBj6GZsSTglSMjF7nJZlZeI9lYDKGp8TaEVKmUoZpCRaXVCx
kEImIJw8y2i9LJjXuRSImrPK4kNAW8MYMz4DxuFyobOW4zhwv265HXvEQqUMQ5jQCiRPKJ24GQY+
6/ecKzj6mYQwzBFdCq4sVk5TMjEGNhqmsNhAi7AEC+WEStAZzdNXKw2jl3Q4JUIosEK4dIYiCqcV
n4TM223NxioeWst76xUvPZw1jpAy27qmjcIwJ77VrUnBs20rWlGIE3ba4FNk1zV8ehi5co5WMkMG
a2um2bN1LS/8nlYrWiP4JKi65suXR5zSvHG24fziHhfrBxjd8ujBI+Ik3J4Cf2868aGfeatylAhp
tWKaerTUFEncpcxl68jzTGUNwgJX0mSCj2zWa47TDdkUWgIxHomqMB56Bj/x5c2ej56f+MHNga+G
ma/ljA2en+8cf2rX8P6jBzx+9AhVbai6h5QEPmmsRE6+J+ZIHO8wRjivKnS1wdVrcswo6ygswVPe
B56/vOL3Pv2MT49HioY0efxhj4wnVA5k8aBFUPbnhPIv/Ru/8ivTv/Orf/l3//1f+yuvx/CvC/r/
sfMv//l/9T/V3b0/i7DgMGWJMdPaLJQzEiqPlBxQklCSUUAIA/BK0Z4iogyqLGOo2Xv6ceR6GPjq
5o59mLm6mrj96HOq2FD6AzHeMusv8I0jN0Je1SQTEB3Q55akPd4MtBcrihOK6+i95tSPXN8MFO0o
aabZZM4fbQk3P0HpmXpdL9axEJYOaSOMc0cuHSGbpaD5E7Z5TN8L8+TJKHI0VLlF8gUmXVCyZZgS
ohTa3OCvP6Ub96w252hleHB5D1d1RKWIGVCKLIuAUMkyptF/RJxjQbAWEZwzONNSNyucrRHR+Dkz
9Imts+wqi+SJz54PJBSPtjVV1aBdTc4VVlmsWqJcX/ie0U8kyTydJlZqWZHEEkFmomTWtWUOE6oo
dILoEykGTqcRows5LdkAtRFySlglnO56VimQhpkheqrKUJTB2ZphmtBak8JMKZlKhMM0sm0s2c+U
mCg+MBxOxGnmdDqybRzHvqdThdYJPw2eWSsaDdvNis2qxZcG1zkK8KSreZEytREMhUMp7IfEPha+
XVd8FgomKzYIL3vPSgqfhsC5KlzPnmdT4KwkXkyJyirmeaS2Bq2FURV0ZTj5zHlTk8aI04qtahhC
IVnHwXvazuHHgFIVLY4hwLpu8TFRrzbsx5GdFUyt6cNMqFeEMdK6hpQLdSkYnYnjxIO25mY+krTm
tgRGP1NrzWEcsVbx+TDwgQgrZzmdPH3OfHCaeVcEXSI6ZXJI7OeZS+Cq99wvwkYLJSQ2znJdMtZo
7mQxq90WYaUUnTZURmiUcERIkllbg4+Kn183vOUcb7Q1koScls+WL5G1q/nhNPPYNFzYhilkqrbh
5Rwo2jJNYXHAGMPHx0BXNRg0ZPjf2XuTWN/W9Lzr93Wr+7e7Pd29VfdWuapcVW4xKsmCSAZlEAUJ
EBISEhKECIkgBhgZJyIgIZgQjGJLZAADBmaIFIFlJaJxGhxHVsXBjptqXHXrVt2mzrnnnN39u9V8
7ctgHSIxQGJs3zXfW3st7bXe733f53l+Riv6UOZDYvK0dQUpUNsWZxqG00SnDGftgs3VE7pmTdWs
6RYdrlqh6pY/7kcmDbemsOocTa1mz3tToUXobMV5vSCmgnEzW8EaR8lzkIyu4ON+oKo0XgKjeGLs
CSHyw4db/s/Xd2xjJPuJz6P5yrLjK1dbfvTZFe9cn7O9uqRu1mi7QcQyxUjOEKNHi2bwE0UFlosV
jXXUi0tMYXbeYNFKA4rBR751fM3f+M53WaiRS1fobKKzwulhTzn2+Ic9w+kewwi6tG1z+edy5l/+
q7/4H3/rr/31X/ro05L66cj9/9f1e7/5G3/BLDZ/QRkHWZN1xIqgraWkCYWAiqDmMTo5gBZSCahK
QSnUjUObhjB5SoqEaeDheGQ3nHjxcGL0E04E5TwLK6TTHjERszqnqIFIIuuExaDOofev58JTO7xo
jHcw1qjTHDOrlGW13WDp2R2fk48LvBpwdcs4HZmmj0nNEoPH+SNX736JxQ0kdY6Knt3NcwItWW6x
1cA4FqrqEefn5/AQUY3idHwNY6LNCtOsOR4VfXlF2B+5WLzDZn3FF66+T/O5M1bdgtOkcE6QKKAU
qSiikjmKcwp0jaH3cyxm5SBPwuW25WanWZuKxhoeEIz1xDLjSTGaTOA0jZScWTeC8o6LxQKXNAHh
ktnH64ywDYWuc0zDRFKZ9brCmsKqW3A8epy2WMkIHikTWWVyYzmNE1XnWJiC1QWtFat6gU3C82lP
3vf4+kBtGvQCyIGAkHLAiZAxUDxEwfrMeddiQibuTxz8wC56SgyEnLBS+EyjOG1qplj4OAXquzsa
XWEXFTkKHYaNgXXXUC9a7veawzTxAssnfuIbojjkTC2ZF0lYWQGZUbvP/YiREW1qHogIFS8YuXAd
fSxsmxbVNuxiT0FzzIWBwHa55Og9qi4UIrWd3Qk7hCuryFKoGxjKSFu3tFbQEmnbBVEVsJqcJrxJ
LK3QpEytLT4GtpXDe89SO2oKOUYqrTnFgYWDffA8rixfU47N5NGV5eALCwGTM6OP2AI5JExW7HMh
hcxDzrRasW0rblUGZxi1pc/C/SljmAODglKMouiZJ15r4zg3hrum8N1S+KICn4VBMk+2mvs8oqxl
l0eiUTR14SGOrFcLXo0DX1ie87Gf6YhdUxOGwudXa/oYqeqaE5ljH/ns+pzv3z7nabVAx0Rdalpj
iZPiannBeDghaomVFsHQLmoosNlUfEk/4t+Rnr/9UebvH275ysnzzWHict2yDidq3dKYmo8fHnj7
7Iq74x2tq1gvDB/5HZfrFQ/3P6QxFhn33PnA0hR+/dUdT5Th1z5+SR4jFwvH00XFzzw6Y123PHp0
OQc3xYqqvWI3HFgsKvI4cTt/Nejv7rm8eEohs1o/wRaZJyDakKeEbWtKBGULRgynrBnrhlPJHCQx
aiHrxMTEpATGQJOOmL1G+pfYpqX+Z/45tNn+lKubf7B7/upvVUb+g+7x408L+6cd+v/39Y//7q9/
1bbb/0W5syqLQZRFqRk0onQCAkYXEI+RiHrThUrRlJJAz0pTrTRaO8ZpZH9/4tX9jpvjyJg841QI
0SN+4Hh8TW5POK3JdonbPsXnNZ3d8OTybSp3xJRvYhH0pKnyFte3uGFJ9oaSDTEXYoHiJgIHiCPL
J2dUJZL9gf1hh9/UYBK3p5dkJ/hjZDj1uGAofuJh/0CqgaYhDCdKSNTVkVUr1OuGs/MtW92RjCVU
hagzKisUwpRONM0552drhER7Uc8neG3wCEUUAfBlBoyEPEdn9lrhlMKrQgHaek57C2bGrZ5iBmWo
XcHYRB9G9nFgErCuZrVssa6iqTpcbecMfas5DD2GjJSCLdBZy/3JswszC/vR+gxVBCmKFCNFCujC
ED1KIKSMVWCVplJqRrNmWDbz3v/ucMDniHaK1bpGGXDGIiEhPkMUYvBsrMW90Vq0Rr0JzoHdaaJk
xUNOxJR4PxTOK+hcYS+R5yGw0MLby5rNqsXngpZZ5bxxFcoLW1uxtu4N0tLSUVgYjfczvKcPwsMo
qFDwAiHOfvoHnwm58EE/0erE836i5IkzpRgmjzGzdbJrDD6OoAvaFI6xZ7Gs8GFkZeYpiy8ZZw0l
Z87ajrvTnk0zp8dNccJYiw+e68WSP97vEZXZVkvuTj1t1ZBTIlcOVRJ9iEhl+L3jkap2ECesEq6N
ZRx7ohReh4lHrWPnjzOn2xVMEVaiGHJGO4M0CoxlvVhyyA3vdGtCXrBUCy50w1YcX2yXdOJ427bU
ynLC8GPLjt8YZE6d05rcNlxbRVAVj8/WHCbhZFp8cmyrFlyDFsXVZsUhZqp6gWRBG4c0FSXC2Fpu
ssHVc75ELRWrtuZ4HHHOYIth4So625FYUGzDlAKr7YqL9QpVO9wbQpqyUFvH2fKc21PP7e7Eq1hY
5kKtDdfa0itNVRle50ztKlL0GK1njnyc2JXEB8cdHw9HfnP/wNtMfPvuBb/9cGQ/TriU+XFl+Mqi
4cuXF3zm+pz19pyLs8cgllJ3WFUTEe78kT72PL97zrS7o9GKZWWxWrNq19SmoqoaEDN35WXGEGuZ
IVNjGvm/XrzPBy9esMmeL3WGhkIpR6qmxhiDB/qceLjbsVKWnPfUm3Nms7D+olXNv/dXfuHnq//0
F/7Dr/9Xv/wr6dMS+2lB/39d//Bv/uqCqv0/TLt5pnSDVjUKhVbzyFaVACQ0CSUJNCCZouc9JFJQ
eg520bbBx4HD6cT7z1/z8d2eV8ORIfWoVIjhnpIzleloWNCuL3CbDWrc0dgRKydKAcMO4gpJLzAL
h9aBkiy5qsi65UThxn9MX0VO/pbd+JpDuEGrmnFY0g+aUioWrJETtMlRcUbbXpJ1RTJCXlhUB1XV
URTkWOOHijAEjBZS3hFlZOhf4/WOYXiNdQXbWNrzK67Ov0oJmf3rjxmWLU3lOd+e067O8D5hMJQM
oEilIFnYGkuOQu00FIURTUHP/aM1hAJ2UaG1RZuGpnOzWluE704Du5w4axqa9pzN+TmDjxTjmLLH
S2QogeADF23HNE6EGBjDyNLA9XbJMEayc6QyYiz0MdKHEa01/RRx1UzKK2rO1x9jpDWOOCpKnr3O
1sKidSBC1y7QPpNzYdoN7G8PnDmHCmC7BTEXBmVwtcWIYttYkk58Mk3sVaaqhGgMfUoMCv7oFHl3
0fF4taFgyVYzpcTTsw1BElXt2HQtr4fIwhleZIVhfoYHZVjWhjuT+emzjonM08pB0QxKIVn48BQY
JZIY+SiPnFTkd8bCVdGYMbNxhmrsZxqXZKIXnK4wfWJpHSZmjCrURpEmUMaRUqGuHeS5u62MYRcL
e2oWRZicpabMWQ3WkHwkFBh8ZpIGI4XrVFgzsSgRJBJzwofEYUp0WUgxc+M9S9G8Dom7VPOdonnQ
Na9szWtlcK7mcbNCzIaL1Ya1rdm6mg+9IjnHVVshleNq6XhQilJrHrJgtOFL1vKOtXxGK1RRnHUt
p5QJteZZU1EpRWMbYi6ctRv6LARlOKsajLVsm5pOFJvO4YpmbaBVQpczF8sFOgkNipWx1KKpjGMK
Qr1cIUox6syqanHO0TY1xWh0M/8tAtSNYaEN3g/83f2e1wrWSvHUWrZOM4WRx3WNxJGsCkEiz8OJ
m+x5edizk8juNPL+1PNTRvGHQ88Gy2VRfN42/NntiqebM549eUTTLlisrtBiCAaUnTPhYwm8uv2E
7716zni7w44j71yuWC7XLLpLrDFz6JLS5AzGVkjKKMW8S1fzdOf44ff55stX7KaJVQy0wBQPNM2G
HAVjGxBFKVB8Yndzi+ZI8begFFk7VyT/XG2X/8Yv/Py/+8Ev/crf+O6nZfbTkfs/vaSufhndfEWZ
GvWGQDQfLQWRN5Yz5qhXREGKoBRFG7TMpDEkY5wlTCNk4f7Y862bBz4ZB8a8Z+UCbVKchj2P2muc
WBpbo8tA3r+YRXXuREyvifGeyj+AD5TpSGO/TIkWk5eMo8IuIm0e2SShqTXRFYrumPIVK7nk1fdf
oZTCrs6QwULQRF0Qe0k0C5p1Zr97SbuwZNMThwPWOOpGExcTuYxIc06pLxhCxJ9uoO0ouqc/3rNc
PaJTli7VNHbg7oMjevkdFqslm813+eLZOVuzZmRWtVqBWOSNOEnRSUFjkKoQE2hdSEWICrLSVKph
vbJgV7RqTTaOikIvPaecCAYmrUlWEbSFqiLHzCjC+z5xrWAkkhxUlWWVHdYYfBa0cuSsyEFRLOhU
0NGQS8IpGHPBy5udboTOaAxCqgy2a9DjRBTF7jhx7jqm4YTTNV1luSmR174n3Hrevdyi0Yx5RBlL
iop2taYEBweNazStjBitoESeNA2xjLz/cOIbmyNvNbdsN9dkL1w2NdMpkqPFOUXvhS9sLrkbB/5M
veTge161EeMnDmPkndpyioLVhk9iwaj5Gd9mYbGAfcnEZFgbxff7nrUTXvYDP9J2fONuz0I0Vddw
mjTXTYObTizaFqcygwi1rZgEdGtIaWKz6lA4hpyxTcsncaRZLZhSIjpDbWDykdZWDGOksRV9Ctwq
eFQb0qFnbRW3UbOyDh0CH/qRK6VQOaHIs/XLWlo966WcaQlZcM4RtKLR8NVtC9bxpG3JAtJt2D+c
+JFlx4OM/FAin+scD0mwFTwVzyvv+TOt44RQNZpeGZbO4bXjYco86lpup8J5s0WXTNDzYfMUB1bd
Ei9CVIoYIyHCW5uOXdjPq4UU8dqgFdyOkaZdIf2I1qB1IBjYdIZjf+B8vcGJ4uF0oGk0rixwtaOk
GaxsNVxvrmg2j1EfPueZy2yK58MRHpXAc5/5sSeaj8Y0q+mt4eO+x5P51uHIT68NOz/ytkucN2v+
BXVJi2XoM4/O16y1xdRrzi+2nIaAs0tSGBgEKue5GR84TAMfffKKH+weMD7xk5uOy80GVa3fpCha
srHk6Oc+zsyfSkPGKgNGYyahio6nBYIunGmF1YUcjlh7hRRLlkJhwlpLrITjNFJ98AlHfcvy8Z6z
t9+lu7hGGX5Eq8WvP7z84JdT7v/y1bOv5k/L7Z/yDv03f+1Xf9x0y//BLTtM1VH0TOxSWs0duZE5
0rWkmV+uNPJGwU4qsyddCloJlEwOgaEf+cFHL3h+e2IYA3WZaHXP0tU0LrGoDdoKtjGgA6JGlBvR
XYeqLDiLc+dImBj7R5AfMRzXjMMCby1utSCIQdQSrTqCTwxSiEYzKYUowZ0tSU1H6hacVOFoDHnV
MoQjonYcT89ZGE3Y7zFTIk2BHPaUYUJlw/LqMUXXrBdLxAU6NzKVI1kl4hGkachdR2w0n9x8i8nf
s338GZbacLVpkG5NREhYiir4pKjsjOkUDUVDyIJSM0CmVZoxFlozx6BWVtO1Gu0Mi8USsYqkDVtt
uVxtuL58hDYOZ1uUaELMPPeeYUw8chWpJJwzaKtIJbJeNmhtWK7WPAwjU9E4O4+zswj7MKNNE+Cl
oLUGcbS2JoZCV9WgwOdMEiEozaKbE+t01eBMhWThtfe8d+xZL2tCyQStqZQhpjludMpwtVwgJJ7Z
iq01LETxdtdx7xMxC3cibGrLZVMTgmHddtwfJzwKZww7b1HWonTF2VlHCJpFs2TZdSQ0F67ih1lY
WMdNBG002hb2UtCSOcTI1szPXeVEWzI3ObAUz//WH0ESNxL4+vHAE5NQIbHpDA/DiCotxmp2U6Bt
O0oSXOsgFnw2VFXFMEw0VUsXZkRqgyenSGctU4DtquE708CNAacVtkSMUjz3mYVr+PgwUlJBBSFO
ASvze9aKUNA4MVSVZakdX950PK4q3touudqu8dqxutzileWmaXh/yjxxjmVjeYWhayrQFa1tsQrO
tONi2TIpGBY1Y2VJ1lHqmpPW6KZhYStW7QLQTKbmcbdEK0cxc6hONpaYBOMcSimiKJqqIlAQNRPR
OtdQazcnxzvDpBLRWrTWBBTGGgoRqzIpDtR1hzEOKTNOWWmNoPjB6zv+8NU9pXimAovi+CQFlFF8
lD2/OfZ4HfmDviemzHvHHT9J4WnOfM7AT2wb3l5uuFhvWDUrludnNKsNRVvWF5cUEZSt5vAlo5jy
xM3xjueh53/84CN+72EPu4HryvK1t8+5un6MabYUqcHO7wBF4dwsyFMGdBFUBRbNcRJe7O/4+x99
SCZxrRUqTay7jpJvqEw1rzMVOKtJPmCVRRvDMA2I9wzHO5oaYjjhug2p8LNaN1/7z/7qf/S3/9ov
/cqn1LY/zR16U7d/0TYLTLN5AxOxiCpoLKDRJTLP2PPMzi6eGXngZkRqDggZrSpS9pz6HbvjgdO0
47qDtc3kNLG2HdYqlNuSk6VYmffnxTKqiFBQeYlmgcmWUizxWOO2j9GjxnQNTSuoThAmnBGSZIIo
dHNFJR0lRKwXTDZo7xjLyMTEmCOnkNi0CeGI+IhSikzNJJpmsaHaa5gKY5zISXN6mQhpj7qMlE5T
DkKd3kLw6MrhypqsB26Pe8Y2E4YT3/7mB2zaDWfn7/G4ttSLxwS9JYvGWIfWhVdDYNvUxJSJSqPJ
JCyDybweCledxopmJLFRmqwsXVXRpaf8pFryqr2hchV1d8UUA13VMI09RuBUZIZtKM1DLDyrK27C
SAKyUWjrMLaQikeUQiWDZGHImVwKMc+UNVsZrJ7JVsgcmBOtIjlN1bUMwRCA41hwulBXBWpYdA3P
VmtOOTHFRNKadVMxofA6QwU5Q9VYzscGaytEMtG0uErz7lqhTMs/mgbeGyfOhxOfWdUUGXEG7kMm
5TlIRGWFrh3KwGq9wNWaZQ60tSVI5I93liCQjOfKCA9TwqlArQvRJg7Zc6LiiRZKmfkEU4A49owy
MeaGVS78k93IT3VL4o2nVQ2VUwQ0Shum4YGmrsmhEKKgVUsZIytR2HHWJSQpiBRWumEKmdo6Bh94
Zhwb0VRjwBR47iceG8s4BtrkKEr4xjRyWYS6JM4ElFIMIuTK8kdZcJViVWk2TUvT1URTs6hbeq9Q
UvFHh54zU/OyVtSxcLmqqRDEVhifManmM5cXPExHzhYNzsBH1pK1wSr40bMzXsWRxrW0yvBKad5t
Ww59oKwqhinyVtNCUUxozjvDrheWtcUoYahqNlIYkvB44bgZPGZVk9NEzI5LU3McIutmRRw8x6RI
+sCr+x2rZo0rGb1sqYwmAUF5Hgx0nWa/C7y7MjxVkYdUeNZY/sHhxGOrMSe41vC4JLoc+dqqY6Ut
zfWWd843KCp0veFu7NlsHnM8HgmNwZkF+/FIV8NpeOC+0qT9Pd/YHXkliY9v97zjE08mz5c+f84X
33oG1RWYjhg1xoEpENUMnIlRwBSUJLSqKVFIIiQNMWtIhhe5sI1QKYPTFbpWLNDUViiSSN5TLZb0
4zgfzk8nqnGPeI928OzHe9z6Ec3y6s/FYH93//IH/8rm8bvf+LTs/ins0L/+t/4nV22e/KptLxfo
BsSiVI3WzOExklHMXaSoBBQkjwgJiW9G0yXMY3utmPoTNzd3PH99w36caI3Q6EJrW8BgVIOiI0uF
EUvWFsk1EY1dPEXsEmjANOjUYHJHs1hjK42xAeoj2Z6ggpISyRSctjS10FQtq8USdQDJwvrxU5TO
6C6D69HNwFoim2TZVM+46LZY3aDqCiVCZa85DYL3a0IOZLp53yk9JhuOh4EkNW31FBktem0439SI
79lcv0XKjpsfvMfpsKZ94pCYuGobbLvAqvn+eyCJIilBmTnQQyuF0+ARnNE0Zo6JNUrP1jfz5mds
TaobTLuk6hZgG1rXEorgi+BzIA6evgRees+6EqwuGD1nR5MSzzarOfs6JogRIwWlhP7o0bpwmKaZ
gFcUWRRSFLloKms5eY+IwlrDVAxd5UjJoKRCRFNwWFeRVGFdGY4hYhuL04ohJZJoTl5YVCv2fSKI
BVXhxaJdRVaKp1cbPo6RFzHxfJw4K5kvbmp0gW1rySFCzHSVoY+RRW3JJdDUlpWtkeB4slrQJuEn
tlu2yfDENnx+0aKUxjrIVrPUFR0Kqwy1KF7HRCWZuxxJ0bNBc5sCT3ThdvSckfh7+xOxFM4VnBJc
Wsd7O8+2apFTz8s+cr2quH3Y01QOJYHtouJFf6BSha6XRAdOAAAgAElEQVStOfQDVWXxQ6AUuLaa
46lnpQv708hFY7F9og0gNnG77/msnqOWi4Y/DJGjs6wbR+80y6WjMZZ2vWZlK7xUtIs17x8Gjli+
5QsXBj5vCy5nro0Qp8R50yFTYq0Nl92SvU/YRc2tshxsy4SwVgvaquZ7Y+Rpu6FSFd41WAWDCNFo
xAfWzlLl8CY1UM2BOFrQUWGMJafIWAzbtuJhCrTOoaVQlJBKopQZoduPI7Z23Ex7eu9ZSaCpNa5u
0G++V0Mf2T2c+Dsf/hA99VxrzRNdeGvRsK3nFcrPnK3xU+KzRnFpCo+18IXzJZt1xcWjR7RNh2su
UKYhmYZlc0ZMGtfWSIFeAvenG8ie925f862He/7g2PNRf0CHkS/lzBcXhp/44ud468nnUc0VIgqU
RTOL4Cwa9GxZE2ZhpzbVfA9l4vbuY779yWvGPFAmz1udpWXu7BU1CBQgFyGrOb9CpGC0RVBobRn3
J1SIpMM9vt+h1ACkM22bf+sXf/Hnv/3f/PX/9o8/Lb1/yjr0ann5L2G7K203pBxQuvqnyvZCQCvF
rOeOUIRCnGEGuZB1nnejJYIkVBJimshS2J2O1AoqUyhR4aNi6TbUTjP4gjFQ7Py7lM0UWWKLJaSI
KzV+CFjjCKpiijPnOi8qik+s0oIpRLpSsagUR5nQRhGUZlCGtB1ZXtV8cvt1um3F47NnhCET9oIf
FJiKIX6CyjMEpfE9/e2R5uwRi/QJ+eycTXuO9x5jniEkfH+gFIOpL4imQq0qUhrYnD8jGqAsOHNr
/NmKhsTv/+4n/MYPhX89RL72JUFd/ihV7YhTpmstu5BmX7ISpghnjSEE4ayqSAiNgUZDL4p1bfjw
IXDeOZaqphTLymWOSVi3Fbv7PQfROBxr13BU8IHfsdYKHRKt1qRi0FFoxFJGoXYdIY4cYmLl5m5s
4Sz4gFKgdSKpCmeEcRAWa8MYHLXWeFPw8qaAToG67jiOA6ZtcaqQrWW7WBFFUxk1c6u1JebCPmQ2
jaBiIGqFWEOxkdpaRl/o65qrbs0/i+K37zP/6DDx+d2Jd5cG32hSmRPykIw2hpCgL4kuF6IoKDVZ
Ehtp6SpF0ybUquEUI5ca2uiYfGLTZp6fNFoymxLYKs3Gal7HzHXT8jpEkg68H2BQmd8bIy+DcG0U
vxUT++L48rSgiGO3j+Si0a7iN1+9ZFSKd4aJbeVwU+KYRla65pPTng+953NGwGiOOXE3RBaSOY6F
xiT8cMSVeUVxOk28qwylZLQS9iIkB9lkrFN8ua447zr6YtAaDiVStR1D8Syd8BB7nqnINYoSA62a
SLGwsYWOAWMKSgx9jjRNheTCW8Zy5hQpWdad5pAjqW5ZVC3FgGSPEcPbi2722iuhsZFSCq3TxJxY
WEOIBa2gThERzarWnIaBq3rmDRSlMcoSVWS7NBz6PbhCoBDfUNU++fCHdHg6k4nNCrtccfCJ1/4W
0j2jH7hzlhvd8M6ZRqH58vUWL8JnrzpygT4EPrtZMinh4uItqmJIqaJ1Ld5PXHVbQujZLhxlGrnt
H+jLyNd/+AJJE39n3LFMgTOt6PuJax9pYuAz15d86eoxQRyuafCHCeUESfImw8ERUsRUGukDxVmK
j6BnLryJM9zno11A+0RsLD6OrJym392hmyVuUVOMx9WWwb9kterw5YxKK0oRgoK2rrm5u2WVIyYF
/OYW/a4sS2X+53zY/ZdTCf/FYnv9aRjNn5aCrpv231bVgoKgMCB65nYDSmZpnKhm3p1nQStLFkUm
I0UhWs23py3RB8KkKGOmmRRGBKMMMc1CO2c0yjmCH+eudP5CzDhBWyFJ47QjWiHHGUmq60Rl552S
GzRZLLoyLLMhusSYH6iajJMWUwpd6SmXNe24IC0fkf0dDD2V6yhrz33eY4aJ3q0YDg+0g0IOA0t1
TRt7jFxxXTdMC4X3mswrTn7LKi0ZpYZiUJNQnyW6bsvN/beZdg+cL7/IemN49PmvsrJCPETq05HX
z1/xoqq40g2Lq8+yKAANaz17gilgrGL8f7SGCKh5ZD4BrSkM8Y2tjZnk1raKMRe0NdwMJ17FuZPp
/UQxiXXy/OzKEXNmjJGlNdxNA1tt2U1Hls0ZRCEkodGOFDJGYDiNGCmYbBA0rQgxQK2FfvJoBO0s
Gmb/tikslh2qZEQECSOnJCycwyhYtRWNVfQpzf8rBR7Vs2hSDKz0nDmujSb5WcszTYlt07KqNO/1
J3IcOZwisU2kQTGEDK2jL5ZRhOsp0amCCoX96LlaBlIsOGfR2rFZLrifRpQyPOrWxEloK8VhGmjX
LYcS8CmzdoXeex6ReJkTG6dwAkcJPHGKKSYuCoQp8nHMPGsbvj0VNs4SeosVQ9Ga3/HC17qW7/WK
r6wXfH/fE5XizgS+GSJfbWveOx1oneYQhd8eRn7WOH7r2PNzdc3HMfFFWzH6hJHMdQ3/sB9Z68Lz
4lHOcq0N342an9usSJPi8XLB+3eeatXw2dby8m5HbCrSGPkSmSpOWAJXm4qXhxOuWxBypmBZ1TWv
+oHriy2n6UhrLC5lvMBITfITT7sNNzHwxHZcFCFkRbcw3NwXfNthY8IjbFWmD5bHS8t48gQDXiKH
LHxGwzgUlgtwyTKhMWpkPxWWrSL4hDMVOo/EnOeUwFTY3b3grE2IOsd2Hd+bRn4wHeb3WiceJo23
Ql06dLXifLll5xNbp2mU4TgElq0jT4HkVpicEemo3/T8uQwoK0wSeehv+YP7A7/2+o4XhwPvmkyf
I+9Y8FNmFfSMEhbFj/zIY0wFUl+QYyErjclzRr5SipwFozQikEVTphGRgmuXlCg03YLJVrh1xzEZ
/vfff8lPPev5wtbgpltK/TlGPzMzXMkofcZQGpzSTD6iSsEZ4TidUFlTdiPHV3/E1dtPccuG9eMf
V9MY/3OM+dHT7u4vLrcXw6dl+E/4yP33f+s3rlSz/u+VaU3Js7UCMorM3ATFNzCWeQcIM3hD6Tzv
0XNCSqTkjBJhjJ79cOST13eUUlB6Fstba9FaZlxhFHQNBQE9A0hKhlggWUPQwqAVRxVJKmHihGss
BkH5Aed6rJ0LW1F7CHv0eMAVwXmFKTfUp4kqFpqyZ6VPtKal+EB48PMIbIpU1JzrBqMMShm6s44Y
Ld5VmM0507TFHx6IIuTiuWBkLQO1EmyjyXLg1N/yyd0HFBVotyNBTdhU8eL5+7z/3vus1o9JpnAk
89h52tpiFxUxRSpdE0VmUZbSDCXjzEyF0uqNzW0G1RIKiFUzx9ooJgqHmDBS2B13dGh0GqhyxgEu
BzoL+6Ew9IYxjkxBeNrM5q62cQzRcyyCo1BiIpfEy2EkK0FpUHbOxx5yoF1YQizYynBICTFQO8FP
iUVtuT8ObLqayswhNM7Mfva2q+n9QDEKW2lSTnSV43iKuLbi9TjOB0IjHIOnXVZ8OA2cNxqjDXYS
3nKWU/Rc1zU6ZSptcbVFpHCxrCljpNKWf/JwR8qBtUSGaWDbGtKUUNVMWat1y2bRkINhvWwoWJZN
y3Lh6EyLq2uUVVwuG15rxeNFTdCKgiXNkF8+Z2qOIfPZyvJ5rbjziY1obkOAmLiJiTEmFiSG4NlJ
5DYl7kugl8S3xgGjMt8cJmwW/vHhRJsLixj5XpiYUsaozNOSeBEzffF0ZO6jR6uBWBKNCmxUpjIt
X1q1xJyoa4fLiaEUUohMgyfEEfo9dZyYphOUiA6RlISpCGOZVy374sHNosghwLZpEJ8xTUPK84j3
kWvoimABCXM3n1NBjBANiM6zgyJGusqRi+CTn2NOS2FVWVLWrNoKnyJBQOtMyZHaGkLys15HNDd+
xEqhHHvwEzcPO4gD55s1QWte7l/zN7/1HY6vdqza2XL2mdrMHvDNhqZdMpiWZbWgiGW5aJFUcJXB
SOEweZarjil6snhGvyOSOB1e8Z271+yOez54+ZJ3TeJfbDU/tmz40crwcU6gFF7gn9+u+Ol3v4Dr
ttj2EVLmBDgtIHrWv5SSMM5CgqAy6bjH+z1L5wipMOXI777/AZ6BxzU0VeR6nTievk3dtnjb4LUH
2+AFRKo5ZU80SmlyCCxcRQxHjBhCmkixp84d2Q+0V4/JqsWaxY/FrP78X/5P/sr/+ku/9F9/ylv/
E92hV82/Kbm4rISSJqyyc8HThiIJUQalFKUklBSKJIx+Y2OTOZu9FIU2lpgDRRKnwdPniabKSAZX
zy8qiTfWk4KiYI1CKUPWGp8DYjWFgiqFWgAiQQ7kusanA2oSjJmJSloiOWVC/hC7ekZ2l/g0kZrX
5JjR64TcW3zpUFWHygtE95gmsOl65PoS8okQLPakoGs47QaGbsuhdOQSCfuerDLWRMb9HarbcLbe
EszILu9w7Sx0O3dfoGk0apiozYq+z/T5kpvpnua7L9jwhHZb8+H3nnMzKbaf7xFd4drH2GZJpiWo
zJhh5QxjEIzTrHXGFoWIoAtYrXE6g1gOcZq7XimMo6dtFCF6rCi0zoixdF2LOt6zqhU3p4SWgpN5
zKmUkIPGUWGLJ0cFRbM0FaVSDCUiWbB6XokEHzEy79QrUZBn4c9C1/RROGFpxJKyYNBMWshU+OSJ
aJQyFMlYa+lDRhsIJYIqRAGbC2vn8IdIZSy7Xqhz5p2mo1eagOZuyixbQ/3G8710lpITqtJ8fOz5
4z5yaRJqVGys8DJFtl1NyZkpFrpuSe81OIXXim7RMJRCyLBc19ylEVst8SoSbE9SMJoVpvMcpsim
FO6mgHXCO43lIRmyNTwXGDA8aDiI553K8XGYc/CTF16UgnEWHwwG4Y+OIw2G3x4HROCqqglR+LI1
qFJ411lCFrKFJ8AueZyM9N5zjeKjKXIwmT9/ETgde3AdL4YBl2ew6yf7HZeV4WEa2JRInyK2JJw2
vJqETlnGFDmvKpQuxFy4WC940Z84X2zZp4l7rXiiBUdm01gOfodtOqwIXhfOrWJ3GrCtoQ4Bayts
DAxZszGO+/2Eayp0FqTM73zMCWrF0Y/c1xVnMWJ8YOMs2Ue0VYzTiUkmbA5o5XFrx+3Jo/aR8xev
8ENh2t1x/fqIKoonCZ5Umidasw/CYzL9cUBtz4j9HlMvuGhbHkKmuMQ3n79k1SjOa3iZCqMqTPf3
1Js1/esfMp0KdfT8a1vD082Chas4e3rJzf7In73peW+/55vpwGcvNtTVGrGr2bqbBas0ISdMpZAw
ryKVgCRFyonD7R3G9ajWkFSHc57HnWADvG0M5WLJUjt8ucSqDi8ZrTacUjVHNNeaksDVGa0yxmYy
GZ8zyjly0dRcMgQH95Hxk5eoZxdYdwbw00bc129f3/yrl9dXv/NpOf4T2qH/+3/pL/13ufA4pUCK
EaUyShXMTPKYO/aSUKKhpDk8RmlKycToIc12kqJmSMTQ9xwPJyQliggawRmLU4I2hlIEJUKWTJSM
MpALnEJE1BzAkktCJKLInIZbctVQrKFXCWqDcSAuEdL7+PwBRf0Q5zyqnMj9PY3ZYsTQtEsqpdBW
gxyYxtdk3VMtG9Q4oesaE2pqc4XJl5zuLap6BLQoaQkhkXNFOI1QPKKE3FmGvseXxGJzCf2R1UJx
UUM19ORhh104sm0pGZb7zNNuyTJYfFbsy8DLwwPf9z2HfMBJ4vGixUhNoyxDiFRaUSEgllrNHvXa
wMkH/Jud4N0wsZBCOJ7olKJMASmBkhIxRDptidHP5LOp59AfubTQ1Irri3MShlQMtiRinr3n+yHR
VjMIRGlwupByorYG/WZ6I6mgraYzmVQyttbklGmswyoNArVSBC8YZ4njTKJqrSWHglWwD4G6Vpym
AmUOCjmGQqsdh5C5sBbjZ4BLpxSdKC67hkRNdjVaV/TiWLiKnDNrW/PB/sTtcSAMIy9OI2dKcRMD
CyPcnCZe5MyZs/gUqGrHQ4ywWPA6BurK0i4aDlHYrDqGBF9ulyjdcqFrvrLconLNF1ZrzpTjcdey
7BbsjdBuF5yM5meWNVkpvtpUvF3VBApfrVteJOGz2tDlGef6CMt9gbdNRSmGs8ryTDsagS8aw6II
X2kc3xkjWzI5hv+bvTf5kS1Nz/t+33jOiRMRGTnczDvV2FXFZlPdbFIDBcu2IAjecOGFdzZg0fLC
S4OyLQj6EzyAtLzSwgt7o51hwLAAAbIFW7ZoQRLd7G42u6qru6tv3bpT3puZMZ3pm14vzqX8L6iF
WuQmcxFAxhfxnu99nuf3oGIPYWIXe/o88dWznqYyfLsYdFFoaxlCmNvSZOJ740Aoe/75/gadB6rS
Y9KA1ZkwJTbOUYlCi+b1FMHM5rafxcRCg9UZYw0pB5qqRluhTxldzYAcrTWGWR6yVuMk4r2nTAHE
UylNnAreeSQVrDPcxZ7W11RuvhyIml05WmmUyEzWMxDGPSqO1CnAFCkhsd13qJJxWigm8eT6wKfP
b/E6MpG48Bbl4U4r1pWjaRzez4Y06xZ4HFmE1+PID+5uyRJoSo8zmS+Ot9yOI8/uXlAhPFhUXFWe
s/MNVxennF1e0azOQDlGBf/i5pYzp/i3Hl9ycv6Aqj0nJoMylhAzSoMVRcoZaxRZhKIy+8MNNzev
sKrHMaHbM3Yvn/PVs9c0sedUCe+0joUtKBITS4asMbplN2pKEchzBXUqHWM+YqsFndzh/YpjhigW
TMUkhbqyTLcvaM5PMN6jlUVrv4o5/bW/9bf+9pf/9X/zX37/65H8r9kN/ft/8H98N+f83ZwVcRzf
uk491lpEIka91T0loVFICYjS5DQhJaEEyrw1J8ZEiRNh6Bn7PVZFlM54KyBCEHA4ohQ0GqXsHDmL
glHQVDWpCFklXM5ghKxGThY1RVtMMXil0TmgtIJyQIdn5LAlHODs6iEhJdwh46uEUhWSBwqJ4Pf0
8pKpfUXVtniVkUXi+OZA2LegBsb9gjQMeA2xdqjUkscbitmR1Q4vE/cefYQ1E7dywNWWQT2hvxsY
cAzNAij08cgZR1rl+fjiMQ8vWk6lYvuDr0g/8Tz9+AHjr/U82W55cHfLX7nsuCKyXL6DX5zzYhxY
uRVTFhSZpDQpF7RojscAtcZ2gboPNH6CKaJMYZg6goq8CZGC5uPW8aYfaL0mqZmFvqDQLiuqsyWH
QweNIw2ZlDJjzByCcOoVxQmpFI4pkTJzvl07lnoGh5SSUCiSU+Q8V8NW3uCzkLXClIh5GylLZDQe
kuCVY0wRKZ6cCy5lEkLRsxzTlTjrj7lgBByCKnOcTDCgPKC5jWCMw6Cx2mGscFkrdBV5OU7EMsAQ
iQZekfgyGpLT3Cjh3DnWJVBMRQodtyVzWtWA5v5yiUHQTnHaelw/QL3CG81HumbZaH6hPOceJhE+
1Bu0VzzqE+/Vhkd9pkHw2rKxE1prvqkj96zleUzcV4q1qbgqicpafqOBL4FcDJfGcxcTJ9bwYoJH
usz983HExB6XE/spUVLh3SicHCai9BRn2O7mrvtbM/IHklAS+cG+I3YdL4pQmbkXfjcVNrYmThGU
QZIwoGgxHIeRq6biEAc6bXikFc+L5qO14+kwYK2lDpGkDJHEPgYu1it242F+D0LAofFOcegD3lti
OIK1KA1jilRtpjuMYBRrhINW3EqPPvS8f7rmzVdfcjsOXHrLdtexsoofHwYGsfzk2FPZO67qMr9W
gn0U7rUND5eeUBRVUfzktqNatVwNgb5ueFSvyLFQV0vU0PFBu+LzrufHw8RvXxh2+5HzxvHYN1ye
nfLo5IwxJVarU3KeWK8fEmNmWyl2dSI7y7dOFixPlujVCSLClIVFpSkDVE4jYtBao0whT0KQiRd3
19wOB05EOFaBE4nc9j3aWDbOUJsym02TZrl8TH+Yc+fPpxnoFCSRpMPj6aYX1G6JzpFCTTSOlBRK
G4qetzTXxwM+vMH86J/AN3oWj36NGWNlqoz6H589ff5nnS9/4/Lqcfl6NP9rMtCjUr9DKeSYoUwY
4+fbmDEgQhFBlMEIZCOInYe7Qihp1ly1KoiAihNTP7LbHlAym70q67FqpqNJLlgEby2pTOQgKAuZ
AhhEaaJEtC5kiWjuEK6x7T1UfkUSj2FAywKyQLkhqz2mm2lXYYwQCnpsiNMOphNkbBnUwLBWpLLB
toLataT1ASfniL7lNr5EqwuKg3G9ZVrptw1Jb1hzjTYZbexb9OQ1pcwI1tBP+HSCaSvymOmNJ+fE
+vJXCMpgXc2DeycgNdPNxHEMhOOncNajblumV5bPywa+0XN2CPzqNxRSJlbisFHRp4ixNTHP78Uh
G3IZqZIll4klgXGcC26maWAqI1ESSECrwleTIZrClAq/GHsudaJuHI/WJyx0hfKw70f6rDDa8TpM
WFcYy9y/rZTQoBiKcAyRpYXrEGksWCylKHzRhDDgpJrllrdNUgFFdoUgPVVtOaQBimKpHSnPhRXH
IbGwCp2FQwhorZgKVFoRU8ErIWd4MUYeNRX7VLC14bOQOXeWQSVejvDe0rMNIyvvETS9g3MM14eR
2kOHYq0UoTiebWWu9QwO5XvedDu+6Rpqm9lNgYvlgjEUTtqG3TiAcyhf8bNh4vx0Q556vvH4gjEH
6pI4bVd8fnPHJ/fPSUPgdKGpUbw+HHm0XHPX9/zZs1O+v+34wLfca2ru+sBmUfEyJb65qdjsOvop
c997/iRBtoY/HkbaJGxE2E2JMxFe9JG6wE+/GOjeCG+WBf9Yc9EI3iTqZPmjKaNs5hOt+Cx2tBI5
dIHO1kyN4vkI9cqjckJb6EgYpXlS4JGGE9/wB30gFksoiQmDTmnOmTeOSiKpghznTvtxTJgpYRtL
lYRtjmiVeBMMjVsgacJpRQmJSYSUElMM1NpBHPAiXOSerAOhf832cIdWhpfbAyEXXuvM98rIo6rn
h+OB86MmvY5MWfPeuuCy5i+eLQgUKmUhaq5z5KubPdWpoqktJvZo5TEYzv2Cxw82/KNPP2PUNf/i
buAbi4aP1wtOnGNzcUljF6ztGmPeQpDMglISp+uG1X7PB8uGX784Zb18iNELUnJYV5FSBgvlT3sv
DJQIooXj7khKCRUCkwqc12tKGPEqgopsY8fCGqYc8AuLFcV6UTNlIQfYpwkZhdux48y2aPOQEgwd
jpXTKGpMihijSSqhlDCVGQq1e/UGoz7jQimahx9RNfdJqWCM/09TjB8/f/qTf//hO598rav/sq/c
v/cH/7vLov+HlEtLEigFYzTKWox5C5NRHlIG44A8k+BEKDkwJyTnnHoukRATIUyEaaQUwSkwtppX
RQI4R84Zb+Y1r0KTUWAMY1YkrYhSGHPC6kwqAa0aIgElDZIDSMS7U3Qe6I6fkXMHq1MO6YhtDnRh
z05vcWGN12eUHupqhQsrrK8JpaXoE0adIazpkxBTA2f3qTgjJ0fjFjCONIuOZmnp/cDeBtSi5jgq
jrsV3RFUfo9pWGLNzD03uSDGYaxHKUe9qNg0mZPW0JZEf3jDIX+FWWjubn7Cdr9F5R33Vo/oQ8dq
HPHdntH1pOGW3dRzlw5s+1uWJtEdt1hb6KceCQFdBqbQUevC9TBSAZMZeTYNWFUoU+bKKP7x7YGY
Ri5InLea9x9eYfWK4Bruup6dQCiBZ10gI4wxURsFKKYEjXK8iYa1V0xF0SePVxGdhcYJXSgsaodk
wZkZmLKdAm1rCEVYNAt+MYwgBW81XSo4Y9iPI2vnUGLYpdmDESRRe0MvCWsMvUocRbFxlj4LIIQS
UBQShaISlSogcN7UfL4due0nQsy8Yw0fGYPkzEcYNjJLR5nMFxK4LpGfTz0/HyYWKfFkiNhSCCEg
RvG0GygY/qibONWaWgqVU5wsLTkHmtrjncOJxZuaacqYumJXhKDauR/daFZNzU0SHq5aFtVsxBu9
p1OKB4slN0PktPaknOliQqdA1/esysTrcaCUkW0/8XJI5JB58emB/GakdLDUCd8KUQf6EHmSRlY6
0UpEUuTYDWynSIfwOgohGXqBUSsW3nIg0xN4TeI2CnfTxD0F96TQ5cgnbU2dCw0Zo4SbkonW8DQF
6sXMGT8UwWlHkNkM2ZdMWyluy4CjEK1lLJHWWjxqbvdLhVLAkth1B5YGbnZ3vDqODOHAm2nPmzRw
SBOfVPDYwjhO3MuZmDPbknkxFQY0H7Qtp80JravYZTg1lhFDxlPZgjKOunZ0JaOWDX0WlkvDH6ce
7TQPlo6HzvHuo49Z2g2ZNYt2TUkGZ2sUhqg1hJHb45ZHFs6bhsvTD/BqSUbPgzQWtNKUUtAOahTH
MILKvL7+Bbd3t8TdHct1w9XJkmGMhBS5efkKNU3UTlErOG1aprHQNp62MsQIjcksnUJbz8JYnHUI
iru0pVIN12OPqwzaKZTJFFtIsmW9WDLm15TxNc2gkTxiVg05KKxfQ5SPM+7f+8//s9/9h7/3+79/
8/WI/iUe6P/RX/+df7dM8h+roskp4qsaW9c4v5w1cgARlCozbrFk5m50KCUjopA00+NyyKRxYHc8
kmOc/64VjXezBq8MogRRmlDeUpLQc+mHRKJoikSSFCoKqszEJE+FiprKrVFlApVwdUVQL9iX17xx
E3uJeHNGkoZ18xi7P8V299GrcxBHdpphOWLOPNIcId1hSyaaA7uXmddPX7B8/AF3h1cMNnG+PJIb
sJWgVSSrxDANnK4foorgVxsWm/ss1ycofcd6c8m0tOzlQKkd1emGqm5YB3igV5Rj4njXcdAHnh1f
cPrwlH33EiUT65TQw5JuzPgS6bsemUbGbc/tdsdn19eE4x43bFmFxBR6xnFPjvM6XhlNJHOQxMYr
Uso8tLNhbFFgGvqZqR9H9tPIJ8uazWaNsi0ZQzcENIoyHLAxYFLGSMAVxRgL5ArEEoulIDMQh0Ct
EoXCNmUyeubPF1jWFd006+kaTSkQYsFnoZaKnApW5nKXrDJeK4aQaAzkklkpTaUNtRG01UiZYRpZ
gzWKrcwboZrClBJtgVo0l4uaMka6PKByYEgJH3OJxxwAACAASURBVCNpSqz0rKXvdObECaNMGEZO
c+IqBpYlE+PIWg/cTj2jjnw2Hfg8Tpzpwj5laimcEDmrPRIDOSm08gwh4ZQhRWjqmm0OJBHWzvJ8
ClR1hXeWXDmUsmhtcfWCaYq8V7fsh8BPD4l7SnHdB67HzCEk3pHEskysTE+DIrpMVWvWTvArj8+W
ZBUxHtlXhq4q/CxM7EphETPnsXCVhNJn9ncBdRTKlLEmcennLvkhR2zJ5JT43qHnN6zh6dDzGOE4
BSqBJYWhF6rVgq7fUzlDS6QKwoe1Z9x1bJoGCQGjFSZFbsae8+WCv399zUnlsKXgER6aTO52nJ0s
icNx5siHjuNhy8J5tnc3qDjy03Dgi+OOEwkslfDdizWmFN7zjpKF/VQ4FMOnpfBnzpacmZasLavF
gn6C1jmmDG3laICgFYvacQyJy5MzVqZhaRoe+YpDnvjNs1MeLzesV1cY1VCMx3mLwmGcpqi5o+LQ
HzjGgVPjudeesVxfodXsm9Ayy0JKKwzzw2lOiSDCvu/5+dNnHPY7fEycn2lWjWEg08eOn758TUwd
y5K5qOu5lc5a3lK8qK1BKwtZo2VGcY9RSEoTiyUr9/Y8zvE4bz1aG6xdYMSQywKtG4btc4rKGJ3R
VYPCUrSgVHuec/4P/ubf+N0//L2/8/tffD2mf0lX7imV3xEEqzVVu8Zai7UWUEguaBS6KEQ7JBfQ
GlUUGNBlbhEqGIpEgmS6KTCmTHxb0mCNmuNeCEWDE4XRoMsMfylkisw0pUxGG42oEc+E0GMLWL3A
GDBSI9TY1JNChxRDiiek/C7KbVi395E+YvqJNhV0crA3mM2CID0l1ShV0+1G+oNnzBO3ccehP7BY
XFHePMd+9Zqrq1OG457bJJw8eEBVX+HuLBdYTvYb6qlBrxrWZ5eU48CtX2NXhkVY0aaMNZqrkzNa
tcDdJMLg2e23FH/C0TdIadHrc963J9z+/Dn1mcbxjOP+Bf/8ScPm4/e56PcsmoovUDzLwpk1/KHy
/NXzU2oqxFdsFgO2brELz+uu58qCIXHVKk59y4PRkmLhi9eRlynx7BhxpefXx4ZvdCOrpaY/dNRa
k0Iil3nfklLgxMKQE5bCwgl9jDRKGFPinjMMGSo742BNgUXluI0J6wyvhgmXNU4JOQmrtuL1NLG2
DpGMeXtL3w4TK2+4DQGpNUNUfJkz77v5IfHcz4kIrRTWWl5MgZWHz6fEUgvvGMMxJk6MZYiJXBRD
ibyjDbdO8WVKeD1Xqfq6YA2zJV8V7kKArLhWBa8Skzg6pTkGww+GA7+1brkWTaxrnkrip4Nwv/Vc
j3DZCoch0ovnUlteHI+s2obdBK5U/GTo6JPj2xvPj8aJv9B4chYeNktkKDAVlsuKLo80Mv+f/1yr
+cE08sdh4rGGVzrTKKFLwpmuWVUKmSwTgagN754lvriLVCEwdDc8bk+5bx3f7xPtMWE0DLXFSMaP
ifcqw/d+tKe2Fe9/d80kmZIDIUxsFbx+uxZOGiqBX4RArRzbFHiRJ75hR8b9BMAqOCYBoxvujnuc
sRymgfy2h17LyEpbJBz5Lau4yBFSJutCFwSrYBp7Dv2eWhs+v3mJL5nV1PPQaPaq8H7J6FQoonnU
GO61msk1pMkgCu7uOn64H4hYyEJQict6Pl+ntaFHkRSMIfAzKXxznTge91ydXOFTohjLedVQF+Fd
r2nLiLGnIJ4JhfcWyaDtzOGo3JxUOCZHY1sMhuXJQ7StSErNF5wI1mliyCirZt+H0jitOPYdYjLa
ZEw9F970OVAtTzi+esMgGmMqihL2IVIpjTMzctu/jbNGE6kXwhQgSCZIYSxlNhiHibpkJCV01rOn
yc0MfSkKY2bDYcHibgJpfML5u5BObqjuvY9raoz4M0T/gyc/efJfvPfJe3/n61H9SzbQ/+gP/+l5
13W/rU2FFof3S1AZrZs5Z67nG3gxoGkopYdSgYqztq40SgdsbRm6iRIT/ZiJYR7ylZs7jFMM8w2G
gtEapYSQAG0IZDJQlEMT8CiKaJxyJK0pBCIDKCHpEcl3oBVaFZx/gKsW+LxGTMUxRbS2RK0wfsAt
I6ZEUqrJIqRjIocJUzaEPDGUiX3WTIsl7eU9rF1i7z0nsuBufEOqR7ah4ModwQ6UKuHWhrvXA01e
YWJBYXh4umFVe7r9Nf0ykyVjS4etK45VoEcYVi/BTSjXs5QOqgV+bDlXpyztAnfSUsUXmPRjrlzD
fop8ejvxdHfk3umaUDd8OSTWb2ouVvdoq5rNZoNfbvDS0vU9/+w48eGJ57vrFVfLBaa9QBlLXd3Q
3Dr+p+kJXwzwYijsjwPr0x6lEsVkPCPWGoIv7IcECvoS8AaMmfAZqmLIIrRqprPFAEYrrGhcgTVC
KZEYoNEWI4Y+ZWwpWBReK8aQaIxGkaiYHxArDUYblGTOi2Kpoak0IoqsBIdGEVi6mRr22Dk6ydwR
eULhkAOtNqixUKFJleLohFtVWHnNBQptZiSu6ecH0qk4PJZ7HqYyGw5XWnEXA+dFcT10eOMZyPxs
6lFF8UfZsPaGi9eBbTEM2fD8sCNbx2eHnsfe84QdX/YTj2zF//blHfdNxWk30J6s0CmRUqJZ1oTY
0S6gLz2iAlKEPAZ+DUXMBZUL1zliteKdynEdhIu34Ka9mrhLwKJidxjQ9ZrTpuIvXG54b8p8/jrw
ouv5/AcdepxYrhxdDqRuZP3NlsM00LrMLlqUFIapUBvLd5qKfT9yT88lKU4LXYxcp5EP2sg/en3k
W8slzmim5GgqzdNB+JVTT9/1BG2wBXZj4PK0Yn88cuost91E6x1ea2IWNk1Ld7OnKYXcB9Z3E6c2
gmROr1aEPnBCZq0LOkcu7YLxMMDJAu0aXDbsouZuKlxqhZfC+cqwWhiOU8E3lm7MvNNYvj/u6W3D
Mh4wcWK1WqEnaJbnlCmijON+dc5w3OFdyzQFVOXmKK4BpyFOoLwwTIEuC40RKt2inZ2jpFaIUyaJ
ogL4l6VVc+VwlMAQC0lgDImF14QB0Jq62aD7Z5zKik4S3ilETQwxYCtDyBldBGegKgrvDCIZrWu8
g1RmEFSOgdoYfA4YoyghMKRClaBYRe1XhFITVaYrjtvdnvT8xyzfrDmvZt1dmTOUeKt1+9+++fld
d/Hh6X//9bj+JRroYwj/oVLKW+0w2kMRtK0Q5ZEc5kOpNEoyhRnEAoLKiqIMulhEtSiJpJTphkAI
CclljpSJ4O0suysMHoMxhpADTglFz3G1IqDKTETbjxFrLSOCFEd+63i2xpGnjFItqEw0fmbN12f0
hx0bd8J6sUZjmPoO5V5DSFhxxPCKrK9INtEH2MmeOx3YTTt0JSwk4U1FWlT49y+YRk8+ZGzzhspq
ajIWYSyFtkqUKrExkWoacblmMVmUt5zeu0Rt9xzsHl+BcROrZYTVCeHNKc4Z2voCV11wslwxlYn6
w4pUDmxDx264IeuB5z/9Pu2Db+OefMViv6d+dMkgN+hhZPfgY14827HWZ7TvdXzjnSP7o+HFGPl/
bkaeni34M+9eok82nF88xvmWzcklD06XJCv8k+uXTCjuhp7V/g3iGlIOdNM0x8yyRSnHL0LEFIVo
uA2BVlUE9XbQx4jm7YamCNpkDqNQrKao2VBXq0wMhdYYUsg0YrA5YrKmbQ3HLrKsLSEmGm+JAZgU
H6gaFwuVs3MFp0Sc8WSB1sLtlHhkDJ+Hjq0qfGjhdQLvFWEIrBctGsVae35lueKrfUdlNVFnPMKp
F4qp+E6rQAyP25qXY2D3p5n4XDithC9y4pN61oK7DO86w+fHCddY/t8YiMZyzBqlFFdVxY9CYVnX
/DAW+lzYqZGnqfDuBnZJsTAVTRzh7YPrOM2d86+7EZ8LISTOg7BR8CdT4LeMYgt8oQz/V44ctede
Y3gzDiycZU9g9Jb6sqF0ipQSAJ+cr9nYie9fJzoCX11rDtvC8fmEaTTDYkDVDlt5SujZjdCnwoO2
5sNFRRJh5WDImUMu7GLhJgV+WDK3GkadeZkGrpo1d3mgHxqGxtOHWUrrS8Yoy7HvGVLGNZZO5pt9
lYUxC7sAh2HPiVYMx55WRlyJaJMZupFu2nGiE4+tImQYjgf2OtIs57NZnS1ZZ8dlUCgyW63wzQJl
K5xSmKJpSWwqxb3syAjHMXKxsEyhp7FLVBG0hpVdYCWi6xZlHVoZdNFIKTjjKEUwNlOi4RgSfdxz
4QKb5TlW6VlCfOvrMN6iUsEZjcaAKqicmcYex0gYRjwGW4QxRU78inE4UC8qii3sI6x0pijFyjr6
MaHVHEcsKJpFRR8yzlU4NYO3agGVBmJRODUgGYJMpCJoam5iYWUsRspcDKMUQ57rXO9edYw2oavP
SQ+Fk3e+Q8wea5cMKf3d6y+2Ly8/2PyvX4/sX5KBLiK/Q54hLkbPxDWtHAU9l2wUQb3V0DGAVkgZ
yVowMuM5xWrSmMhKs5tGjmVeK3mnaQCdBCVzhanS6l9S4YydD39tKuI4YmUmxhkVqCTjrGUoCi01
Rhw2Cd1k0OWCYhSSE0FpplRYuZacNI1usSWxsIZOZabxU9g4enNL0VvGMjJpRU5rzLpCHUem8YhT
Fjil6XpsMiyqNd4suL6BfhnZlhv6rkNNhVX3hPfuf4SMI3m4pVpfQGXQemBVay4+eMh2e8DmO6za
sreJuqkQ11BoWcVZQ5Zi8a1mlDsOZs+gXzLKHV0JTL94wubQUXpDm3o2asnPf/xTrMkoU6P6A0fe
40ma6HPPl19Fcm35NzaGB02EWzjYmntn96n9hqqtMeZd/mpzxjcunvDFVy94fYxUrzvOzh2+FIag
UBZ0NHjxtEnwRVPSPOhugG0RrmrHZ0PiHWewKGyB+u2qvraGfRSOqiCiWBHnW3goKGXYToFN0zCG
TJ+Fxmt2EzRVpo9C5T1KwRATgYxyQiiC0QGjErUA2rEwlp/nnm/6hsYqRpmoJGMy1FkRUuZD23Kx
VJhh4kTBdohUGiZluFpXPGgaBM+D0xPk2CE58KNxpKkUzgg+jnRek3Ph1CnWUrAysZbCqmh2JbBU
FhcV2zIyTYlX0tBowyLDSjk+bhq+1Rq0CA6IAsY7bvrAlA06wb4XTgVimul/TyXzWgsvgIBhtJY9
igtVcWcK31q0XPqKHqE30B8KO+t4M8DzYcKul9Srhkdl4v9+2GHqmraL2Fwx7A5UeB4uLLUv7EPE
WsNZgWYKdL1CW4NvBbzn2TTxOiZuOiGpRGs937u5YeEr/uI68TNX8e1a+KO7nklXjLnngbcsgDpo
Ft4Q+wMuF14fCz8fEx80iuP2BqdBxcw0TqycZjdGFj7x7FVPJyOXdY3SEw2GN+OIqhzlMCFaUMsl
VyS+3bQcQ+C9yjEOgnEKt/Ic+onVwnN7HLlqal6K8HzIPFppvrzZcbZ6xDjuSaJZ+po4CevFCnLB
NA6VDSEpfA0SBbOwjL0woTkhUbrA8nRBKQpxBhkLUzIsHaScMd5QopCdILGwe1MoEkhlpK4URUdG
Y2iahtvDgF42dERqV1Da0ofESWPp+8Symgf0WCK1X5HEYpSiLtBEAZUoGLytySmRrGWMkaFMOF/I
cY+rasgBVRJt1VJCwXnFcTRoNNfPbthtB8QL7cXHRLEorMnYv/fip2/+0oOPLn749dj+JTDF/Sd/
/a/93ZQiWmusc/MAtwuUNijtwBr0TA1HIWA8Kk0YFGX+zZxDjiP98cjtbkdOE5Uu6JIpKc0PBEbN
vcLaIErh3obWcylkCnG2us5tbnp20bvC/JPNrKuneb2tkqKMGi0elRVNAlERrwqVNRRdGNMNEMCc
UqqIyx9hzIeE/IB9WLIlk+sT9vsjOmRadcopV9huQ/8s0eqWQw+DjowUlIoUJuoh45TG5YE4ZVSI
GNHUTWGtFQt9xA2vqI6vaNQebwPenaFHjaWGUZMQRDtevNxhkyLvRupzWKxaaA9MQ2IIgaoIcdux
VJFKK6yZGfpTtyM9PSLHW1abFbthYL97hRp7VgqGm4EyCkbg/cePWZ5dzCYd7ajrhlV7ghPDV/ue
kCYaqwlljg5Jymgp6AzVWw+FVYLRjkEyaKETzUYrJiXEXDgxc4SxtmBVASlUWqFKxpT5YU6pubta
stBYT0KTRBGzIFohyqJQGCVkKUTJ9DHxJkV8EepqphQei0YbiBTuW8/VokKFwpnStEFTW0+Iiqw1
y7XjR9NIrDU3kvEOnhwTz0VYLhwXfsnlyRm2rqBpEecoruKTkxZjDX/5dMM95fgV57m/qChEfGPI
KnPuDPucWQAPKkfUgvWG5xQWVnPfG/78suE3z1dIgZNlS0iZbCxODCFEFl7z/LBH68IXseOn08BD
D9cp0uhMNooPK7DGsFGOv1LVnAThz1cVrSqcac+jtsFqYRLDy5honOfd1mOdpa08t2Pgoq3wTrN7
GXn/oyXf/lbDh1ctKkWsdaysJvUFSYU+Zbybb377ktmlzF0fWEgh3WWWcWAjwqUIVYHXUeOV8A/3
PQunuZBCXYQrhJ/tJzYnjp9t7yAnzkzh0A0s1UQaBlYUcp5ogMrB7W7P8+PIk+PIuTPU2mFNPbeS
aYurPcckaJqZiRBhpaAtwnJhcDqz92Aah1hYthWhCKPALcJ1BpMTqQibRiE50HiHVxoyc3JHObSx
UOY+dq1A0IiCIprnt7fc7l5x2lScrk5mo6/MlwtnDFJAaY0p8zkWDK/uvuL5sONVd02SiZUVTIm0
tWNRMtotyClyuN7jEyyKQpWIqAHvClWVET2xrCxaaXSZccppKrPOr+dmy2I0xluicmRtwFiUtoDF
G4NCM04yy5VGY6zgDehciN0eIxbGiG9arK/ArihKVbHEf+dv/u7f/nu/99/9V8PXo/tf8Rt6zAnJ
E1SWUgIGh+QRrdbzgSiZog386cEuBWyDEkFSRCtPzhPGOHKWmcZmZpJcUztymFBKoUSBsZgCGkVW
oHKkMZqUEt7MkXIUaFEovaAkoShH1IVwjBjliTGjUgGbyXkCSWg9sSgFVRKuGCwOoxtGMbimJrFk
8iv2kyEvLJMeqcsZJSfOZYHXFY/f+QDpI0cPY3dNroUvX/6IKQ1kpTm5X9O2V7hwg/GO43KJnTTl
uEWyotmeoUSRrKYbher0N/H1ArEaTI21FZvKwHace8gT9OMI7ob6XFGm54wDEBwmPED8lr1aMi5u
6YZCqza0C6HbDtSVxpiIHCPHT/8x7sFDFnJBf/gJz55fYJt30F3DOxeBm7sdm/czJak55W8Mi2rJ
gweP+V/u3kDXE487oPBh22ImaI0llcRC1JznRkAnXqeJxmiKCJWpuZkia+upGsPTQXjYaO6Gwumi
ASW8GjLLLAw5c9XU9FFRrENVFcMQsE6xC8LSNOg4EYqmqSz7caDxhkkUa2tYZ5AItrJoyYjR5GxQ
GUalaaxi7TTXuWfhHEMuiIZFDfebJSFmfnbssBH6EZxV2KzZ+CVnm1NEG6x17Pe3fKuqub+07LuB
88axcRkqzQ9DZKvX7EpmjCPfXBrqYeC+VThj2WSDCNwOhQ+alm9ay6JuMd6RY2FfLEOCRmCfJ1oR
dkPHPgbuifBimtDAp2Gm7n3HGXYx8r62/KbSNL7mUkB5h28UU1JUa9iNEbShajuGvcNXiusxcOE9
N0PPg4WjKHithF/9t+9ReWHfCtdi+F4ENwWePx2ppolFqajuVfzT57f8+idrjkZziIVNV3gVFI/r
jN5pKkmsrCWEkZU1/PEx8cg5Xu73XJgKMYaXYjjVlts3b0hSaJRg+sAnBuoIRgslTmy7Dl8ZXk6B
gYGnYeChUjTGorDcu9iw28032sopkIKV/1+TN3omzBmrmQRUFtJUWNcVqmjq2pMEGjS/YTI/DwHn
FNNxR2haWl8zqoHat+SSKPZtBNeAolAyGGvJEZKCHx53+DHx5x5dItmi7QzlKaLRGUQVtDHENKd7
+mHHq77nq+4G0wcWb2UkX3u8Nmxjx9nJPcbjgWpjmJIwhIixmn0q1GjGsWCMowuFSgtLbWdOvrWk
NIKFujYMObOqWg7bnmPMOG0IJWPF8qZPnNYOpQxjBC2RkgpL7zmqEVdBjj3p+mcs7i3JdKwebci5
Q0R9lNXiHzz59NVffu+bV1+XuvyrPNBTHOZ8eZqB3MoqKJkiAV1m7rZSGinzYBYJUOa1ubaGospb
JOzMKrZFk/NMKkpxjjA1lZthCsymEJ0Fpea+YKstlVUUMaRS0EVIWVGCUFtDN4U5u+4tsSSME4Kb
K1kPx1umcc/y4hLnQMc7jBrw1SWxDJigEOcp9l0qA0aPKGuofUPoO2pzSmMLThnYzx+AOkG9TCj/
gur0lLKFZmNZrQ2mS4wpEl3EHOGSDb69YNOesLBLmosatVJ0n/0Jqp0oJ6egKoYsDFKQSTEmRy4j
NgY0r0nTM1Kr0XmH0YrLza9yf7Ok7w2SF+RljxEPuWcf4cE7Kw5qIJ0vaduGePOaLkbK+CmLaWR7
uI82ax49qNkszjg5e0TGkSWTMJRSEAvFeP7S5oz/s9/x92+3/PaqZhgDNZacQGtIJjCkEecUSiU+
8BmRwpvsGXLGorFi+GoQxBgOUWO8YpdGtIZzryBmNDJH5qQCFF3o32rV85dgypHl2w9FdxxZ+pkD
f+k1RmsCE0E0Uy6IVjONLEPtNDJlGmtQBTa+YkRI1iKVMGnPyVIjoTC5if6ux3RQW8W7TtEsDK5K
JKWwunDVLqico5TEsnUo56lMoRjhsWQ+WBeSFCbJrOuCqycWFTyNkQ+Xaw7Hie9uNB9gqJWirRf0
IdE0Fce3vfEimS5MSBGGaXYlX4fCQ22BwjYEvuMM5zIX0awVnK9ram+wu5Gl1zitSV5QxlE5zdnl
gifXGr2ckye1ccSYCUWzso6bBfybj08pRvj8OHI9jvzPw0AIivoIJgT6r16SjGfY3SOI4599v8Mt
K2ggKzipHLVWjFXhnjc4VbiRQFU0Z+K4bwp/MgZ2xvFu5YlYLtZLrqfERsMxZRqlMUpxjJF3Th3P
ro/kLGzDyKuxo5sC2ShC5XiFpy01PnjywrBcL5HDyMpoYhSaUtBZ6KZE5TVdNzMgVlXFmDPaWXIq
NKuWF2PiVlke1ZrXt4F3W8P27si6rpBS6FLBV4Vj39EYQyWWZB3rRlOSQltFCDBKQQ+ZjsTJYk15
20JYyrx51JKIRWPsvI3MFPo40Gc4k0gvc/mMT/L2+6iQ3ewpymXuKBhzpuTMaQNeLEant4kjZl5H
EXCzDJBiIJmMK5qU5uKmKSbq2pIKlFKoMaSc/j/23uRH03RN7/o94zt8UwyZkVmVWcOpqjP2RNsM
li2hbhkBC2MvANkbWOAtCxawdiOxZOGFlyxgAQKJBTQSZpLsBZZpjBufHg7dZ6yqrCEzY/yGd3jG
m8Ub9L/QR6K+dSjiiwh97/0893VdvwutF2LdMUyMWYhec6ZbRrGP2N4VWQJDmHj7i9fsZvC71xi/
A7Mip+mf17b9z1/9+Ppvvvedp9/Ur/6yDnRLJVGXHnK1GGu0TXgBkWUwK5HHt/xYqWoW52lVoEte
1u66sF6fMU9H8u2EWE2qBesMqRZSLfjHdTtakLwgO4teNHgRTS0VVSwIiFLMSbEkVzNVJYxR6AR+
NkzzTDs7uvYp5AyqYswVNXeU0aHSy4UnPWdsL+AUKh5o7Ypt7tDSwiyMeU2DpVUeRaJdzwxzpiBs
n3u67bvMOjLmhHYwxYFt0pRVi3aOrV6T3rwhXilUu0Xmgv7gN4hRMYaAqEKVTCwNZ75ltQocwy2q
meFcsb+DRp7SyQek4wDxnK47R497XGtZv/uMdd8wE/BBkcpIPtxz9vRdJA6srp5wfPsKv37B7uIc
97OBYTZcPPW8+OglZ8+fLpSqxwePyFLjuGk6Prp6zn/z5jN+VoQ3sXJuMtoZgsrMZolLOWcQIiLQ
a8uQha0STgpMXepeRWCnFldx5yyRivPCIMuw+6TRJBKbxi7tcBUcdiFYWUMMmRmF1poUBachlkK/
cjzExZhZrWLOQmstxxA5t46cI1oqYh2HkLHeMFShdY7khH3JbLYr6jhzdbbm+uuZ0hh6pzgkYbUy
lFrp1i3HOVNdj3UtcR7Z9B0pR7a7ni/ur7EIl+sV14eBJ+ueUgc+2TYoKaw0bHzHM63p1yuIgagU
xRviWNi0DTEsRUanMHE3zqwazS/mwDkKr+AllhUz2ik+3thFH3WwMhplC9pEohlY6YYm1AWbazRt
1DRdB53iifWLdNa3xGoIolFNg+REtA5rhGhmlNL0VeNyYfgq4280rr5kOGqGh8zuuUMmYdxHzl5a
qAVUoescMQtfnibeaVoulUNL5iPfEFXhAy/0KnMvi/N6PlYapTCiWTmF1oagFejEKWm+TpF9Lnw9
TjTecLlp+TTCh5s1r+aOj/WGolp2fUdKGeUUSiV0nVl7YZ5OlBKIQbN1ls60HENg41dISDS+QbTC
dA0/6Bo288y/4hvqMKEaD3PgTbjm8sn73OzvkQJNmknasrINkhTW8+hih3g/81IyTy5WJAm4tifm
AgaUCFkyjW8XJocqkApznHDMfJ0KzdpxKhOYjEVznDPPN2eE+cS6ddgYeDhN9AgRhXENIo4pCSuj
Hp/XQimF6gRlFFYs2i6DvrGGmDJKDL0FKYUislQrS6Qkg0kVZxQqJZT1zJJorKMYDcXRbXbMxeAP
Mw9f/JT+6n36djnI6ubq305i/xj4j78Z4b+kA72WhbUtSlElU5NglKXkgOlWoD2UANosopVyaIlU
USjqYm7DUDD064bNuCIMMyEE0ArnHLUWqtZQFfrxNFvIqFoBRWsVuRaEQvAKJXpZYxVBZYWqS9yp
Jk2NQjUFMa9JzVvoFM4/w+odIg1FKmOokCOVaYGR4FBxxiO0ccIXTygFaiL6QkwGNTXsx7fQaL6K
gTEfyaxp+IDxoSUTcOZIxnCsn9N2MGvNEatoagAAIABJREFU0VrWzzeUXsgqopxBZ899Tbi2I7Bo
a8btSeoLnMkk+9VikDETera0bo0qjlwSKUcoe/oLQzgdwTSMKXA7Bo5F6FctFxdPAMvV5XsMx8jF
y45YC1k8vutAWc63jt1uh2k8JS9gCkOFR1CQqIrzPUl1fLffEGukZEvWMFUoYhiyolVLJC3JEp8q
paCNIpRIJw6lClkqsVpOVVhpjUdYacughBk4oFB14bJr0VhbF1hRqhRj0aLQui6ZX2Op2pAFIjAV
TWcKOmucLG1zANUoalmqeFu/wG6MUZCXAhlXZ1zjKcryg7bnWRf4R84yh8RwipxMx71UnmlPVJ4o
anHSF8HZDo3BKssUMroqWtdSqoJHF3TbbNC1EEtiYy2nSXjuGlRWUA29M5RZaGzDNBeswBgT1yHT
SeVuSFAjHs1GCz2wUZUn2vDcaratQdWClyWDPx0CJiTqHBjmCBZOx4A4z3QAG+Bqoym64eyq4U0U
Vr7jzX4iNS1HUWyzYl0bPh0j3xbPpDX3G4/YDdUX1mL59E1kAkwR2r7QWoPtFduNI8pCKftcJ0ia
X++Xrdy724b9VBFtKEpzW4SohS/DxHdaR6iV59rztLc8xMy5MeSQaHB4VXjReC5bT1Waf/2qoxk9
z1dbNBrrO9atY36IuAb2hz1SZp51S9FQiyBjodltsXMG28AkzFNgfXVJDZmP+5aYK6cg+L5jHIV+
taEGyN4Q5xP7cWbdtZRxRrUOz9IC6a0jJQFdllV50/DEKULM2B5yWmSsmiIVQaQQyzIA43gix8T9
4YhJlaud48u7A2feofMChmmKI4eZWjNTnkAltBHmUjl3K4YYcc6Ril7MpVIZhkC7dqgsFAVWKZRe
NmahVM4bz1gqjXIoJ0xocjaMj5wGpZY2xaNeaq67XUPI0FpLt+rAWnTbcNzfQ9NRpyNufY72Pbo0
f+ezP7n96Qffu/wvvxnjv4wu91yIueJKpCpLrUKtGWpE5YRyC1udmtHoRwqRQeGWxjUl1LoE0pTW
dO2KbX/kIU+ICCUnoNIqTVWLCa6KLMPdGGrJeG8wytIqC8xENMkVispoKlYKJYGuGVyisqcwMdQv
IGpq7QnNU5rcUoogVZNKWtZRXjB2kQGstSgTlmIYOzJMM/k4EdXIQz7jlA4cw8hh1JT4ElltKHaH
bTXblWMc7hAd2fgNqgyIElarp2ysBWPwek0ko1Y9Wk9kBG0Vu74nxJEkN7jSsioHxnEiDiD5irt8
i2iPv0x04RfYaDk/+wsM+8+Z34zI5Yec8tIRbroO73Z4bdm2ikbykqGuiViFexyD1riupevXS1+y
gRrrslHRC50NIGbhr+0uiBJhrDRK0CWwMYopJS6cJhXNKQmtMYRSl975ImwV7KwmyaLW3JbM2mh0
LWQqrlp8VvyKdZxyQinF2xDZGMel1qgstEoTckZbx5/GwrvAetdyGCLGLi1tayzmcWXrvechJtZt
Q8gVMQpvLEkqu7VljIXztiPmiilw0XjeTIGPt2skJcyFJX0xY7eacQ64OWOvLshFU8XSWk+YJna9
52EasH3L23FkZR1903I4zazbjlIivumZw4TFgO0IpyN952kqiLGYWsipsnaehzEgxvLDYWZlAk9t
5dWQ+J5TPMvQqsp7a0uYIs+l0oWKcw6TFka/bztuf/KW0ivmz48c/3ik/dBzLBPNBw4JhuFu4urF
JXk9Mo2aIC1t07B2hl55DrUSlcLoykfdmnNJiKvIJhKrsM+V85VjehtZe/jJMPNep2h0paqK9kuU
6z4qNMIpKd5OwlW7bH1CXYybdzVjlJAE9iRSWVgAn1hLkUyoM6ek6ETz0hv0ZDjfdrTOcZcLL1Yr
TkXRd0scUJfISmsaBb5EJE1MhxE5DLRD4rJrQAoSB5x43k4TKrTEtkVPnqQ7uq5DA9J1lLI8j7Sz
xJhx4rgfJkqGaEZKt/SMFxJGL1RLZRZ4Ut81rM83GB1Be2oxaA1aBFEKg6HWZRsWS2akkMjEGtl1
FlMTZ7phI/rxkGiZc0Y96vC9MZytHHEKtHaRx2ouiDYYU5ffgULjlr9LqYuXb44RqxVzqQiFLAWj
KlV7jBRWjad0jjwHgoKHMLOylpwya+t4OAxYrWnblpQc282O4hb3fhxO5GlkXaCkjHUrRZX/7Me/
/wc//85f+PV//M0o/2Ub6GSsBi2RlAq2toSY6JRD+4jCPxriFOqRFCdVA25ht+OhTmhroWaadUMb
GpqoiXOgpseuc1NRaJQCpZYVeJKENZpQMk4JyhhSsSiVFme00dRUqbWiiuCNwjRwPHyG787o+R6T
WEr9FqdoeadtKA8TpiwrMBME02gkzUzTVzwMX+I7WO1ecrz+khB6pHFYt+GsNkgS9qHC5pIcBdSG
WI+4rFmLwtSJ2u7xvaUeC6NJvD69ZiyK7fOXFKXR7ZrkK9SCV0LjLOuscLMFfYYqlb4+ockOb9e4
/l2094R5ouTXnLWVrfY06cg7H/+Ah7tI0BF73pIPhVQVMUyc7Qpj3dH2npILW7UmYZnnEzyJ3LoZ
bSdQFfGLFggVY5YBrJVgquWT3ZaH9ECUCd8U5nnGKo1W0KEQMfS6oWsqhylRBLypGG2pREQbgoJZ
4B1vuc5Cr5e1+pelIHZ56Fw5jyqRnCslBoYk9K4hiyKqwlgVs2eRT/TiiteS0RVyXLwYXgk9gmOR
WDa9JUyV6xB5phbTmfZL/MnahsMohKg4bxQf9I5/870zfreOnMaJ10PkJibetZkQLNYaSjzitSVK
IJTIXDRGBO08p1CIRtGrpSJY50yuhY13zCHRJugaSDFgrSXlgFdmKTapkVQia4m0Uehd5btO85FT
nCthYw2XKIIWdiFhUag0E49HSi7c3dxzsJHbn17z+p/9nMwK/7pn870rsvaonWbA8GmYObvsmI+Z
2Qu2cWzcGjGWlDIigDHsvONSVbJLeDLawJACRWk+Plc8NYpfe9KytoqbeWaWDEpxTNAYzVoKh1Ax
s+Bs5XA6UbPQNpaaEspoJMG6VkapbLXQlrJoyBVOMdDYDquE987axbiWK+/Zluk20GlHfNizbg1e
G8JpZL1qKQ+Z49sJdT0S94Gnl5ZdC8Z7XL8iTjPUwuH2DmUb0vGEutzRpjVBWy7XZ+xjpm0baoys
25bGFfYhYG3D/iFz3u4wRVF0odkYYiwYZ8gBmsZx3nVMWXHerihpgWQhIGZJ5AxjwjrYj0dGCiEM
bBAue8/hMNAbg6oRqy1OR+6PwvsffsD17ReMqeHTWeGq58w69nNms+qpoUCtCxgpRdq1Z87L9+is
RaRStSw2KO3IpZJFcEahtcK3hlPIrHpNDJrbLKyMJutKkkCqlVU2qKrJVmMvKmlu6c9W5ClRSiGV
E0yBXCbyPLWNMb/7k//lv/9L3/5X/8bPvhnnv1w5dKRmco7L23KeFCasdji1ARWWoa6XnHopy/pJ
pIA1mBoRFp24kNDW4vodfiyUeCA+3s5CCBgrj4YRRUwZbw1VFTQKZQyqCq0GnMZWIUTDlCtamqUO
MBeqFLJuqWZkDl9gmi0qCevimcZLTAUZKnW+weoWSNhVR69HZHiL10/o1InOR3LWKH3F8OpA3jwn
i+NMnxinPW3vCdM9pjQM6YE8tpQ60D90vFU7VDyAdby9fcU76x15EtrRctY8xRaPCTNFFFrtiCYi
VVFLZrV6Ti6G+XiidU+Y54bhOiBeYSLMqytW2y24MyIN8XZEmvWCgbyFZtMi5xFmUCvNIealFMV4
hmi5uPKoc8sTJ4hMKFORrBeErzKPlfUaqULXGEpzxuT2qFUiPZZgdFpTal5Y0aYgCINUlFcYWdzc
a2uYaiViUGZpRXuTFx7/U2XRtXClhf2jdyLFzEYZOi2ELH9W5IMGK46PGphzodRlLV9VxTkIUgiq
4lGMOdOKgrmgBcaSUFicb/k6CxqFmcHQUEtlmDKNNkyx8ny7Zp5H7G7FFGfeVoiMdNMBpy84pYkS
C1pZjqdMYxqGfcI5C3GRRLfWsZ8GzhvHOEVqVaS83Fw2zjGflmFeU2aoyxYkh5mq4G6InKfMWSk8
GSNXveeZhUYXWpUw48RF2zNf3zMrMAfhfjoy6czX+6/4+rPP+PT/+pxpv6d/+Ze4evkOT95ZU2zP
+rxn3swUb5idI0hPlY6bQ6E5W/F/7yMow3tG0xi42HjSGMmdQ5XlxnemN7ydIr+2rsgs9F5QuXK2
baha8RBmzs88N1NYPodNprfgDdxPgSdNxyEJ0yR8Z9fyB1Pm17zlVYFfcy1KPI6CtgqJQtc6hhA5
b1qeNC0hTVgNd6fAqi+keSbN0LWKHBL+fEfOgTyc2E0n7I9/wuY3nrDTz3DdDttYYtOyCfDFlPji
9oHhDvz8wNPzC1itOesVvXckCw8nIcTCVAMjQusdyoCtlRonTLOhTsvtOOaCEoXViq3vwDToaokS
UbU8NhIaQs6IVswpQE44HUg1sO4zJU5oVYg1MqWMazVDqPRtxzzsIVdU1sRJsfaWQ1i6DrxWnPQS
HY0abN9zioWq/FKEUyvWWkotxCo0FnKKeOeQlNDeMMZEyYXVquUUC1vjSLWgpJK1Q9e04GbLRB4L
/u6e3dU76Lzgg123WS5yCMhMjZGs5cnpuP8f/vh3/95f/pW//u8/fDPQf1kC8VmT85JfrEpT4kSt
EPKAnm/o/YulhlObpfdcC6YIaQmxUSiIsUgJWC2U6mmanvU6ImOGOlJTxJgGa2VxaarHDmuzNBKV
UhZjndFYb5fbtQJMxTcLF7noind6iWG0H7Af78G/Qy4GjKHt1rz68f9BIx63XmG3mcwRa/Z0aKh3
bJ6tUWFCzzdQI9chcjz+KYe54746DuHAdNyjDZx177PbJo7Da9pRoXJlur0m7g4w3tB6R3WJF1cv
2fQ7vL1gfXiC6Rf9tfVXIJk0z1SvSbryEAb6OND6jnBxyVx62ss15mRJD29pzy5p5gJjQ3EN49cn
4rWmbhWrJ47n65ashdt9IkYBCdTsqFVTPFy/idzeZt77XsNWK6YxL5z8rNF2wfHFIgv2NNaFnV8K
V+dPOR0id3eVSyvEGKHqpT5VKYJJxFLYGMOpFC58Q8k8asX6kURl+FkprI0w1MChVN5brZgPwpPe
k6Om0UJu4Bgmeg+TZC67huOcabWhsfDVKfPuquXHc+ad3vFGhJQd310bwlSgWVCkF12LlkwohlXf
8s8e9jxddfS54huH5vF23nuOcaTd7Rhdi9uccZYKh/2JX4yB33w40j9dU2umKEE8nOLE2rYMQdFY
i5KETg4jwq50mGKXhzaQ0DyMM6vOkkshecWUM58hnFnN3ZR4VjVzqjwrmg9E2BnPuxPsrCLHgJKZ
Gmfu7u8I08zhNHP9+7/HnXugPunZ3/2CYv4KT7//CbrRnIZI/06H2vY4v2OwmlNrWK06TimjxHJU
UJXiGDMzwqVStJKpCiwF1Vgmk3hVC+8ZS62FdddgpHLUCZUzKRUar8kKnnU7+s4yoAEIIZBSWsyr
RbgdBl4XTTGW63E5cHXO8gmLIc5Ipq0alaBUy/H+BFYQWxnniR5FGiP6cGA+FPrGogvEu8zaWwgF
nSZeTBM6nKj7B9x0SXo90PoNysz052uyh6uwGGl//sN79OeF+L5w8Z6w6zrOdpbRVJpNw11IDKWw
7lpyFfrOoFWgmC1UoRS10C6zBhEsS/TWNYpcBascpQS0Xg7JRSmUFobpQGLGpIQFQojMJYCBcgxU
DCkVnLKs2xX39zNTLCgyZ1ahJePM8mw9JoezllgSxWhCTkgWvF2icRah1YacFRoWfoV1zCEsng/X
MYXAtu8IsdIqw9Y2hJzwoqkhI2T20z1TusU+/1Vubh+wzQolW7rdBU4UJSsa3xPChOk2MAwEke+3
vvmvf/I//6d/7dv/2n+YvwHL/BK8/r2/9Td/pw4j1rglFpEE6yySl3WSaxq0do8AmbqsdxCMqogy
LCSFBYElafkqYwxQCePAPEeQjHXu0Sev0dpQZGlrkyosdo9KKYoswsKmU4s+tWw4WXglGbLByIrK
GlMbJJalKKbA6TjSr64IJMQtg34qAcNzsr5iCg4uf4XUXvGgVnx9tPzp2yO36oL94Z7Ja6J6wPf3
NGcNl+mCJqwoA8Rp0aFVmCHN5NNMS+BitaFf7dBF8F1LLjPGC227SBKNWC5dh4ozd6/+CO/XFN/T
uycUrdHFUdA0pbJt14hyaK1RsUW5hvGkOekZdg7TK/CKtnhc8jjvUcD+UBADo47cvc1ELbz35Anf
/dYnbK7eReqi7eWyAChKrOQkRFWYc6ZpGkLITDGTy0yIiSKFogKahRBmZAELOWXQopfmtaSWf1AR
jMpoMi+NYqUrKxRSMy0NOkOzIMg5lgwoplJANBRFrGqxyufKShlEVdayeC2GCi+cptOPaE1VWRmL
VoqcltX8kCqtEjZ1kRWsLpzCkpkPkrFWL3FMZdhYzVwq14eJCwUfrFuudmvmpKl9ZS+F0SjuVKWo
SqMW49uudYipeO/IFCqLBDTmQO8Mxylijf6zgo5zrdhEWCfF/SGyCZXfXDleOMu5LpwDVmVkHImn
kRQir796zavPf8zt3St+8qPfY+wjWUP4tGLKM84vn/GtX3/J5QdbdusO6zTn6245jNQFWKQejWmh
LofjPxwDW2eWgV0X/8SXUdhoAxQujEUpQcMSpaqZlascwsjPjyeUqljj2HQdxwxetzSmIYtFtGVU
sGka7qLwjnV02qMqvN80NNXw/qYhjsKZ0lxqwzRMxDry5rBHhZHzekQNA6syM7y9ZnjzANOe/OaO
TlX09ZF2GrDjDYQHdr2mjF+wehGp/pZ8/TX2WkAnuvMd6XRg/d4VOoPMM6evjsgfTrwUsJeR9dai
ItRNw93DAcGw6dYMp0LnW5oKfr2htWuyGHRrSaEgrUZVIeqKN5paFn8MBYxRiMCcBW+F++OREwXG
I1kiIczsj4HWex6Oka61rLylaxtc3/DmYc+rceDLcORExtjCXGee9maBZemCMwtt0GpPzGFJTsji
f7JWg6k0jUcEEkLjHOIUzms0gjcWXSvCEnucQyYroRhAA26pI7ba0bUtrfN0XYvtW9CasiAAloie
syjJaKvRU/1EqXrx9/6r//HvfzPQfwlef/vf+eu/E6eAaS3ySEbSWpNSwijB2KXXG/2YgywZqePC
dK8B0RqNRVKh1rS0+rgGEY1IIYVIelzfFgpKK6RqtBJy1dRHBp1SS++6YnHZ1ypQwSqwVbBWk4sg
CMkuONCCUKVSi2AFegedK3i1x6SMSQkzLI5prGWugcyEsg159FR7Ri0WIxcLBa5rMPqIPQaed57m
OMAJbAzUeEbbX5FlpiZNrA5VO/KDggDWZCTNKA3atxAsecjkVCnA/XjD19c/Zt0/Y2UvkQjplJke
KswKg6b0K6ZY0M4x7RWzj9wR6M46TGtISqOVopaAMeB7xen6wM3bPVkXNpcdb25uSKvMt95/zq9/
+0POLl9QtKLkSlUKpxVTUCQlDENGK83WKIqKKJeY5j1OFXLJKAq1VmytGLV87r1eoDNGaawSSi0Y
IFc4t9Apha6VRoERzdZ5PAuLYCTzkDPWLbxvZzT28evRZQHWeMWUAuiMV7A2isvGEfOi6ZdHg17M
ghKD9w1lzvS2424urLVjDnHxKhjHPBXW1iFJ6K1HF+EnDxOHMvN1mHm3s1z6hmjWKAensMA2TCxc
2A5S5pSFlW+IOYGCMhda42AOFBStd7zejzjvGKJArcRYIGVWKXGVAt82kW+7TKsj25IwQyKmgfjz
I29+/4aH/ZHPf++f8ur3/zH7h2vkWcPdIEyfT3zre3+Zlx9/xCe/9pQX5ys6r7joO2QInOOwc8Y5
QysZQ2GlM6YmnnvoYuBjrzjLAQO0RvEnYeJppyhSMVpxqcCWxIqZmmacRE6ngR9/fuLMGbTTPNl0
FCzrVU/SBmzL6BqMNLzTrrmLhQ5HrzUX1rBtoNOK3kHNiVZlnlnhdNpzGg6MxwPpqy95OkzwdiTe
BIY/fIV8GbH9ifSjn+KVRr39GTsr+MOnuCxsnuxQZWb1/EPS/JYUf8bxD/4I23r08gviL87R1WFN
wdwXVgO0+Yg9UzTrFi0a03pUSaAswxhxnUMhNM6wXu9w2mEf29ZElmZIo/VCyIyC0oWa00LDRhNz
xmvLMAdyHJgPD+yHe1RJjKeA15FxDuSaWFuDdYbdasVxvycMI199fQPDzBmVba08cQZqxQBK2UXq
NAapeqlz1RqUpdUGax+bKnPFGksomlw1zjgQhdMGXcBbgyzoO2xjGGImVShqOZjYukZXaIzBe8vm
cst6u2GeZ1zbUnPErxq0Vbi+w3YbyjzhvP4X/6O//dv/29/9L/6nV9+s3P+cXyUvWENtDCVFdNNS
JS0DFCGlAdOdP+I7zbIelExNCZGE9WsQME1LrRlVDaI8zmn61Yaj31PGJd6mlF5+jmSs9WhVsMpQ
syyfmlqQAsYuHxylNLM2VM8C9IiZogqiNWSLlQV4YnxHDHecnQslRHpliIdCPFlK7rBti9fvEsOX
aDujg0aROOVIaxxyHslNxqqZqCoqB/L+nq9eac7WO1K0xCycbS44Ts8hfU3jKr7b0vqOpBpyCZx+
+lP89/8Kh+tEfxbYu5EhzZhp5BDe8tVp4LT/jCehwelzjHh06ulXmYvtipQUpvZQhPtVoG0aVFvR
W8uXN3v8xrDqPYf5gb5vORwK+XDine2W00mR98Kuem6j5ismxESqWtrMRBRGL1nWrIRchBzA6EJi
om1bRHWM94rCYp5JypJKYmsbKoW5gteaqSpchaoWfGtnFJ2qrLzmbpw4dwqlhFoiUg2pWrRkRBSN
1jRVyBXahSpDZz2hZHrd4K3ibioobRgkY9VSqnJfE2dmwfoqZZACpyqcJ6jFUpLgRNEqQ0XRawci
eKdIOkM1OK1oFPzGpuM4N7y6n3h7TMxJaFaKY6xYI3TaLbxwtSQ8rNXEGJmrLHFLBFMVmUpGEUTo
W8tY8tLNroQwC09M4Nkw86FVNC1sGKhWwzgw1cpwCtwfT1y/uWW6Hzjqwv7lRzwcXsF8xt1Y+G7z
gu9++H381vBk09JYhzWQZ6EMCXdzz8Zozp4WZikcaib7ysr36MOJj6plLtMC2leapC2/5aHmCVUj
59rTlrTErsKJZl6G1erViV+dKpsx0Hee08Mes95yFyp7rXnvfMc8ZDbdhmmKXK12bGog5cCZh5aK
VZUyTtSHGbHCdRVyGomHgfWx8HDzNV/80ZF+8xJDYvzpP6ExljmPnF/9gPqzz1k1Aubn1HrD5tkL
bM48eed9kgj2xa8y9S+5/r2/j/zpV5x++Bnv/Ft/FZ68h191XD55TpKJelUJP35Ns5vx334Xawrt
KZGUozOKz48nup2j1Miq7+i1YFTBkgnTvEiBVaN1s8QPa8aQiYd7bN9jVUsVQGdSmhZNOxzQddkU
jSGhlWJMkV3jsUXTWAclMA4z98eJt6dAWyo7I6iqsdYyhJlq1NLklsGKUFJCszA+vLfoItii0aYy
lYrXlioVo6GIoEQoUqhZMDQUDFUXRBnE2GW5GgpKGba2oOOBXB4YDok8bgkni3YtYiJJL/XDioht
L6lzQJ1douWBMNz/J8BvfzPQ/7xNccYi1VASGNuQc15uZa6h1rrcMNOMcS1FaSpLnnyeDktPOg7M
GsSgaBAFiENZUKah6TvKwSBVsE4tWWNZ1letgNZCVQW0IubKIzwZUw0ZRZJCZqkgVK3GFE+MkVZb
ZguGDiuG8Tbzi5//hLNnG4qMmHrGTOYUf876OOHbjuwNm/Y5YnqyCLkM7NWPsOPClU5hQMfKijVa
v4fZtSR1iegDpjUM0kBZk1OPCRNeIvY0w6bnYbohjTeou59y/v5HhCkx30Suj7dcrAxxzPSbD5G0
4qgUN7c/ooiisy0fuw9QseO861GdYowR60H5SKML3mcuNwW/ylhbKHmirRY1HlFrjekMdkiMIVHu
HT0rvuUdkpebr65mSRYoRa7gjGKqYLygZCZLpjMdqC3b1XNeX78FqXitEJOwqhJqoVEaUcvtPCnB
I1i9OPo3TqNr5dwZrCqPLXtLU5koQ6yRUDRVV97GihVhlRSNMTQFQlZUV7mZCqOGNzUtjuo6k+bM
mbWMIbB2njlX8mNMaooF02jCVDl3npoivXYYpTjkyHlniTXTOoWSgNeK989aXgyG2+AZkiJXxwoB
cTzdnnFz+0DtV6xUZWMtzTyz3x/ZNpY4VbpVT5JElMK2aZnmkTNnOMXIjsrDFHhaKp+0hRedsJaC
oxLHQNN33BwOPMyZ+fWRr3/4GWPjmKa3ZFvZfvB9rv/3L1FTx/v1nH/ue79BI46z7QpzrESfaFvH
7Zd3tDrA/R12m9j5D7m/e8uVhnGY8ZszxiFjbMNKKRplwRqGsuBQ46mgVeWZb7m7PbEqlfjFPc1R
s+sM7SHwHdewP2RKP3NfMq+Pmf91Et5/ueXjrqdXln5leYiRxltczaQotKHi4kQrmpoz8osDY6d4
GGeyy+R6RzlC0zWc9v+Umg44NaNXd8Q44X4B2nyBen1Evfs+4fpLOq2wb7/Cbba0XY+9vsW8eBdb
15h/+d/g+MUN9z/9R/T/8L/FrQPNh38RwdB/3BA/m5nfHnHqXerdiGnX1Bo569dw98CWhdGgrGXb
rnEiWG2QFCEP1JwprkVnwVhPaxXT6UAeX2P9Jdotm81SAspEpCSUXobyHMIjZMuSlUM7jVWF3apl
PI7MIvz44chdiTxHcyqZjVNUlXFW/1ljZVGKOWVW2tJZg8yKplTIgjKJJIrqhFFHjIHWW0pKixxm
LAVDzCBGUE5Tali4DbXitGGlhBKWFjchUurI/c09qQrtxSUGQZmGMI00TUeJC2zK+A1xnDF2+1u/
+Ad/97e+9dv/wT/8ZqD/eYJlciIG4kMaAAAgAElEQVSFiHQF7RaICyxmNR6xLCXPaJNRWi+rcWMw
ukHSTIozfr0F0SjXoNBITo+FGx7tOpTpSXF6zHcKVllIGWuFGDNGFaoYMMu6vxRQzkJJrHRDzIsD
ulGGIEKphqge3aUYxilR+pbu8gJkzXT4go5KOR3Jk8M8e5+740QskYMXenvizfiAaRXN+g6lZiQa
Zk6EXJDYEL/qsQkaPdHmju3ZihwOhMPMqXiSqrzNEFTkfHyDt4XjXLGv/h9m3i5RtKMsjtD8gvnB
cRvvsP0J6b/gdDqh6Oiv3qHuB0YRLowHW2isQUXoJ5iLocQB2sCQCmJ78q7leHtHnI6sV2ccxjfc
D+DUzHRuljX4KEhZ9LFSltuZheVmoxeuu24M8z7gG4fTCjGWi82Om9t7OlMZU1lgMMYSRHAIuS7a
sdILXTDqxQB1WIQTlFpu4aWUxZSTFuQpWeFkqeT8NCfed5pryTxRDZHESVmyLiQBXyvPJXHlGtba
cEqFRmuuU6YYxZtcOMct63tleRILRhRNWWJ1rlUUUShViEZDLjTW8TBPdLbFaMNH3Ya9wFp5xhqw
hyOr9RZPoXl0g2/ITGFmOt1zd9zzf94H/qWuoW0vMcqggYd5QEqlKOEuZl42lY9M5SmBd6ZApwXb
Osr+HpHA9PmB8Wc/Qs7fId4OjF99Dd/+ENY78s0t9U9+yMff+4vEh3v6XOn75TZddUM4CDVHBlOp
Q0C1Ef74Dzn7q/8C9Q9+yqokylCxbUZtFWV/g9p8Cpffh7tPMf33FhhQ1pTiqMeMOlrOs4BL8OVn
mLhCv1CcaejHDWdTSw7CcJHR1vIiOvpNJjbw7nZDqRrTFGoMdClh6nLT3Gih7gPjPLDNkfsfvoZ+
Rs4hv/05rslwvMbN9zSbSp0P1H3BVej6DWnsUeWBMGbSzciqOnLbsXpiqA8PGOtpsIhv6X/wLex7
T+neswz/5L+j+6N/gLp8SrUXrD6yhE9/hn93D51B4oCMA/rS0paAHma6tiE8nNhcPUWHSKmGlonx
/p4y3zJcX9M/e0r37Dm6u6S3DePDNTef/4Lu5hUXn/wq1lqOIdA0Kx7u79AOclwIma2y3MQ9W9di
YmJ73uHIjEPmeEoMU+apslizpDmKXtz3K/eIfFWWqsFi8c5xiJGLtV8O/qbSe0cOiat+zXFM4AQ1
QcrgG7/IeFowHmKJ6CL01uA7w5Rn+t4gKVAQ0AuOy6uGUyiMY+Xjc810nFitHfM446468jiifYvZ
PCc9vo86tn8H+P/lQP+l0dD/3b/1N34nzTO+bZb2syLohfuCtQ7nOpTyKNsCjvr/GSO0Rjn32NrT
U5Wg9GKsEypKaSBSpSISKaFSyrJCVWppVdNmIX9ptTS3LQI0xMzCb1eKUqCoQiiFlAtDTrQsvHlT
hPk4wVSxAm064cYZFx6ox0SJhWiekEMgqw1XZzs22wZdAoSA7jJlXyHtaP0TVO1I8ZJoOvbHG0Y/
sfGOYvasdxc4yazSa7o6ksotyh4pJjG3mZM+8SAK+/yCuYEHFbk3kVs9cnBnDAqyqSjZsNPnrOeG
87CheRNR/ZbZHzkpxVAsYU64k8FExyorio6EOCOdpbjAXbrj7ds3CM+IM5SwIQ1rjF7zEFtyspx9
a8tvfvt9Lt95nyqGKGoxIipFLJVUYYyRKQWUrrRaY1tPLhNzGIlzYE4ZgxALGBSNc6hHxGROhbOu
JRcNylFEY9AoWQBCvjr2VbivAqJ5KII2wkllvuUdjRb6/5e9N9uxNEvP8541/sOeYo7IqSpr6lFN
iaTYIkELbAmGAUMHFgTBEHziC7AvwQZ0bF2CfWCf2gYhwDYMG4ZB0iTNqdlsdnV1V3VXMeeMjGlP
/7hGH/xB+Q4oAuw4TGRiJwJ77/Wv73vf51Fg9GRbi5OTj8z0WlpKVBaElAhIkpzed30WuJQQBLoc
WJKYSXEfzMsYAWnK15GUpANQkiFOatecEjFBGSSHWA5VyZGtiVpzVJeQA6dWciY8VeyRzY4vn18R
uj0v9y0fzDTndUlZLBFZsXYBrSYN6lxEFj5xNDqezgtmY6AqFWns6IYNOQTWVz9n83/9b/iLD9m8
foX42gJWCuwtqdsxsz2LJ49wrz+Fm1eYMXH0+IIgI82LS2SSbP7nn6IKgZJrdClRc0F/+SeYeobf
dRRnJ7g/eQ0vWuqTj3F//GdUnJI2a2b7TFq/RXx6x/HxiuFHtxzMauzbPbP5nvLjJbvf/z84+qVP
iATmD2d0N2s2n/2MeiF4ZDwfFQ0HdebUJPbrnpkPVE1P3g9caEnpHUdGkjYjdz9ek1LCvb5Diors
FXM74+j8ESoLZN8j3kR0+RB7+ivY8pvouiPf3bF4aLGnnrSQmEqTds8pv/6A7i9+n/LkELoOuzSo
aoGc18yffEh/9QA+b1BGIR8copXCt2vy0GBkjTk8QcsFLAqqg0O69R6MRoSB2byiKi3KaESzZvPi
GenNG+zNLf72DVURKWqNkprh9iX9szco55hQHY7RBwIO17eMOXG7a+6RsBGd4KDW5ODuxTGCm63j
i/WWH962nCmoACGnh2KJoTAaFyVNzCQpp/yQSuQEIUwrUDtt2VFKEvGMYkAbTZ8dTgZSzmSpSBqG
NJFospr26oUSiPzXX7YORwIjyEqgbEVEoaMgDA6YLntaG7TWSKkx81Ny8khVIbKCGJ/+1//lP/vd
f/Pf/vazXxzo/55+/vN/9Z/8667pMaZAyIzRkz5QCIkSFSEJhJwCblP6PJNzQkiLNBpp5yAMQhiE
lJCGKfX+17vO7InB0bcDxB6DQKeIUWL6JYhIFJIsJEIYclLA5E2HhDaTgWgYA/hIjInsI8InxJCI
twNKZtz+mu7yknBb40LJsD9mGxaM6ZA4n3FbSrbpLZfhEkfP1d1rYpsQQ0b0Cr9xjCP4OCLSwCoM
IHoO80BtJAePHtCoK0LVwjITdMYeV3gF+22gS57iYkEvDK3Y0oVM7Jf4dU2/kfh2Tso1aXTIpIhN
pu32nBw+pVWO3PaUomS73dBrR5dBZ/CjJxxJBlqE1kQ0Ie0Yuob5zCDnK2RRE2JESxBKc7DQvPew
5pc/eY/Ds8cEY4jjXzvoBc04OZs3bQsIKloQnrKwZCJD8Lzc7bhyE5vAp0yp73n/Mk+gHyRWTS76
Qhj6mEEofJDEpDnQmqs+UWGwWXJoJKVUKJGwGdoUUVqQpcQIS0iKLkhqJXgTPUlPafHkmSh1Lk6H
dYxUBOoMcwRzLdmEiJaZvU9QWu5yopaKg1lF7jxzazBxwqjWRrNrJDNb0Y+Zh4s5hdVEpTmdLUiD
56SwLPo9od/RvrviR7//ks+/aJgfZY4eLXi4OqTJJXcZftoPHAnJ50PLAw3vEzk0cGIiJjhEGYmX
e3avLolB0vzgEndzRINlt7vD6T3DeEP5+AK3d9hYYstHpDtFpU9ZPHwfW1QMn75j82cNYS9x1284
erJEVSPmwRPS5afQGsRuJP/VHnH+Hv7HbxH1GUlq4r5C6WNinxCiYv39/xfRSOoPHhO/XGPdQO5v
kS4Tf/6M8uiUQkH40R+SfIO7+hn1+SFFG7E/H1jpJdZJ5BiJ+0gaPLEfmWmFSJ5Vbam1xruB7TjS
v+xIUmBPC+S4Zx4dB3ONvPuc2clj2G4o52eIfslcHHJwZNBxSaVAy8DyvY+I71qUguFHf4iyAfNg
R7p9C7Enm4r5xx8ilCF0hu5lz/juZ8w+eg9lZ6j5CXGU+O//KeWjY8RKMbs4wo0D0lpoepRUzCtN
OZ+jVeD2+c+4efkSe3tFKaZGiyFi64rYbGB7he5arOupa4lPPUWZ2e4a+pzwzk1uigD94FkVFpUy
C6tYzgwpJbad5/nNmgsdOVYJKUcUI4WUU1MoS6TUiHvbpURgk6IUapJg+YiU8h65CyGlqWlBBglK
agQSFPgYUdN9CZki3MuvY5oO/JAkSSiiNGSmMF3OhjEm2r6lFBNqtp4tplF7PUeJqb5niooQPMoW
lMPw9N/89//j//CLA/3f089/9q/+5b/u9i1Vqck5o8VEkxJSI6wh5jxVnpJHIcnZQ85IZZGyQKkK
IQxwf+jfp9UzaXL3GkUIAykMkziAgBBhAp6ITAbSFK0HqckAUk1imKzwSeAjuJAmTKiMxBgmFnqK
7MaGcN+3DTkjZ0vaMXEbt+yc5bqscYsj+jiSC0HWS/q+Zf/6DV+8fEc7NFx1t4Tk2bsbQt6gx5bO
ebSaEX2BjyXJG9q3b9CrA5ocGeMC15/hhkz0EW0luW3JucEEw0E4hn2gbXZIWROGDUX2nB2dY1PC
3D+5p4MVW2toN7f084CxPWa85mS8ZmkCZemw1pJJZF2x6+/YXN/QDzUhGA4Oj6jrkrKAucwciZGZ
V7z/wRFf/9oTVmdPQBm8/+ukriCGjMuSYXTE7CiDQwnBzBhSCJAj7a4hRY8RGU8kC+iTJ6BJ8b6p
kDWIKXC3D9NDWZ8Fy/tJjZgu3QgtkHKyTy21wQdo41T/0Uz77k2KjAmsFLRxGi++cYFSKWyCxNR6
iCSKrOgjJCQNGZ8jo5jqOVIlhpSZF1NuQMXp3ehdxCPY+oQsS2QWE6fcCKSCWSFQYWBlFZUfSV3D
m7dXPPvyhmHj+NnnI+Wx4unXH3AyX3GTEk0/cGA0S+e4yJmPVOI0RlYF6K4h+wYpM+27K1zb0X95
jXAj8ckJQ79FPqoJlzcUY0G5eIh8W2DjihQT+foNs2Vg8f4xzFr6r64xH35EuPUcnD6kLmpUsSCO
guGzz7Hf+CXc6x9DpYkmQt6Rhh3j9gWmOsRvO/TBAW77jrwbWHzyHmH9EmUgbp8hVINMJen2DctP
fgN506H0nNhfIlOLKRKhuUXZiu2zr+hy4Kbtue0T+5RQC0O9sMjSMquL6bNdSPrcs/38GfqxIK9f
IdZXWL9HxIiqHtL98Q8pZ6eU8xPwW+pZSbz8gtmjI8LrO2x1gVjXRN9QPDjF9beoJTQ/eUe8NOTb
HvXeOeb4GL/bIA8Lhsstfv+a6rRGXRxSnq9oLu9wu2vkSqIXnuLgDGZzqCVut6PQgtJq7GpF6ja8
/MkXvPvqHWK3YXGamS8PSH1PaQ3D85dIAaob0cljjaLZrTE+cvP6jjQzsOuwShNcIo2eo5nFe89y
XmK1pHOey82OH9xuOFAZmRyWOFH2RKQyBUNIKCFpckArSVlZWu8RWjGSCOn+75OxWiJSoixKnJuo
m0oYgs9U2RCcxAqNT9PDvNYJCNRWgszoqBFSEJIgCcU+CjJ6goC5SG1KrNVUR0vAohdHpJyQogBZ
kMnoIMlOPf2v/ot/9rv/zX/3P/2duqX/7dGnIhkGzzBGrBUEI1A5AwGRI1IovO8hKFyW065ca2yO
E0FIlpAVmXi/7xFkmJLzGaQuqRdLhr6lbXuG0U3u85ipjJ56zPl+2ComgxtZk0NEaIOKGSsFhchk
lUjRk5PDu2uGwaNKS+o80kp8UePGHpYVs3nJ6A6oqwJbGmSbEbcZq0cIghlzlsC2BzuvGcaAkgfI
SlAdZOxdxg2KVFYMXqHwvAsbVmLGdn9JGmqEHNE4kpAIX0DsgEwKkTHfopTi7OEKmR29C+idQ7k1
WMHoO7zwtKNjeWjYuB3VgUDGAd3tafoSG45J1tHubvFVTRA74hB5qH4JuZjjnCOvI8VMEruRdrNj
3bVcLD9kZRWlmRPFpFYESCoTg0ArgRwDpbXIxjE4TakEY+dR2mKVZVZoGi+Ro0cSiClQR4XNEhUV
CEPwDmM0PgcOdWKfModSYhUMPqNUpmfi/XvUFJg0mpwCSwFCZgoDMUQOcqIoND4KnmrNnQt8rCxW
QCAzKzTvhhGf4S4lkpQcyszr6PmWLXjpHKVSyMk8gxKJdec4sAaXJFGVkypTJE6KgsF1FKWhDwNY
zXEZ8X6kLEG3I1ebO158fsOr5zvevh0wjxy/+Y1jPpYltZgz9x0yKx7EjN4MrMrMRXQIInNhaJo7
lDGML9/S3V6jyxm7m58jbEX/7EtyFMxOn0Jl0WJFePuGcnHM+HbN7tVP0MYS5Ax1tmL36Z9g7hYU
ckQLz+nDY9zNHnW6IPz4En3ya4StIdy+hzlf4V5eIWcGv7skFHvy7Jj29e9hH34LrxpqPVL1Pb27
RpsHJCewh4/QXYs5fQ9zLug/v0U/3RFch7xYENYvEfMN6uyG0V7h9DXP/2iPOv0uF7/5LZanK5Kq
aIPguFRgAmo5w73d0YfEkgWxaSnKOWpsGD+/pPzmL2GKD1gefhPKJexvEduRTA9nEvdmDc4yqw6R
Jx8hHhQkf8nebRgbzSreMr56x8GvnqHW5yQ3otUJxfyA/O6Q8OyK+oOvIVYac3FE+MaHdD/9PsXq
lyd98sNzhq5FlQqlBLqUGCVwzYDcRdIPPNWRpP5aQiaPkIrx8h1yBCkkIjp8dvjrd1ih6V7tkYXF
lwmVDUVhuQsjRa3YtyPGgpYCl+CqHfmL6x0iT9CajJouMikTs+DGB5TRhCjZRs1KKPo+0yTFTEaM
ztQyQo4ImRnjNK5PUTAQp5VnnNoiCUEhJhJnHhPWaERIlOXkZVAZshbEMU2oZTKFFAxxJOUpGNqn
jvPFYgq7zg6nf5MsStfEmNGqwIkAlcao+u/cLv1vjz5Vip0QYhm9A6sZx5FKK7Qy+OTIKDKTgKEb
G2QUaCMR2WFtPb1plJmCG+keFiQFKlmyHFAorJ4xr1YMs55xHAnRT0+DIjORvhVCSWLg372etZYo
EyFElJzqRNontq4n0tH55zgiI5OQALWkWK1I60g5X+JbS99bdluFGjSxH5k7Q7AjVswJoyW0Bvwx
pTpFhYEqS0wO6CjpasHWXaPiSNff0Po9XRoRl55+NMi8IBlDjPvJNawjDqYPfZPY58DB6ojazRi9
wqoS0V0jdMHoejyBHAOuSfRv/wqpWvqrQCxaSllyFQIyBG5eXnM3GymrBxRGUmnodYPWDp8F+26N
rJdQQx8U5Bk8PubJBxfMDh8RZUn0029ZJIgJUs6EDEIZYpgmISlkuuCpFzUyl8zKY+SmI6eMQTCO
EyUwEaiYbswhZrSJpOwhJ2ROJKEYYuA2J1bK0KTMsVAUSEYEg09ECTsh2KXIMZ4XWXBK4pDInkQp
BYUWLCXsg6fWEhUnA9hcw3rCE1ELeJoNOQtkkqwqw5AhSoWT4KQAPSWtS1PSD4mFtBQxIfQUEkxK
UMiMTYmiUKgQyL2jbzp2m57nP9ny891zrvQtQ7qgrktyIaGd/AOzMFKEwHEW2DTpT0UUyDGRug73
bIAtpFlGlOfsX35G6EsW336MqY4IcUeoLd2LzxHnc5r9FrE4p7AFh++dY4IkX99SnT0ghxcc/Na3
SblDHfSwnBH6V8jqPcIm47JhbPcwmxO7DYQj/OEJ8VnPMH9MiDOSD2RrSLfXlIePcM8/x0aI2wVK
7eDgguHHvwuHA96/QhweEfwVUQ1gF2w/uyIflmy/vGN3t0O4dzwYvklKAodFSMF6TJyWNcL37N/C
Lj4hfdZTVMdIJyBYzMUhu/UlobZkvSW9fY1yhtjdUB5/wPiXr9CxwOfIvv0Z9aOPub35nPmHX2f7
g98h20jQHn2XkD/6Ge7zjuLRY8T7c9IKqkcLwmd/hPjH38XfbFl98gS5S/Q/3hHvdgx3z1mIT8ij
Qh0tYecRosLEmqFJxCzpP9+i3j+gjA9IUVIcLIg3a/SiQIQOFzsQAtc2IGqapsHrJeMmIOsag2G1
0ASfaZzgcFYjhaZzgTd7x+ve81hHbAxoOcFpMpLKGGTM95POaWplZab16d6UCEjJmMBIppWjS5RW
0YwdRk+TLx88WhpSzNhy0ljP5bRrlyRCyPgxURSGnO95IkR0lpRS0DuBHBwUkGcRoQZQArUQ9MMO
Ux4i5J7gM0JNl7MkNH2bvvfuL/7P3zz/B//RH/ziQP8bT7nb5z7G74R753HOnpwtMY0IYUj3vWWZ
M8Glyd4VJ8+w9yNWzZFaEWMEWU771Qw5j+SgiHoCPlSrC+aDY9cM+LGFFDAZtLLElJFolAKDJIRp
v5NDolAw+Ak60sdAEJpEj9BbZG4xSXC3XVOtjhl2twg5Q1cH7NZ7AhIhKlyX8H2DT19i1IpidowP
79OIW+YP32dRl/TrZ5hlhSos3X5DNw6Y+8NXFIohj4yyoiorfBPJbJFyhjYlWo2EsUMFS4gBggD5
kG3jiDoQeo+cgawhqBnOK3wYKFYVvb3CzQuGFOjdwOFygc+SLo90/WtSqSn1nGE/opeGHs3Yv2Xf
OhYHgtC/oynPKfQK3QUK94Q7naiOjimPDiZNKSDIUxVZgAeQU2JaWFBkfPYUykAMEyXKKKw2DM5B
UmQ0XUxAwstAL8FIjSOipSBEMbEKgDF5ltqSRKSJnlXK00hcWJoY0CYjUmSmMtEnniiFVZpbH5mJ
acWi0pSIz2TcmKCQHBYFmxwhTpzr10Pgw1lJ4xMHUtOHqWq3EJJ+8BRK0QyeuS6IQ0KHyTb34mbP
aV2wiwFTTY7oPYljU6Lblr5pIQ6EdqA+93jXk7C8HRJX2XGQHQWJikRKgaoUHBSKuAdVZdxmS1AZ
gsBHgT4/ZvfiJV7X3GxvmasLZk+/zub5FWm+YNO95nZzzebu9+njyAPzlPnYs1yfIRGY9hFx7Zmd
GlbLwO7HP0B/8D5j+33cgwFRbmk2z4hPK/bPn1EWH9PdvGCun6BOLXEXUEeP6F+3yPKIvBpJX33J
4X/4a7ivfhd1do5dRNTOII5q+j/sWPzar9C9XmKqJ4zhNU6/QusPaXZ/Slcc0A9zdqHibpuZ76Ec
PQczjdKaNnrOM+TBE2eS/e0NrfuU5en7lLrC7N6y+Po36C+v0b98xq7boJtrahQxT/6H8PavkKeP
GNcJYsfiZzdItSbYU3ZvM+LkeKpdqjXxVUvR/JBDrvE//QHJSPTQU+dr/PpLZHmIUt9AnR2SHj5h
9/v/ltXDeqqplnZqbzAipcT5PSlFtj7QbDb4U0VoW/ThESk79IFGzBVu1yALSXezp3uzJxUOpz1S
WsLOYUREzuZYYfFxmlbOtUbFRN8OXG86ngg4QeO8p641Y/BTwyVPZMXSKnKOVHKq7S7LRJHExPtA
QoRwb3krrULd8yFUlpggUfdSrcR944SEEx4XMkZkCgEBwUJZIpG51ey7TAgJn4EQyTKDkve/G0nN
VFOdQs8QxjA1k0JC64oUJFEvkKr4O9VL/1tzoEsjXrQ+fqd0gdIFtLSoOAE0pJ52tyIKfIxYbQkp
EpNn9APWD1BzX3H763BAJt0/bWIE4Mkio42ins+YLyxvug1WRGzIFGqiHiXvSdKAj1PYIk879kBC
W4lO4t8l7/t4iLS/Tmky2Qfkk8AwelCB/e1b5KtX6HHk2AgK+4DsOtTCEv0TukHSR0HfbqlNhd8M
3IWR2cxyFwe6y7cM+zWuaUg5osQxUhpk9Cgibv8W2E83v7RGyjlWFoBkTB0mPyQyIJJDugoRSoJ7
RQ6GiMDrZ8jCEtqMDwGle8agyDogEcSoiPtAM4zcDVMtS4Se2FS0quLk4n2cvGZeHeLGn1AuDI6E
HwOhf0BA8u35IUrPULMFTFwZRJoYANqAH6ebQO8DsSgxRaDpR6pKkOKArOcELdgV0PWBPAbmRmK8
J2Y5rUVIGA1eZozSiLFlJqbWQhMCj8uavXd8S5WMcUrmCjNimehvKvUoWzL4gFaZ2lq2zrFSBb2H
EAPvIkiVWOpJkVppxeUY8VpQiDTR9cQ0Pao0rKNgLjSaxLaPHNeGMCb0QpK0pA+By9GRxg4rPUuh
yNnSjQGrJLlPjLcjN7db1jc9Yp/Zvfkpwf2U2dkvo4xmLjOMPcZ7zkRi3DUsK4tsWlLfIYQlDQIp
C+K7FrLB+5GkEo53iGJFHBWjUbSqZ/fuir0YaZ98gBsMO79l4RLnJ09g+QBxl7n4R/+Y/v/+IfOD
b5JejMjeEptruusviCrQXt3ihCbOZ7R2we5uiyiX+EVFGRo4lvibL1H6GHvsyd0NnFq2L/4XxEVC
HxXo0SDMBf5na4pPvkMoFgR/Q/Jz2n5DPz9g/emPSYe/TusNr4fEZeoY6gOCllSlYjU3rFtPqWBU
CWE0yycln/yn73P7gw49NIx3P8erkaJbYM4foUyBvAkUq8eYvIHskUdHjO9ekscZWcyQiwXrTYtY
/n1uPl2D+IhZ/Yi0vkKLiGwcSVqK1OJf3WI+eYi7abGrQ7ovfkhlvos4dBRHluI9Tff9ERE1w90b
zOED8hBRRhB8B06i0shw2WLnMHYt/lWHfrhEBhDljNA4ZLFgaLbcbndkJXCbnnJuEfuRg0Lidh51
kJEiMI6Bi6MlLjiUhJQCCx/QBFIXOZrZ6ZE7yYmAKBIns5Jt76nuK58eMGIyCZ4tC3x0UwZEKnJM
KDR9yGRp6FzCyilMKhAsZoZt2yMNiAAuR0pZEJMg+0QMIKXBzgxD15BEIseIURYzF6RxUs4mZ1D1
Ct8kZHmAwODHDltOtEZRT2G6lDVZ8L3Nj//37x18+z/+nV8c6H+T6TwRXyglSAmGvmc5m1y+OQqU
8KQETggyAo8npIRKAi0kLvXo3CCTRQpLznmqr2WFEAqpBCk6pJSknLBFyXJxxG7fY6JHhIEgIjJP
t/rC3u95tUB7j5AgcsKnjFIKWxaYmDBoxhhIbsTnwEILUv+Mvr3FRs162HL+4ddotxvKMrB//Rmd
bCncjKo4oOSA2ErKaCaRxRaa5gZfG4a+YXZwRnl2TreGPFjCOIK8I2dJN047cBEyYlIj0I6H+FGy
PPgVYliRucO1BdZ2ZLeb6ljJo2QmdIGMB6dRRcC3FQWaolrRxy3tfkBbQRoypMDR4bcJuWbf7xmb
xE5kgsm0/jl57NB3lqcXC0r5Ca+2nuZCs8mSG6cxSpAmEik5Z4wWEz43T0l1o0u8H7kdYC4X+OAw
QiMyLGTBYzPjK7/jbghUWbSS6bMAACAASURBVDAmRSktd33GaIVPCiUTUUVcEmgtuXWRZVXRJ0GX
JaUQdIgpzOgTx1bSO48WBhugyILkE+t+4IQEbsCERInExYkxnkWmFwKR4UxmTIY2ZBSCofc4oA/Q
ZkslEykJSpFphpEjqZjnESU0Io58frPhRIw8sSvmyxljipBhJUB6jw+Ofu9pbwcQI7FL+L2hKkZW
WaH6SCFhhWQ5CsSqxGZPGAKiAu/XKKNx+w1SBepzj/vqS4rsaDYD89NvEZWgudkTVE37tmGszuh8
Yiwm2MqySswWmhQHyuUh6asBqx+iTyO3n/0ZHPYMz1vCoWGgY/vmOeWv/SbX3/8xzr8P4wnFw4rQ
7nA3G0x1RPIzytkdojCo5hbz9APCdo89fsJ4d4I6fExae9KdR359ye4nv41+rGnLnzNaTd859j4R
7QrfRjIKVS/57j99ym9855y6nBFixsXAsa3Y9wMLYziZLeBgpPz17zAMA+svLti9+YL+J694+Fsf
Mv74jtIOpPia/e4G8+Aj4rOvkL/0T3BNRwoQ+47UlujHR7jbkaBa9jfXrN77hD4MjK+/RP7Kdxj/
n0+pT1f4vsJ176iOPiL+3leUxQd0V3/M7Lv/Ado71J1Hf/Ycf/CI+h+dEV1GzBfk0ZNcR/QerR3V
hSePEbdrqQcQpqRYHhBuetKsIG4zxDvMZkT0mfKhxZcGUWXwGpcTWRuGODKzGjzsw8i2bYj3aO0h
RI6FZeciHo0UCiEEty5NyXM3JdmlmOqbSyUgR5QwDDky454xn5iscFKiREZKhSNhVGQ/RiSJFKfv
A6s0IUtizkQxwWzKLJBeI1WiyBnfZhYrwdAljJxu61GMxGEHajWR8oYRaUtiGpEI8C0pRbSp6IeA
KPTfmV36354bOuKlTpCix3lFiI7sMtZWxOhBG3TMBAkxxmkcLswUIisCKWSEyRNBLgdAEnEIOUFp
hDQgM1loZLmkWIwslh3tektKYqpf5ECOUyVKyITK8R5fqEhJYIyijxFrSqIISDfZ2LKIDCbgrrbk
tYLiFOKWo8V7xG3GbQPruztSM8NVhyxWF/S7LaJaMJ4LwrBEaEPeN/imILo9ujJk7Tk4PEfGDWk+
g1bTr2+JRiJyjTmpCLsNKQgOTw/p2ho/VrTuACkKpJmTjCNUGTGvyNeCxABaorRHiYSSiRBL/Dh5
0qMT+OCRRuO8o98ETF5yffOOnCMh1Qh9inuWWc0foWKJ22dUfMTdzYpkG9SyYmYMsxPB18/npGla
fj/tkAidid0Eldm7ME0/SIxCQO4YncNagxgnkYRRhr0vOSzA00097piYC8tKZZ6NIydVgY8JrQr6
5DFy2mPfhpE6K74YOs5swQmaJjmCT2yJzI3irg/MTYHNCu8TMwVj6FloS5882SSiklySMVLzl25E
icxjJCYL5kjeuczDuqCLmU8qQ8iBIUX2heR/vd7wG0XJP8kRW1ry0PO1puGkVJhx2iPWOVHkyHkW
dNcbhn7NENf4sic+9lRNzezN15ifPsbGhOwGirlkpQqM6LB1iRkVyXbILHB+pJCJNAzkIiLEgL/9
c9TFe5THEa17mnbO8MUL/GpFMCe4rGiTYmk0dWVZqMTB+RI+u6P42ox81SO/NceXDes3P8QcneN8
zyAiu26kLQT2tmE3e4DMjxFliZw7hNgSri+R9hC/DdjVCWHIiDAFmrrngdn8HLmxuGHArX+GWgyo
ZmS/7dDVKW2s2PhDdvacy2VBM6x4ZzPr40z59474h7/1EUovaeQENGqV4c2YmaMpbGYwlqMHx+R+
wTZ0pGpGr45pn19z/TIhYiaoEqsi8uEH5KQovv4+vs/kKJBxBosD9ErTBkcsCm53G5bLUxj3SAex
OmFzc035eIF6vCBut+iDY25fb5nX3+Tqj14Qbp4hPvr7jMIi/sGHjK+vKLYt8c0dslpAioQQEbEk
tD1qH1lenFK9vKI8q8B3qMMj/OhQtUZgSG7AzGa0L1uKOpHkNA43WaMKPeWKvOD88BCBRtWauO1o
escA3LjAspa8HkcqI0EKhBTMhCTERKUmY17KiTFnhJqmlwpBGgMzqxApotX0utYkYk5kkaY/lwKT
BJGM0FM4bgxpAnzd07btvUfdJ4nCY8qCrnWIctIVB5HQOjHGqTY8rAfqk2OS90SmCYQfHVpLYswY
NVWfh2aPls33ms/+7ffm3/rnv/OLA/1v6McI8cKqcqoo6YIUJklBUkx9cxGn1HDKpCzJOU3dQ2mI
0ZP9MCUzRAQxvbEQEZESKbmp/pbkVCEymrKuWK2WjPt2eogIaTI9WU2UEa0VfgwoU5CQ6DyNd2uR
px6qz0hpScJPsJk+4tyewgyM+x2hnSA5iYCtNSJU7Mce6xJiO2e/H3D7O3wOCAVZSIZ8BWVLLK4p
FjPCeMN+vcOkC1R+R2AgqA4lNDoFdO8JAaK2tPuG0HUIMpIFUSpk9mQxMvoNqRmnh6TQI7WlmC1R
o0CiSUOANBDHGll46CXyXUmWGt0VFMv3GMqKpBXC9eS8R/WOg5Nj+u1bzAA2eZJsSXVNDB07Z1gt
BIMYmADeckLtCiCJqf6FmL4opCISUUpjlcUPIwhNSIlkNUVh+XhVsWsHumFSpHoCRc50PrNSkZkS
7ONE/2tTwmRByIJAJgtJJTRlFoQYmGuLi46tiFRYApnRJxSZMoBIHnwCG1EiMzfTw16B4liM3CVF
ISUuSHrghExpE0b3XCiByRFF5sBoxhD4YNjR3zaYg4pUWpo3W+ajx5qClZ0xjxF5v/vfX24Qwx7X
7VDJsywSwlviwRlHSbBNFWndEFODHjeIoDA1VPf5EVloups1IgZC48n9gNQFwzqQ5r+KSxVJAvWC
8fUP6cWMzbs9+2y4CzWukwzykov6nNPvPKH5yQ8pmz25n5GVgQ8lV3/wB/jjI5rLW1ho2reRdhuI
52fcfvEFefkRY/8V9eKQFANu/SnL4zP81R5ljnBvFXJzCCffYrjaEk/PuXpxSRxuKKxjEFfU7z2l
ffGXqNkhWRyQykfsU81fbTNvk2BrG27Vkg9+7Yzv/sMzHp9d0IlyCnDuM0pLfACKgiYEquUJpRyQ
IXKiA7NyTZE0u6XFtwl3F2m3DW5UrB4dkl5F5NMCdo5itSIUCi89FIJQlITRMLgDlnaJu+rJTmAv
vknbfYU8/1Wa24waEqGSNKFB6I/Z3f4lqa5xf/575Ns1uuvwP/2Ko38xw19eUfy9JTlkgpL4fUd7
u2deKZr1NSr8HFO+T4oaWyjGpkdUNbkZQGuwmqyhenxEu2kwD8/xzUieKXAgteHAFPSjoxCSu7uO
pmmxKbBUgkOluE4DoDFCo+5Db95HikKTYiQqRciBnKAmkUZBqRTRZdKYMKWZLlNSMgRPaf9/vLYQ
BkIAKxFMDwNWJIKAQglcuB/rp0zOUCjLyOTe2PUjVSWnNZyDkozsmJonY0dSlmSYXOlKTN9RM40P
PTKMDM6iPH8nbul/ew50Y14sl3O6dgSl8C5Nez+V0TaTXUAaRRKSHAOEzOAiMWSsHUmpQ8hh4rnf
29JSzEQ8KXp0HElZIbUhoyiLOWE2sJhXtHGE4LEShMhEkQhZkqRFCAtJYGSG5KilRquIVApdZNrO
Y5Ck7Zbdi2dEGRj7PcFrdCpZ6TNCkgxIlFlw17zlrvspKRekQVEWJ0hd4vNAzupe61qRtg6R5f1N
do1QoOflpGztdnitSarGp548zIihvIfu1MhCg3T4EMBn8EeEsZv49PIOlU7RQUD2dH6CPeRUgFAT
9MUaMiOE6fDthw26PIBxPaWWhxbUgravyOIYYRrEco62B9SHS7q+Z24kgwuoFEgyIJK9T8VNggcU
tH1ASzm9PlAWks4FysLS++l2To5orTlYFex7TRaaLiRyFkQBYwBbWe5CwghNGxI3GS6IDFnxwEhu
xsBMTeNvpQVRwlXMBGHpM+isSDHzNice24KbIVALyRASWglmeQrnfM1m2ih4ymSbMki8lAwjHBQS
6z0iTxbA2mQuijn7YeBXm5G8DmQbEFESXreEJnHwYMH5cUkI4GPiRAje3u0I3Z4iOuY5oYzGmEhc
zShCz/b1W7rWsNstuBAl2hhsVU7cbu2BQBoj2ija13cU0iIO5qRuRKwOCeM18vyUm+2P2JyOeP0+
u68ijVkxjhqtPNXiENNds6rfY3f7FeXJKUHfIh+f0TaXXO8vKT7+NutP/xxlDUPO5PMVfvRgRpS6
Rqkls4MT/N07kpsT+hrf3HA0/5icJL5Y4FxiHBO5mtFGiOUFapREcUF7N6fx59jqiHHniGnNvtD8
lfPsw8CozpkvFbOzGd98+gBpluiiZHe7xxTgIzQpIJVk4woer2b0/ZZ5qTk61BxWJfZkweXRW25f
DUShWP9pz+JkRnMXqA4UHQLz7RmLj2bEOAGFMIIGGNYOWZYoP+K6N7BasBWBcvmU/M5QyoJ5VSP8
SDaJ7psVu5+vYXtF8/mfU4hDilZyHAzxbg9nFUZLYpYU5Qzf7sALbC6ZXZ1T8Jq83mDOanKO6Gqq
guY8oIoSsV2jhcaUBSZEjJ6RnENZJotg4SYzWpFpxw1X445b76lT5ExKYgicIrFKoNJkwEv3Ibgu
JUgZrRKlERiR0fc3cu8CeIlUAp8zo5gqb0VhKPUUbJuCK46kEiYZIFKKaY05XYocGEFSgj5F5D1n
RBcK5wIxJmJQjF5SGkWzHSgvHLHdEWRJtZrj2g5jCqIfpyBzhDGOmLImjZ5Sp+/d/slvf+/4u//i
d35xoP9NHOhl+bKs53gHPnmQchrTDB6ZAa2wWhAB7wUSEAT8ENinyHy1QGQ/3a50RYoTitCPjuBH
xnFAWqjUciLKKYGpDIdnS0a3Y2wjAwGdNVJaolcoZaYdPmLqpqeEkBklmXrLeXrDN36gSZE+Flzf
Ddw2gWX5kO3O0XQjqdixD2usqXAzQz/0yOqEcnlK7u1ExFOWNl9jZME8PSDIyc29H1sGP1DOPkbr
A2TZs5IDQ+9QvmXPDGdqyCNZ9piDFSaNyKIlhgFvKqLzIAxZzCmlIBuIOuKHnugzicTBg6dIbSit
JLgtYbdHljUhecx8RSJQ0OKtJ7tEyC2BjBsrkqzw+QTDjDAkVDXHZI3oJW035R/CxGOBnKcPfhYM
ITMgcCSUNow+0CdLYRWD26K1AJ8pzZyx6FBWYaNl7QcE96a1LJFRMLpAYUALwYJJxTj9DzUrLaYv
EDI5CWJMSCSLBMkrKgnbMCl11xnWQiGFJebMMgv6GNBao7UhO89KRDZuYFEUpCwoC8XjWUnXD7Rt
z9j3UEhUJaFpCJ+tKZeS29cj9qQgNiNFVKwKzUlR03vPmBzEkf3Pb3CX1xy/rzl9VBOCxxFZVoKx
AHbPIZ7SvdrAWmC/cYZhuhVJK/BMQiO6EbmzRAlKRey8xt0kuJ6hyxk6XlAcFTRvPaPbkmSJii0H
J3MOq5pyiHR/6f4/9t6s5dp1Tc867vZpRv823/d+7WxqztWlWstUKgFhBYMYoZBkRwkIbrjhT1D8
AYJbbrofEAQhGypBYqA0WonVQC1Ta9Wcc63Zfv3bjfZp7t6N54v+ggVFscbeuzFg8I5n3Nd9Xdd5
Hieq/3Vy0oTFJTrW9N1bJJ8w3J9g9RFjUCSxJ95fUsQCyYn8TqL1A0S3QI2vEXHBuNVUzfcZ84Zy
lJAqxnBH110jcsI/es7gE/v7Lymp5jxo+tWnlH6gK4LBB+7yO77NJ1ye81Apzj+q+fEPL5jZGmlb
YpEYPUdLOPUBaRQvA9SNARdYqDmq1tzkglxe0lYtj1WFmt1yvbHIi5bYZ04pox5oolVcnNWwVNgs
0SIzryvmsnA/74gbi+870rKQDwn35meYzaeM+R366jc5FQtjg71YE04a1/wu/bsvaLoVs/aK7tvP
WG+u2P7kj1j/wX+AHB1xNkOWgLKJxVnD4f/6Dnv/p6hPBvwXf8b804/IIdOul2xv76CRpFuHuz8x
3yzIWrJ4fMbQCSINRhqEkawXFduhZ/lww5/867f89LTHB8dlhsYoQglYNbVCsmSUlQw+s6jUJDaW
k0c9jgE0WPQUekMkItFS4ZKjrqaVaKUUMiVUElgrcT6hhaS8/91SpmhqrRWRmlZP09MUA9EYcoF2
pshSYGhJIRCzIWU4dicW/oA6KOTmnBKOZBcpSpJDREpFOg0ULVFSEkNmlJF4vf2v/rp36X91Crq1
L6tWx+6AzmGyj4VQEGJKOdPFTApMJVFSEFxEhITIcco7P25hdols5uQ8TmI4oScRnRumEeaYETJh
mwVaNlR1ixawPHTcD5kxuUlkkycSvMggS5nEdCljpZpU8yVQhGYsgdMQ2B4cQWqG6sD8YWKoHT7v
Ce6Mox7p+tek2E2Z4EXRtAtWKdM8qXGxZX/KhPvAVfspJE/ijvnwmuNpjyhlUtz3e+pmjT0qvMvM
2g3RG0wecCmQRAdlxIqOVbWiiIA3p+n/UnpKSuQwx1eO3I+kUJFyTQ4SOFL8O4SPeL9CuAU2PUTn
FWO4wYg5dlGxOfuE7f41p/mXSNWTzGeI9gGb2XP8eEJqye1BokeNai291tSzJSVqpJoSlnIUCCWJ
Q6bWYtqQSE1kSkNrtWWMgYVuJuFcLkgrkbVmta7ZJ0cfBBsppoNDKnyKzMq0j7OlkEomicyzSpBD
ZI7AiEkEJ6TECMGZggpJzgmVJeeCieMeetZCsLCSHBNT6VeIInDjFM5yChEpBHUBTaYRATFGWj/i
+xP9d1vSXHFYnIidY9VdU3mJXlTc/tk10j5kNjtD9yfMcSCeOnSOHO7v2P2fv8DaA/pvfEqzXnC4
2yGMxt9c4/s9F8/OOX79F3QvPqR/8jGPPtqgiqAYgSiScuipG4l/4dEcyV2N+2yk+ncvGf+fPU29
IsQllS3TSsa9RV3Mca8/p+veUtXfw+9aePIhp+/ANM8ZyoESArvXn9EdPyd//APCdYdqLkn5iOAB
cd9h5kvK5jnxxdfop4o8HEjXBTmcQ1wwlIpgKpKd0a89p1QziOdc5zuSmHEoihdOspQ1j4KlEMjR
MQjPm3JLbhqO5YBGoB4t+ORvP+ejX39K19d0ZsbpGJC15hQDSRcuZg3WJdabBV+8uePxDOqqYj86
rpYzGDLi3HJuWtRsR/844keBVImUEqqWSFlw1rJsJF03ohqDotAWjVrMuTsYslW4/YyOGq1niByQ
V5ra1MhTQu4KpQjy06eEm4HgAmN3T11p7qLgPGTS9hv87gmybYkBdKupZwr7UFP+5nOy+pasCvF4
QuWEi45YIkFYttf3jD6yqi2CQjCBXZEMVy1DkcwXmqgEdTtj6AJfbo/867eOpwjWqtClqUkJJZPy
lGkvS0QbTXxvHJJSoEkYIyZQV5w8cOMYJuxrlSbhcIgIISnB0ydolCKlQpGZEgoiZ4wx+BhxsZDn
mpJBJokLASE1Xco0taQYSRCRnCdWSI0miEIQhVO3R5uKua4JIWBmDTAi5ERcBIHSlgiUEvBRUor+
e9f/8n/48YO//R/94a8K+i/59Vu//3fjH/4v/+Q12jyXWeJDohCQWtEgEe/5nSJl/JgYuw6DJoQA
RjLsjyzPj0gzR4qWIg2lWCq7JJielLbE4LH9wKyaIWQEoRDacnb+EN+FScRSplhWoaY9vTIGrcpk
40ppAh9ogyDjs0NVGju3vB0jO9nRhxP74vHjG5K9Y3g3YQ2F8gzdge60Q0rJod6wvPUUWlAV1t+h
h4K0LU3TIIpFjY6lnJOlJKURPewIQnNUmt3pG0qKJAyykehxhcorzvQaOx7Zpdechg4tNVW9YXF5
zjBIgu1IocHvPDlsId8itMUohTIVKzcyDCfe5DeQG7J0yENAoxhJpNwzdD163k42P7vnKL+B2cfI
0VHNZjinSOcVHzxZc/noKSkLoprQvaGAUdD5SCkKEQILrYgpsC/Q6Jrt0VNZiyYis0GajCo1F7ML
jseEDYKUAykkhJUMqTDXijFmkJGZiCAyrTAMcaBSNTEHGg1JavpQOK8qbgePFJJQCkVkjAJXChe2
Yh8dc51JOWGFoFGKPnrqoigpshCClQmIkln6SLrfM8gOMXjM8ReYfWYcW/w7wSLvCbcDfr6Cu8+Z
XQg2H51xrhSV60klULwnXnc8+M1LQl9RGcguEoQitYZTTrw6bbkLI25/TRu2/PrZHK0+JZ4Kss3E
ocd7h3GBoiL62Ybw+Rb1XFDu7wjv/oT87EPGdMJzIr67Y+g8zB5j2o+w7orcXBLblkPTchjfsVnN
yCqTKkk/t3TmIWTIi+/ju0KSDdJNquV42BP9DSMvKEOF4xlhVhNy5nb3NWL+EBNHXMx0BxhkYHd/
R5GBWEaug+GWxK50vNu9QOs5q9UcN/Qc0wLrFFVa8ujj3+c//oe/wfLTT2H2jK5koqoZlGZZVRxO
tywXljfRIyqFIbJVhnM0W1/IskDXIUpiIQQ3HVSLMy4vJS/vBzZnNcMpMKsUfQjkrBl0olQVpqkJ
w4l21nBVCZazlnd1zVtlSKPm1AfKqkdJTekTJktiHVAY/KEwzFcc+xcI37NaDuS45/zbkebP/xz1
7NeZiwcgMqpqUEJTPZyh9SeI+xmiTvghs9AtLmZEVZGHgAseMQucqj3rdcWAYrRQhELPLMK2+KxR
FrbvDjyQik+NxHaTIHM0EmWZxv0F6pSxWlDLRBccxSqk1jRMuZf33cBaCpSqCGISDh8GSV1rYkm0
RlFKpK1rLBMu25IZhMQ2Gh8DTipoFV3KVEqSs5yEsEJy6DtstIwqUBmJmlsOh5ESC6lMe/39Xc/F
QyiDJ4pEs1gwDhHd1IR+xLQ1Ugrc/ki7OsefdhTREnblr/UuXf9V+jCqyO+MkM8n1F+YHp9SJqCL
nJSTUkqG6MglUkQCkYkRhsOJ4+0blo9qhLIIIlkoUDNsvaJejsR+B1KSM5N9qExEKTuDs0cronB4
H8khQgRlFcpOgrWMmHbQCbLQhORQtSJEOOwiyi6R+hP2N9dsj5lsE6bX5GGHrDPLUBh85qz5AZ04
ks0CicUOhUrBseuRXQFeI+tLYkzEtED4mpuVYDFqfNuwO0YSgpwTSQeEtZTRk0sELG+Pd8zXA8EH
svSIpWT1kaLkRDrOSKcFQWuSvoVkkfoKUQLHmztC6RGXH+GaHhOO1CtJFJLElIZkjAVXYW3FfP1w
YjyvHmO7M7SMZDOjO2qMNfz+kzl/6/FzlvOHRArRgwsCLSAMIIXAl4TPiRgLLnoQgsFFfM5EqQhR
o1VhcB3WWjCK1awlp8SbIZON4VgihsxYIkYkKpGpxQSv2Z0GPIKlSox54lEnPEJYtiEwCliYjMuR
1hTG7LGAk4WCRyHRUjCTkiF4umHEySl5b2MEta/w3jPsB+6/u6X4EdI3lJc/wwuFvgHFY+S8pmRB
jJY0rrlYbNgsCmdrRYkddaW57464k2O+1Nh2wdOPr3DXWypREHuH0ArZJXRZkI43rDYtD3/4CG0V
MXhEgnTqUAXCTY8soFUho6mezXG3A2p5hY+WWDQxrTnVR9SZJo8OnSdYU7mWyE1h/ObEMkiamcSu
KkQxGAHN1W/QfXaCh49IJZD2nlIG0C3Rfkm4H5DtAscbji/37PoRoZZ853dU7pJufEuuB9r6Meas
xe1GmnwgWsHTyxn9i3OC2CCqOb02ODReLpFzhzS3PHww4w/+7qeo9TmPHq242XtOQuO6nkXd8up4
x0xljNLUzjHTNe7g+L5RfDcEToPj0xq+6Xc8byuuXw1oAeeLGfv9ETOT3B2OXJ6v6PoRWTfUVcN+
G5nNJLd+pGnWVFZw6ztmD87ZGIUyks3ZnFffXmNOI+H2His07fyC8dVIfKR4/X/8jLPvf8zZxY94
9Ud/gRGgyjXbD59h//nPaP/OW8Ljj6E2SGUgLVk0Z/h9RPnHmIuR7Hg/keyRlwvCzT1hFFSjRp81
aNMwbkcWD9Yop6BZsWoaotCIkugOR66PnuPgWI2Bwxh5ftVOsatHR1aC1mrIGTVF15NLRuRIQJFk
BiUIStCLwHxWsfMBUkQJRZZQGUVwmhgySiukhJgVUmVyLpxSmkK0mLp9gFQyyhr66ElK4HMkhcwM
gwZqrdG6UGLAAVJn7m+3rC8UdjkjhEnQl1KgKI33IyElpFW4dMJYRRo0x5v9j7/5p//4xx/+/f/k
D39V0H/ZBV2J7+rGkLJnHAOkRCJPYrYI5EKImRACCkXOkegndvsYe/Y3d5iqptkYUBeoMj00sVoy
lxB0hVZQpKJkMTFIkUhdUbUrLp9ITrst/WmYCioJXRTFZ6Q2pDzlsKc4cHIJFwqDK0QEd+OBsnzE
3dcj1fwJw8kQhcTlN/RhC0Zy6gI7rinFUM0FuhTiLrNs53S6Zr4siHhGlAYhGxo9IxGpVQBRk6WG
+oZgPTkckDGSg6OgEdQoZRAErNUI3ZKOmRLnHPdzQha423uEsYjsIA5IPJWpULmilBlaJbrS0p06
cjljSOcYXTGfF7TqmecZYxoR9R1tdYVd1Axdxg3vCLYhdIJcVlxeKZ4/brh68mCC4RQBMWNUmexB
WVIpiQ9hykkvCYSigulwsBaVIIkywYNUYK4ExMLZWYsgMZK4GRN9TFSq0Ig80anylH6ri0JJNV0A
/RSpW0SBAlIlxphZGoVHIPV0oAgJUmRCcJxJM3lic0HHRDx56AOn6FhXmqdmTnaZ067n9st7dv/q
cza/c4bffz5lUB8Dwp3RXDwiJoH8tQv6uxu6MXD/VcfVbyqEiwijEAJOt1tOd7dUIrL58DGLpmbU
EjUk9l+/Yuwh3Tmy7Pl4/ohfe/oDFosFJSWYa8JNRykCUxv605HZkzXuS4f4eEMOBv8W1NPf5fiT
N8QiOcktt5/9nPLsU14fv0QZSzizaHdglGtWqWHx7Ay931MvBO7lG2gqlFJU8zXOJEIzchKJxIEg
TtjzGTG25ODpU6LX1uwYkAAAIABJREFUgtenE8dx5K00KP8OISQPLz9hdbWgvrCcNytMttx3AWUa
NuKS1AvMXHF/Dyl4tOyx0mNWc37nNz5hMVuyqTcMPYwnz11O9CnSzD03caRVmhlT3vbdOPKqj4gi
eZ0ToUTqLmCHntv7A6c+THHNbqQvGacktVaEw4jOIEzG+46xCMakURRcjNyPkVVd0UpLXa9ZPGrZ
H7b4DgZTc7h9idoF8v0OpSa1/PLBFWjD/ouv8DqxzXuSnvHV9hU+Fp5+85b45Bb18JKoIvXTFd2r
t6SbwvxvSjgYzGpOcCdU28I4oFPH+brC7w5UWuFODrmqoNZQCVZLjbSFdV3x9s09znmGo2fcTdhi
bRQ/ux4430yCs90xMbrAYmUhBEBiG4NK0xrSJEllaqSYWO+d9GQ9BWhlCQjJMRakngJVEhKr1BTE
gkAUg8yCLCUUKFJMwCfgpk8oI6mqisKUSU+WzLWmbsENnkCeINuxEFIk5sistkQ/YvQcFzy5yAkK
nQNNNaV3FgkxKNJcYnP/17ZL/ytV0LWW3zXN1PWMw7TPzlFgUZOH0WRSDtMXVOKUBiUmWElIiWF3
4E7CmRDMNiDtGcU01KXFF4ltJEI43nPfUBTQlpIzZrZA1u17opmmP3WI9+ATLaCIqcOLpRB8IebE
4BKnwTGEwOnugDtmHj15xP1tptWa0xigGNywJMkGd7zDthIpd0jXI1zN8jSwmG+Y1+eEvMXPPPd+
S6Ii9BGjLCkmXNVT06OUo4gTojkiBk1dN0QnSdGRGbFmwB0rYt5TpCSrRBo6ws0tOq0RuiEXgxZz
VJvRImAEuNLTtAsOx3cgHYiEqgQlJHKe0zYV47Xj5AdSdcadzth1oqoTu+0WnUeksCgzHcSf+TgJ
w0rByff2sTJ15lPOMoxxYkKHONHpREm0CEBjc49UhpAiRmqkGIglUVUVi6XnSgS+jSPXqfCJ0BQZ
KCiG5LHvoRgxa1pp8cWjhSTIjCiRLCTde1a7FDBTAl8KOmaKVgwx00qDyzCThWWJHDpPuT2xEI6r
zZxNyvQpEj7ryV/ccLZ4hC2B7C+on1/gD3vCeoart8hqxSi3uNQTl0eK7ZmbhIkjymq8d6TjEVXd
I/OJ+bNndPe3pBQ43d2x/fkv2NmKMn/G9Zuf8MnTj1gyidukNOTTSOkdulLEocOcWVLxsAgQC2EA
sVbEO09qEoM8sb39OfrxgkP5ElVXqHlFGgYkFWW/px0Li/VD5FGBtnjdE/qB4+hRD3+N/Ys9sZ6c
EcOhoiw17u7Iod3RI6A1HJ1ku3pCd2w4nd5ysTxHVvDDf/sx3//4iuEU0N8zDH6yLZWseboThFPm
xZuAzJHOBYq06MWKH/xwwfKqQs8LKfTcvU18M2j+t33gk5nh44PkwkRErnl93/FcSv5479iIzDbC
Pnp0jnzlHd+Xhbcx8O7goJLc+IEHtWFEcFlZrk/wQGusDbz1YGvDWzfywFpOBKySbKxhd8qsjKEW
AnNxwRAzn/cd7xrLYrtjXXqqUqNHjeSESAnGz6kua4Zux7aymLDnqoK7f/kvkA/nzDb/HohCVUtM
Lhi1pZptEGT0WpJHj5kvGd8eURiaqqU8WqI2c+4VpNWScYyYs7PpXJWG3A3sbwbu7j3b20DcZl72
ngePBZuVQqgJ0mRsphsSlYsYK7BGQMpUWmNVwZcygWj8gNUNPglAosRkRfVZIRHUWuIKhFjQRpNS
RL9nBBQpqJRgKFAbyeinkCNRoM1gjcQPkSSZ3tdaatOS3zdP3TiijWE8BuImUkoheUnVNKTugFCG
7D1GQQmeOEbkYk6SGWssJQw//uaf/Nc//vAf/Jd/+KuC/ssUxrXVi6qASQE5Bvy/obCRkTEjskCV
yUIBQJxuYaVMwBnvC+H2npJBC011ViF0PWX4Sk0yM4iCQqQUiGXKQpe5UPQcqROzNZi6QdoDueu5
uTuiKVihUFqSU6Ivnu048OWrO4TNvLk78uZupE7naDNnM3Mctm9YmzkdA8V7pI7MG4mdNYQwEnzk
brjlarmgM1t86Dn1J/rkyMkSo2UYDaZJ5GQpu4FmeUQtymQDMSDixCNPwTNBGSWyfUiSJ1zf0Cwb
UC0kQUgapCTZaeJgVYXQgVgdCKInFYecjSTnEWNGqAxDnEIOTneMR0XMFyQvEX2k0QljLDG+Y5YS
OksKBpknpONGSfCBLMU0CMkgmKhQSkw+fiEEzmdSEhMr3we0kuTsSGRkcdPaJUf6NF080vSc0JJ5
2DtuA3QlYlJhG6Z8e1lAiIxWmbEMCAmxREQqBCE4xkgtND79/0XdFDXpBAI8EJaSNCJnWqNRSVAp
yZnW4Dxtn7jPHds3md2f3VDXNec/mJNWHts8x52+wtIga4m5Fax+60Nuv95Td5qSXvP4qaZKGX1e
owzs7o9UOrFZLFnNz6h7j9NA1uxvCjF/gJILSpKUPMPsvuXy9y7AOEqTYQiItkwq9+NA0QXvD7Cq
YBT0X76i+uAJ/WdbxEXFafsFQ3+LNw39oBlPHSpKfN9RYsdKCprvzRGrE7P5PWN4C1eB8eUd+xdf
I80TDl2m0wtGVRiiRB8LYTVjuwt0dcVp9FAKzdkDrh6v+fDih8zmBm0ETy6WLGZzHpxbQhQc+oKQ
HjdmzleK0zHgveTJec31q0BqKmS74KOHmk0jCSHw6u6eL6PgVTF8lzJt1txouNCaTdfRe89Ja556
z7kS3A89x37k+0pxSp4XQ2IbM21KlFI4KsmDokgJ+g52UWJby1FJ7tEUr7jNkqaq6Igsqoa1jZQ4
+aqTFCyWM+bzGct1xXdGsOVAH7bYuz1tmVG3K7h9zVgfYHakEpowJPY9vEoFe3ei/uoV1Qev0B99
Hymh2ljUb26QVYOcV8j5DDlrJ7FayihlMMZQLWYkW5EaSxISvWipZi2CTCmFVzdb3vZH/tdXO7pt
QJoC40B8G1guz6lkQRZoFoX5vMLHgDV2+l2mgs+ZUBT2Pbo4lfo9XtVMxMcicKK8p75FqqqiP0Wq
IhnDFJMsiySWiSJXlESWRCyJUBKG8v43qxldQkoFcTrqnMyIRjJrWk7+QH5vKQ3vxXTdTU+9XuH7
DpiQtkIIEplw7GnnNWEYSDkhXcLtCqun9V/LLv2vVEGXVr9QJWG9pF5qhruekhMZMVHbgoCSMe8J
Rv8mIjXnidEdKJSc2d/do7TkXCqqtUSYzfSAZEuSabJMlAAlkrOboP/ZIJnEKLUW6KZhd/2GvJ8y
yXOUNFbgfEKqqausjaTWMBaJMALTRsbbPc4qqkZwsG+xumPwW5LPOJ9Ieo5qakrpaK2FvAWnyEmw
jz3D8UC7XDA/X7IYahB3CCMZgyTrd6RaU5wjizCFkMSJNZ/RFNUQ8pLKKmaXIDCkAZp2RrB7hlPA
XKwp3YjVHSX15K7gvCd7R2o8JWqEEQgkJSVKXpLVimYRUHlJjgVjLevlGcPo2b3eU4RHy4QyC5qz
OU8eNfz2XBNd+P++GyEEJU/xipWaIBC1ng7nrBKxjCAiWmkOfUdTTylOSJBSEWOF0BnpAlprkjZ8
MF8gUsQdPUspGEukKRKdIEmBVpI3KbJQMFDQpfDOZ+ZSclZVvPIDjYIxSExRLACSpBKCcZrNI5Og
RMmqnnE8BNpzjdsm+n3klBIpVZw3ivMHllHBfjgStt9SPf59xFdz5k8fI/qK8FNLjj22g7OPrxhf
vuDhf/gjhtf3xDQiiNQmsn78jOwCyXviITK8OpCaGaTCsN2xEooniwtWDy3FBISMZHFCX83wb3YQ
PSJlyslhqpb4xSvs4xVJbwl8TtxcMnz3ZmJ7nzyj6wihQvWFM3vBUjas+I7NJ0+p8h7Dkrgf4M4R
3wSq89/E9zNChsHBYEduK8k8ztiqipsI4aRpNoIPvl/z0bNzrpYrVg/XdGNhP8JFZclC0DRzhuNA
VgmjFKMYkKXQ+cT5M8XgCp9eShAapSONzogi2I2ONyHz1mdUbfhBUYwxoheGUxacJ82zktmOiegi
Y5YsoufCZcJQOKsLQx+I3jNuBXkdWC41SIsYIm/7gp5pPgsDwcAtgktrOMfw4lh42loWJbIfBlIB
JzQPGkuKjuILi8oymy1pPvyE48u/5JDe4mNPjUc2IBdgmiXbWcvdVx0uFl5iMUHw+CffYK4+4+HT
7xOyo/ngkjGdkCJQX7TEfmSxXrN/d4uY15OGQURMrdjKEVlLZG6o1wuKjMQk6G73fPXNG77c9bz8
i55aZVrvQWWWDw2HoWOhRmy1oowOtWgJpcMhKNmA0tOkUoJWkhQD1gpcCrR2KugnPyW1SSGxWtA7
j0SxsIZh8DRWU6MYU6YoTRGZmdVTlroGIaf3z7VgF6fQo5TFpLSXEp8L83lDOOwpZvLJYyCMDqEX
WNvi+4QwLW7oEArarEhOwFxQfEIWKP20sqUMP97/9L//tdXf+Edf/qqg/5JeQqRvtda0szndwaGK
RmtBGT2lTIxAKSVBTdCDIt9bjbSmpEyMeRKHBTje71H2FReVRZYEakHRFTIbQpKoNHW6hYIugZQm
oE0J08hXaUszv+TsStHvDqToKQW8z4QxY5JkaRUiFdYLy9niI8ZY+Ob6BXN9QTq/5HiqiX2hyI7h
9HbCNJ4Ky8piGKmjxAcNjWZ/usY5h48jZSdw5Q2sF5RuZKFnlOEGIaeOQvaJVp0RdEDXDTJn6osN
Yawp+owkHCW2pJQIwwHvelIcEfJAVa0Q6kTOO0QTCZ2j3KVJuewLar6k9Bahr9CsIEvO2pb6rObt
9nry4m42hDxxAHKuUOoCNxZkL5Bt5vmjis3cstw8pqRMzppS3t+otWRMmSRgzJnhPXffhzJFKSaP
UmqKr1WZJA2DH6cMZwpDOlBJiwIer2e0uvDSeQbv3sfnFoKSaCN55RM/D4mPdMXX0UPKU7BOlNxL
x75kniSFlYJcBB0FpUEoCamAkCQh0NoybyXi40AaR8ZK0AvP/r6HZUSqTFCJ6LaE7h2yeUbeV5yb
wCwL9l+OmDhgTcGuf4SMLcu/9Yi49bguE3aSMixZPH6OsBWp68hJczj0+HpGcSPH3T0h3rGqLPMn
H1K2BrNYksaAUDWlU5SThFjjv/iO+rwm3X1DFifK7h4/PqL6wUO2N/fkqpCaiqQ84hDQ4zTtsVGx
+OCS5nZB/9M/pb16zP39O3ycc3d7y1FdkirFXeh5fSE5hnvMcslMzOiHiBWG9bNLfuu3L7CVZLWw
tNqyXMwQSZJL4sHKchwDc2P4+X5LoyVORrax4IF97ykV9CGy04EHVrAw8KituNkFfCr85W3HcRR8
eNnw5trxaKHorGA2RDCCn6fMD6uK5BwqZvqkUDHwMGU+/6Ln0QPBvgv0rrDfDdhrx+zxiu+agMpQ
ciZ0kOcG78W0kjEjF7ZiNVcsXcQlR5cVq6blfgyo6GmzRObE+WLF40cdr64j4uIJ4/aGfhzpDrfM
ombz9Ak9HUYumH/8AadvX8Npwc2x40X6CPNFZvW9d8gHl6haYBYt6GmqKOsalxIxCHI/ULqRIgtJ
Z0Qz7a2xhmYxZ3e/p+sdf/l6y598s+W7rz19jIRXPfGsoG3ifgyU3nOhJvTyXApOMZHkAWMn6qMo
9dSRZ3BjpLZz+ugZvKeqNGNK1LaaOnUKhmlaWhdIIWOEohSBywWEhlQQUiGixApFbQoxehAKFwJD
BFUiSk3TvhwTbVUxuhNto+h9JpXEMXs2stAsIOWRoCfhH4BMhdGNSCVIIZNGR/X+8iEazdAnWpf+
APhv/zoVdPVX6cP85//ZPxqF4L/IqZByJMfM0A2IVJC5kFPESqaAlKpCCEFOBSikFKfI0BRROuGj
IwWHEqCMQKgKhSaXaURWdM0UsllIEZIfyD4T+hOiFKQwWDujqmtqkVFMKWE+Zu66E0c/0kfPfrzD
DwdMa7k5HWC14BQTd6eOXT+w336D695SSmH+4IqrR89gu6fJS+SwQeWaOFZc7yKSJcaegRh48OSK
Zpi88IWRB49/yDFC7zLhJNCqJo+ZUjJZz+lHx5APBP+GlE5E58lhIJ6OoDUxjFAbQhyRXuHuImWs
0EaSiBRVqB7UBBfBVmAGZJVI2ZFspJeB1HdIofAhosJIpRsChapdU28CZVX4tQ/P+dHjM37wo494
+Om/RcmWIAQhSmIBgyDEgpDQOzfdtHPkFD3nlSX3gXmtqQoTfCYFuiKZGcnRe04IvBsoKdM2FTF7
jFLkUAg5Id7v5VorkSXwgZ0ynTdCU8nCUOBppVnIyFpMfttWShotCFkgFPQktBVoXZAisWotXR6x
q4bu2HHzZuDwak989ad87+9cMn+mKMIxnk7c/t9/jFCP0OE5V/YR7cWcm69+Rm4/p559xfPfnnHx
65esn10iqznHY+L47ohwkYtnmwl+YyS5FN5+fk9sFU5X3Hx7SwpbnqmW55+csX6qWX7vI/whIZVB
REVwgcRAvN6BmJF2e0KsEY+e0Q89PF5yc/cF+3CLSyPHqNh6hXaXXK5+xEqtMGEGdY2qNKXZ8Prl
1/hn3+ebuzvus+NmMWebCtuccDpTLWZ88MMlzQct90bx+HtrfvjBmso2rJYzbF0hjeGYCy/9BMk5
xcA2eXwJfHU68Rddj0qBKgUYPN0+8O1PpwuQGDI+BL5+2fPmixNGa3xKnAvojyPSOfzoCSIwL4V9
53hSMpVPVD4S95EyRIIb6O4yqXc4nzm4keP1K06nI7W95/d+5wN8cMTR4d3AeSN4d3/kzddfUTyg
E+MhcXAelwPvUqKVEikKjRVoozimyKyqmCsJMrM79GwPA7qSfNu/4t56zGrDUAmsXGLlY/KuxZ5a
qvkZQdxg+1dcacXiw3Oa5+eQRoofqc+XZJ+xTU1WhpKmOOT+7T2qSEIQUM0JTYNdL/EeDl3heh/4
n3/yln/x0xN+LGxMJugeXRLn6zlzpTkLmnNVc1Y1VNZgdI2SNV0YUDKSS0PMGoNBK41UkpAVRgm0
lJQcJ+4HCSvAJKiLxMSCygI1HdEgMi5JhNHT31mg3xchEycTEaEglYYERUpKzowlY2XBk7ClIJKj
UYYlBm1r2tmCUiqqZkHXe7SpKNFN9aIxE8GwUZTeE2Og0hH35iWLjz/Q/81/9z/+41916L8sL/rv
/fv7n/zJP3shpXxmK4WdVYijZet7ajIqR2Qs2AKIRI5M0ZlJQy6orIkxoasKlyOnIRNfvWPjE7NN
oFk+QtcXCGlBapAayYyojoTgiW5k2B2orcHUA/ViQWUser2hXjT0w57SSd5291zvIl6k6bbc7fDj
SAmSRmvG4Nk0hbR7AwtJjpeE3JO7LTvfMVss2B9eU5UNvmxQMdC2LSUbHl08IG6vsDeS++Q5uC9Y
zjTdaUdWiflZy6y+pJWCF+MrhG1wviehSJIpAensIYQjeX9CWD3FlmIprtDWC6I3U8628ySvpz27
8PjjdL8rxVF6hR+OUAyd66j0I6KPmLphaWeoJFjYljirSAZKKsiS6e4cZ+uGxeopyrS4sUy2tTwp
WUOcSG1ZTDu7JKH3noFE5yKSQiTisgMhKcHRKo1GTRqKqHn/sTgeRqSxnM8VYpi0EC6Mk+vBe6IP
SJm47TO6NnQicW4FG+GohaASgSAKlYQhZqQUYNRkCZQCXyKywLWLVLWiaitufeL13rFKAdnvseEO
hGWUmes//2O6aKluJYsHmfZHFS4OmE8z45c/QyS4XP8uy/UCu5oz+IgfRrZ/vmOzmiMixEpQRKHb
nUjxRDSTh77jjmM5ku2cNrcY3ZITyGri32YtEa0mHiGdXSGrmnQbEY0lh0B1btje/5y8fYGKHdHX
GG+50B8SF0tCFng8VRaU+3vCxz9k/2ZLHFcM7wKxfcA2XBNMoZ9XmN7QyoZNu+D8ak67MVx+LFHW
0AlDbhqS0JSYeTc6cgIvCrejpymFl3FgcIlKwzf3I+cbyxAStYu8OPXoq8L2WDiKxP13B3QGTcPN
K0nY7wh3PR/84BGrFkytKL4lFs/MC9yhUMlIXSkWORIk3O0Sb74eqc8VHz+rWM8bit7Q50QLiJJ4
sFS8Ch3Zd/SycH4W6cIOlCYOLUddcW5mzNsFYzfwlsSBwqczw3xmWWtJqyYb4YMHZ7zsOr64v+Pr
r19wOjouTEMZRvh6pL2csxaQRkdvj7Du2QnDL178lIe/+Abzz0786NEFIQr0aokRliQ90tpJ+3O2
wL28YSwwjI60sTRzQzGCarFm+/aGNzvP//TZO/73P3pNuR/pb2+4+miBGO6YXy4ItxGnFMoURmFo
dUHVhhggKIUoDZVquD1EKj21P1IWskiEHFhUFkRAFo0WU4BVjcaHhCwFLd8LYGUgUrBVRXERWTJe
S1wCtED4ghVTrrpWkplSHEXECsnb00hbSXoBjdQYWxMiZJ+IGHI0qKiJOkMJGKuIJUGSCBS+D1Am
jknOoCtNduBkw/1X/+rf6X/xT+ftJ3//9KuC/st6ZfHPgf+0si0xDTjCNAILmVwKgyyUKk4eS21I
vqCURAMxB4RQdCFNBSQlxphwWbDoAxcp0C4dZvYIKeeTF1LJyU4xrxjyNUmcuL7f0hjFqkRm6w2m
aVFRI22FrI482XfsjiPf3UbmcolaOnLoKRlUaYiiQvvISZ6RQyTplp2/BlnRdRFihrykUyMpvURG
MMsZcZhxv+8RySEldOkekQdCaBnHkdg7nNQ4DuxnkUM8ojqHkA25mjLH6RM4izQPyTYjK4FUa2yJ
ZB8o/TlZVWRhKH4LIqKaiX2PSwi7pgiLUBZUS4kNJIF7ewACPne4qsGKzHgUtDIhcs2x9Kja0Z5p
VAVnZ2vUe2xuKJMAjlKIJaOt5th7jFHMnaNkTysD0Qfa1pCzw0xpOEQhMMDQO2plpvAdM0WQuuxY
VxUxQ1U1mASdN/TOMxaBzTD4yFpPHfhZERQKNgvWUjHEgCwCJ+FQEtIYuhiZV3ATI4/kRCUcSmFT
1WRfsO3/y96b9Oi6pWda12rf7mui2xG7Oft0eU6ms3HahY2Nq8ogVQkEZYkJTJH8E/gLNUVixBgx
ZIZATJBQQbokcFXaZezMdOLMk6ffZzfRffF1b7O6h8G7XfyClEDKNYz4BhGKWOtZ63nu+7o7Xu0f
SF7jHjW8uvlrzr/3Efvt1/TcUT2+wg5Lnv7eJdYpjhXEBP3e0p0sKEeNb1bIaIiqcP/FnvBpxH8n
kR8Gug/PGLaZ4gr+0rH/2efsckVvtozqliqeUVxLs3qHMpY5pe8QUI2GSYi7jMkt4fOEMWdgB6aF
pTpv6D/7FeXd9xl//ppJR/rVR2y3wsWzc169+ZwthTWBRgzrMSHas3ctB634Irdc2yVf/+rvWDx+
Tmcv+eCDFYsPauqFI8Q5FreymjEHAoU0KZbGcj/t2YwZ2Qv9MbJeKvYEXm8KFyozvTpy93zBw3bP
dLxhc3zFat1CLrjUMQ6Rk9UVcRPo9wPl9sAw3eLuDP2gWEwt6wvNlASzh+kw4U4WkB1N6yil8Nkv
RtrO8A8/bPn4vSXZzcjTKWR2oXA7RIYpMXiDOluBE+SQ+dbjPyDnSAyGysN57Sip4A6JWiy2TqwX
jvW6ofINTBHb1BQt7PI1anlF0/w2D4cDqdqxurjAK4POD0xxInhLKAF/suZp8wRz/Yq7/QPH11+y
/Yv/Dfu936FpPCkGTKuJ/YhZL5l2PaI8WSZCSjTnJ6iTDmct1/e3fL478C++uOP//JuvkZsvUMcb
JH/G4e49FpdPMWWBPMwP5VjvGdyBV42iOXacdh1WOTrnaDCcVY7OWo4hc5jm/agUbMeZ7a6ZQ4+0
1vS8jYAwGm1mG2iWeS/nGIhKIWpOXdQIORe8AUqZ0xhFE2PBewMGusrOItpJaPQ8FgvGgSqIBaNh
fxw4WdWUMIKAKY4jE41TswDYO4yZjw5Ec4yCcyvi/bHaPXzzHwH/w28K+q+rnk/9n2nl/lQphTWK
UIRtDDQqU5k5dc1oR0FRUWY7Wy4gebZaGTUL5oA4RQoKnefPlClydjlx8kRjjEH7DoVCuQpt3+ao
p8DxuGf/0KMEvK2oTy8w1qJUAgqPrx6xOez45nrHXW+o5Yz7nQEzz/z71pDc3JrebAIh2DnrWMO6
ek5tYH22Zn93w/H4kqMLeGdIwzfEZk1SAydTQ1t1WDHY5QnS1OgpzNat9SkpBLTZopVGrMNoRzre
gt2Tp4ryoBDZoC7PyH1BygotipIj5Aala5Reo9UeVxeyGklqQDYRxCBiILfACYgBIqgWJRrVbzCu
pV21NFFjTaR2hVQsja0YveAWHlVkbpulGaAa37oTlEAICaMEIzLjIWOgmPlGn9PEoumYYgCjgIwu
maqumMKAdYa+jyQJLBtPSAXTdTRGkZRlczxSUsKLQatMWxkGyRg9q1+NUjjjOcaMeau8b70hG4XK
BkSzSYlnlaNQCAhTTNSiefdqSf7jE958vkN3p4TqlofDgd3tgRLOsf6KtqtZLBtyygSBYq8w5z+g
qi1+5TC2QAVqgOH6lnD3Eyr1QypzgjWzpa9eLRg/78E9IzvH2jY8OttglYApKG9mN0fSxEmhHKiQ
0An0CNJHShFKGNEfLBjDkbjPFLdkY15zXxZcS6CYiB7v0LJB58zgNaVdcXP7JTk7bkLNfa/ZlY7S
NLjyCOIB1w30PPDmINhWMwGTn22GTfT85M3IO43wMBbUYaIviZvbAy4n7hvh/FHN01J4eDPRlQdu
vh4ZN0eG/hsm7tmFiSCaqloTeou4c1I84kSjFhqvPc4XYo6oypGTgv7IN18EHJb9ZmDdTXz0/VOm
XDB95OOnnu+fNTx7tCY7jWtqdkPkuB3QJjDIRLs0+BxxIfH80XwZzdlQW0fjBaM0ShfOL5o5sMQb
jK2oVidYbbA2cuoXbO/ueSc7+r1h7NcctGXfRzY3I48/+IhSPNu7LY6Oujojb4/kkOnrp9z2LV/f
DFR/8XPef++1sQslAAAgAElEQVR9SE8RHXG2pQ8j1gfS5oi9aOgqAwLVyRXJnbAbej55cce/fL3h
f/m7O/j5G8zS4i8Mwxdbnnx0iaQlTAFdHdDKE/Zfc1xqFvGc/EJRrlq6BqrOkMeCrzQpC0oJVsMQ
I0tnEBXJWVDaUlmLMprDMePMnIseS6DzloyAVnOAYWVmh0subwu+BjKJtyRODGhFUYVSFFXriGNG
nEKUYicz4MuJQ6xB5UKKe7Raz9nuvmYMCUXFNI7oojDeoKcE1lNyYowFQZH3G5Z5+JPfFPRfZ0GP
8UdYQwxv7WhSOFCYiawapcHkueWeRZFzoiiFCBQzC6wUUJLCZY17q1QO/cgwTfQhE3Lh8l1PoxvE
ZLS2pJSw1YLFyTPCOLBJL9htj7TdHb5tMG2HUh7rK5bnj/hWCqQh8rdfXfPZNxO7IXNRV+S7gjsY
KuM435xjMtzHgQc8KYNraqaQCZNQGAgcqHQEXWM6YHpFpiLomiopzs7eIeYHxrIj2y0Pxx1qTCRV
I64iDAdM0RBGiDsUCyQOYGsYIunhFkkZJoMqF6AsYvaQBmznwByJHCkC66qhXwfCHlQqFN52opxg
F6c0MnD+aI2LiUaOLGrDMQX2R09vG7KsuZRLHq3OEamIAmlOoycJTDnjlEZSwmlDiD1DySQtBITK
ekKOMws6CDFCFEUuBbRBSsFUMxJ2s83sh4h52HPetGRGvBPWS8OQFBnDmAKjtoQUcLbQ6Hlep0Rz
3494Y9HGoo2wMJY9iUszdyu+bWfE6z5lag2b48S5r+i04slpQ9gs+PLTwG6nOXGn3PziNe89+X18
Nlw8WVFMJqhM0prD7huyvSTuR4xfU7LCNBX+MJD7A94MiIvYs4pSEsVbfK4JaHRXox4iqt/QrBT0
v2R1/m1SHqnrNeFhwOiZh591wT1bcpSeYj3DLsErOD095atPvmZQV4w7jV7+NmF3j08tTz44Q+1f
sfrwHfo3rzkO14TWMvkrvnrIvOgHciPYVcNi4fnodxr67TXVyYJshcF5/u52RwCqruP6mDmzji/+
dsfhxM1woF2P95Hp9U+p6pZp6LHLjzhsV+xfbpDQEaxjHBxpXyGLM/r+DecfvT8X61FDsKS4plrU
nJ1acvOUzhc6G1msHOeVZhTHtoHqpGM/REbRnIeAS4rv/nbN43qg+IjoSIXHWoe1CmcLq1qx6QPn
C8s4RN5b1zjmw79yc8qfMYYhFrxW1BWI1Zw+PqNYi65rUhbqpqYkRb/teXmd+clPejZfv+C9Z99j
2htU2DPtRppuyZAn7h++4dydsGwNcpzb13tledM/ZfXlyOOffcp0+T7+6Zp0jJimIZeAEDGLGieG
RVtjV6dMB7i76fkfX9zxf9/0qM92yOZz2L6ktB5ja/abO6bxa+xoUbnQtQZ/uOds+j7yZcZ4S9TQ
Lw37VOaMUjKLRtjnQpvB6jn6WLQiiiaXhNJzNoKyc6x17TQaTSLNdlo0qJnrEaRQ64SxjigRawsp
amIuMwwKhUoKdMFKIauMZMNgBGtmvrzSs1VuPyYulyezwt14Usjot5a+nDPI3BnAKlSW+Sypao67
kSopwjj9s/6bf63aZ38ovynov4b1e//0P/viz//F//RFCOH9pDJJCo3TOC3onIhTofIgb/nfmUzO
BtEK9XZmp7TGatDVTAqLJZNVIE0K6weur19ijOLyacJ3z1BuNb/cjKNUK84efwRKuH/5gofDgNne
cOodygjWNGjlOT8/57vfVqisYIB+0fLqp1/MiUKHAVU3NCtNHxeEwwNGWk6aRyTzkmAeePEQeHa+
Yq0LwXRUfkUvmaHpIVoOuyNFefT2BhsLyh0hR+RYEHWD9ZbutGF71FgvkCH7BYU1xIokAbc4IfeH
uaBLApORcgCxKCbS+IB2BdqChMzUZ4oVXNNSV2v2dwPKLCmukI5HhsVcSDsssVPYriP6mtw3tN5T
LRre/XbHx+8+xqk1UQnDlEjMc2kRhTaKfchvYxnH+dafZ69spxT9lDBVixaFtopxCuQ0sW5rbsYj
77QtKRm8WKYEhz7TNgY7CXVVoepCnwLOa/ZHIabEy2HkXGnOleZQElYJQSkqq5hKIinFJHG200nh
x4fMP64rBlEcSsEUQwSyAVUsXb3g6vFjPjPf5008od8r9snwjm+Ir0fMt2Yqne0c090DDC1qU5Fu
BR0MvBUsxod7lvYG+08uqJ5PmEYIhwO2W9L/8ob8Z3c033nC8njHzh1wJtBOGxolTLdbug9PkDIh
KMpxj7Fgpjxnh55UDL/4hvUPnnHYJ7JrKSdPCQ8PZNviujUm33MoL2F5oG5OuGsNd8MVm2uY1o7b
8Q29iqg48fG3f5fvPTvDakX9/oq7PON0X728hrGaQ5OOA+eTplBxcnxg7CdUJUzX39APd+Rpw72y
qJXjTTxFppYprEgbh9YVOY7QvM8P/2DFXb+nOzWcX6yp3tfEDOOoKUl4WlvOzg3bQ0abiPNzG3iK
Df5ZjdUO6w2nK4dfWPwBHi08lW8YR5gGkM6QpkKKYKQguXDmLRINUmusNzgimQRWUZTG1ZZFrcgF
2qbi4uSE9mxJNhWVUvOeNIbN64Gfvgz81SeRPtXQfsTx9oFFOqVaWsww8HB3w91+g0yBaO4ZtWMZ
EpV+SnALvjr+ikcPB4b/XdN89DHN8x8yTBmnOsbbAe0bclbgLbqpGMYD3+x7fvT5K/7qxxviVwe4
vgafEEZat6YPS2IYUUNPCJlQBqRoUDuc/gwfLzn0Nct9pGlaXCpkLTSVfrt3Ba3BVY5NEB5XFVMq
TCnilOJ+OFIbh6ARBV5bsiSqSjOFhLYWKQpToGBndLQShqhovGUgUyRRGU0Sw8JZgmScCNYpYiys
K0eUjI6CUwYlUDWe8TDSnngkBkoWTBLCOLF4tCIOI9Zq4jShS8Y6IZUeq84o++FxHA6/B/zlbwr6
r2nlGH80TvFPxyjsYyahaACDxZg8e5dlBkJoY0Al5knOfCAjGaUtpSiKzNF/2hoap4llZNpN3OdZ
RHX5rkVjsa6mUNBOY/SS7vIxKRw4bh7od3uaZotrFminUQXq9pSLq5pvDSO7Q+av/uVrjnee/v5z
jD3y/rd/lzef/R3hbMlCP8WNI/ViSQg1nXmKmb7kzetMsZco+8DzztP4M7w7w+TI1HZM9zuiCNeH
GyYDaIMVhypLjF5An6lMgDExydwe1FqQpYU0EVmhlwEOAd2tKeM9WntUHClYVDGYdubCl11FnyJm
3aLHJYdDRlCo0rJctGh1Q5omyrHnECPTwxZ/ajgtFxgUBzVxebHk/e9c8ujqEtXW5CykNKespSJY
pYgpk0yiz4Gvpz2t9SxQVL5lSLN1ptKaKYwoM7OZF9WaIYxo1RCyRiuPrxtszEjJHPqBxmk6axji
yElXsXAaHY9IgXespYnCPiXa2pMQlFXci6JH6FEMWXiCISfFUwpOFDklzkQwMmszDjHS1pqurjiO
hqtvt1SPn3Bz+xpvHjN8+TVn+xXVLyLVqpCtRf8s4F7VuKPl0W99hHt+gvI15dCT+4mTiyfo8Zd0
zyzKRlwQ8rYnvim0333Kdq8JB83h+A27dGBNZHz9muXT95F9QcfZY5tkHgelw4gpgfxwQ73eUw6f
kFyNXyyJ/ZZ+fE2u1kxBiPsFD/1rbF3AjmR5xMFfc1z23IQviT5B2nP5W9/h977zhI/XS046z81h
xI2zVfAXuWZ3O8KwwTjHo+UVqTEk7/Fjx3QdSLsLrF+i3QXKDDgn9KEmOs/jjxeESeHQBON4/q6l
KPgHHy6wTnHImuet5U1QLLIQ4/w6Pm0too5cdAuGPnG6qLmtI6MNfOfpgmGcka6paNpzzSHMYCXr
G948RBZVR01hiIKxNYeSKLYmlMCJ16RRMLZiueyIoVDVFlUErR11q7mWwvPnT4i5UJ2c47VhHAPq
2HN3c8/xzQH98ki93VOOn3IvX1DYc7J7zKL7Laq3lze/fsJtP/DZ3Y5Tq+lqzeP3H6M2d2xvFMPd
p0j9E0i/RSmFJLO3nNpSYiavamJU3B17fv7qhr+4uSf/6g51+xL9HuQ3OxanltP3hPZQoTcvKW5g
zBFZNAQ1t69XqyvivebUVWTJtFXBN5b7Kc4dQKBB0ZdIlxT+790qytA6zxgSkj1ZZv67NTInKaqC
BIhJowuMklh6T85CeXupFqCylqgykt5y3kthCoqiDE7NhUo7qI1gSkY3c75EU8/6ItvWZEmElCjo
OdlNmXlSqA2ShZzBOEMcEmILRWDq9+T48Ce/Kei/Tj96nP7MEP902B/RRXCiADVTx9TMRDtkwVmZ
C7kUHAWDoOysDZvfhZqUBG8taYwIavY4Z+G425EnwRk4e79C+SvQdm7TaE1bP0IeDyQiQQX6eGRR
1ygVUFqjjMfVhat33+e3s4ATxr8U3O4Rn/7NX7P97AUPmy8J2ysQxywPc7jKsz8eCHiEASeZ5fIx
1zcHbN3QKc/zD39Ifn03t/sazakbGGPNrq7Zbl5j644iAn4+FGk6tDjMsEfrRD6MKJuQnBATUb7F
N2egB7I7EPcJVSm0atBmiewiKgmiLmFSCAFtJ0qcUG6DW74zA2aGNwzjFgq45Rmvvg485G9opaJ0
73CxdLzfnVI152hnGfuA1naOQKXgNBxyoFKG2/GecyK6FKQorHOUOLHUDjmMWDPHKjoxlBQhR1pd
UaaCkYqmPeEwKZQa6MtE1pqcDvQhsqocWSXW645BjkBiFydgttm8TnOBhkwxsCiJQxIqDLdJWKvZ
Ky+S0UZmUZQuGFPYl4jXhsppLi4X3Pxfd3RxgQ53hN1XTM2SrWxY2h8SB0G6ioJBTVsuLhcYl1Be
kw8TWQ34iwnuB+ziCRwnlK5QAtok3InCvFZIlPnQmwK17+jVLf6iYiojyjlkSmSlqHRFGTbYpmL8
2ac4cbjLM1IcqJZPSK9fo+MFTWmpbzYwgQ5L1ouKxaMrdocDt7sVSZ8Q5TVowT95zu//g+/y773/
CGsaFs2Cugssx8zNcODyo4bt0JPkimcnClXByjqe/8ATDoXxDtKhIZkEi5qRgYtHHVvnef645pgU
d8dZRxFL5mgLI4Ur70jAeW3x1nGi4ZASvtYYKRxSxntLFgWNYZMzzmnefdxRsuC9J+ZEVAVbWara
M+bMVmm8JFw/Ee08yokhs3prkS4F1pUh6DifNapgnHm75w2VNYxJ8eHjS+q2wxVL5RbkYUT1I5+9
uKNPR35xc83YDeTNl7TugZIUC/cdbHfGYDwlRG5lSRNa1u5jLgtcXCxYeEXcbnlxyNwpxVgi9Qf/
AVNM6HVD2g3YRcvUD4irQQzb/cSb48Cff7Nnf5spuwOqC5T4NVa2dOv36O8O3L25ozm/xDSnxHGL
Ux9ic8aXLZtvCvTCy/ELxC84kUCzXnB6olGtpj9mrIHWGrIoKmdmT7cWpESWfs46L6VQ20LtNL3M
QtaQZwdJSBmrLVPKjAKrxqAoaCVzlGoq1GiIBSuCJqPs7JApSWEri1EasRadFCg1Q6ZQdLYihoy1
hjDN466m0Qz7HabSjGPEWQVRk5PQ1ueU60CsAv1x/yfAP/9NQf81rcmUH6WUKKFnoeaQFDXNhTrk
jLEKYxVF5k1rEVDM0BBlybFQW5Ci8NaAKv9vCzdFSoZpLIg+snl9Q7v6FdoIyp6CmtnuSQRTn7C6
eAeVhlnJWUCFiMK8xc9aXPuIx881SVuOWfM3n94Q7j/i7u5z6qsz+uvPOXOnII9oT0+Y3rzipIvs
9xMXp8+o64JFURQ443nYbnj987/DW0vWhqlPHHPLQXV4v+Tq8YJ+jNxev2Z1psljIJUjujIobRE1
os2EpDR3KpRAGWaMomqh1BgV0cqik6GQyS69vdH2qPqKZnXGdNPj3Q2qHCiDI6k907BFKg0Juu49
2tN3GMYDmxRQ3jH6npwjmQrQf599g0YwRVPUnGZW9N/Pt4QQB7ypyTmhJCOlIGQKllTKTJ/Smil5
GmNnwYvyWJ85W1/QxxtS0USJhEPE6Tlataospjb4wTCoii9ipiuFNmV8dDQOkoA1ioeUqZIiK2Gp
hUMRXsfAI1dolUJrwVMoIbOoNGPIKDUX9dP31qgxgrzH9Lcv6A+fcJhWTP4jxHVE40mLBau9RjNA
7yj9QEaom4ZAhWofo4ujKAXOkTcj9cri7wLaZtomU+0bFBXbciR15yQpeFNTpkJmwtSe6fYB5RMq
j5i1QaWJeNNT/zvfZTMZdPcMZyzTy1cU3mBdIWWFajpKmCi+Za829BIwziNpz8n5Ozy5OmFxeoWv
Goo1pEOk6wr9ULFKhg/+wNGGlt9vPcdDwgMqZ+7aSP2eJg2OoAVTFZztuFi3HEPGYtgMheenmkXt
uY4ZmTJWK96p/WxhtIYJzaiFR7qaaYBFYyVj64qg83ywq9m+Vxn/dnxmKCFTKaEYQ0XB2pqgCgrF
UYRaCTEmphhxRpFzRqM4RkE7xxQEpaB2lj4VVouKgMesataPzkniWXWXqGlgdxh589U1P/3lK970
e5DA3ZtrTJg4FTjtPsDqBSUlXLij9ob64hxbn7IMFrY99fEGZxWlf0W3PPJweEF554r82dfIex7b
aEJM+E4R00Q+X7Hdjnx2zPz4Zsu/vj4yvt6hh2+wvoJrWCy/j1cdm2CRMw3VOwxqj9FL+qCQ+wl1
XHI4OSVLoA89VdtjfeD83NPve0LjKRkWtQJRuEqzshYx894QlSkl0nnDECJKG8ZYKFmjrCEVTV1B
ksyithzHjJVIrStiTnTO0fcBKRHtHKIVzmlSnIOWSrH0Y6KqHMcwt/IjkYWpQCuqymG8Q4oiK0gS
KXr+20UJOFuRhX974XBWk2KZv9/vGO+vf2989beP6yfff/2bgv5rWP/kn/0XX/z3/+1/84VIfh+V
0CXirYI4b9wkQFZze73I7KF4y/kG5pzurOcvayGWRCLhVIUYSEUIEnABdts76hcKbcCvnoJdUfQa
haDFUrWnSPIYBF0iJRcgI3FCaYcyUDUdz549wyjNSed4yJnXX9XsNqewydyGNxidUaaw9y+oSoVS
gaXqaA8naHHk6NFNBWNHOUSKF7KdODZ7hrZhGjVJEmWKxBiRqmOyBbW0qEFQXUOZBnTyKPF0p88Y
7l+hs1BoKBEyAbTBdBZjLShB20Q6jiAJyQfUAEm2oPvZk14UKYwICYxCxgFQbG/uWJ08Yt0u2T7c
EcqIXgSKThhdZsCPMeQCoBFdSEXjlKafphnPGjNZhGKEKQveOEIKeKNQWjClsKiFY5hYdi39FBBn
0QK6VNRLIYUWhaPJgdGOmCRMMaKSokThqu6omVhUnpwzY4iorHlVRk6txRTBI7xXGRIRV+Y5+5XV
rJ0hlVmTkZRCFPRZqNGcNTWcRNJHmd1XD5S0hvVzxrghVh0P22sWT85Jp4nQbgld5ng8p5y9S0gW
bUFCZPo8snh6QR4T9tEJ6VCYKFRPluTPbkh5QEzBLh3j3lLrC9bdBdNhxLWWMg0YKxD3TPkBtRDi
i8+xJ47p9p4xP9DW3+Xm5/+KadNTqnOsHVFeSNtEe/kuMiwY2yUP6UBYrVidG8Z9Jscjsgp0laGY
hubsjM9ebtF+hTfgiuMHTxzXt44rFHUaaaq5G7M5BtpKE3LmyXpN1ziGPqG84X4YWVQNpRROO2Fl
PceQ+NBawNLVlqHABlg0DqMUj40m9Yl33QJVhDfHCe00I5lJNHVRNEajjVBZYbVokOFIp+e8+waH
U440JZxWhElYeMNhmihhLjgRQ1V5lESSEsYcIUGWhCgFDpqqoj47o14sMHZBXS2Rkrh/s+GTX7zm
r/98w10ZiZsbpu2PubAa1xV2EqjyBSZOIDVDCcRh5PydmjyArXbk3DMWxZA3mO0GZQ1jjgw/+RmL
D59RQo0yQgrD3E1wlvvdHa/2gR+/eGD/8wP84qesH1XoPOFPLjj54AllZUifXmMEutWafHukiCL1
I2UYkKxIfU+z7FhcfcyyhhNqmtuJMkSiGxl0JDlPngKX1RoJmUZmjjxxzmko6LmLFiEXRas0JRtq
LeQoLLxjHDNDDHStZZKMhnk0V6DxFRo9s94FUIaU5ut9W9doAa8VKUQsYJ2gvdCuGsSAEUWZ5lS3
xlvCMOCNRsYMlDnZEEUxgTRlfFuTckOcjpp4/E+A/+43Bf3XtB6G8KMxlj8NUaiMmglvRmEN86tC
5iKO6Le3rxlkUEqhGM0YR2rv0AgiGlXm+FMRKCqTVWYqI/0Yub+OGF1YXmWqkytMpUhqAaoCLFo7
rHNQAjCSph1pTKjcY7zBL1a0ywXvfus9Fl3FYQj8r8fC8PCYJ9+y3HzxY6b+G4Z7oa4WrNoVWh+I
B8+YNVMcQDKH/g1RHMp0jKGiPq0p9jVGR2K6Ry3U7N/sFWYaGIOiWa9QCWKYECI5GpQyeHNJ7SPa
rdjst4Q8gFaISkgeSMOAMhVKeWQCSkZjSVgkCmWyYDLee0oo2LpGjMJWS0zVsjSPcGokB4ViB67h
GDI9AkqQJCilySmA8WQpxCxYA3FKOGqmtKU1Bkcm6URSlocpcFF1IIWZwFowomaLDBFnNUOYudLO
aLxbsHCK/X5L29Tk1LNn5hCEIfB43XKCpQKGHNFDRgg8jBPazG31o0AOEwttqJWwycIVsFOFE61Q
CqRklHEMOROwBKPQGFadIy48x10meci142G7x37yGe7yO4xpYmSLf7xnbCMlvYeUjGhHCRMmW2zz
CIqFpMnHSFU5DvtIaTO5C2Q9oeoV+/4l/uxb1O3pfFkKGaJgXE0aItotkXBA0NAkkCP6yTmhP5Lu
78j7LeV+h55a6lSzVEtOuqcE5hZqqjpWEjgIaHZYlZkeXnO92TM+PvDQW5RXJJsYk4AznElH1Qlr
A2WaHSVTSVTZkKNmyIXBOIqC5D25gLU1RQSlFa0xhFhonJ/FfFZovUVC4sJb9qkgznKXBGsqOkC0
4OpqzsoNmqVYTkzFVCZUgaThNkSKd0QBKwqnKmIRtNFMonGlsD1EjgEqp+jHSOsNKQegMEhhl+Js
Jy0FrGNKhuXFgrb2PEyF08UKLZoRMyeZfT7S5cLXv7yhNp/yu+89J+z3SIZ28S59iKhuAdZi64i6
PTLd71nZljo1NBcN0cscE1oSaVFzf2MZ/03k7D8+Z5CEbSriMOCWLWkwTMHz9Zdb3vxVhBf3qPBz
hvQ+Z6s1rol4NzGVjDUtehg43g5YfTKbxfOeoCJ0S0iF8RColg5Rhrib2AwZ4p7m2TmD7DD6hGPe
U48Vp62liJBSQkSjTSYWjVMGipr1ORbipPFGc4wT3hsayWjv5+S2nDHaEEl4q6mUn/UK1hJTIRdB
lMLYub1fyjwSyRj82zAZvEb03JZXRiOhzG346fgWMavJMWO8QaY51lWXmngcQHeM/T3T4YGUNn/y
m4L+a1z3Q/qzEuKfjscJ19RolZGiUNZhVJ6DPqKQme0L1hmCmbOsbVYYLSAZyTMcRAFOCxSLswql
KnIOTCRuxoTZ7DnkF6ymyOKi4D0os0Bpj1b1fIEwDUiHtvM/cL+/x/SCNhHfndJ2a+zzhn+sMmMs
bJrCbrxA+3fgZ6/ZH27x1mGnzLI54cCSQ9mirgr32y+I04itF2i9wNeG1Dh8fcb962umocWUR2Qd
KdOBNBzQNlNkmtGtY0DlgOgOoyu2D29Q6TjDXeoaxyx2cTWobEjxgCShFEH5M8z6lPygUbWDrCjy
DYSJkCu0bynFIeMjtErU2aHTRNh5dnHLZEaC8fhnV5yenqJpCGWe/yUBo9ScwiTCMWWyBmcL1nqy
nqlw3tZMOeDtW1Kb2Le395kpMISMw75VyEIRzZCFxrYMcaK4Fm80RdUoHIfDiHawH9M8gmkqJHmc
y7ggvE+FyZmpJJzAIWeuvOaQC+emMOg5r75HM1JoreKnsXCV8wzJCdDWNXVOlGBIryy6u+Ru8wUP
129wp44TLZROo5844t6S6sS4OaJXjqa1HB++xp58TXYK3V4xDA+ILdi64/jNHfUqs8RyeBFR9w9Y
NTE2itAtWZ+u0LkglSaLJk6Zpus4vN5g10+ILz9HWNCtfof7v77Fy8fY8gXpcA/NmvH4gPOPiPcH
lo9OsY1wWXtU3fDJ57/ArFrCCKftOxyOW/r9A3HS2OUpjXZstMbYzJRGnj0+Q2Jk1xtSydzuR2wL
h17ReCGiqQSsTcSY6DzzOIbZc58yoAtZgwYGKbjWY63m/3iY+G2n3xZleBkLS5XpbM1QoLKKsTCP
CIzQi8bowEOMnGuHemtTnJPB5uDkIWdqgRWehwJ5yqyLwttESAVMYZcjxipWtWWMlspWmFKhTQel
IlJhTIXkgCjAZb78ZE97lmnVVxA+5Xe+9U/ZbrZcX79iHx84u3xOCBsGs0PpQr3asfbVLKC82xOr
mtGOLB63lMOBZXvJ4ZdvGPoNJSZUC1knqMAqDSqjK8Oxz+w2PQxvEAJ5/w3DIjHeHrl/1dM8f59w
vAOZaOJLnG9m7PUUCKFF+zUpJdrTijoG7NEQRsu+SkztG1yyFMzMe4gzDttlS9CZECKds5iicGZ+
YGmZ2/BZmM9nJ3OhKW8564qZ/Khm+3FKGWctu3DE1prkEiKKShmyaFTMGA1IwtkaTKK2FVpr6rom
xIy1mpITojOiFFOa7cia+fXvxKKAlApWItZqchxQyhKHPTEc/0M5vPZq8Tj8/7mgm/+v/mAf/+E/
eiCG/9IhODPPvdCWJIUUZ2DHIWUS841c67de56jwygAWxYwjVFqR3v6yopn5wtbNlg0MOc3xq4ex
MA0RUsY7j/eLedaMRhmNMRqlDMY1aGMJ05b97oHc795+vkW5lnax5tHC04eRf3OfWJgFabPlHMUP
//jf5/rFG0KZCHXmkO7oHl+gfOG43+JcjXMNQ98TxBDzliwnkE+ZpiV2rEm9geJwVUNnT3BeU19e
ULRGcsUtwDYAACAASURBVIeuTmdCXZ6IZEplyHE/29Z0S6U0Jd2hV4GSBzSz95k0gF1iRSO5zC89
7ZE0kYJCi1CVBeQGLZeMegWrM6Jy8PQpH/3Rt/nj731Et/iQrB19FkQbDIpR5jnlWCKgmKaBQMA6
wyFBjSGETFc3c1StgaKFKWdq36KKkJmbMgnB6EJRmWVTMcSBZB2tncnQja9Ib2/6qRSmArUzGGOo
Gz3Hp1rNRgrJKKJS3OXI89rTknAIZwaWZrZDOVF4MVRBqLKmtoJSmXVjKGlkfzcyfnNARqGUipQi
lz/4LmZ9xjBZsAtcv+JsWtNhaM9rtERK2GGWHbo46pNT4qGHJJQI8cUBqOn3wv3LW44Btow8at/j
6dmS06s1pR/QKaJKweSMbALDp0eSBKaffoI25xBHioMYC1PaM253UK85uJFB9sSwwZ92VE2Nchn6
Ed92lCjIwlK3a0oqvOqFTmUsiZO6ZqqX6Kpi0Ia6bpmMg2XH/Vg4FMevSiFpzUIbhij02c7dmOzQ
VlMoGKUYJdM4g2Q1703nSNqwblv2ydBhWeHwUXHuLCvMrC8pE6MWsre8Al5L4i+nwMoaKlXotMYU
yCFTa0sughFFZh6vKYGchNorvBRymq2Uh5ywzjIVjRWHdw3eOeq6oW4a6tahRHO+qOfAHTIyHPj5
33zG//yjT2AIDOO/4umq5WLxLk1RnK/eY5nXpOvC9nZPP+059Ef6fqAPiTTVVLmC0eGnAYkj7XLN
cR9Zbl/z/upjmh9cYq7OUQEkG0KCuD7hq1c7/ublA5/dBsrmCM7QrBZ4b8hhQtWKMQemYYBjQReH
mhQUT2UaKisgA6u1Rk+WtanxPmOXEdXMkbMl12jpULmiyyuWVUVlFN4qjAJVBJMLFbPg2Gv9bzsw
+i2PPWZBlTJ7zAsorVi0brbUAsegQENXefopov/+BE8ZHWed1NIbdNGsfIUqQr1uqWuHiML4GUCT
UiaNgaA0ja8Y9yPWGiTN+ereC31/pFlVwAiSWaTXNE/eqxbLD/7sn/9X//Xnvynov4b1h//wj/7z
2vCf+pTnF2hJKAuhTOT5ujfPlM0IOaNVxBKxZFTJSJkozKp4jEKLozKOOGrI+m2hVsSoZhCB1oQU
SDkTQ481E1VjsNagXAVqJr2hZ8+7VhpRE/vDG7abDU5l/KrFNSt0Mfiq43FjiMcjhxHq7jlBKtYV
9HdvsGdnLFbn2HLJoS/st1vEFPRiwWEQYjEUqcFcsDp9RGuXuLFH5zIz0ItgsqK2J4TxgXHaUHJA
TYk8vaHoDUr1YGeGO2pE4kRJkRhHso5IaSlyyul33mUcDTKNWBI5JZSyUO5mEE0eMQra8zMqY1AY
quocqWt2sWCqjtXVJX/0777HP/rwe9jqnBHFGOa85hgzGk1JIKIYYj+3+K2lJACHKYpS9BwAUQq1
s0gpWKPRopAEvvb8P+y9ya9m6Zaf9bzt7r7m9Ce6zMiMmzdvV77G1+UqYZuyXZIlhAdITD2DCQyQ
YcSICULCA0vIAgYlMWHAEDEAgaAkDEIgl8tV9tXN2/jezMjMyMiIE6c/X7Obt1sMdvwBDDwoRH2z
UOgcheLss993rfVbz5NTpnbz7rDRCm0191PCeI8khTaeUoSVb6m8ZRciVaPJymI8aK+xolm0Foma
A1MTEbyCqmRySTglaBSVc6SYqMTQJEUaDe17WIbTnlqVuU1cCXHaEr68IZiB/eaS9YtPsYsDymTJ
QVN+FehGx+qZpz5tUE4QVZH2Gbs6wa+WpKQhOPIOUvLcfbVjOwTSuubh/jeodMdC3/Ldx0d0j88x
ZpYOlZQoxhONEBs9BxOdp9z+htxY7NHHvPs//xFxOGNqTrirA/t+y21/i/U16+98iG4E2vlgu7m/
5tXdryi7gdvxAdKWnfN89nbkZQ6cWs+LJ4ezEEQbihiMb7kPGZs8xghTLrTMrfLKapSZL21ezQCR
XDIJQWvDmGFXCpMorIbGOQIKVRKlZLYhzaG1knhIiUESogxWO3opLMXwxWbgOBUOJVGlhCpCHzMh
CkYLW6UYLaQy/10MAZcFiYUchayFfZI53FosWVkO6o5oOh6dnZFGw/nREYvao5XgMrx78w1OJuTq
Ld9+/ZpHJ4rq5g3h9gu+/8O/Qri8YrE4RD0I7XKB6zRDfCCuO25V4SZf8FAijorF4phW9TS2o9Id
i+6cu6u3PEqPeP50TfeDjurZR6SkMc2S4SYQjw95880dn38z8s0UyblGxkQaXnN8fki1PMI2Z2T1
BMxTHj/7lH5Y4NsjlK3AtYSx0Ogl/WaDbrc8+/4SrTe0JxbLLVHfoCYwdoE2Bu08xULtFUnPMpYY
E+RM7R3Kampv5hm/zMQ3UXOlHilYr4kKjFbkIrOaWgxREhmNVoocNCgDIohRhJKwXuGcx1uLtgat
HVXjCUUQHMrMBYFkxX4qWBxp5spgjaLEgDGFIQw07by/XqYJK5mqaVk++QHFHV3+/f/8H/7hnx/o
/5I/f+8//c/+jX7K/62UrBurQSuUNXOr20KfE5MIQRJj3JPKiJJCJYILZcZflgLMmr35+FcUNeMH
ldYUmZ26IgrlHVPIFKMJKYLANAYsiapRGD2vraAMKIXRGhC09WgdmfY79ncbdAnUjcPYClMv6DrN
Waf4YrvjqiTGfc3Xn33B2fFTqu2G6KE6KCS9QXRh2G0wuqLkjKQJYy2rLvH040f0b/ZIrhBlaZZr
9OSoD1ryQSTYiMiIalekqBFVodpj3Nk5ebhHVw7SCFSY6gO0ffY+OHgK6RCll5SbhJYtwgRlg+R7
RC/wVUOOPVXV4xrBdQVT3TNkWJ2tmKYth0vDX/v0mL/1o+ecnP0Q41ZsY6AoM6NVyzwayQhRMm8e
tmTtQan3czcYx4ll1aBywHs1i1JUppAZi+ArRz8NJJlTrnNmFXZjYuEqtAadNUbLDImpa/o4oXxN
Ekhx3l8dSmHZzhpFh2HdWFwWzp3DoamMgjy3CKdUSMmQiyGgEaUQo/BOU/vCMAUWbYVFeNgIO2N4
9e0X7NMSKzX6pCMrRby54e6Ln2HkK84/OKA5XpKlYMWS7gvd+SHaV5AEMfDw5S2qMmy+2BI3PUPs
kfs9xgjNsOXT3/kd3OER+qBDhhmPK8bQX+9QYyFfjaRrKOoRUz8SGsfbb3/K/qiw62qu1YoHzvHt
jzlzH3KwWHP+aI1c3BLKyLf3X/LZ/SvUo4ZQTVzdfEUY7nj32ed8M1WcfrjgJ48OEb8mGD1jfJsF
l/vArSisLlyEzEopegtPvSUrodKahVUYKVRG0Mmii8GJfq/jFfal0HrNWBI5FXKSObhoFDc5YVXm
lSRMEe5T5DImlknx3IBD+DxHdgjazuHXSgSd5g2KWBJlTAwhQ1GYLIQiFBURpzDO0DjLhShWbQtO
4+oGXVmUczw+6eicxeXI21dv2N7e8PDlt1x9fUn/MFBej1z9i3/O85NH1A8bltWaRhy11yw/9jA8
kM23XOZfEJt3qBxwpuWk+5C6T4hckm1kGh5Io+CixoUl7f6C89/7ANUdISpRhoFIRqqW+7sdQ4xs
Y0QK9JdfYeUt2/s7+gdFjJqx3FJ0wQuE7R1KTyCRYXOBypdofQ36Etdc0lQtITwgpucq3hBKQ6vO
0e4IXdYsnWflFLVV1AZEEibP3nRtDJOGvczgpkllInM1znsOm9aaIcWZMpdnx0PMzKPUedscdKEA
ijnMZtXMjVBKg9ZMuaCMoqo7YlZUviLFTE6FKcZ5lCiFFIBUyKFAiWibcUbhPYQpYKyg0ohG449P
UPXxyT/4L/6r//LPZ+j/Ej//4//+py/++//7f/1vPut35oeVm9dNRGiVRydFwNL3iYJjTJGYDEYM
yjRoMjqBiYLzM61IUJAEawtxymhlKVlTOU3BocgESUQ0agJdZrLwQ9hCikhOLI4e6A6e4v0BuA7J
DjAo1dGtPmA82/Pt51+Sv7lAW8X6THDtI1x1zCcfe/5dNP/Hz77gjxxcuU9J19dcDQ+U4Ybjo08o
3SHaVdjmGOUM3q2IMZOzwpeO/ldw+NDi9ZLbcMtDb5n8yBQzcRKK6Sl+hY2CawC/ItzsSWNERaHo
CUwFsoP1BooiXil0VYEP6HFPVb2hqSPTFCnKEydNiQ/EaFD0pGjwaU2fIUdFkcjl3RVpumQqz5mK
gl5jVEdWhpA0xs7VcLKC5ELOc8gty2yGSzmDnlt21mqszsSSMWrGTUatmbJGKCht0aKpbIUWRS7z
TNXmQuM9u3GH0Q2aiPWepBWDMbjaUe0C1JacFKpMKDxxKhgteFEsa0hxQkSRMtwboUbm9l1W1AJK
abSGSUWUhZgSjVVMgFWex99bUR95Uvoh022mO63QQyblPeFmR64G+vGO0Qr7aWTZLAmhR6+hlICJ
DoDhmx226pi+CVRhweEnR2xuvsSdd1SdwdyN7IdIF4VmEmLOVJWb1/4WNSFPDPmQHBrG1/eo3/pL
XP3m50zPHhEXme3mWx6GM4JM1IdHTA93SFIEpRiXt+zSZ5jHW86851auKEFhonD76ht0LzzdPOFk
+BFXF3ccfvcD9juFdi1DEAqWtq3wY+RHXU0MPV1yHDC/jA+YiWylCIIhZFhYy9U0oZwHE6nJXKfM
mAqnxiIRKmO5HSM3JbE3hUkrdjkxJeFj57BlYpDCnsJtDNTGsmOenwaVaZgDn1XRbFNhEDgxiklr
RsksFhVUsHeWlVQ8x1G0QrThaOHQqnB0VLGsFG3TEnKG3ciblxeYbwf0mx3dsUZffcEHTwzL1SH9
F7/EsoDQopoN4W5A0gVKPbB5e0PvHUZXVF1m2L5j8CPHj5/AZo89PiX2hUEFBnlDWhegZ/z2C+oP
PiHsdrjVknE3YWyFDkK4SjxsAqZdc3j4nH7bk+MZrtaIgXbhyeOACm9JU8QYhY47VOqZ9HxpjWHB
lU6kmGn7BZu+Q/kZUf3Uax498VRSWK4HkJHKO2JxhGwZ5uQoTs3dGCUZsaDSHEQcRsE7SyhpHl3q
eaXWWY0kjXkvs04p4Y1B8kRjZkOayobKeQweZywlQ6UrVNC0yxplCmnKiIdcZo+6KRBimNdYY0C5
TIoJ4y3e1aRxoOkq0uRIQyDuJ3KWT9+92r2JyX5VkK9LSV+J0l9h5Csj6eta26/Oni/GPz/Q/19+
3m3k5J/8yT/9w9fTeLIpiqwsYw7YXDCSUMoxpcQQItrArg+QCq0oxExE5UljwbeKvszVtxFNi8Vr
hyRLSQUtBa0dZCFZmcMVdq4gSYlQNFIi92MivXvLqt9wGiYW6zV1+whtVmA6RGmUXdOsPsAu79nc
3hC/vOTpkDl6Dq45RVcrnj75iL82zVTznyfFWzLXVwaJe969GTBHH5B6jXYvSKOmhIGiB7R/oIy3
uOaMoAbqVYXCwpCQ6pAS7tCpIOMslNBiKUmQ/R6mS4o/wKwWCC0ybBDj0GFAmyVJehTzbdW0Ead7
RCmsB4mPAM0QdijbUvKKLJbJaKwxpHGD8Q4rs3qxsjW7QVO0wwjkBDWOXCCXjNUyu9A1bKfI0im0
LsQ8Yx3HlGi1YooFg0ZjUGpecRtUoLY1MQjKeYwyiGS80oSkWNYdIQWiOGqjSNlQG0sKhYVZkXMC
c0BRiZg0bdMypYgyHssshfG2RYnD20zOkZ4epSMP00iUTAjCsiR6mTkIycyZDY2mnzRVsRx3J8Th
ng9/63tsbvaEYUMZBfYTOo+4MVJ1H7N5Y+lWinalERyumWFGzhnSPs0KyEXH9vUN7amnPxgx4wN6
+xZ/t2P1/DlTGFBG5tHI+xxAmhK+q+hf36PPLP3dA6MdycMt92XPlM65e9hzO0akqlAp49IX2HSL
O/gLxGHAPF6yuWi53FySvUXFgiSLqg3Sa1ZNTT06+os9334U0UTGVHBmQRwnlsqQS2FbNKr2fB4z
P2gsIQhpciw74b4f0bVmGzK6U2xV4VoMB16YCrQabqbIqTGMpbATmRP9RtFpzS/2kePKsNZwGUHp
Mrddzdz9+ajRdGaW/yhduC2ZVmViKhyhAY3F4FRFpTVSWY7WFTc58uRgwfWD4rRpSCWzU4q2bZCU
WXcttdfUbYva9Uzjhn/xyw3u1YZH4Z7V2QH1UaLeWJyfqM5WpH4DD19DmykqU51FTq3j0+y5DSe8
u6u4vDLc4dm7gUkPrL1hXSrMODPm0deY6wfkXQ0nBekTVmliTCRfiNZwuSu8DTBNBh0stxcX8/jJ
fYzJHZXUHFUdogP3emB4uJshWiUS1QOVM4wjKKMZh0QWDc5D9ZhiPPdFs1rC5MHngpRA7SK6gBOI
RuNVmslrOVEpgyiLSgqr5gNYW0UsGaXngJsq5f1hW8hToRjBa4vGkHJGiiYxJ9i9tcSSqU2eiZPG
gMzdO00hjoL1s0ipco4SCtM0w6lmEUthKhGTM82qZoojzaJBqzmom3Ni2NywKAFEP65q+zhl/tVc
HEkKOiu080y58PbLYVQib5TIS2f0S4u8NMa8DLm8jKm8PPuku/vzAx2IOfmbvfx3mfii0hrtPVoZ
Mo6VcVg1I/4pioVz9ONsv7rd3DJGcIcrqn6k0RWDgJlAFU3lDIMEtOj5sAkFhZAnRQGcYcbIao3T
Cuys6CylEGXgdhsZYyQGWG/3HB1nFuuMrQ0iDnSFdaccPvqYb0fhYXOPebfB1m9ZnCpcc0LbHfLR
8+9glGZVPH80adYLx89/+qc8TK+I9xu0PcSYBSUJTWcYh4myuWayiSKKk4OaZq0pxhOigsnRDxvS
/e79HmdAqYjrKoRjUAl98JicBR4SynwMcSBvDEk7bLVGV4msdqS0BZ/ISaFNhwoepSdkpfAHiWkb
kHAP/gZnDzCDQF1h65FcFKeHa3784SkH3QFZzYAO0QoVEso5KLM5SSlBTUJjKvI04miJMc6tcl8I
UdDeMaREbWe6npWCsY4SRmzl0TlTTEErjyqGoB37KSCupWhhzIUUI2TFsjbsh0LRoI1CZK7ck2i8
XzDsd1hTkyQStaOpFXlQHC8NQxo5KpqdihSV5hZ8TBixpCIstGKKwnVKHFnDJhVca3nycYfrMte/
2cLtyDhu0ftIVsfI+lNKfULEMuwjOmZcbcljee9sNpjjBfGbSN7scUc15XpPFdZUcoaxRxArlF6A
U7Mu2MxMBGNnoJKuLNpVTJffMPkD+umCq+Gfca8Mt0rYLz5EfEO1a+nEs3SadLmH+gFpGva3e4YH
Q3fWsklxlhYtzjD7SEzC+G7D7mHPQiUWEpm0YcwjRikW1nIxBYx4HJkPvKW1ln3MNK1wowpJVwyl
cGMCXjMfDo2lq6AfIll5vLNorZAITaUYs0ZUZFsUWkNnPFYyz5u5nVqhqWrN/ZRZFIMymqWBhxTR
OfFtCkyhMHmPRXGsa1yd8U1H5Sw7cSzqJX0AZw1Gze+NxoHO0PiGPCaKNdhU2OwLaVQsNoq8syjX
kt684eCjM0LYoG6/Qs6P2HzxGSH0VBG6qsUcfYpcXfLhs7/C8KtLSimIjmzlEvKWadxxrDr00uFt
weuCrgspNUxDYLE6IPe36NozbjfwrMJutqRVT28ekHRDmX6DlAnKElGBsOuoasv9pSJNNfvtCuGO
ujmctzz6a7Ib6M7XxLzHmIJSDdZ1ZFboqubR0RpUIYWC7mAQhWfN/ZSYRmGxahlTYa3te6CLmo1r
KaOtYsqCcRpdFFHmNUAjFm0t12Oi8g6n1GxcUwXJamZXiJ5VrRKpxc7fVymcnQUuutJYrRnTSO1a
Qpowogkyh++0hj6OeECSzCbOccK0ClXXDNstpXHkaSBsN8TpGrP8lK5ShDJ36yTPDA2jLZlIZW1N
KS+01i/0jENhVuUIyShefRnGovQblceXIQ4vndUvjSovPeWlCduXJz/45O7/Fwd6Vvrvl1J+jzRx
IMJaCqTMOERK5xGjGaMiJk0coEyz+rILLUZpGC13D4E3akJtAVdoWsP5QrPUmlgmkjIYhOgcMN8W
rTaQ5vCWEkWW+daf4vwwGl2I48j1eEnsR97/lKnaHtc+AjqUEw4Oj4lhw9YL0zRxc31HzpHuoKda
rKhqy/OPPwRg3Gl+duE5/e4B+5++Io1fkGOP7D5DtyforsaqLWNORFsxqB1Pz3/EGOaZ8a6PDPuJ
0F8gjDgdcesDcuhZnRwy7rek0VPubqFtUHUCN69omPoAKUtQl8T+a6Qx5LuE0SBqRbM4YBon4BJU
JmaPsYE8TZjmMTavKZ1QKo0wEaZDfvT9c/7CJ884On+C4MlKEyUjVgFCkIJVMCXBakPOwsScFA86
o5ViLAVjFJIT2ILRmpzfixpKJFvNVMBah1Y1U2K27SWwqqboTJ8izuj3NCgh5kCxEIrB5IL3lpgF
bw05R7QraKUxImirKMVSKNjKYKTiaOGppgFdQUkjrRdCSeScGTRzyMdAj6KUxKJ2OF9YHBr4wRF3
f/ILbJuQm5FKF6QeCSuIPrO9H1m2hv3NHavTA+JuBylCL6SvN3TfM+SLn9IdHbE8hW9/8WtKrTHN
I+q2mjMhrkCc0GNgcXbO9ZcXuNazf5VI3Yf0dz2bZkf+dMXm6wjeUy9O4W6JH0e6I0V9fAjj5/jz
JbFqOVsfs32mGU3Fu/sRM1iq5Smh2VHtduh6h3t4w7PwI1Z3PbpueHl5ialaWl0zZsfB0Zq3N4kP
u5ph2NF5RVTCLkBc1/zzh55PV46UI1YUHzSKL3cjh/USM2m8tRiduJFENsLXBKytuI2RTw4qauA3
08Tv1RXXMoIuhKJ4rIRlp3lImafeUZLml9vAWAZuf/7H3J9+l+XikFhlmoMO11qsN2yxuMawiYmu
1RTJ1HXNQVdB0LTaUIXCeLuj39xxdTFQysjJYWLob9EPN4xX15z95AnDwxJ7+JT+Ic4dsLM9JV1R
mxfIAK08xx/8gPHRCVpd08k9QRI2ZrQdIOy5efWOs4OPCPc9RW4QVyFNjexHcv1+lBgTWkXKNCBp
i3J7VJsQvUeVLcJAKYGkz3DqhMRjWEZkSqR7x8QtUhJiIaqew85R1cfsb3YU39EuPOtlzTQGpLrH
eoVuPJNSKAzBWEJylKaQlWbtLI2zRDKdnVPuTTXDfJQWsp4BMpbZn2Cdm10Hel5DjZKJesbTRC04
mTMVTjQxWXytCCWjzHygB6VorGEi4loPfvY+GGfeB+De2xm1gAS8Ams0RMFSYU1NNAHjFWPqiaOZ
4U4oPBrjYZ+YdcV2Tu+3lZvHdNagmS8uoiAU8KIoSUDZWhQvJHcvQqxJQYgyj5miqvnypxc3Otxd
G5tvvOcmq/HG+/paCdeNrq9VuL4m726qkm6yyjfaN9f6e79f/j91oBcJf2eX5T/MaaCMAyHCc1NR
K6CyjDLbuDz6/QNQ0FaTKPR2QowlFMXGCm/fXLBYO2w7cuALD8MpZdCo5gjVKpSALYUker79TwXn
Z6mL0QqtDTrPu70UjVKClgRZM/Q7bt9lVIJ2veXgRJNNA7aj4Fh2JzSuYri7xqjMbhuQcovKBbvo
0E3N4ydH/M2/XtH8QpiqRN294Nd/JEz9/4akFpUM2pzju4ZxewMrzWX+hmnzcyY1sE8LRNy8wmU7
jJ0RlzENUCIxaMJ0jrZb2qNTcohkJlSZKO5bJFzgqieUdEchUNunRFPjK0vpLWacPc851OhG0GWa
d7trxxQ0eVRIXGKqCuqaF3/1E373J5/w5Dvfwa8fkUQjZqa0jVreP/iAUUxBCNqR0kSvLceVY7Mf
8Qp01DS+Q0pkyIKdhCAZ72tiEozzMzZWFM5ZYpqoW8d9P6CtxStNURavK8YSccYSww5nLaLK+8sA
REbqpma321JVFZXV3G0nDo3hZpfobIWUQKUdVmtIhuUC7nvNs+LZjCNjSYgU9pK5CYlLyZwYRbaF
EmGxWmJlh/3xpwzDxOVX/wOlROLUkqvH7CZFPWQWUZH3kbxMxLCnaIXdTxh1iT3JpPwGf1Rhdm9x
PzGMd0v2byLGHSEimABx02Oalryb5hWhnULGiOpWqBtFvmlRwwnN3TWyasnjNXm7Y3//FcOgyU9+
RF1/l+Xhh/R5x4k6Jy8z9xH6bsPt/oKjeATxBUt7S9e11NnQ7QLVdsOXr9+w207cK8fZas13PvgO
Wz0jW8UZ3gTFIwcuQ+U8r3PiWjsee8dv4shvGc//PEXOveNDowllNit+GyaoKu6JbMXxuDbs9cjS
GT7rB84rz4TiTmceOYPEROfgRCeWObGYMvfbPfs3W+6uLqmHBv3yhuWp4WBZkLrh5HBFVVe0RmEq
zT4XPlg64n5ipQU9DjS6os6BPAzspj2bacduN7J/e015+TnT9Weo/i2dy8jlI2y6om6fktw8Ront
QBwMsRxjr3qOVs8Q32HOPCfVAcfvHrjJE2/KLf1DT1SJ+rRBGodPryBFzNE59vExqZpzFiEEkuww
CVSo8MFzMK3Z2oahrGAJPLwBO6IrTQ5bhslTzGt036D0NbGMoAa0RKw6ZnvfEdaPub/5luXZI2Ly
bHbXiL3nUB9ycvQEbXuM9WjnuRszMXmscVgyWmXGMPP0dxN4Zemcew8BA2LGGMdUwoztVpkimXWn
2Ax5ZjoYx/00YbAolfFGo83MXIo2owBvPEOMHB8eoQWSMjTdgjxlFosl+36kuJYYR8ZxR2sdZRJS
TuiiYOlo2gUhZrrTE7ZX74gUBJg2t5SS2E0JpQwpqzlXI2XuDjvQbrbOiZqxtFZDTIpKQyjzNg4a
JIOpDcMoNMw+i5A9muVxDKfHRYT9FMkCUxiQMiDWkvZ71m7FwJYpjnjdcPnH/8t/Hcr+P3j2u//W
/s98yl1kXIL6n/aprDc3d7z++tfc3t7j8sRxpegqARWxVoBIHwOVN4gxTFIQp+klcT+N7HcPBLbY
6h43bhDAVJ6JAtajvWC1By1UGmLJ2MJMOtJz8CmlNP94RZBSWDaOOET0lHF2DmKFPCFTJuXwXuCh
KG8NvAAAIABJREFUQAneGayp8M5R2QqJUKKQ84jSGm09VX1A1bQ0IuTdSB8yiGW/vUHXS0q5xR2s
0W1LVQsnjw7JzTcULaTwgIwXWLkn7a4oqp9v6EQkT7MsYWHIOpF0JDhLzjV5WpD2DTkukXSAuGMk
7gGLaVaUkBFdUYYHpnJMjo6SHaayqHpNznf45Ql1XZNsj/iM+AXV0Yp/+/f/FT79+AcsH/0WynQM
WlPK+wfazKIFAYYkTKIxFMIYaGwhpx4jGUVE64SrHPsUKK4CElpZsJpSLM54YhS8d4wxzyl9meUa
tdOMKVHbmVhSO4eUAgKumtn8TeXYxRFnNLXzPISAthXbaUKKJpRCg8YhZEk4LRRdcL6AhWwslTdM
Ymism53tIoieq47KQlGCrxTOGFAG2zTkAtE9nscc5xV27XFppD1t0OkB03Ro51DeU1Dkm4w6WSEX
V+R3F4hW7LeW/qEQ3igsj1jFhvX3j3FS0DnjWo9SQsyKPCXCdWbYTdy9/qeMw1tCuGDabeiiwRaH
GntKekBp8NuB5vCM+uljxr3m7mXm6quJi9eGRT6h3h6w1Kd0uuGZPOLjfMSZOmYpgakJ3Nw88Ori
nq9ud2AjTxuFt7O3WinhMmW+yYksUCkQEX5YWY6VcKAtz7ziFwGOlOHVFGkLbIpgiuLQGkIWRgob
IqcUXiAciXBeBDcFTmLh9fVECSM6JeI+4EvChcx0s8emifjujmrTs351x6myrFLHShRLE2mc5qRy
+G3h3HnWk9AEYZEyad+zNkK+uKK/umO6vuPtn37Lw13P9p9t8J2iW2rU7jXdJ2fo7jXH5y9Yffdj
hv4dqbonfPWPWf34BZ4NevNLFs++Q3j7OdXjmlI8wzeKd33mdv+Ei2lJUIc4rbB3e5ZSWDaeZyHx
0b/2OxQE09X02zvsskO5Iy5HzVfbntfXW/bckh5+CeMdlARqmilq3iDbjA4DRfWodA0qgnOInbMY
frEm6goVC6YSTLXHddc8PX+MyC21V3R1R+Ualr7D4GlTRR4y24dMtTBs0jhXxno23dlKkYogArFY
khJEFUYlGGeYKHg03iiW3hMFQik4P7976/cCpch7wqQWuoXBeo02BuVAeUsBTBFyEnIqxEkYx4IW
oaRMKgmv1HxJcJa6dhhr8F3LtOkxSeFSYfnsMbpbglsRC4QoxFDmSl+BFoW1imIVohRKzz6IucgU
sijKzDBCmflgr7yicoK3iqaev97UCucUxmhca0HVYFvG7BjVitGv2SZH8CfsS0XUq5+IOvm7f+/f
+3f+5B/+wR+8+jNdoYuU/ySiP5j6zP3dBZuHW9alQKVZ2hlMUCrNKMKUCpSJPtmZ364FV1UsrGVy
E7gG2VgyE72+I217Elc4HJv7zLMnx7hWkXICVTAotKkgW8gW8e//TSWjtaIykCeBaU7pmveI1BJ7
hmEi7Efag4HqYEu9PMDWS4x11OtHpDBgq440bAn9lrzpabOi7gyVW/HiO9+j8g37/ufUS405/Du8
+uUfQ+6JVz+jch2NyTyT77KbDGF/T6SwVxrrPA9uQ2wWRHk7PzjVmiQFowIuFoZgICRyGnBmRTGO
lDZAwUtN0WtCeonWnqrRjDtLxkCc8bagcctzklzOhiMC3rd02hJ6B+0p//rvfsqPX3zK4aPvY5sl
Q8iINsQiGKshFUqZfylJQg3sQ8TbjCqFkCNK1Lyz7BpuxwmnDUrNX+etYTdG6towljAjH5mFLVDm
HXHjGdOs2HVWE2OmsYptjliXySVTlGBF0eiGhYX9GFi5BZSMMi2KwNhrFt6ym7ZYbSgqsUkJUbOU
5bCpkEmz9A2tg4dhYNHMFfsmjlyGiSYVmuiIIXLqLS4npK5QH5zitx5d9ri0IN1ewMGKkAOLZYUy
BtV4ZBtIfg4Kbn79GfXxGdub1/RugfILxH6O7hx315on10+QlZvX8TKkXKBS7PZbejsSju4J3SW5
GWEErTSDTIz7gUkKWS24TPfcEvgbjcP0BTaGtTkk1jXoyP1+4PSDmoNFRdkUnj5rSb/ekLTl7Tcb
IHEfI2++uOc3KVD+8ge8qB3dOGJPFuhs+ZuHK7562BIKHHhL3E+sMcRh4rnX+CB8N2mUTvzJfmLl
LJUS/uJBhzWC3SeWAb4JidOSOUdxSmbKiXfDyMM+cTtsud4lvrO25D6AcbjG4feF072m9QcMR5Zx
vOHA9CyPAmo3kF4pdkPi9FlmoRwqayplmIxF+sz2YeD28h6jItvrPds398R+C6ailne4Dw4omzNy
/xFBXyG5ozp/Tt72NI/PyJUnv3vOYuwwcaI5+W3C62v8Ys0QazCG2xLZ02GtpY47DlvBTHvGKeAO
vo+7+paDv/3XUVKjK0PuJ3xpULEjNJZ2ldEO7prCmC3zvt405zEOTynWQnSIXVCSgrBC/AmqDLM9
7nCJprBuT9C5In5okTji9IbWNozbCWUclT3E5Iqjdk2nHBd95KASVCp0fkbpLtqOtjEzRMqqmR+g
DYIhG03lHaEYnElcxcioCo13pCxIioCm0jBOmXlfpaCywpqClYI2Qmehaiy+ckxqpn+WVECZuZCY
Ip55i0aUJam5uyvM/BGbNHmKLA4PUXZBvUzQGzQ9duHIOVJCoN/dk+JMszTOolyDRIXVHp01YhVx
XpXH2/kyLWr+88yhL+SksRqmrLAOrBacg1opxqSoG0OKQrCQoiVYQyoV+3FCN48w5LlgVEKM0/PG
2X/06jc3/yAr/R9//Mlh/DN3oE/TzV+OSf79qRRCv6XfvCPuB1bWsKg6Vo1Hvw/LDDFy0+8xZcQU
xV0eyBgSmoFIkIiyDqksfvTs+kgZFD5aUoHt5ornVTsn3ckUp3C1wUgh20S2MnvTmWlSlRWUGPJU
8K5GF0ElIZtCkUgphjhGJhGaMJH7ETmYaJcrTHuI6zpK05K7Bdx59g8PjMOWg6ToDj1uueLZi0/4
N73h//rZz7npE9v9X+Tis1vS+A5rBoyKiD3l+OBDJnvP7gFs1CivsdGxXQe2O9DKQ0qIzJzjMg5U
jSaExQySESjSY3We10D6C8hbIJLCYyQfUqJGyfl7DtsW9CUxZsqup5jZFCatJxeh8StePF3x+z/6
mEePPkF1p0SlCVpQCLHInDgXKBpKUYxZ8FpRyHhrCWFE4VA54cVjZYYAOW2RXLDGIRkcjsp67sdE
U9k5pVRmVa4xQu0NIUcWviaWQtSGbVHsi2bddkx9P6+pSSYo2EpmKgrvWsI0UJRHSYWoSCgT0GJN
YExCzJGpZHLOLE1Gh8LKW1rtUB5CyWivaHXFr8qGTgUeSsJTqGOhyVC1FRKFYQFlH1FpSzko3N2+
43RVI0FRrJCHCaaE8pDveug0UW3nyv7oAJu38LWjjPekeEB6fUn57iHWCbF/oH50Sn/1wObdrxiz
Yn/bU1ohZZg2keQh2gGhBWmYotBJy1pNmMWamAMxjBRvoOwx+0CnCr4Yyl2PC4XpRlFXCaFn//It
JZ4y7q9o3jywAB5Cyx9uHH/1dyOuHHJ2doaRxCPf0laa+23PKgXKMKJDoovgsuYnAv/43YZ4/8A/
8YbfOao5P1vQNUvOneHXbybUbmAxBGpvmHTGh4nVfU8pBZ0mYprgdUJdFjiryMZiSia+fYtdO5re
ku+XMC2xGpYrQ7zs4dXI5cvI+Q8XnH50RAgjjfPcx55h07O7nxgu75iGhN72HD6qcf09Xl9jC/T9
W+z+K0KMJNOR3hYq6zg8deQE5dHvEL/+OZ3XLNZPGGwABXEz0h4f8PwHa4Zvbnkiwvm7HWcHaxbd
Y0I/sHt9zYssrGpHmvbY9SnT/QZrPWGI4DJOCova8fRozcuNIaYT4AJBk8IAVQNMYG9AAuY4Yf0B
8eZbVAi05TExWaRsWa4WyMKye7ulcZnOnGIbS78bsOkp2oPGEEOZWfAVeG8xPpO9RhvFFOdMjFWW
KWmUsRjlMMYQU8YYBWLIKfO4qZhKwSpNyfOMW6QwBWidQpf5neEQDIpTVyMBfF0jY6HrOhDLNCa0
t8gYscaznyayzMjoUhJeOVTJWGNQRQj7CWcriliqbon4gHWC8R1FtZQ0sb+5oIyBpqlgtaRIR9GK
PUuU0bjKo/Xc2Y1Ok7OgNcj7aXdReq7eRShaQYRoFcrM8qJi9NzFcO9XpROoSaEmsFTzJURmJr7W
GmcqChgo/1EW9bd+/ev+7376afv5n5kD/WH/0oyl/AFFzDglYn8PYccSWC08rdcs1h2qMlRVwuwD
QywEKwRV0KUwyUjRlozQdDU6jmgpTPt7Dosi9pmF9ky3GX15y+bwHJ0BB7JqUUnN1Cel8CKIZOb/
bsjKksThDVBAKwGT5xeHntvIQSnSZBhiYhwCzX7PyfkJC2sw3SFGabRxNEewHXv6zT3xdoeykc6f
YOoVjz/6gN+OG8aUcLqw0D/h4leWZvfAuhKGIaIWHmjR4nF5BudQCQnFXvZ0y5N5zeb2GudmChbu
A4z2SAkYKaiSMdqi2AMjzXKPkRr0TNwTM/OyRT2Q0w5E8NmS7YJpUshJTSoH1Mvn/OjjU/7Gb3/K
809+jF48Bq8JUUBposzhtgRMsxqHfdIko9mGgHWerCMp2hn+gJC1opeCsX6Gu6p5hSXGiPeOHCOt
FrzRjHmiso6YJpx17HOgtgalZ9Lc2lWEEFjXNcRCo2pqX7FPe9bOECRga00hUxmNc5atBLoWcp6d
1zE5LrJw3CjiAJVopinSFJAoTO8DcFO2tO9pdOeS0NmS00QmsgmCUhaXC8lp2u+eMN42CGEO2QCT
qtlLYtm0s3zIabRK7N7+DPeXntAPX6J3FV2dGIsm/+DH3P7pTwnVxLYP1M5QFf3/MPcmv5ptZ57W
s9rdfd3po7/99bXvtV1ppzPtSigVkEhIMEW0U8SgKgsGqIRKQgImTBghISExKiYwYIgYIyQopUhX
ptN2pn376OOcON3X7Wa1DNYxf0FlFYNQSKETcZrYezXv+3ufhxAFKir67YgwGb+7YXzzGh9G3M5j
q/eYxYFhUvTVEU61DCEguKZVFVdXA20yTOeB7dUWUde4aaSZNxz4BtUIdJuppWb2wRL36y+JXCPc
FWb9lrP5nG5j2FycI3TLTaux7znuH85ZGcNs3tIhCdMetx/46uKafj/yyErmVfGbD39xSfh6i/yw
pv2k5nhqsNbAXPLF9hrxeou4GNhohbGJ6WKHSIHVyjLbjuy2I2k7EUVm/PJbmoMV7eN7MG5JvmMa
I9t+i3ID9ljRiczmcovrb+njmjP/e5jV3cHS6DKyeNXz7E+f882zX3J8eoC6eM3R0R/B9SsODg5I
MRKnSNOu2N/uyMf32X99QffpAkOgchuoM+u3L9Fn75K/eMnyB0+YxnOGV5/Tzn+fkyXoyrI7F7S9
xm/OcXLOfvM1qs4EH+hf/gL/wSfIkyVSSpTVBBfQTQOup02CmVFUdoZXByAfItIF7AJWG4LJxGqP
XlVYOVBJz65ek0Vio29JcoESgqODkgy31pJCy/7SYI9m7PoFNzsQRpc2p5T0OqNkRFeObRo5MDVR
JmLMWKXpnSdHwxAzrUoYKckhIaNEK80RChVyAciou4BZzsScaAQlv3I3LeNSZi41KI2QFckV0Ewa
ApKEVbLYImUkRI8LjpQSk5+wMhNTRImEUpqcE7pucNst+kAjiEThaLoG7xJ6VuOHkd4L0m5DHmBe
G1zssfUcH0fQDclVCGUwpoYhUtvSghNIhBAEIpUUhFgCtzkJUgRlSoJeKkjyLl8giylUGlAZhBKE
kMlegcrklNGmHHpkAfX8QfD6519/7f7k/fft//T/iw1d5OZPQpA/DkGw327pt5e4YWS5bIjeUTeW
qmvJItG2GqEg+hZN5u1tz4GsaLShD4G2yqS8R9uBq3TO+uAVySxIu1uG3Q4/nDA/+ZDty3IwUCcD
STlSbki6ohUKUUlyKPKGjIYMWcQiCZAa5F3ZRpbye5KZIMD5Hq0iPo3E1KBVJufA8n5CmkUp6dqa
etYxTlvWt+tCQBIT86MapTsePHmHn/nEgRV8e6h5dlTz1f/1T1ASpJhj7YqboTDZzVzStIa+3zNK
B2EgpYZxvykPUnDEbPGxJnkNWZCzJCGYeAnc4FNAxiVGLql9wKhE1IJReEJ0RKMZUgWqw7Yr0nqH
EUv02SE/++G7/O2PH/PRx59iF48JtiYkmBIMZHIqFKnJR6RUuBDxMRJzZMoZpTRXQyILzfwu4W51
Yu8jQUV0hkrWZCRRKhyZGDyHsznRl2pDzJGUJI1W9G5CF6M8UmRScuxzpBOGnfM0usYngQuGyoDI
gbkV7Po9yjQkUXrkPhv6MFJXGiWgo3i5GyFIUvJ25zgRkr2YWFrFqCU5SbSpiAjO5ofEsUxBeDfi
88iti1QZ6spiZSmfLaQlbgt2OKZEMqosTvs9xiiy36K7OVE44rUCU5E2O9rVPdQH73L7Z/+UKQic
NyRVs/cjtp7h0WRVExaP6H/rcPU7+JvnhGGL7mbk9R6bF/ggqOUEYU/Ka578S/8ychCcf/E5MUb2
qeegeUIjnnK6+gF2dMidRS5UqZxYzW59SX6SENcvSOs12d6iXEfd1KRLy+ZLi9ee77x3xMxIRJ1R
U0QPa27fXPJX//cN28uR4SPDZ+8brgaHvdzw4y6jb3ccv2qZzjSVSQz7Ab9+wVwGjNkRbiLTFoYr
RxIerhvE9Rvunxzhpg24HmW+JaVT4s2EnmWkl3idaRcnxPEF27ee2dEDZj/o2P7T56iLX+O/kOw/
VDT3Z2SfqSuBHCfEN5ecPH5CvLlk755z8fQLHj44YvHD9xmeXrL4wRHi+RxxsSaONRKPDY7h6VOq
BKwdTdPh9wJTt+ilZRwDzVGHmbYoNNYoVB0Qpx1Xo+FqL/FyyXHzmP1M8+q3/4T7f+cHuJs9qqpw
g0e0BiaFVg1Wbgi3ibAWyFiR0hmZDmkbkpEIq+DmBrmQiM01kxeYIEm5Rk0nxNCQbMXlbiLHAjoK
aGZdjYqR+WLG8aGiqyXRRaItF//OSpwQaG+RCFwsZe6EREnJ7I6h34qE9J6FkvgMg090UnA1jkit
ONKaHHL53DnTmbItGakhZbSqqYwmBUPT1KWCKg0pZaKAmVVMwSOlRQSHVZLhblPXJiNlRstc0vap
WNvG24HK1sTR36lVa7LSZFGmWHJSTDuPMonx9hIlLGlexuGQ18S6Q5uaHOeFbRA7AhkhEkKUamNW
FKJlKjZQhCyXxpzIUZKyIsuyTia4k/wAJqOdIMm7j1MUOVjOZMrhIAsWOed//OVv+39LSv0fv/+R
vfkXForb7G4eh9T+r87pauwj/fZb9utzxt2eLCJVbZBKYqwhCkmWEpGLHEVTFvEcUzHwpoRJHuUl
rVwxlwdU8YDoa/Z7mLYt5682mLxgN45EMZZRpnALIqOEJ9mGpCAjcVISVRFySGTBgWqBMiWwIbQg
SF3ACcUgUnSjMZCGieAG1DShZCR7j1CSFEraWwvwg8cPE34IaKNQWqG1pm0srYCDrqLuLHJ5D7+1
XK4lG1dxc+3p9Ql5eUqwHa7t8C6SVU2Olv3oyWkkxwEy2ONDullTHhLtSWEHeQYMgEWrj2mqBdI+
RKmOKQt6kcndHNEscbuapJY4fUrVHJDfP+aPfvSIf/1vfcjjT35Ee/wesl6StKaPpayUM0iViXcV
uZwEUwH1EWQgolBCMfrASmqm6NCivMQ+KYQqituqqtBRoRKoCEZIlEzIWJSpOKiExAiDjAmrFIKA
FIXVLaVCCklCo63AJ0eUQPYgIjqpu3J+hgTRZ1QuBigjJdy1DH5HNUspk7MipMyQAkoLNmNg8BlN
6d2tGouVktYYbkOiFxofMqDRWpQ2gQFJIAPdQU1SkdyvEXks5bpKMfWvULMzsjgkylPSrmW8qIj1
KeOuZb/WqPoRywcdzcMZRI+2uig/R8/2Yk//toZ4RL81uHBA0CcEDpDtEQJLmgZicrx3+hnHjx+h
aku63ZL3O/S8xb/+hmZ2AINB1i3SVUxvPGKuSNuRUW+Yti8IQ1+CfNPA6qd/B6ktfnuOiAmVAqt5
woWRY524uLjk4vqar764ZHy+53tNpv5qT72P2F1AfNHjdy+JN885aCVuu6GuNesXb/nmr75GjHuy
94Q44eLI9uYZftWxfn2ObmbIpOjeP0T6EV17Zu9+h/2zF6jD+zhlcGHEHtSQNUo2aK85+O49/Iue
tE6YaKhsS3u2xDWaurKc//lb/AhyoUjbC1p1SnPV8cH9h8wO5riU6dqauAlUJx1cfE3Hnro7IXz1
OXb1mPjtDvP4I8Znv2F2doA96MAITLKoyxe0zSH7v/w56vET4qRJcUCkGXqa0YUjun3itF7z6Eff
KWNZTU2IGXWwIpoZb/aRP/tiw5//3LG/htRfQV4DjpzmpHiKEAphJMYckLeWRj1gDAo5u4e1S7LS
oBP9oBnGiphnZOaIUHP0sOVkXnO4BJ0tQgk6rVAOrCrZu0oVtHYfiyVxSIUZkpxERItCldk0FKOM
YCLSKqSMzK1mypkcJGOMGCvojCTEXEbGcqG91VoSpKGe1wQpUUbjHHRdjbYaLSSmUkzDWHj9hHLg
uzPslXFXha4bkBKfPUInXL9HEqhaQbU8Bn3AGCr2+1t2N7cIDSIEgvfk4PDjRE6OGEaykMSwgRQJ
qXAhks+E6MumnSUqy7t1pngK5N2+QpLIXFLyKQrkXWBUIsrHiPIri4wUuZBzI8Sc8SFAyhAjIstP
Y5z+3f/k7/2jn/93//1/8+xfyIb+D//z//ofDxM/DC6x371gff2SzWZPiI7KSpQGawxohRQKqTQk
MFoXEUXw9JMj5ogfAyIE8pBRwaAmwf4mYlJHGguCcNEE0uIa3Z4zVW/Y6ksGmXHGsFicglBU1tLH
zJQyRkis0FRGkERAyIwTMOVUeiOpjGYJoZimiZQjxEgi42MgxciwH/HOkQmFfEQEPxUpgStpzOgd
hBIQi1OgbioqY+iM5fRwjnlwwG/eWl68key8QtqK2gbmi8Ri1pP0Ww7OKrS8ZOKKnEC0BiECdTvR
qAmZHSlLgtsi1W1htYuBaGp02iKcYmSLtz26E2SdEdkQnCNFy8HDjvr+nO98csZ/+Ief8d53fsTs
4D2M6UAb9rEQviRl9ryWxV6X7kQbLidqJRhSOdDs/UQlBVZEdIhokQgpUNctLjoaZRAiF2KaNaQY
aCpDTh4ZBVZpvAdrJGMcEXWZfQ0iY2RRPC5shZ8CyhS2+054rEmEPLLqOq7HHicknba46LB1xRA8
i6oi+JHsQzH2OU+rDCZGDs0d5IaEFYmd9+ickTnSNOD8SO9HFm3xp2tj0UIVpaRKxX5HIuVcHM7J
M2z2WGWQwZZn3BqcqLDNAbvffokcNP5FD3FBqFdMW42/gtTUHDSSxXtzpAhYGUg2EpTg5mZkI3qm
TcatK3w2OPeM+fEcLUAwYn1i1RVuQBwT2QvGuMa5K966V6gwsXj0AeLNmtYcYnPEqDXabDHWETef
w3ROd/oOzdEHGHWCFDPGZ6/ZXj9ns31GXe1pbUPo94SbLZevrhnfbuF8x+ryCnv5muXM0zSKfL4j
PP0K4d8wDr+mqq7pdMt2sNy8XuP2Bt9b3vz1Jf1as71Y4waLDZrTe6cczw9oB8Hq0QzxzR5rM/Xy
HjJYbD2j2tc0swb95ksWucbuX3N4UNOEJeI31yhxQJ0Cy8fvoGeC6miOlBW99AxBs3kmGf0Ro2+Y
O8XjT06wSjD7YEa+uoT9c/Q8IN1fo/pb8hdPmf/sDxDVvMxqrzpinGOcRmhBPW/RSpOeTzTimJwO
MPfuMQ4bnn/7jHFc49yGqemx0wuemBecffd76HmDVjViSig7w80qnNJ883TLr/cDU5VJ13tQLSJt
ENxDtIL6XoVKV1i1Jw7nhHSDnyDKFifPcKlFz5ZUVUWtNStTADwYAVlyeCaLqEgkGqnQSGolUBSn
hdWKMcQClZKlnSSJVEKhJRhdrHZOF2NiJJNEUV73LiFUJtzdPpXMpJhpTCZEgdYFMAOCZdcQg6C2
FpUydaVpKo2PAdFqwpjwIZBDwk+OVdvgh5G5NdRWY7UqpfzJITXE0RP8FhF7sJn56XtEWgINw+1b
+n6PkRInInreMOx6BJmUHTmW6abx1qOqDj9tSaFM7gS3QUiFH69Q0hJjwFCgOOQipplSQuty6SFl
lEhFQCUzKWSUFIWoJwSVuZsWSEWEE6extAr8HiEhp3ElRPwP/tM/+Ufhn+uG/urN65P/7B/+l/+j
y/rfdiOMw8j15XP2tz0xRmQCRZFjKKuRQgIJJYqIo6oLIciQ2Q+e7EufUnpDXAtELrdh1e9RraWy
ksZZQtixCa9YuytIgbpest94urzEsCBj8V7iYxEG1EYihaO25VaXTCLLWOJyQpIp/Y8xRxAal+9O
UkqSU2Y3Tjgig5/Y73YoAiIHsiy3KZ88mRLWSzEThoHoJ4TI2MqyPFyhlSWIyO0y8XyX8W5Dv/kV
zb2WTm7Ju8+Zy0S93ZCNY7e9QZqIG9ekIDg6OsPYJZttX5Kb6Qalt4g8IWg4YgZKg/B4rpniCLYj
GkFOmexHVC05+WDJx98/5t//o+/wycc/oVk+pqnq0i8Xgj5ktPxdslORU2bwCa0VU0qAxAdPihKy
ZOfLjVp5MBTJCpny76VIpy2kUJjQWRCTp7GWy+2Wru0YQyQJRdCBJDKVNgx+wlqL87H0p4RGJIFU
Ch8CXWUwuRjVRJZ4wLQNkxuJUpSbdFZoYRhcYGZLcl6IjPcJEQtu0juPknDhE29TxonM5Z0Y400/
IqWFpOiaGYu2JWdJV1u2RLJRBJGIOtF1iugCafIoFTCm9NZSyKVKEQPDzS/RZ/fw8ZpYW9z0Fvuw
QiyuyVc/Z/6dFd3BgtoaUsx0yyVx1OzOPbtvEtMlpKwYNezda9AbVKsRdiC6W44+eUh93GE2KWOR
AAAgAElEQVR1TU6O/etvobrFeM/J0fewN2+pqwZTabKKqEqjbINeWlIf0eaQ2eMPqJsZ2szIG0Pw
DaOs6eOEmCRVGiFWvPzTXyC2ChEF4duXxNefI2+umJ0c4V+eM1x9jZ17rIicRcd8fUMlEyIM5FeX
kALxzTnTzS2dTdw/e8h8s2NZzViOgerpG5aHS6rrEeMv6RYzxKgwUhHXG+pW4/evkOYGqj1p95ZZ
u0CtK7pPD+Fqgxhf0o6HmPlA9d6KGBXVqoEahk1m/n6HnRJ285pqvOb0Z8cs7x0z+h43btl/8S2z
k59A8wDxtqU+/oDxl5dUD+f0NrO/vMApj//2itO//Sn9LpLsku3XDn12D3vccmtq9pcVKbVczY8x
g2WxOubxk49YaEv1zj3cMCGbFkcgnM3Ybx2/eTXy55cDkwpwIzEPW9IE1b0zupOObqnL5M7oCB6i
0yR5SkoN+B6pnxNsjzqEbh4QbeTwnuXokWS+iggjWSwsoyjOeqUl2RYu/uuUEFbzRmq6uoRmR8DJ
hJYapQVZJKIUSJkhJ+pKElOk0jCliEZgJGgyjdYQMwKDS0XagxBEJMu6oalrpJKouxFRqQCZsW1L
8I4US+BOZAVyKhAwHUkEjLGIuwOFlAEXR1R0yDgyO1pSzZZkc0pOkqG/xY0DIQWUlWQCWQSkgRSn
IoOLRZ2eYk8OAWEkKfaQM+nOBeLjREoTQjXlwiWLNEgJgRKCkMrGnRNImclRFlZKgeWhdLHaaAUx
ggupCGfCiJSlMifShJBa5bT/438uPfTX5y9k8uZPnLP/lZBymSKMDoZ+R9+Dx+L9gEiQcqBSJSUZ
KQnuFFz54rPAmKLNO1w0mJRgmggJohsJw0Rcwtick03LboReTbhqwdrfA11zux7YO82wrbBY9v2e
Xeg5uTdHVzCfK6zUWAteRiqlSZMnCkii9FiUtriYSvpQSioSzgt2kyfkRC0lUz9QhYgaHeTAfLGi
nmm0ndF0M8RMoKVBYxl3W5yPiMljZy3dvOPh4475ssNIwXrI/FlSUDUMbuDl/pZH7z7BTQP14Yz+
4hsGFGnwxEEAnuvX5wi9xY1AVuTUk20FYkZFQB5BmjxGNITcYJKkawC/JVY121Zw78Exf/eH9/m7
P/4+H3/2+9Tzh0hbAm8hweAKB78iM5ZJwzuAi2LnElKVF3UXJVIKUhKsqprkHVNIGJWYQkKpCucS
IhtczngEbWXJImCMpncTq64mxkAUAqUlfdZIo9gnj9CKFBJZSVqtcT4ysxUhlVJ2JRPryWOFZgqC
yszZ7AYUhloZUtgzN5pxHFlWFu8nlMhoZZiEp2lrpmlk31YspOJoK1lYw5vBcSANr1ygQ2FcwkWH
MprBjdStRidFrTqmyWKkpUoD/bTHmIA4mrPerJmCZ+5gPtPUyuKeP6c5+Izh+hljf4OYrUhjRCZB
2u2pPnyX3XDD/uIV+uRekV3sFW43oWVHvtoSVaCXL7kcnrHnDb6vmXVzlKxpZw31YgEpIxeOcX3F
rX+F14m0H1icgNwpchxIKpCGK8RhRwiwPHsHMc6gv2ZWR3LYkZvM+O0V8t2PaW4bVH+Pw3sz8psL
wiqQL77l+tUl1fc/Y/JXpPs15sU5q3uW7XQFrFHzFXJ/Q5ADiZr9N0+pNhuq2ft09xvE7gJ5cM4U
vqS9J4nb18zaa5ZnD3DbX3H0zhnhsifKU0TVMI0SeWjwby9pjpYFlWsO0Isz9td/DtcBtUqcfe+M
p3/5Oc4sGcKOKjZ0waFnLXNtmc0ki3cT65uRcfuKts1o9QXd/FOM0tjFjKn3uKmhak8YbvZIA+Z2
Rz5S2HsL1PUVff8KUwnquiMPA9XKYFrDNPTkZs8UI9UqcvphQ/VKYJLEDZJ5sqjJISoP+3KhiCEQ
MggXcGPAHlpqn+mfCXABf95jVULXb7DzCqXGYv1r7jEMb8FmpJwhjKaar0umSY1Yf050DUGeMsw8
AofUGdEJMholNRnBxhfR0tLAma7wJJZ3hDVtMp0SBYvtISBQCiYV6UOm0ZIxRJRSuCSoRAmRaSHJ
qvS4pVJEAUKlUorWYDW4XDIxqEBIgkZbJp+omprsE1IYjPGMUiB1JoRQwFIqIUKCWObFhREklYjT
SMpT6dPr0pM3RhOip64rhBb4GOhMTfae2phSic0CFxI+B7QqvnZrJPgBKUqoMsZIVpY87MmBMo2h
Kpr6kCQCja1IdyV3kUu7UqUywlvbQrvMGUAScllntYZKGybtETFCzsR0R8WLExHxN99Df/r8r97x
Pv/PIdi/75KtQ1CMU8T5QD+OeB8ReSD5iewmfCg9k5RSUZZmSUaUE1FKICEIT/ABnxKDCyBhGi5w
278i1q/Q9prz9IqrYcsmw61K3PqpnPSqjjHM2a89ya4YfGbc96Xcmb4hTbdofY0uB8My3ygkRpQw
hhIGJRS/ixzKVB7OEFLRg96lNYd0V4KfEvvRM/mJGDIiQ1UZjDXU8w7d1AQy3kWub/fI6KmMpWnn
1F1NVVcYH3nuRsao8X3PeDvx/ruPiKMkmQO8qXFTJKtyIMJK6oNDkvBoHTFd6V+JmKjbh9DUDMMS
oeZUyzOUqpHVjCZaghiolGXx4JSf/uRd/s2f/ZgPP/tDutV9ZANJlRG0MQsGL1Aqoyms9oJ5FWQE
O18OPIpMyOWl9an0xdzkSklPwS4EwJBD4ffH6JDaMtd3gRKt8MFjTIOPgqQMUmt8zihlCN5jdI0K
dy+FUggys6rCxQnueNApGLS2xChR2jJ6X0JoRIJ3CCHYhYnGanZuJMYSgElBYbVkJBJVRuVEjpk+
eqooqRIMAc6kIOXEPkxMJK6dxypBDJGjRUuDoY6GVhpk0FQKJILtrceLwkWoK4MB4rBHRod7c4HS
S/LW4a4G7PFDwrUk1wvSK41dzVBWYBpbVKCTQyjNzetv6a+ucFqxGW7pDh4RhxElGyqhaQ/m1KlB
dxXrX/+a9fUr1vs33E47hhBoSejakIaI9BLbCmQeqXXGOoE4/5KmKqElVS3on/aELAjVHH87UktP
Tc9iZWD/gnT7LchD3Lgr2tqriPWOpp8R9y/Is0Tsd4hlC5Uiess4JnSqOPjuT8i3AV2NqINzZotA
PVfoiy9ZnFWI9Q3VfIm4hbpZYZaHiKsdRz94VHjsqxVCatSuRlYd/qs3iFFirs85/OxD2s4QZxE1
T2y3v2JxusAeHtGerEibAafLBnr75TXuJjGLWz64nzn79DPkqibXmsvf/pJUZaI+Qpzv6A6PkJvA
/L1DpImIZY2THrP/muOf/D568th5gxgSeZ+JO0V//gJx2NFfPifphLIj1zefk9SWB0rx4ccfFXRq
pXDTDmkUtDM2QvPlRc+XtwPTKeTQw80bmvs1dhVQtia7lmEtcH0N+zlSL2mWBzR1oq4vqXRkXq9I
SpMEaFHRHc1YzWvudR2tMsgssEKRs8STkTGzqiRtVtiUqHOiCpEKgU2CRigSApOKfjrdteWkkCAt
s8oSBCipCBE0ghhKtW5ZVYQUsVKhJFRSUpsy5920ihignXcgJTEJbFWTYgm3TmNJu6cs8VOgshXZ
Baq6Ivnynhkj6LdbtCgmQasE7XKGna/Q7TEhKobgubq8xPmJymhElpjWEoIrApAsQJWx6hgCtjZI
bYo3Xopih5SaxAQSEp4UBhKJkBwkSUSgc2lbCCkRsoxMSyWId+V2IeXd7xnuDkcpSdLd3HvZpCQI
QNi/uQ395esv7T/4B//RfzH24/8SQvrEO42Plpgk3hfLTgqgZQS/I0+OYbclTAMhRWQG7pzmOaU7
m3YqIpW700th50ZQMOkdu+aKa/UNvtKMaUbwT2i7j6lnD/Hre+w3K5Q+Ie8VYRpYCYsWFcmB2/ZM
Y2KfPW+2bwh54uDwAG1KSCFRwglaFvCMj6VEKMioOJFkuhu9SOz9iDEWHyJT9KUEFBNjcHdfe8RU
mqZrkbbC1DUpePZ9z7Abid5T1RKlFM2s42hpOGwiuXXMTwyniwX5xUu68RWzmaDRidunX7EZJ2bH
94tJTk4gPS5viz7VTAQfmJsljTll4TT3Dh+UB4aEbRTLtrCZ33n8iJ/+4Xv8a3/w+3zn+z+mOzzF
tIJsBOMIYxDsfMHlSiQ5l4cvpPKs9yETM3c/i9IuCakY0ibnUCnTSYkLjqx0QSvmTJQRQaK2ipyL
4jFlsKYkPINIVFYR7mxrkkzOHi0kAZBGQkpYI0nRE0i0yuBTwKqqzKYqSU6RHEt537uysbvoMUbg
UmDKnlaXvr0xkpQ8jRVoNDFEEIaLSdAYTRYSLcAIwYs4IqXgK1+YD2PK2CxZGFOQsHURUlS2ojKS
SIFPuH1G30QWtkKFTNetyLcatnOgYXx1jqwN8cVX2MNinrr66rfog4b6dEGznDP2O3SniURuby7w
0hOUYT8ppIjspguO60ccLU6YH6/IYkCdtFx8+UuuwoDrjrncRZb1J1TxADs/QlGSwbpeUK0jp+88
of98g1iDTpr2+CHEgZurN3B0TEqePK1pUs/sbM7qyRnT0xvSfoZINXKwyPkxOkZWckblByorcKIj
aU1oF8S9INgT3PaG5uCUtnpA2oyoZks6f4VRCjXtme8aDj/4lOHZL7G1QHWeo3eeoHFYO9E9WaG3
DhsF8e0btM2kfk1c3yCXNfHqa04++Zjs1iy+9xi/fc14+ZJmWNAe1DT3T5l2I7Qtw5uB9Rcj0lVU
/dd88N0TjBSY9x+gYkW/zvRryf4vrjn86BGNGGD6lubwFuEvmT86RV5+zmxwzO0CkxRqtiSME+Kw
ZvPiFdvNt1TvvIfrPbOzM3SuMYzMDyue/OB9Dg+PmGJAtYWBbypLnq+4yYrzy56v+4FhCf56S31g
kHLACIeNChVmDDcGNyVIFXomsatrVL3BNh5dJZoKutkRs7qlkYZl09GohtOqhSgxxnDc1RgBrcqs
alB3a3OIgU6VEVUjNDGHoq0Wooiu1B0BTkmkKX+utSwregx4H1EiI3MiI7GyoKKVkKhcxljryqC1
RmqBMFX5/nPGGkvWmaQFJEFwATdlcowkH7G5rNsql3U7xYCQkEJECUXqPRqou4r27DEoQ9Jzxn5k
c7OHPCFFoKokKUwolRE5kaRASk2M5WIhS+0fKTUiZYSuiKFHmxqBLhkgVRVqqIi4sCYJSMi7vroi
BDC63MiFyCAEKRaddAipkDeFKH9HSIKf7j5f0Usr+Te0oX/7/C9+Enz434Zh+Hf2w6Qn54hpRqIh
ZX3X3C9sXiUdOewZ+w273Y7gA9l5VBJU2hJjRkiFzCBVcRzHkFHCIoKgMpqcM14aNiy5ci1717Id
AovZBzTVimQq9qHicutwUyoyF9UTnSc3N9Tbc3ocTk7Upnh543DFfH6AMRajxf/n2Y25lDvcNCJk
MTNlKXEhEkIiZA95IhPptxeoUA4nOSt654m+pJwrCV1bY+qq/KenQhVyyTP1A27oUSZSzzpqW/Hg
eMXDWtMQ2SSgM2zCxBd//ZfseoewM7wPzNs5KkrCbiCMGb/zVO0RRw8+oVYVtW05MMfMDIha4oUj
Z4+1PQjFvD3hR7/3Dj/90Q/47NM/pD06xraSVEESsB5gzLD2CaOKsU6I0heaksAqwd6XHtEUExJo
tCAEaGQi+kRjdJHkpIiSAh/KBjqEgMyKRVXUtkYpBu+IWuNyImqFxTD6gFIG7wTaGEJIRbeKJLlA
LS396EiVJYUJrxRZpkKkUpLoPUZZcky4EIpsImekKjd3axRjyoxxohYSS8AqSU6JVlRYUehstRSI
BPNKMqaI0bCsMlZ6rApcJ48h4ifP4GKZ45UZ3QrQEdVqGgn+tkcFTbXJ1EZgK8P2F9d0x0eEy54U
fXleXz2j+e532N7+iik7+nCDzZ6mOURlgxgFu01i2wumoFlvnnE5nXMxvODk+CEP3vsuiwdHpBTZ
vPgtu/GWvloQHi7ZSU+bZsy9ZVYFFm2Nut6iGoGZd+jrmsVHD4kvBVqeoI2m+8E9YhwYzUSeRUS6
geuvaEzN3Bj0vsfqQ3Q+gl4itAG9R66vOTh4QntwiMiO8XLDuH9Giophm8hqSb14hOkXaD2jWhhs
N8H2kraCKu04PXkfKTX+7S3DmytacczBpx+R3qypHx2jUkT0jrgdCa8zUc7xl7c0n74HbovaPGN+
5GmUp37yHsPbZwxv3yLfXlM/qDD3TgFNUpLxuifsMvZkyWx9zckjhX10j+bhMdFrBq85/9NfkURL
9/gMJ36JbZ+j5NforoVmhbw5p1FHiKun2HmD7DLtg0MwkvX+a+LRIW5rkMenKNWAr2i2FbMR5l0N
61fI6Ih6j64lWIOfVzif2Y573jIwmYR3W5YLzcouaJJF6xnjtmHwBq1bcrBkOaJahWq2tI3Hy0A2
gYU5oqtmHB0e0GjD4dKiJSgJM6uptcQI8DEis0ILyuFal82srSw+yoLXBva5lN8VFNqbFuiUqa28
y8mUGfEcAiH5MnlyNyVjs2RwjkoZVl3FFCNNW4EQNE1NJS1ZSObtjOACra3JQRA9BCcY+hErJCL5
ksuihKmrqnggmsaWg8fkqRCY2rJ48C5JN2Q1Z9gO7DZrUthjpKCtTRFUSVmqxKHMyMfgsV2L8HfA
qySJIhcGCAl0+ZoFkGS5qEAmJw+5VDZTGMhocpZ3l9fCkCcLUhZFXhZlOYhQLjkZWXryWRbhtLLF
R/LPdCN/8fPu7/39f++/Hfur/8Httvc36x7nJeQOmIOsEak4k2MMqMJyJyXPOO7Y9nu2Y0/0pZeR
cgIExsoSuBIZEQRKG6KPSAk6S5TSxKzYR8nLEV73E0+vb4hhhW0PcRME7VmnnuU8kLs9MXuSNhi/
Zb1/yeDe4vyam/UzbJrodxNJb6kXc9K4YYpbjOpKqSQppLCFAZ/KDGVKZbRAS4HMFrLEmhaFQhY7
CYGAGyM5ZsTvghFaAqYgWNtSrok+cnOxht5hc6KedXTzI466GTOV+fai5yJL1rLh2W+fc7s+Z8oJ
Fy1BzXBS4YZMyg3ZViRxwqx+j+RmNAiqbsbgMkP1ljFvCJWhNXvU6oz33n2fP/7J3+IHv/dTZkeH
2LksxDEp2G4zNxPsIyhk4SNnMLLIbKwWOCDlgtVNCGRO5TCUShsl5ZJ6dTGCyGQKmhUjcHhaY5Ay
0WmLyCVAl4XEx4w2ihATUoqiVUwJLRLERHtHmRKqEP8mIkIIYs4IqfEpFWaNTKQUQIqSkrcGl3w5
xUtJCJFaSkwsY2wiRqTWxFTyuTElIoEkYCARZUabzDaX8btdEuVGEyRLpRETXA8Ta58IJCotyb7Q
8g5XDcLD6BJ5iohNoG0U0y7gxz1ilnB5T0pvif0F9v1H5LVmzEtGueD2zRvSTU97+D6VXhCvI25S
rL/dsXu1ZaP39Jtv0LZCWcV8foDqOqLVbHPFxdOJHDTerpguBO3UIuINy3saLt9CfUX77gI1BVbv
P0INEnVo4PKSzCv0kxkxQtQtKbUIcQ8dDmirmsMnR0R/yezjB6TxBazeUD95FyaBvBaoa8/iyRnj
TuPvnRHqB8TmGNMcY9ySmiK6mNk5Zz88wL/6DdJFxM0VzelDTKNINqAePOHm6Uvuf/hjKuFolydU
ccT/5nNs1zJ++Qy7nJHeJtI0llzJy19y8P3HyPULuvv3iGqPMAP25EM2v/gFi/c/QdsOXS+I+8iw
nTArw/h2w8mnj5HPN3SLJd1H3yFaSZCSq9dXCHmLriT5+f/D8uEfkX51zUx8DIPFNo8Q/YScNF1r
SLtr6ncfklBgD8m9Jdxq6qM5aYisHrSoBYjrNdXjFfv/4/+ka+ewGFGLI4IxDLOWJGsuBw9CUiER
wjDtPZU3bNYBnxeE0OFUwzSvqe5b9EJydip5cLxg3rSYmDk7fY/5omN0N9w/WTGrZelvK8GyUmxC
RFBAWS4UlHAWglc3iWVt0EiIZZRMK4kSkkZlrKZw0IVA5tILl1qynUasUQRiyYAI6Oxd6Fkk9O9C
oiIRc6YxBm00AkljalzKGCOQ5DJ+XEmm/UBykfU4IEMCIXBuRClJDo6mrcvapHIJew6OLBJ+/5rV
wzlm2SGbE2I2uDGy3+9x+01Jx+syMSVMIoZU1qIEUkpETMQQ0bYliIA2FVklwKC0JaXSCstEpKwp
zcmMlIaYtqQUCMmRcuLuXICgGOsKR0QQsiDlfFeVLmrwsieK4rbPpe/+z2xDf/rit388bC/+9/Xl
23/j+nwtr272+CjJWFAdUreAKb2NEBA5kwilfOEnNpsbtpt9oYNJyNEjYukzhlBKf0RBlAJSSZlb
W4GS2MowxsB2HDluDrgdBM9eBmx6zIf3Vqw6hRAB1WkOmoQUHrHbMfUXjLFIXKQQOJ+IsWbnI7v9
FlkPmE5SKwnCIFRdTlIokJmUM5lc8KDlu0FrjQugkoWkkUITrWEzTUiruRj3LGwpT8XRoTPIGKi7
DrJEqpJy7J1nve7JQ6Bra5q2xTYVXWvprOPXmw3nTuDFnHjxa0xzjLWWtoH5ckYINVTHkO8R+gXO
C3w0TFcdwzZyud+gZ4d081Nk17CYPeJf+ewD/tWffspnP/kZs4Mj9AqwMGUYo+D6VtBHGGNmZgtW
VAkIQjCUBAc+ZGTOhJzwqdzcb0dPrRQxZYwAJctEQSZw6xxCCvbRkVDMpMFP0JlS3h4lEBSBTKst
0Rel6pQiymjwiYQsidlYyHJBZCrbQi4vhlGlJ1YZw96VEN0uJKKIzKqKIfYsakN0PUoqWgQ6lFZB
8oUd73IqcAir2PhcqFVZFnlPSjiZWLQVY4S5rvCpEOZaJDJmWpl5OjpWtcCFEVXD8azCSIi+zM1K
WQIxbrNH/b+kvVmPZtl1pvesPZ3hG2PKsSqzRlapRJEUJVFqst3dFtiXtoEG+g/YBgy1u9VA3xm6
sa/9CwxfWX/BF7ZhGPad26ZabNJUiaJYpcqqnCozMoZvOufs0Rf7I+UGDMN2JxCITEQEIiLPd85a
e633fd5ekYcr5LQhqB3bT3/O2Yffw18vmE4dhzixu7mhNIH5g/us3r5gvD3gTww32x3b2xG/nHN9
65mt32E+e0jf9Oj7K57/7K+4Gq7o+gsO4zW9O2euHeu5cOIcd95/n3yt0HoOlwp9u6C8FvL+EvWe
Jbz4n2nPNasPz8AksoLw2S3WrFBfTHTZ0WVHMztFguLm06/pzx/j9BJbFEp/gd78lIt/8A2mw7/G
+1ccnn6GHwuuewe5zuhbwWjDiWRWS2Hz5BUyb6v7QC3R7HD3zymbZ8yHG+5+4z5y+xXu3cfk3TW6
P0HSGTmdoNYrwvOBPINUBlSM2OCZLZas3/2IdHlJ/+53mK5vCZ//Esd9XH8Pd9IzvdjT4LBDRmWN
aQX9Ys/qvXOae2eo8yVpmtg9vcF1hvjj/42Tb/wmLQNaJdzZWwgRmkB+/RX24YC+f4akr2jO3yfT
0iznjC8yOlmKERIJFprxege9Ix+gWd6B6LDtjGZ9QYqak4cPUCw5O3+Lty8e05g1Xd/y5jDj7YcL
dt6B15zccyifOTvRfPSO4t6ZolsKi6bF5h6lFpx2c1RuEOmRxpJUh9Ea1LE4o+m1pcRMA7RGY7Vi
6QwiGWXqiilLQqvCnoCqbmOsMhgpGGWwuqAEWqUwIuSgqrUzCSlrSuSIaBVAUDphNfStq9NQ0fhQ
m+2udRSkgnumag8epgPj4YCUwDTtMVLQqTb35II2mqZvqqDN9ZSQKAHmXYtZrGlWj4gxMsaGm9tL
pjDQtw0pQtetCL5UXVdWlChY5ShjQhtdcx9SrE6opFBuTZkOiG7JuuJni2ohDbUellSFb6oh+S3g
SNMNSjtirhwMQUipJoGGUJuUKh6vGqWSqmBOapfwb1/Qv/r62dk//+N/9l/tNq//y8uvX56+erZl
PylSbNB6htBgbI9WHaCQoskxIiUgOSKSyHHE+z23m2tuD1usBMgRZcyRrlMLYCnHU1Q5sr6PMBNt
TI3WQzNMI3EAs++qr71zrHtVhRcFvny6hVIYp6/ZvnhGe54Yyi3KG1xbT4WCwk+eaZbJdkAXQ5BM
q05JSdDFMU4DogoiNVbPWKEcd0RZCtYJYmsij9WaJAqjG7SqY2l1tHuFIZBTQqlCzgnXNohViKmd
WgoeIwXrLLqfIVpYLhranPj54cDtFxvydUDEMetP2d9esUs72u4tsDVRLh0EE4WLuSaEzKKb4bRw
PpuxO2hEn/M7H9zn29/5iG/9wQ9Y3rlAL0D11VYxZmF3C88OiVSALPS6joOsFrLUrrWgONS2lZ3P
NLYm4t2kRKc1oo+K1+zxEYTAOCW0hlA8i6YjlYmsFFpq4Eo0ipAjOFPH48oSi7CLgtY1OjbahiSR
qQgeYQogynE7HmhsS5aqIJWYkAyNtUjMCBopEJLgjGIfIiKZKJEoGa+FWwJJwyZ5jLEcSkQZaJXD
5HIU3GVmVjOOkVYpeltFK04UQ4o0thCVp3UBlUeG4Dm3GjUEFm1PDpGbmz3pkMnjQN5EursNMnlS
Coyff46e3yNeNkzTBj64YH+4pKRb3N0V/f1HGNeh25bSW65vBnZvCpvZnDchcXn7hlAKdDN8Ep68
+pIX2y2j0tgCrnMs5yNWJ6x/Ql9ayuZrmnxOenWDCkIzTCy+d0q6+QkmvcKe3WBiRBWFnw7EaSJ8
+YJSrmj6Bj28oelalKk5CJ1f4vqCXUTU5hVmlVAqMT57hXeOcDWCbSjDBM6j9StWJ1vOf+8umJfI
IlH2Fj2cYTinuVyweH9Nev4LFg8cLrzGuXPs+SPYeoxd4H/0BL3oyTZRxKBMgXFkefc+drhl8XBB
fvNjzHKGPr1PyVdo05JvDszun5I7gywizZlj9DvsQkiXn2P7yHw6wX3znGZ9h+1mx+UXgZf/8hVd
e5fzKMTrS+bvP6K8/pzm3gKRPSVv6B69T/nszzFdi20fYtxJjT+eMvpUE/YJc1Z3u3w72ogAACAA
SURBVO3CYk3L+PQL8gry8KTeP1+/Ri972pMVi/e/yYNv/oC7777Hxx//Bm+ffMx0e8a/jC3z+5m+
1Zx3hnkfsS7x4dvCspVajMQhVjPXFauaxeFLw9Y2FF2fuzNjWSiNMYrOUidrxwxzrSswKgpoo7mZ
PEYpjEq81JmlMTU5T1da5byxSKqTsob6/Ig5kHJhCrqCvaLUOFPRJAQrBi2KmW3wKVUNjGS61tA4
QUlD07f4sTJJxqkKq0UKkFn3HSVHjDU0rj5X23mHSgrXNGxvBuLhwHo1o793B92uCWnGMCp2uyti
SbSurgCNFYTqlzfU9MySFSElitRY75ISOis0GpFQyXFakFIQsVASkguIo0gVCtaPOciBknJdP+T9
8ZQux116Jv4q0CzXA2gp+aiBOorI9b9lQX/y5Mk/nobdf3vYbn5w9eqlvH41MGWN5IYsFpSgjK1A
OlGgDSnHyrsOA4WIFijZM023vLm5ZrOr5B5KZQL7GOqONtbdQ8oFVaBtm0qLMwpSRlRBUwlDVlmU
trzeFsQqxrAjhpH95Am51J8hTJUf30KZRtYizJ2FfEsz6wljIeqJyU8cxiuKz0yxI5UF46TQyiHF
orXgrK6nQSVoMspk3FHhXbJglcYdU8SCz7SqwlFyKBxGj6LG/JUQ0VajtcZZg7NC4wwVY1zpSBW0
o1gbwwdWQ99Bd07vLLYrGPuGsr/C6harZxTfkIMjFAsrQ5pmtGJoZwsenJ2wZsnD9+/wD//hb/Ld
3/0B6wd3MAtQfSEpCEG42cPlPhOKJpXC0ipUOaYLqcyUBaM0Q85QhCmB1kKnhX3IWCMYKTSmHPdG
ESeFmBKd0hXRKOAQMhrlFIlAUHU3rUxdYUxZoZQmpCqwSaVUh0MJhJBAFCpBZywhBpyxOKWYUsRq
IZXM7GhLyeVYhHPEGU2OiWDAxLq/KyiGMCFWKClSdKICaT1zY9iPA1pqEI1C0dmGwWecaFKuaVFj
ikipvngfFaeuYYq5EuhCxPtAYzSHw4RSmVwi49VId9ohMaPcnNwu2D2zjPtCGNYQV0irqvq+n1P2
0M/fRjvHYtGRkmLnEzdvNni/Awd+v6lMcA83r0feeM3XB5g1mq6/ZukmuiZgp18wO1EIG4x2MIc8
qmOGwBXLd5fEL/532piZL1Y0KmJMZBq/xtwR9k9+inu4xsw7nBPm77xVPbwpkb5+QtP1uPtwePkp
7vG7TB7KvY+It2vG7QlFzcnhkubuhBx+zvqxp1EH8u4NJj1k+uKW9sH7pOsXrJRl/eG7qMs983Kf
znzC8vHH6MsdTAPOWsKXLzB3T5nKFv2uwy9eMu0/pXEFo7Z0d04pmz32/e9X2p6cAj3x0y+Yv/UY
2oJZWJxRSJ6YrXu0DTijceqG5oNT9GrJFIXb1zuufjowm50xX7bY8yXu0ZLMS9S6IT79C+xijppG
0vicdvkAcWdoNyfFiJoJyhU0Ht0owrMRiQ3pyxFztmYqAyHfkNSKaXNJ6U/oz8+5893vsb6zoFuC
m8P6wvLxRxdM8S4/GTRKCe89tAwobt5MnHeV32FdIetaRO+v55Rc6ZdZWaw+wmWU4aRtUFJtpzHV
/W3OmowhZGEsmc5pplQ54vWglbAIGscUFb3WKDE0jQHUkalekKJIYkEsBUVIVQxXNFglx1F9obWa
fCziRStsY+i7OsJ2TaU+phhJIXA4eMiJlCCXhJQMFPpOo6QwP+mhqCpaK8Juc8ClwmyuWL71IcXM
8awIfmLabSsDXhJt41CSKH4Cq8lSatNREspocslIphbXVDBOk8OENgalNURfk0OzPxIxh3oYFEXO
E0oMOQWKVAsaORFLgRRRYok5IQiShZhT9b9njkLsVAu5+v9pW/viy7/4g//0n/6L/3oaDv/Z5up6
fn25YRwKOWuKUqRSbWaJhGgQV8MzBKkn33FPihErGZF6Kipl4sXrr7nebSBHKm+ojt5jjkc4SSam
hBKFHMfkIkKO9aGvJeOUxhpQOtIvMsu5oqSRcXtDuZ2QjUOGRJIbVDuyOFW4uWbaHaBReNXiPeiU
ACFPBjeuaeM9tsFxvXPcDoK45hgK8rfjIU2FBBiElKlQfaXqv4tUbyJUBnE8juxLhixsD3tiCKQU
UEYwTtN0M5arJUZrtG1JJddUnqJBWZa2563e8N7DGe++e8pm0jx9/ozdmxtmp48wzSkGjV7OMAvD
vBHE7Mg6c/72nG7d8v57p/zhH36H7/7+91lcnNGcFHJLDUUYYHMQnm4zV772ZIgwPyapKYFQk1Ep
FA65ZgLvc8JqhSnV9+l0/Z2dEsYp0RqYUubWj7RG6jjLNsSQUNqiC1jROF0L+7xtOYRQoRNoJBYW
TUtKCWc1OSf0MVQnZmhsyz4m5s5hqMAGRSHEhHGGMQbKcR+npeBEE6OncwsmH9BKaK3FhwON0VAC
7VEdL6oQi64YYGUZh0jjzK+FeUobAoI2kTELXevQKtesdF3/P5QqPI2BGAMxRgafCD7WUJ0Smc80
KXrsypJVYj8Zbl7sGTwE0+D3BTmfYVJLemVo+zXtwmHnFi+Rm93A0y8+59Zfs0mvud5vGYhs/UDX
LbidthzCNd1Jg0lbkhpJOlLcRN56VJhj7zwibwpmD1oumZ+vMe4S9eZLuvmctlthT9bsnz4hqDOy
PSPfnNC88wEuLpivz+lWS4rNbH/xryi3V3S/8QisQTHDNOeQNUUVwosnjNpTyowhPEdCosmexcdr
ePGM5vycdC2IOUW1CrV/xerdC/TwmvniPvp6pDk/QTfXhL/5Ec0Hb4N/hnrrgtxbFAdkWRh3P6E5
m5Cr57QnGrl5jlueMvvo94hTQUnD9NUeXc6x83P0LDK7fw4HX1diMWLna8rzCbP5ivn3f4tgMqpp
uf30NYfnI+5RS/rsKetPPiRdT6jZCgiIgWZxl+hf0l98QplWmNUZ4CiHWsTj9R6xEKfC7iaxfT2Q
fUPzjTlBDEqdkM/vcfvqisGsmL9/n8ff+i7r067emwpaJ8zXim992PHuxR20OufFRvGSzPOuxbcz
bFY8njsu2o5O6oEkZUFrYRThojc0SmhF6ARam1l2jikHiqqTNkpmiPXUODOOAHS6uizGLMxMxbE2
SmGkMHOWkDJjShijOYSML4WYC6Iqn3yKqaZakumVRkvC6ow1imSEzjZobY7iOIVuNIaGaQiULIy7
QJxCXcnGSKeFGAON1hgEbQ3GQMwZN2sZRs9uv0fCFfM7cxZ3H1DcEkzHOG0Zhh3iBxpjakjUFKCp
+etKO5BMyfWZkmJClKnj8FynlWGacF1H9r6exBVQCiKVmSviQGJ13ShTE1q0oURfP49CSZFcMjn7
eqrPCUptYOq0IP8a6oWo/2/hLF999q9+6DH/+TTyA78bORwOjNuAn4RcDGIMrTF470k5EGLAeDDG
gXaEtCV4qVahIiTdoI+meYWm07XoXR720M8Ypz19Z2lCAa2YokL7hJ8iOUUa16J0HYBYAdU2NY1G
g9PCqrdsRs+uMXy+u6Y7mbGL15SpJRUh0HI+v8u0uUH6OWEUxo1Gxb5yeeNELhO79i6uWxK2B1zz
hj5N9Ifqr157YbFuWeieous4xplKhotpAlkQssILiLaYkquH3SWmHPFZM447DIWpJIbsCQRmswUn
p2co19K1Z+ScGUIkjSNxyohpaJsFj+8olm3LqyuL/U3HsNnxsn2XFIU3by4J2dLogl6s8dmTdcdC
W2LX050s+d4PfpNv/+73WJ2cYFZCclXcVSZh2sObAW5ChT2UUnDUnbqqgCZivTSMqRb7vcCkBFNA
SDgDIdZOcoyFLAqfMiFFGlMtLlpnQio0WlM0pJArPQ5Nq1uyz0froLAPU7VvpIiXTMqFA7Cwmpyq
kjYUT6M5RrkmGqU5xIwzbeXMG40zjiFNdErjQ6B3LXtfu+hGOw7+QONWxDQybxZcHbakbJhZxeAT
KE2MBdMqtC1cHwLzrjIWrFZMSWiNpjWFoQizxjCEiMoWJRlbAsvGcT356tulgBhK59jHQte1ddox
Ce68YV92iPQMRTB6wWK5Qn2dWT6+gxhNeikcbKSsFCOW6+z465vn3CzA3jnn/OE9Pv3R52zkQJFI
yHM2b66J6hW2WWJ2O1rXUxK0739I/uxz2vYtzKMO+eI1ywcP8F/+HJ0eY0KH2s7Rdz4ivepRn7xD
+ZtIx2PUM8dCK86/eUqeTagSOUxfYKVHtwNFWrqLOxx2G/RiiU/XmPfmtMGz/eILrLVYnVl88k3K
1Uv0LrHwK4avv2Lx8APi60vMyT1c36P8AdULhee4h+8Rhl9ifmtB6W6Z/Feo9gy1vaS7uM/tz/8H
TBgoVlNuB8zZb5DpcQ970jCQdEHZQjoV9PKE7b/+lNPzx5Rffkk5mWEWluwTtm1IdkQ3hbKZUEow
3YL2QQ/Lidtn1zTtFm22hP1fo046wk//DPuNRI4D5u4JSj+ArUe3K4af7zDvzCgxYecgjeLmxRvy
cmIaQZJi3i8pXxtKu8IfFNPZI/Jpj3t4juv6evA5Jm0VoANcD//ebzf8/juPePLslP34bQ4T/PXn
W/6b//VnpJsnvHd3h49QxsDmMLJetFz0mpU1HEpmbgRFom0tzmYMQkkQfeIghUHVxMJOOaZwIAEl
Cb0RWlXx2Vrr+j3Q+BywxuBzpbXpXJXcjVIMFFrlmDnYDf6InbWI1mQl6KLRuvLNja0Tg5KFIU7o
oqslL4ZqfQsBFSOCYDJYLYjRKFPtX2ItMUZSCqAGRDa45oLEgBNFKh6dIxI8JUU4gmJE25q8SThS
SWM9ISdQpeqlUDU5bpoGjNL4wxZjXM0KSQGtLSmOaN0cszcKSiwlRpS25DhRpGp/UqzhNfEwglbo
FCvv3bVHcE1DiQlj5mTJ5PT/UhT31c/+px/+8T/9538agvkTH9KjaT9w2E0cJk/OtoqFtK4Rb3lC
KKTooSSMVVXRXRTjmIiHAUkZoyLWZKzNKA0hHniz3fP19Q2b7YBSAzoHcg4EhEQdn+cSyBPEOKFK
QaWEqBoKotRR5ZwSrTE0Wmi0xerCou9RThAd2G13LE4aHp48YFWWnI13OLH3ceUB8/W7sL6L9HO0
W1B8hKYnlQnFnuGw5eXf/IxiHdMhcb19g5obkrom5oHEFZkbjEwkEllc7WpF0zeWIjU9rNoRCkZp
Yoo1xackkvf4aUSVRGM1zipcN0NUVXummNnd3BKnAcaJ5XrGbNUx6xtmvUU1Db5ZcBgNu12gTC9w
7obYDixXC/rGMrMt3/6Nt/h3f+9b/Pb3/y6r+2eYlSCLKjYsSRh3cDPAc1/JzDNTd+lLU4uzkkL8
1YhJCoMvNFrQlOO6ITEUaLXCB5gZzRQivVbHGyWw0PWF3CgoKeNsDWHY5kTXGHIuNM4wxUyUqo7d
pUjTWlLKLBrH5Ee0MsxRjNOEdoLJgjVCTpFEfbj4nHHWsg0T2jgCsfLfpe79s6pfn6xBK8UmRBql
Cb5a1q6miaXVNJLJU6KTluzTryE1SqpvdvSJhavfT0kmHvn/TmliFKzWjDlxr1lymCLTlGkx4AUF
TPtI3idcK8iYkNYRHOxvD+iznrD5iq65oROHMxP9XlGGTNHCzSawjYXLl57bIZKnkcPhiuvNa2Zl
wRB6fPYo2aHazFwOzJsRm1q4nGjzHLtvWJ7fR64Lc3VKqzNzvaDXF9jnHatPHlO+/Bx7saI8KIzL
ZyQ3MT59xqK5j3q24145YWEN3UrBwnD7ox+z6M9Y3vsGSvfYPMMXizJz0uUt6uSM8fINaXeFT9eU
9grVTPDihuVBcdafYbmhnTVwdUn7/hoZrnGPTzHao5o9+u6aUm7oLr6DbG9xs0/gNiPKYc7u4p/8
GXJ6Tgl3kfAt7PIhujnD3J1RvMUuVhAbUpmRpxYpK/oHC2Rh0V1Xg5pcA6omLtrlXbJK6L4H2yGN
sL+cGJ9ccfdiRtN1SPLoxTXx9hWmKaQh0j76Q2QLEi0yX4EIqjeIAWVb/ASpWzDpOYdLh7rfVU65
CGrpmDJsn8HyvOPbf/gD7r71Ds4es09q+DCVL1Yx2otOeHDR8OhBz+OHPR+8tebb9x9xiPd5SYs0
kVwMM+W4OzecNJZGKayyNMrSmIbGOsZJ15VmhiQKLZUYB4UpRIYMN1Nk1WgWrcMUxdmsRaROyLKB
oBTJwFXKNK2uSnVTCZJWg8QEOUDWGG2YtZqucTgtXJwvKBSala3uJ61wRjMdAsvZnOlwqBM6XxMy
F11H9HW60M9m2FbXiNQYsV1DHEdy9JD2KL/l/OEd9GxFs3yHOAWiD0zjSJxGZvMZw37AOVdTNwto
a4gh0bQ9wzDSugYT6xrQOSFlT9s3BH+AklEKYilo25OTh6arEPM4olRlXgCkeECMRZQm5wNCQxh3
SE6VEz9sKMmT/YaSDuRpSyEjaYI4/D8X9M/+/L/74T/7o//oT2Pp/8RH9SgWh58SIUDIihgg/4pU
g0IdjfC/6hSqerxmxqYCYaodTS6x7lUtOGcxqpDixG6/YbM9MMQJWwAySTRDzFAMUkCXiCIerW9T
ZairAgTUURynjMK1dQe06FuM0ZydLpkfGeSztvDxxSkf3DtnVbbos55xbsh3etJJQ5onsIaFEYwd
WboLlidCyZHt9deE/R5vFA/eucvp+ZwuK3pbc3wtzzHlKSqP5PQVKs5QsceKpRFLzIWm1PWDsw5y
pQMtGsd+CGgpjKOn+IxMVdjh2q7umc2CFDMheK6vrtjvNsxm0C1a+pM5/czx8KTn0yc3PHt+w8W7
Bqu2PHjUMl6/gJx4+OgBH390hx/89nv8zg/+PusHF5gFyLxexlhgvIXtpnDpC9tY6JQi5IxRYEQQ
SYQMh1xQIgSEKHWnbkqh0wrJmUYUOReMqvtrfxwTjdHjtGGKkYxiigUpmr5p2ceKTkWlo38zI0Wz
bts6FqeO8nutaUShU2BuNG1OKF3QGRqppCqdC9a4KoajrjeUOmoYosehoWR61VQ3RanWuCl5GgAi
SiJexSPNScgl4ZRFSaGRipgcp4hVhqQqu14ZYZsSvkCvNDNrECzJFyyCEU3MmU1MFQJUqCCOnCgG
jMsomyhNItlEmCkGM5HMBGpHR487vKJrC5IV6qwnKmGvJm5uPbdPr3mzvWHY3OJSpveZ0+aU1u1x
3ZZcXnHeD6zmnv3tAKlwtriDHRZ07j7NbaJ1K0yasDtFo+foHdgTBy+fYU3EfbhkeP2XJHnDtL3G
Ls5R2dGm58wu3qCbN7R35xy++Blhew2bBjU8ZP7WmvHpJdpp8iZg/IRZ2woEwZPUAWUsJgRaBfM4
YA+ZdvUA/1dP6N69QIrFrva4kxPKL/+CdvUA8TNcvEsJEMcTxK6ZfjbR3H9MuIzk27fQq3sMP3lN
+9HvEq9vmX/8EFLCFMHNTwk3E6rv4dNIP2+wZUK91dOsLVx+gTk5g1IqjdBCvnlGc/9dmDXYWcvl
n39G+vwJpycfwmho3r4gXl3j7r5Dulqgrlb0dz4mv8xYNwPlSW1C2sI0jtjzBYdUSMpx9fXE1DpY
WGShKCvYkdkHjw/C2mz47r//j1iullj7t8/s+sT42z+KygVXUtkXix7eftvyzW+cYOWMH3+55st+
BU5xPSQWaDqtmZkETaFYKmJZMsVoJgSfqsap5EynhDFETElYKbhjeljnFEWBL5GsFZNOQGaXPDGB
yhpdFK1yNGJQ6CP9TOOcUCQxaxTOwLIzlHyc5IpClMFoQwkFjCb4wiFkgi+VmAk02lZnlDMoJ7h5
SxZBWUNJhegrj33Y3KDCnvXpGbPztyhmRowFnyaGzSVFVweKVQZlMr4ElKpQKGVqdocAShlKrPnz
hYJ1GnKN2lauQYrgmq5Gy1qLood0QExzXOWZYzuWUVoTw6FqGspxX16q20tZR5xuIUfyfkMcd1AG
wnBNzvH/vqD/1Z/9jz/84//kn/xp8PpPYm4exSykaBhCwsca0B5KRfsJqvoOtapZwEYhElGSUVIt
Q841eJ8wypFQaFWFX9aA0ULOHkVmt9lx+eaG4TBwdbhlc7kntj0pGlrdVO5tjuQCIabq2UNIRUEx
1adYDFY7pAi9ddjGMu8aFrOOdKTujGOm0Q0KT7tegjbcjnt003O26rATLLLFRViuLpitZpS4Y28z
h3FHZEDPD4xyy5Nnf8HV4TUh7tCpABOpLBAeUcrbJDlhyg1t0xJLHTmjqgK+IHgKjVbsUyIeP6bR
TL4QQ2Y8RFL0OKsRKeSc8ZPn9vbAYT9iUqbrGrrZjFl/wmy+5pP7c4LAIIaSTzm7d07xhc60/J3f
/oTvfvJNvvv9v8fq/n3sSpBZvfNDAj/B1XXhchB2iaoBkKpst0rIMaOLwpd6OlciHEKuXXgRGq04
hIJCo0XYxkQssE8ZD4wlVvythv0UcMYQS8Q6VxOXjK20qZDpdUP2uaIjk2LnJ2ZNQ4ql7tWyx0ll
74dUVeulgLN1Tx5KvTkOxZNdQ86FzjgGP2FVZO56fJxwyjCWgLKKGCdIgWXTMg4jjTHEGDBaQCn8
VBW3Bx+YdS2DL2iBpmnYh8ysawgpowuMEVzWzJQlTJ7GmLpOsZBKxInQ2orEVargWoXWlQi1H/do
W1BGc8iBwWi2nz/FHizLvqcfRhbdHVqZ4e40jDe3jKo2V5fjnt04EOOBWzUiqwXtg1PS4hpxATNp
1tqweT1Spo6ZuoONM5RpcE5o1wP9AtTVDfPZnO6sIV5+Sf93VkzrH2HWt3TffMwYXpDCPeTmQ5b2
Hex2QZcS5uIV7drhZpopX8L9h2R3ipYGNZvwz/8KxQ3+5pd084hRkdwolI/kV1foCPbgWa8eMk+G
Rs/QyWHW99GPHjA9+RzrznDzqmUxzRIOYGZn8NSj12v0cEt59QX68YK4/4wy2zM8fYI5OUN1M+TT
a7rFAnn9lNU3P6DsYz187ws6JPqFI/30/2D+Ww9ht6se8uU5pulRjcPf7FC2B2twp2tQjpvne/Ln
FXrSvNeg15Z0a0FluHxO894HaLGUPKIu5mQN9I7w+iXNvXNyjviSUG3LtRvZ94m9ytiFY1Swyxmv
WpJ1PGrWvPP9b3Fysa7qfaoC2yO/Hr2n43t9LBW/OrVbqVraDz5s+XvfPmfmVvz5G8W8veAqW8bj
TnzMlW4YqBapWCr6+BAzMWVMrmN4lTNaFayrtlulhNPFjL2POG0xWpOLEI6ZDz2KuXWoKLiiMLmA
RFSuGgBjFI0xWGvomqZO66r9moIQdSVHBqge7VT92dXmnJi1hlI83cyhNNjGYLVCYuXDD5s9MUdS
yQzjQJMss1VPf36XJJogjui3TPsDUD3p2lpy8Khc0d7Z1/rmh6q5iTFRSqGoRJEAWoi+cta1spRs
K4Y3ZVQzQ8JAwaKKJseA0qaGvihHDgdyOY7gU0DpjjQExBhCDCQfSBi2e0+Ike2bK/wwEsf9v1nQ
//LTn/7wj/7j//BPY9B/EpN9FJKh0BCTZUqalCvAJWWhoNFi0GLqWEVApKq+ldJo3RzfHIX6XpQ5
xulpjIo0jaPoOmpMWXFzs+H6+sBuOxJ8ou8syY/0SmMsNFLwIVBU5d+mKnmiKKm4vQRajn/Pgj2i
Art5Q1H66PmrKWGudRjbYFyF6ee2xToheEPYC62BrGO12VGIDWiXie012eyZred0vaGMMG4jElYw
CIPqUXJK1mcMMRKjIRWh0w1SauZtLJByJkQoRZFVLfZFVaZvypkkwuADisQwjHROEdOIlEKKkVYU
KQ7sD1s6o2m7BtuvMM2cZrbk0VnDL39xydNLT8qKVeq4f36fj77zDr//7/x9Lh48Rp8IecYRzVp3
3dtN4elO2JXCkKHVdcSUc8Idb2ortWhX3GuqXadWUOqJOuaCMfVGG1IhC/hjF7oJNejGamGTA9ko
JhTOtRySB63xKaJSYq4dfgRlDNtpIilNq2qiW6M1xQdEqpo8qlL90CWidMGnXMlMAqFI5cmrghLN
5CfaY4HPUpuqSM0kTlONTs05klP9HTchMXMdvxwm1soxxMSYFI0yhJJonGUXItkWDiJsSsIaxZuQ
uNMY8rExsqauJIwohhjQyjABeyBp6KTQGAUhowg0gDKFUEZ8uGTz6mdwNuH/4i9ppcMcdswe9zQn
PVG9Rp07dtdfsn39JXHmeXN4zdW4Y8y37NMNYSw0ymGuD5zPP2TwBjEr1vY92vWCeZmYozh71LHy
Lc3zgfnyHsV64nrEz6+Q7haZ7Sk5omcXhK8muE20Jw/gsKE5TdhmoH38CJZn5OYxu89/yeGLEewV
7lxhFp7gD+h8y2xxgppZrJnhn11SPOgwp7GWi7cfoW7/hsW7DlOuob+EpWN68hntO99E5hfo/px4
FbCLJXQz0k3C3Z8TdxvUaSJ2Gukg+wHcijwa8qcDjYuY3RbjtuiTO6QY6r33/ICaabjcoBcT7uNT
yAWJEcTiTk7IMSHGIK4j+w327jmBht32hvgLjzwRTj6aE77aY/oG+avXiJnhHt2h3BwwJ4piFWbd
EW6vUEFjT1bkISJqxrDLHAZNDBrrHPPGsE9gtUMlzfWoOVu23Pv4XVb37pGtMAEjQqSQqAWvokXl
3zisyfFNS925953wyYOO/+B33uLvfviYj++/z+P797nVLVdpwTRZnAhOWXyoIt+RQtC5pq9JIQO+
FIxYnHaczzsa17KLkc5ZtqEyOgYKWSk6bVCSUKUQJKEboZRY8xUaRac0697hlKLrLD4pDjnRrRYE
FNoYipZjkEti2hcapSomVQdcX8BETAdZIs5VmhrFo1RmGgLKCYdxwh8CZkrMVy3dxRlFd2Q0wR+Y
fCCFzLiLSDkwHcLRf15dSTkW8mEia0WJGSRRVCQTj2LnhDGWlHPdvwsopSklUXJAi6njd1Wn0aVE
igRSDgh1cpeLqVPcXBAUJU0ULYTgidETSiQePMNhZNgdR+5/+fNf/PCf/NG/pmMcSQAAIABJREFU
+NOYzJ8Ebx9F6YjiCKVlkoaYNSmraldIIPo4UJcClHpxtEaUohQNYlGqxeAoylY7kbZoMb/u4CyC
Npp8tCKlkLm5vuHy5padD2x9QSfF9XZfca8kkuTazan6UDTakCXXF2/JRytE7VWtFjAZ3Whs2yJG
Y4wgJHqr6KzCqkJKCZ9Bo8mlKrHbLpL0iJ4VzEwTJTJ5j2k7WgtiEmqYWOYOpCcftjTjAT1FUi6E
ESI9myFwfb1DNx1KKXypAJrpeIEzCtHq15AAoywUoVOKVqBvKpPc+5GSC+NhpMRIDmBtIcaMjwfC
FHBO086WaNui+xVWC3PreXLYckvm8cM13/vtt/nW7/wBbz/+GHuqkPmvsK2QBhinwvWNcEgFTbWd
dUfRR2c0w1EEEqoBAKUglDoWSwUaVR8kU6kuhH2qE5hDrnaukmsS3dIodmGqjOKSj/ziigK2WhOT
sGgdpSRQBiHgyZzMW8acMEYRSWQlpJIoIsc0poTRpnLkjcFqzZQyxlp0zrS26hW0rmCgfQoY05By
qSzlKSKi6bThMNbd9z5FWm1pAvTFYrVwCAHnhBFP0hnRiX0J9EazGyZaEZoCbS60WtimgDUQUqEo
TcQSqY3Mc6pFR6RmIjcU/BHK4VMkpAmdhfDqhq59G3utyc8v0duRMj6jeXxCPlyiF3vSkHnzkx8z
TppxOnCTYCMT3QwanfHbW3qZ0MGzuDhlyLf4VqHXGmUnWqXpc8PZ/XfQLxVm57HtDBUG2juFtPuC
mVnS3O4xk0elM6Yv/xr7+Az/5CndI013skKmG7rFCo/HzOdc/uh/QeyB+ccfocaEs+f4n77g5KPf
IL8yqAc9h+C5ffGXjN2SwIzT976Bjc9xAWZvGeLNS+y7gXj5Bc29e+izFWXY00tPvBqZffQe8cUG
u26xJ5aUPfbiPnHX4twD4qs1Mr+Pkrtw42gereHl1zS9IPMZ0tQwjfhqj3u0oNxeY+Y99sIipkXN
FkiOuJMlJURk0VN8daWY1RpxC+LkidMBniSWjwxxnNCnhXz7Av2WQ9ktul9jFg3p5XP02Slle4Ng
0csFcT9QXFMnZaqw/2zAnjdoo0iZ2jBHwaGx0fONP/g2zckdaCEei2oQIZQqXM0IR9BoDbiSY+34
vxR2KxltFNZBN4fTc835vSWP77+FtncI8YQvvWIngjMN2MK2BIyuh6dDVGwL3IbKGT/pLK61ZBJR
QWsaAmDE4BCa45SvAqaqzkWAKVbbaas0baMwVurU1wqBBLZCZDDHsTuCM4YyKiRWu2oh0+hMyZFZ
26BN9XkbqqocpQljBAsp1YNRnCJ6ipzeWWH6Gbpfk1M5JrEphsMOP0bGfSQfZ9I+hBrA5T3GaEIK
+BjRqiJdsxSmKSL6V26niNJCTr4ecONYVe/akkJFiJcyoo2lSnkVYlpSqKf0kgLaaCAT/R5KxB/2
EDxhGPDjQIgj+8OI/smPf/Hfx9L8FzmmRyFZIgbJDb7UB0/KHLFzmVQquzvHVF9cqSBZI1ITYOoP
A6IsBVNB9+WI/VPNcQyrEalQEJUbUBpRFj+O7HYb/vyrS24OE2/GN1BGlhe1Wz/EW0qpKToVCRix
RtWuRkEsdQwkwJQjShQ5FZRRR1CLrohABV3TonOp/uBcoNQdTasLs8Ywa6C1iint0NahSsC5ka4N
tMWj+yXlpipm32x2+HGLDB0HGsbUcrtNvB42XG8ODIcNC9vhXC3eEShSo0WlACREMk5qYZNcatSo
rgS2QwzknBinSEmFySdS9pQMPo6EEvEhQC70vcZ1M4xbIqpl3ip0GvC28OjeKd/59u/wwUffpT1t
KPNCUfV6xj2MI1zvhJdTfdEKsNYV3GOOqvVU7wmmnGmU4JVgVW2ihgithk3QmFI/xyJoJTVqVsOm
ZLKqDcRtzLXTTrBuOsg1/E+pGj7QaM0hZQ4mk0l4W7BK8CWQlRBzJh071VCqmC6lVCMec6XRxVDH
YlpURUo6wxgnrDL4FCkZOt2AT/SmrZhXVSrUJgvBFUKKtEahQ6y4R7Xn5bTjtNF1D68NOUXIilZX
Zv3SOaZQaLUhp+rgaJXgY0K0VO5CSYSS8VnolEYl6HWFTYi2VQzoU506RYO/sow3EJ5+ScpbSr5B
u4izE0o1tLPl/8nUmzRXkm1Xet8+nbvfDkAAiDb7ZL7Mx2T3SBYpq1INJJnpf8jK2BQn0qhkptH7
L5prqoE0LBmNNLEtFl/D97KLjIwO3cVtvDmdBtszqVEgLIDAxYW7n3PWXutbpLuW6jdIewljZr1a
QX/Fw7MF52I4y4WNiSyagcVpYXpxxXS4ZbU2XJysccNbTk4sZ26N2+3w+8ri5AR3N1LuvyZEx3Iy
uK9vCKe/g3znMTcB509x+zVNKvByR3h0ib0f8OsFsj7lzX/+O2oZsH1l8ewxNY+U+9eEx5Fy9RLz
zHB8/TOOx4mcHM1yzekHn2F++Xec/NZ/i5ETzPQYxg63/RR3/iHmsKN99pA69hgZwXbU3S3uvTVp
+xJzEkhTRWxDthC/2GKeLanHjG0CQsKenlKaPZlK8+OnTNsdhAj7A6YccQ2Uu+eER5ewVUxwYcZ8
rpfk44hbtlTbYNcL6m7P+OsrXPcdZvUd4bQAX1DlOb6ryLgnPPsx+bstNjWYzQqOgn34QHGiD5YM
MVJCZX+8I0+F7sGCkgpZiy+YBMZQkLuB3/sf/h1msUaWhiFDnDnfk+aYmCLUCjkLxUCRzPdL+vdz
9jJL9EZAbCUE6DrhdAMfPel4+u4p6+UFz/cL/uZNZpsLtsBqsjRT4dI5lhI484GVD7RGCXK1Vp0n
zzyRVDLWFlon1BhZNgI14kxFK831ECAibBZBR2eN186GYhDvGWLEWYuXikEwUyVHrSi2JdJ4i/dq
yPXeIanQNM0skWdSjsRpxLVayiS5kGLBFThZr7CrBXZ5Qh4mpgrjENlu9xz2I4fjESsQpxFTCmZ+
LxOZmHqsGEVC5wRFS6tMrcT+iBXN99ak3RalJGzoKCnq4dhoLS4mUEtCbIvkiVwGjWaXiHGG2G+J
cSSNI+Nxz5RGDrt7Yr8jp5FxP2L/5M//1/9dMtTiKVXI2SoXNkPNlRInpWrlOBuU8sxg10abWgup
FKoRqBBrUWi8iAaX5xMzdT6FIJhaZyFIcM5SDQzpyIvtNT9/e8X1dkstb2mvv+D9p0/J8Tl5OEIy
9GPPP/3l/82Dp5+QyQTTYMUgxSDVE3NlKJkqlVQS8r0iYL1GQ1ygCQ2r5YLGaxTLWX0NzgREHK1b
sAgdRioP1kuSObI3r3HlmsZaFn7JohdCvqTJa/IBxtowReE4TezGA4dhQMKeWntiyUTbsJWIx1Gq
NrhB/WHBTKI1sdRKBqY0UkuhlIjMbHSpwqFXZ3Q0Qp77wqkFm3UW3y6X4BcYswDbcHdzw8J0fPjh
R3z645+wvthgT0Cc3vwxwniAwwDXE6Ss2f7vOe3f583HUkkwt6gJhkIsOjMf5t+/3maVKpqxb0Qb
leafDENlZR3HlGmdhZppTEBcZcqJ4BV32Fini6uYHwaBzjhSmqjikCrKksdCzCydx8yOW4Oy1ItR
JG+winlU1zvztQmxKFo0lays/ZKJJBoLKeoJxJQRLxWpmSgJ8cL90LNpPE1NP+R0pyGx8oac1KMh
1eCs9ivX/K8mQStokqEUgtO87YkYxilrc1tWo9G68XNsT6X6SSr78chw/xa3PtIsW+T2Gu8C8eWW
i9/6Q/rhSDqumIojl56TH31AGHesh8B5fICdetriKWWg+MwgA7EUzjaP2FjPk+X7LHaR87Nz3A24
q1es3nsE5wXTJuKrX7P6yR9g7ydMPKd5/yOmqxvK2cS0e87qnVPc8RvM8YrFBx8iv/qS5W98TrKe
3ZuJ/vk1zaZw8ce/x/Dl/4vrLP7wLV4e4U8uePX1C1L9lLqzPPnxx7ir54TyNWc/+TfUNzeIO2P8
2Rc499vwdsLc3rP6yY/Jwxvc5ZJys8M/vMC7BWkUbHtGuSvIsmP661vstwa7DJRvBhaXHvOqYh53
yKFikuCfnpK/fIsrB8zhrSZiXv8Cc+Hx62ek59eERxd6wxg/L4kW0wVMBVm15N1Imo6k4y/J+x6/
uKTc7/Grdyk/H5G6wD97l3xzpFk2SJmocURKoCwqpXj2NwcGMfQ7kLah3QTKmLR4JBn6WrnOhR99
8pBPfvv3sZsTaBW5nFFpNlchT5BR0FNO+mqLGLKg9+cPUrye3vN878i8wFsRfID1xvD+k4ZPHj7g
g/OnnLVPuYuFN6NhLJ6FcYSY6VxlYQrLzmCdVn4m0THcsWoDo3VakVqKzvJTtVigT4qKdkYjn+fL
FqmwWrSkUpCZZFfRNrK5iIw8ZqiWpgohCb6ziGQlukkmxYRxlmlKzBFwjcMZddaXoou2F8vZ+Qlh
s6aGQEmFgmO/G3h7c2B3HIllYhxnLHmN5Jy0SW5GRIsYJFeImaL+Px2xzka+kpSml0tV2b5EaikY
px4yMY4ioy7ooK1sFSgjQqaMR0qeGIeB+7sdx+PAMEyM48Q0TqSYkCzYP//T/+2nlEoshQLzYq6v
KKdRqTVVXcLUitRKVVwQKcf5LDdz1ktGKkq8QWcIImCdoCA/cGRtTzMeY0TNALUn58jd1TVXd1tt
zRruMK9veXD5LhJXlKGhYcH+5p6mKXTNmqZbqZMwWY1/WM9UEjElzTyKwWXBi3yPfaFpO+WReQGv
nOFpHImx4qqlLY6VFzprWDa6WViFDQtzxqo+weaWLIG622uJgOno6opsTyhTw/2dw7iGNCZiDYx9
z/HwlsM+QVPw4oh5IlTBzU06RhSjkwsUoyqCrXnOPFZyrUxTJdbK/ThBsLNrFIY8KnHNGoypNK0l
NEskrCjJEGMkS+Hddz7myZNnhBMDC8UUliKkHYxHuEuwHTONMeQKnZnZzLPdZiiQEAZUCjtk3bQF
q7SoxhiVrkUY5j8bazjEwsIKMVfOfNBkgrEsXGGaEiurUR2THbFMkGATPHbKLEPDNE0M8r0hULDW
EVOhdZ7p0JOxNNaxTwnxDf3cxJZipaeyDg1jmvnKpSJemFJkJLH0DisTwWl9qvMOU4RSKivT0Y8F
azwpGpwsmcRwHCtLExhSxopjG5Vl/j1r2Rp19ntnsdrsS2ss94eR4M1cLjPrnVmjikGEzlbGknBG
edhjLjgRYsmMJUIy1P6W5QasPUK6QlzLcIykdsn9cE3ZnDOlW6rf42SgkFk+ucR2pzTZ4O0RJzs1
RYWGdV1wNp1w4i9ZccF61xKGBc3Rsfp0padfbzGHa4Jf0pULyq9Gut/+PfLRMA2FMT+nyA3+7pbx
69d05y3uZIX4hPnoXcajlk/I/o7Fk5+w3Jxhbkfs8Rp7rPj3PuHeTBzOHnI4rsjffMHTzz7Ffv1X
XP7mR9hpwi1OcT3Uuz1msSd+/Ze0PxoI73xI3b3FLBtq3eKWp8TtNfZ0DWSKd8gg5OOIbZbUUOFN
hRHqqcF86En/5b/S/OETbN1S0wvYTIjc4U5WTP0/4N//I+297lpkdaKArLajjBm37iBNSBfwJyuN
U5nC9v/8GnfxFHEVWS5x7zwk/+xvcL//KTVnpL7BnHWIHZGQtRLaKyUxFUh3GaJl87AjV8u0z1q0
IpnioUvC7/zuj7n4+EfIuqOYQq2GnNDZ8oTOXK0hZ90ZlqwwqJJgLFr0EYFq1GhWUDVOF/65PAQh
AM7C6tTw5DJwsVnwweVTNstHnDz+gIkVy0YdeNYKloghqeHZBMRCIlEkUqrhILrxnkQoxRHn6/2k
08HqMjhiFsQHjA1k0Y9j0hippKIUuWqQKrSuoeaEawzGVWxQ91yMEd96jgedKxunTZiLRcM4jHjv
qDGTxkhTC2HpWT96TE2RKi0pCfdvR27u7tn1A66qOVjI+l6JKg81o/E+05Cz0WIW8VTvGMdK46w2
O9ZKaDy5JtrVilRGTBDwllgixuuBxSDkPEGcKDlyuLumTBPjfs84TvSHA/c3W2rKDIcjKQ40ItQp
UajYP/mz//TTlNO8KM9ccZnPVSnpcL6YH5jquaRZttHJTC7awqPGOKNzdGPmGatgrVdSkihdqIog
NfxwOhXRnU6aBq7evOHqekfeRr771QuMrGn6NavQEa8SkireevYvf05YPfxXhKCxeuHUBDJiHeQy
YgtI0bKAkrPK71Y0/B8ctQhihGkotMEhZFonWFHX9to7nKksjaX1lsPuK27uv2S8H3kzrHg1XtFL
w96ucWbDcRqRxSOQHSYXfNnAEDFlj7t5yaEkgpkY9tccyoRbLDBS6GtiLN+T40Ao5ArGCougi1OW
ylBVITFeKCVTJGNymX8PkxLppqhVhSFQoxoQV4vA6eUT2vUJ7oTZ5KZSXL+HmwGuJq2V9VbHJsbo
nAlr5mISmaOIOojLVH2fqy7epVZSEaYKU6msguEY58jMvJ2SKhxTYW0ttno8TvuOi9Pu86xIX1tU
CXAIqTjEVlIVnPHUOXPrqOxLxLSWgci9ZHYmE41QjXDMifP1koFINgVr1ZCJscSUEWuxteCMmeEQ
DlMN/ZBZhgWHMipW2FmOMXLSNeynIyfO4KxuCowRxpJpfGA7RhKOpdNTRbCeWjPNPNvXNkQdOUzV
4qvMDmQLWQsr1B4q6tiv0IjBFWDKpMOIIVPv9tTtHe7ph6ThiMQj7uwh8flzwuNzXNxhZSClAyae
Qr4k7iekV3Z2HQ3N5jFtXVLGxEleswinNHKND45FXuKPgVAMdmyxjSfe3uJsS053+PcvkHAgthP5
6RVD/i+4S4M5zcg2kqeiUdQf/wFJGiR3HP9uJL1KrB8JdXqFlCvqdy8wl3rtpvIBKZ8wfDuwPvmY
5rBjGX6D9tFDpr/9Z5bv/y6ZAbMYiemf8c8yzW8+JR//mXD2G9ToCc2a+MUdvulwbUf55lvs0FL2
CdaJ7CeGF3+P/3xJ/MU/EH7UkceMGb7Ff3wJdos/b4nxF7in7zJ897fU45bu0/+efBix3QqmSLNc
UA6KBHabNWl/T3tyQnUtcrokHYS7b1uag6O8gvCbD8nPn5N339L86ENyv6NZP4a7jOk2pLcjad/j
P3iXfhvBBXIxuKalGMe+FkpjGNpKXBkOQ+Zssnzyk3/D6v0PcY2CV6ZZbSsq2M1cJqEkHd9VRKN2
s+qmVFGdpGfRvWUCotRZTxMy+vnfK6suVM4eGN557Pn80zWfX57SN5dc1xUv31pal8Ak8gBr62eP
lOKfwRGt4IyZu8MrxiRcjTgMD6wHsRg8tu2oTUdxHts2TLlSMiy8wxbBW1WQRQxGtO/cNQIzXCUn
/jXulTNiCzlGnNNUThoSZOjvdKH2GE4ePWDx4IQ4FZIYDruJ29vE67sbrXrFsXDaHlmrYMRii07o
G2cpqSoUi4RpHKkoxc15C1VjbBIcrukQqyNs46yCtUygFIXGVKmkw0EJksc9se+J40A8Dgz7PYfb
O4Zee1BKHKEmxmkAm7Xj/c/+9D/91JCRGqk1a1l6Uci8kHXiMsfQRHSOKBVMUXqYNcrpdU4wzlBI
eIO6nkvBOaNxifKvFXpU7QQ3JKxkRCx96tnd3fLzl7e8enPg0dLjq9C0AbEW6YQDhuv7yPO75+yW
LUUO9OyITDjTqlRShFpmKSlXSs0cB41KSdD8qAkOEV3MzZwpzjnPFZrKYrfB4VpP0xrazjPlgeVq
wfLBCbaZaNPAuXuXx+GczVTYTBPW95h0wC3eMMZr7NLgTxOhBbOMbOM126sbJFjsIjCWG4J3tC4Q
ayLnQilztSo6pw6ilZ763mmeO6EGEsGAVHIGyTDl+kP1bM06nzEu0PhTfHdKdWpKTJPOscdB6Ae4
TxXEEIxQEnirakFVwzVUIRhtWmudMBT9/t6oAcdbuI8VY9VlW1DZvq/aVDaUilgYc2ZhnUr4KalB
Bp3d1ZIRSXROmMaBjQ9MJTNVrVy1xbJu1bgWjBKijKnqBM+RpfPkYeDENUjJNEYlPFMza+tw6GtJ
ZaLWQrCGVCLBOmJWZGvKCesMrYNjPOK9ZcwDzhhImUhh4QO7IWGqpyCc+kAsAkV4tlxxPSR1BJeK
Cw7jLbfjQBc8h5Tx1lFKZqrCMliGmLQLQIxm8qvwaiicN5acEs6DczCUAXzguD8SG6h2STxksjic
XysH3C0pb68wYUP5dsvik88oP7/FRYOVQCPnEB3p7TXN5RO69SnG9Ei9oR5fsXj4kPriS06eXZDe
3OCfBtoPHcOrL9h89gwzPse/8whvBXMC5tgwfHWA1UfE7yp151h/9BlymHDmXfL2hFI9178sSDly
8ugBtdliV0umb17SPvoDypun+ItPmN5WDr94zfrxU4IpLM4c9vbnuGUhPHpE3H2BrHb0313RGkew
7yMPeoiO+O3PCJcPyF9d4Z89xbSWaXeHbBI5vaQ+WhD3vySbHnN6RsxvMFEoxztM5+FNxF++hzCR
j99iwlPy2z3u7HexN5WaIkYCJlekbSl9T7g4oQ4JQ8UsV5j1CowwXu1I04H22JOHgfDxivhmj3//
U9L9jsW7H2PuB+qxxz59oOSvdk06ZEzymiDq9d7rV7A3lV2cGBuowbHPBbto+eyP/5jNo0uV2UUX
81qU8kgRJanlOi8+qgRWrVIAV5CsDSv6NYpmTrNHysz3ZamQhH/1Rs1bTieqXLslvH9peLY45/W0
4R/HieSVR+7F0XqL9/oMbrzBG0MwSmkzNSM5QTZsvCFYS+sa1l2HIFqIUiumgM1z10Mt+CBqbq7K
xKhW6IJDrCOnBNYQ+1EPlSUh831f+4i3gRILoVvRHzK7fk9MkSZYHjw6xTQd1S/JEe53R97u9rzd
7ohxwpeENxk7a/fWaOxY5kheFgPOIAFccIgtupYYMCbgrFap2hDINWKdoTLNGw5DSRNShbE/QEmk
OHDc7yg1MtzviPue/U4XdwukPFJyIsUIdk4c5Yj98z/5X34q5fuFvGK0xRoxRYlgNmEpuJnEhkmY
WjDe66IoRue4RrPHIhVqmKEGdiYdRKxYchnUVVUKgs5NShlJuTD2PW9u7tgd9lxsPKYeWQyRx48f
MtxExrGws5lf3r7h26vnTCFzXxXCwAjOdyRriClSUSNZKplSYYgTFYgx44PVub0YXPBq5hM7x64y
zliMGFbBs3CG1huCVci/Y8KZgVPnOVs6TsRy0jnMuGO8ekG/v6cNlZIiD56dIas7pDkgrWFvBiqW
0gQOqSeUM3AndP6UxjTE6UCXPUHT1LrLFnQBr0I0lWotk3EUsfrelvlGmxvQCgUnhjoljocDra80
TaDdnCKuAQylCHEyDFkX8wHok9AYvW37UmmNqBN/ZuYzx2G2WcBqDKw1OrNzVfBFGBM0xjCkQmcM
/QyCACEVQyNat7qYGe+pQDCGWKGK0uacsdQcKSnTBO0AFu+oJRJMoS2FPONZp1joTAPzTjzXxC5q
XjzFieAcZo7ctWKpqRBwpDghTm9+J4IxhjEXvPPcjActXkiZLDqrq1mRlHXoWWAo1VLKSDGWvmR8
8OynyL0Yfd9SxhhL30f1ISQwRXCusp805TBQEKkMM8t6VwuvcqH1hkPJ+hCyqoosvPKZl8GBN7z+
5ivC+QVSt/j1KW75EOdWRDJlu8PIgjTcMLzdU+wZciKEfIKVlnKfCO4Ef/6MnAfGwxZ3Higj2LLE
lSVm12PzAcZrLv67Tyi3/4BPX+BvdiwePiI0a9JfvyJ88gHx1UBNIzSZ6hLBgWsd7afvaLXjylBP
HMerL+lWByRsCc/OyeMtNSfM5l3Ki4H66SXTcMN49RxXbuguRmz3Nfmbb/Aft5hTT+aOOL6lvjmw
/vQ9eD3gz34D8hr76AmSFmS/wz96RB4idt1qw9r6lHIXidd3mIsHlMMtLCzN4zNs3WGanvL2X2g+
/Yza32LaJ1R3Dt0Fpukob19iz1bI9RazWSKLltxvMZ2lloi0jloypltpeYlzTPuB3Vdb7KkluwOy
HCFdQ/mG7v3fYLp7QXPxgOItlIHStlSTkbMFU98jnSWvHFNnGWpRYJNTM3GehOup8lv/7o9YLk6Z
nC7+edR7Kg3yQ9V0LQKukseKCZWa9MGPnRGugqZEnD4XSHqSz2Xe0GeItiBVmNQipSf/2SIvapOn
6eCzdxb49gHZODbGsZ0ULnboR920WKsz61zpp8jaKbbUi5pCN97TeM+UIsumwVhLE5x2euTCunWY
Kiw6Lf0KztO0HgE99KVEtYWKNpz5BtLU07SB8f6As4amcUwxqxR/3HJMA8Ullmu4eHyKc2ukXZFG
2O8TX7+95/X9PVUOFEZan7RBDY2lBtExQ84R772anWeWyBSjlrYUgw0ecYIEj20ahdJYVbK/j7eV
aUJyYjqO5GkgDmrgK2mijhMhQJwGPXzWRC5ZQVQlY6tDjCGWiv2Pf/o//1TKgHFzT7hUkKIyhjVU
U/U07gzWzCQ27wnOISRcsDPJJiMy150aNTwh+uCadRuVifO8SJVMiWlGHUAaB/q+5+31junYI0lo
iyd3lsPhSKIS157DOHLfbzkc4PZ+Il6PXHZPkN1AY4VcRtL9QDIZUzWzbHPGkJA8EQz68xmnuz/j
CFYLVKwIwShSMDiPLXNxQcwqG5uGpTtn4R8S/AXiliCW3ZDZ7gLXx8S+2dCXjuWj99WUIhFKxLtC
WIGM0OSKD45m0ZCnV8TxQE1bZI7/jTVTRJDJ/NDkVrOAKcScab3BGPUjuPnkrpdyIdXM/TRQijaH
NcuWdnmi7XACKRWGVBmS0EcFPSAaL4tV615LUWqazCa41ghDVtIUteJFO+m9QCsQk+JV+1rIWfDO
MGTDiYWcKp3RBjNfM51RQ8gi8EOmfczaoR5mXGvnGwUQWZkNJ5WFdQzTiPWWkTLXEnz/2iu7GGld
w/dCdjO76zehZch6atYtpkWqEEti3bRMOeGsJZaKE0snniFlnPEMpcxXyqeQAAAgAElEQVQlQBVj
wDrPduoJzuIMrK3DFL2uLpqWQxoQo8akje+QOX+/CQ1DirQ2cKyVJMJkDTFrB/pgDFs04xuk0ooS
o5bOQBEap4UYwxRJ3YJpGHClZXX2Dquzx3SPLsi3DfntK8z5I6bX3yCLlnp7IKzfgdEx3Wdcd0IZ
BAkVGwWTG8SvKHmiWzyhKw1h84D8/CvWiwesTpaUL18ShiXmu0zz4GPSt1dUWZLfW7Db/4yy6RkW
L2kedJQXLzC5Z/XsPcr9Ff7yEeNu4vDtz0j3v8bka5bvfUwcvsKcNsT9rwjtinrWsN3tSbZl/823
tO2K8vznhO2R5uMF+buv8O/8iPgVuPUZ8sojbxPtw48ody/xTz4mb/fIyRly6JBk8OuHpFtwqzOG
v/4npHmEk8p0/xr3+BH51b8gZ574xdfYzQa/+AAZI27xiHI/Iv6U8tUV3G4Jl+8Qv70nfPIBHCdM
8EiZaWkWakyEswfk7LCrNf23V0z/tKN5Z4GZBrzfwat/JFx63MlHxH6LO31ImQTDktpbCC22WzIe
IpwFkuiJvKQI2RCqMKTM7lhxy8rv/OSPCZsVNai5K0ZISRfiWbujeLQVEZnLsf5/RLmqX5fr9yqf
tpxVqRAhFyHNA3U9XKjyNvu99LAxF4PYAL4TPjptePfknGb9jNu6oPaFwwjJaANZSQkphUClNary
BoHWWnywP/AsukWLbz1N6xQrniLeO3xjUboYWKv90s6ClEKpGSeVPEWMGGrKmPK9w0sl72IF3wXG
40g/JMYY8TLyYGVYn2xwpw/JMZKA3a7nu6s7ro4HYoy4lJGaIaIRbOocuyvK0XdWZX5TVE4XS9HI
F75rcS5gvLr+jTg1cRfRLHpSJSHFqFG6PjHeHbFiqYOa58aU9OcO2h4pVkhi54ib1+e9t9i/+NO/
+KlhQupsHTQgkvUCEHXmWuf0IhGDFQXKKIovaPPX3DxlqxI7zfzgr0UvHIr2Q4NKSjnX2WWoc/gq
hUwi50SZRlIdqZNgc8/9cE973tI3hpupMEjl7nAg7npGs8XFt7TTLW7s2d++Ig7XjCPk/jmNv6Aw
EceeKV1RTYcNYZ7JFGopeO+13dYqTlCqR5yDUvHOk0vClKwGPqNGOe88wQk1dEhw+JNTBnPK/dFj
/Tmp93QLCL7hfLPhFMO5X/D49CFhv+BsbFibC078ktoPpOt74jhyHxPRLbg93JOyxVZLsJZ0P5Gm
A95YpGo1Z82VMOkiJKngxTBllYRi1fm3lILH4xuDtV5PwkVhLNOYiMnq78bMZKmi8ZZjgeCU2+x0
NMVQdUGXqnL6VCphZjofsg7tjtlgnRKmimj2+RA19kUutM6RATGKCd5PE8FqJWvwhmPUeXfwjj4P
BOeUvew9hsoxjdjgOUwR6wLHKROMbkK+P52rZKEPITFKiCpR+5BTyWA8MUcQQ2M8KYk6TOdmvJjL
PH7wHKaJjfdMcVTsa9YURzCeMQ1YMpSJxmlr21QSPigGuQuGkYniLJnMIScQoU/CwqmcfmGEEyeE
ktkYxzFnHI5gDFm0oTCJ4JxHjMdYYcTw9mXPwq1YLC0n647NumX/81tyb7GT0VrFsWCOBrkrhLhE
+h4bHDbdgdxSx2tcF8iDUPcjpbRqHIsH7O1LNs8+wZiI3Gxh8ogz+A8/Yvr2b5FHG+TEUFwh7XqK
7bAykXZbfLPAWcHWB9izJ/S71+Q4ku7+heaJwawdxXwBe4g3e6yr5LMPuU/w9udfEicI548pw3MW
TxJ+IZjFCXK51gLuYUv85hXhvXOsmZCzNeRI7aO2BR0j/mJDOt6BvUcWMKYv4DxixkxdOMzrb7Fm
iVltKP/8JWb9gJqOhNMzJHiMdRAC4z//Pc1Hn5O/eIW3Di7OqPsj0hjNFi8b8v0txnrMsqM0mpI5
frOlTBGGimsbyJb09z9n+W//R9KQqZLJrkM6Sx2LZqHP1sR+RFpPsZ5sLDFY9sPIiI65DtmwHTIf
PD7hR5//Ec3JCgIwQV/hbq/r3RgrJQtNgDKBcbPr2kAtOlevvlCSYBv93JJBPOSoHpQ86SisZCHH
SjVQJiFKmU/3VSPEMK8bFdMJq7Xl8rzh6ckpF4tHVH/CVzdHpgI+G0zMnC8c05DpnKGZD4fWGkrJ
nCxX+EbJmqUK1RhWmxUpgw/KODdif5gftE0gjxlrK7ZWJGe8MeRxws9NnN4ZbFDfF9ZyGPfa2lkm
1s7w9MlDwvoBrj2noqCv6/stL662fLcf6MeR3b5qo1o1BKvKo8sa4XbCvCmKjGliKlmV7uJYLjtM
FWzocD5Qsx4qStZoG9lA6SkU4jQh1TH1PWXKSBnJcSBXldZFtPe8ZE2Q5SpgLMeUiQIDBfsf/8Of
/pRSZ1ZWmcvW7RxgEKyZ3zwqc9c6kvWBLbXqIj4jNpn/NDOoQ6xFsqUah1R1GSPK1C5VmUYYSCaT
geNUSSVyP2Ve3w/c7vYctq9JXWA39dynyH4/cogTNRjs5MjTHVINUz9we3vNy5cvuD++Jpsl+xiZ
yh6xDbUeySKaLy5qnKBmLVwQNG8eHNYIoQkYVwmd1cxfnChZZsdygFJYNA6RQtsGTlct6zNPd9pq
v3rc8s7Zgsuu59xCc7in6Ufi3nOyfIrbekJe0sUnrF5vsG/WMFrEL8Fa6lh/yIuKFJ6/+opm1ZC8
GqyMc2SxTLFSrBo0qikYr1nUnCo5Frwp80WeaFYB6w1mNtZJifhpYIiFUSzOCEUgFd2pW5Qxb2pl
LEKseoVU1DSCgDewzRVrzQ8ngFg1LXHqtZueCmGmsRmpxKwGv6lUsghgSSarqS5DZ0VvCNFq2j4X
sMJ9TCQcQymMtcxdyRAcDHmgpVKdkErCOIhzBKaIfp+oNgGMGI5pom0DOSWKmNkEqPn/nDNnTUef
RiiFmieqKXTGkasiiq36kTGlMJSehe+Y4oSzjiEqkngqiYHMwlm+6wckOHKpuKotU+taaDI4MZAM
u3lzuxDHfZIfKHJZzDwagK7xpFQYU+H+5Zb88g2rzZJ8KMhmqe/Xl19QWs+036oJsEyqvp00HN78
FTU3SFbTXDWefL9j+exjZJtouzXurqNrLOuyRo6/ZvX5M9LLv6P54AHUK8p4jbtcQX+L2XTs/+m/
snn4mGn3LXaohMfvI8NXNN17RFtwD07Zf/lX2MNE++kFZf8V/vIj+m9ukLESPlgSW6A95faXf4nd
gBm+xm8iZ59+Tuq/w128Q3rxBXbxDvX2JXJ7x+IPfqyn/rPH5GPFjx6z66DvsR89IT//Frt0VBJm
scFMnjQcad79lOnFd3qC30Wwa+RkRfnqDe3Hv6dJjYsz6ngEa/DLB6Sfv8RdfoQ5VqRRdKssGqp1
xJs9zgZkvcJsGvII/dsbyv5I+uaIvBcYfv1/4dYRf7kmy4BfnJDTQC2TxoKtobaOQ8nYswV7MsUJ
WSpRDEOJxCz0gN90fPLeI55+/Lu4dUP12qFw6Av3sao8njRYXmaNvDLHNauQYp2LhNQvo2ljoZZK
ScylUWqaZXbM43QjoNXNQk5a4JR7Zr+M/h+aZQfXwGZtWW9aFqsTfv0y8Wp3z3HYEbKwRJiGka7V
WXPrhCgV31gW66BRr6Dj29C06qExQrdq1ecijloTzigDpdaINZYaE9XpATPP0encTzSLoJEyLAlh
txsYUmK6v+fx5RmnDy9ozp9h/JrqAmI3bK+OfPX2wNXhyPVtYn87kiWxCVDnmLArlTho496URjVl
l6pNbVWhOouTJbUKLjSI0R4HaoI6YW2FMujfydScyTkxjQMxjsSSKCWRKeSimflS5lkshiyVbIx6
HWKlmoL9s//pL36q+ozutEQ0xEBOc0Vdnnd3TucmWQ1nmredBQ2jD3pjrErFImAtpUQq6kSnCkV0
HlRQE1Gthji/0UNSGXUcJra7PVMPkhpib7m92+Il4BYdIpkGT9PDKYluWONH4e7mwO19z6td4uub
I/txz3gsICe4xSnZGkZjGKYj01TVZV3QrlxnCd5TclIij614r1CD/WFgKJUhVaxV34CyzSut00IR
7wLWW5p1ICPsdiNuc+S4+yW5jAz1juY8Em1LKOfEXYXlJa4uON7vqD7yzS//DtesqOXIcLdHisF6
i4+RLJnONhpJqYAJ6s4ugjOZ1jg1GJJIOSNV6FNVeXnuOe02SpyyoUVKwqK+hr5mItqx7rylzJGz
SKWUylQMI4okzUUXoFjUQOjQi7szlrFUnDPsCzSzFF8zrJwhp6oO0SJUEVaN4ZgqYQ6BOEQNfag8
P8REZy2lFFpjCRi8KIN6LBovuyqDmuhM4DgqSaqfMl1wuFqIRM5sSx4sYgLEipMWcsRJYeEaJVY5
IZeEtRDnfufOWoYpKiY2TqrGMJHjyGm7IOcjS+fZDwPZGfCQkrbjjakQTMuuFiiW5B2+WhauYZgK
G+cItnA0Gd95tqlyZ4V/KoVg7Pz7rTROR1NtUI+Eq5XOWxyVNliuD5XbX/SECilHmpOCWWpss1wd
EbsmrR/Q7/daGfroCdPeQbskFkM1Z9TqCOEUGw22OLqyxAwDZw/OsHd3LE4WmON3WBkhGtLNNc3Z
Y6L0pO4VtXtFXmwp9p7xX44snj7FLJb45QkmCnncYx9cMv3NP2CLQ2wiRQdnK2qE0G2Y/v4l7tMf
s/+m5+bLn2FqT5Cesz+wyNevsM2C5jxi8gX+9DfJv/gV7oGQ3xjseo0sl0gNNO0zyhc7wucfYmLB
xAazaKnFkk2i7F5izp9QJihX99jLz+B1gwkfYMopbvEe7rLV0/m6Va/GZk16ucWcNpjqkCZj3tlQ
t29wT9bUfoDDAVxA1mvMYk3GE2979t9tMR2Yi4Qp93Qf/zbxzR1mcuAvVBUMLWWomLahWkM1jmqM
noKdZ58nhlKZkmEoEJPn8TsP+fz3/5D1s/ewwc6JE52dT6MCnaai95Y+bPXZa0Ql+Tov8Pn7j7OA
QB41qeJEiFHV2qz2FHLSkzvo/4FXJTYXXTfyoN9DqkrzIqKQmoWWtHxzWPN/vLjl1bDl2QIWLnPW
GVpXoBR84xBxrFzAV49tHESL99CERqFZywVxjJRSIZaZSS+kMRJcQ5p0YaVoI6UzhX4/0a1bjYSV
qqbSPpFj4rgfWHnPe++fs37yjObkMUU8pnlMTML9tvKz67f857s3vLkdOev2fHJZsUbd5A5hHBI1
w5hGvFee+5QiTTD44Di9PENqpQlLjNHUkXOB6Xiv8emSIQ/gDMMwQDUcd1qPbQRIGvuu2VKqIZVA
PyWqrwxlBKfK9vXugHGQh4T9s//wJz8VMbPDQXdgzGg9qRolKFIx1ahDUoPl6nyUua5PBGOcFrvP
QBkpc0NvtYobEasqgPU6fyn6wMpGMF4lG2shTpE89KRpYt9P5GIpneaRazacUjnd3+OOV/jY0b/Z
Mh4jLyLc55ZYM9WCCSfg14yyoVqYtoUhGyqBZdZu4zImTBVMFqoYjDh86KgIjWtmulEzqw+aZaRk
clVWb3GWIgbj1eGYy8Ri4VhuPIvoaeqSetcgu41q1nLCMBru6g22a3l1e81X07e87r/juvS89pFj
XXEflxzfZuKdJ5QF9y8di7QAG2iwOARRiwKdU/57ill9AWisw+aq1bNJFzBvM23nCIs1xIRxC6gF
JxmTFdea59jZMmjlaTHCMJ/Ac63sq57cR6UnMlaZ6QKwLfow6Kv+WxXRTHUVKhp7SUUX+Di3n8ns
1DdWM7IrO/MEEDqri6Mxlv0UaawWsMRY52sp05qWWCKjFLJVkJCxok5gE0i5ItZrbcXsE5hqIoSW
SJzjPHZ+CBmGWNWJWjQypzDJQvWGQyrY1pJqYSJRsQxlIvjAUDPVOe5rYl8zxlv6Ulg5x5RGWkQd
ulSW3pGIeAOFTDWVLfCiVqYK17lSquNYBKkNU4WrobColpQL3jg63+jP5tcc/vEbXBBO39OWKLtc
Uqsh1Q3j3YS/WODPLonbkaYLmADFF21JTIJdBUzq8O2CfLiGOGDuXtDIL1l/+CHl9QHGlnx7xD98
l1J24La4xwvy9TX18C7TFxHMKfYa6t1bXBsor7/GPblg2v8LZXWNffqQfr/FnDymTnvCyQlcfY31
Hp4+5u5ww+3bW6boaT/0NE2PDYaz/+ZH5LfPce2H5JuIzQVjAhy/xV++A1PFdBfkt3vsJPBwRfnu
LQRHCRVsQ3z1a0zt8CdPyNsed3JCvZqQ0w7nVqRfDDQ/3pC+fIt7tqB22p9dxTEcj7TrC4XIPD6l
Xo1gDPbpkhINpjHU45HudE1xgbxqGd/esn/xVrHJ00AuRyS2MJ6x+uy32f/Dl7j2HhYPIAkmWgZr
6B4/oK8ZWXXsc2LKhiyGHC2kysPzDf/23/97No8/J2x0hKYEOaiTrt+HwWCtjsNKqVgrxKniG6UY
RhHEClNSiSsrXZma1TsjFuKk4CnJc0496sm91O/z7Sr91qqfn9M8j89635v5EKn1DkJ/sPw/L67Y
HW/4rD3SHycuGkcw2lxnrcXZRomJ1mj0VKrGVNHXaa2ewG0VTJnn6Fimw6Sz86zlKGUGtpScdIzm
qq5JRjc72/u9ktymniengUcfPWP54CNsuMD4M5JpGPqGl9/d87PvvuEXb+9wv+550Bx4uDAsRWFr
TduQJFNs1eePEw4lgszo2fUCPz+bXfDqwfJGzdVW9Jmdej1pkykJUqocj0ctvOoPlDypNyorXAy0
kpmcSFkNTv2UGaP6dlIVXMnmByqVmKr91qWACarZ5wrGzQUomq3Vqwhq1cICI6q1FBJO9IFbKLgi
VFspYilZT7ilWrTVzjCKVlkmJoJruB8Ghqg53ZsaSKuGZmFYFLi5GUjSk/qWw3HFtO54/strdvaC
bFTmlnqFW28Q46hty+thy7RvkGuH3Y+cvT6yX3i6D95j6CzYNeF4BOeIJrPebDC2EoIjF8E2gdYH
iq+YYBn2O8akkYhcs4IFqp46pRQWwVNj5slpx+Qhnjj69cQ4Ba7e/oq339wydoXsTrh784ZYMvtk
aLolh/EWf+h53X9NazvOu1Oa8wdcbQ+6s+wsNpkfUI6hFkjCUCuGiKvClAquhakKhQTVYMeBaWvo
m1s4O6P0t1A6bSHCYaTDSsKWgWGq0C2I4xxkVSGFWAtjrjRGzTbe1h/amJZe2MaMtZpNPzEzM6Uo
UGXMkU4UmGErlFKURmctU8z/H1Fv1mtZdqXXjbm6vfdpbhP33uiyz2QySRZZVbRcVZIsWXLZFoSS
IPjBerMBGTDgv8Ef5XfDUBk2VJ2qJZlk9tFH3P6es/derR/mjtRTAolkZDJunLPWmvP7xqCzhlxF
IUACUyk4r5Mbay1jKdSmH+i7cc8meOaWOLYdpRSkCqvguCwTg3fErBcbmuOueoJxlFwJTnf1xlo9
SMWQWmVf9hz6oGAl3xg8XM8znTeM84zxhn2Z2TU4DBuub96oGEYqQ9dRUqIVx9AZrsZEZ1aEVLhv
NJgTpHHUddzsR1bGkFNiTlV9yhlc59mWiX/edbyYE5M07nnhLgtitaXxcNUxxoQ0y3E3YEzm4YPK
Ue/5h6efkteVGc+U70jzFf6de7gHA/n1lvnJDSlekfbPGB48pu6uIF7R8orAANMj5Gom9QM27vEn
ETl/igsJs87MV59jT++T2x2rT04ov/qOtn9DePyHlPPn9MMB+/0Fw0cnuINEunhJOiikF3u8fUN9
9ZJw/Bnlcg27jBy+R7m5wR5+SntTaO0BYn/ELN8g78+kp98hq3dJf/Mrhp+8i3n5O/C1YH/wAXLz
End8Rrl4Rdt0mGHN/Pw19vRHVHtLe/cInl/SZI1jID+9xNzrFCbz4Ig6N2iG1jnEjZhNTznf4z8F
k3bUq69pm3chzvrn5PIpNr0Cv6Wez7QHjfLFHvvxQL0AGdZwfQMXb6jdB98HiKVEAsAuY32jxmPy
dy8Zfvcz4v41zT2BzSNa3tFCx3h+h733mPFmTwIVniToqiXPETtXfCvcu3+P1cN36Y49Muhh7PQh
BzpppneNjOUuw1EnjFFraPOkq6dWG3VS2FdMbWmFQEoN74UUtYiEZvFouZCyIfSQJ3BeU/DSDJhG
HPWizFsKo6/krCFjraRCbwxndcC1RIiZUxfonMEHy2rVEaVinGOsFXEN6xpW9GAPqu4gj9puUfZ7
1ZVUSoTBk+JITJPuzmlY0d66X3JRrVWaOPLdzBrPtN9x2C5598OfMxx9wDA8oLoDsvOk2TBNMy+m
Hb+9jXy87WiniXu3CT/qKnrjA2SdqFUqzgs1ZYpFLycenGhGyzSQlGhW/5tLynhjSfNepw21kGtV
e+h+JkhgnHcaHseQ56j14JoxzVGN5WbcMZZliiKGWbTaJ4D93/7D//ELxOiru1lYalGCpzWtdDVj
tR1kte9nlr2jGLt0vkWl7MtfjdEZv5OetvhrQfvfNNFKnNO9INZgLAiWOU3c3E7MueADHHqd+RxZ
waRKGS0jhWvRqsfdPlDw5BpJZQLrYbqhrR8h3Zbx9pw43kFN3Fy+ZjddkHdXHD84pVsFcIGaIrs0
kXIi2Kae9uAx1uDCgO2CjnuD3iRBq0atZWagNosXi6mCEachQoHgPdKvMdue5g0THXfiudgbblrh
dn/O9f6asVyTwht2VxfEWrCdgdU1Ip626bmtV9xNMLnAnRRCr0a78FYkUyxdFaUoLenPtOQgohhq
saSsek5ndWemP8yqPz+raXbfCq41gmmQwTUhF0iit/qIpTNoNUL0ZW6XWlhq+qGtCoHSL5blQ74v
Qm9gX5r+WsC+6otZYTFql+uM4idrXaozLRN8YJ+rQoNqJdXC4IVWE0ZgmlVo0KQQW8ZZQyYqtS4l
elSm0iThnaOWQhANvnnUgreLmY3vianSjCHmSi6NYC3jojWMrbAyQo9AyQxiaEk/vHOqONsh0ihJ
ll57xjvHXdUXSmvCXRSqddzUxs4ZnpCxXjDWcBsLActVzDw2hjXCujXWovQ94wznNGavawmkLinX
zPadjl3JxJd7chNs3WBXW8LBgDEr6mTIqxXpZsatP4AquM0ZjDNmvocZAddo8YrSXiDuO0Ke6LdH
uH4Nm57qK7ItuEeHlOdP6T94n7bbQDkkccZ4nSmtkb+9AAn4/YyzPZgOmd/D3ftD8pOAO/0p9UKw
e4cLjrp7g/vBj8jDQOqF22evqXiaK2xuIicHn8G0wpRjZF5Rbwx13pKf3cD2fVoZMMdb6Axum8AU
yv4Wub+l3N7R6kx2MyVdYd5/j/jqNxRXyMOAOTmGuTL/3WvsqafeFMy7A+Z4pSHfZonXI+H0EXl/
g9luMIeWcptwjwfy7RX+9Jj0+gXGzpgPHmMOV1As85sdOU8wZWQbSG9uKH/7p6z+yR9Q84hYYLFQ
ilvDUaA7GNjNmew9qQm1GuZUmbMyG/rTFT/8/d/j3vuf4TaKqq6oLbAuRaI8a//8LmpLyRthVzRn
s8+aNm/57WcXYhaaaeQk3wOj8nJQzFFT3FPUv1+bNl3s8prHAEkDdsbx/a5dsnyfuXqbkH/5KvMX
T14yj085a4X7g+BM1bBusJjOUoxlLDCsAlPM2jYqakkzC8DMSKPMasVDQHLFOWEeR0QaKU3kkjFW
6WurozVFNNCXEoz7mTwVTIo8PB45+dGPWR98SNedIk7pblN03O0bf/bb3/Lnl9/wanfNeDFh81P6
7pKT0wO6ocN4Q78OuM4RrOA7T2eE3jlWw4btdgvGE1YbxBTtFEqhLv8/csrKY2mVmCOmwjyOpDmT
U6Qmra3m5UEdC8ScyLUypsrYKrFUvbAUgy/gTcD+h//1f/+FNMXmCUa5uQhiB60wiNrTmmjdh2a1
o2saiFcZhtG9ulhBjNdwnZhFQuJptSJ26bgbLdUjlbr0KKwL3yffS21aA7AOJ0LfWbzXA8UMAb/2
SAfTmPjmN58zjhe0fAH1EucajoGDgx5focVCmiM5bxn31+znRqyF0/unHJ2c4kR3VmOKS4VEMFhC
cHjfIU6DGdY7rHVYrxz4Wiq1WcZpMYQ1i0dfqYaGtRWxBmsqNgDekDYQN4FX+Zy5Rm73vybtzqnl
DneQaKbgDyqYiF1ByxkvK+6dPYJ9x8oM2AJ9hc425CZhpcAoIA6Kwbhlx45ahqQZvBgdpzWYpsh+
P9LyRM0TmARtUmSjKLUvIEgFWxc2+cJ7dm+dyqIK1UxjMEpsCqK7dd8aIjAV7bJPVL1eL7kKh8WJ
4AxMWRP6iMLVvahwZWUDKRaGZhmMVvI6oNTCUQiYqiO0gobnnDPcpcTKO90114ZHzW5Hffd9+MTU
Qm89DoVVbF3HPs4E55FWyTgVupTCQdDAnHE6tqQZjvqOXYzLS1/QFEKmGWETAlPOdKFnKnW5NRn2
LeNtR06Nrg/cLLRCa3Wqcc9a4pw5cA5XhQOErVP05UFnKQV66zlvGua0XnidC8dBMK1wvFqxXhvm
Ub+oXv52JO4mwqmlP/SYDsyhI+0j1m+pk8VwyH7a0diSTaaFiXa8og572mqHzCPD6hg795hyxOrj
M8rd3+I/eJd5eoV/LgT/AfXFBj98TJJTEve5++ZLzHTLcPYx+dUrhpOPKfIIwifkC0hTD/cc+Ysv
6cyEufwSYyLMhfz0CvPuA26evWS/q5SbSD/e0YUfkF++xq966tNXdL/zAenXv0EOjvGffUq9+hb/
qIPr13h3CK92lC5gj7fEL7/EPjqm1itk2wN3xOkCe/SYePka050y/ae/xEyWfuuplzf0P3qXfPUM
d3pKefp3yOEhdpjJL/8fzOpAX4ZbQ/zic8ym4Q960nd/Tv/JD7GrNeZwS0mNeBfJN9ek/Q777pqZ
L3EnazYPP6ZKRWxA7q5wx/eI8QJ7NEDXcVcy1TqqNDWntUYskW498NHvfsbjn/wBdttDr+urhqbT
Kw0pQs4NZxr7pHribIS81NRSUz7792rjBShjl/yUiLaPctWLvPzsM0sAACAASURBVAZWG6noP1PQ
YJws4hfRVTbO6v+mNXQ6+3asp7025l3j85cz/+eLr/hi/oYPu8rDXtj6xmrwWFuXOpdKlJzRC3AQ
gylGcyU5kktZCJcNi6HGqlPfBjXONAclRYzToFcIXmVKrVKqYTfqo63FmcNV4f7jexy+/zM2/SOa
HyD0JAyjNF5fXPPXv/mCr69fsymRzbOJezzlYOtZH6/oQ8cwBHzwdF2PdyuM8ax8Twgd280G2xzO
9cuqWhYyX8aIJaWowb02Eac9IpUSR3KaSVNcSrmNqaorbyoztRUiMOVCzHXRqhokGVwBqaJtif/l
f/73v7AuQ9Xah1DB9N/v1GkO3SjqmBERXea3hUZEI9heZzRGD4W3vUddrxZoSzKRihhl8DZZ6jXG
L91hpwGpRXO6HQJ95+mCZ2r6J8+tDOtVx2SFPgRSNezeXFMwiN1BmaltJKVMmkRHx7UjxUzmGsvI
LHeY3nF4dMjgAlYcThy2GVKs34+TvFPjjzGWvtsgAr5TFaA4R5Gq4USx1JwVdlLKQm7ScZQPFmc9
XedwzhNbYEwju/mK/dU1XM/gA8xOk47RUka7mJImSn2I5BWbwWJqhuuINQnj9DDMM5ANBR37FwvR
QGdlMdElbaQarZdc3yTGKbOLmZIjcZ6gTDirkOfOO6Q1vLG4qrcAWdCPkoXdXOidYVx25LEpZKYz
invtRC8UvdW+6lxUY5uKHv65KdLWG30BrDxaf1xeGR2CN5VxzhwNHTknxQ2nplseo1W3vnfcpUIw
6hqecmFrLWYuDC4wx8TaW02d14lgOlKGYJ1KZioYb7hJeuHcFXDOcas/fCwQc8U0YZxRRnwRYmsY
13GbEuthxZs44o0Bo5WRhLCrhVUX2OWijYik6f1JGletsgme17mxMR6P/v6uja6yBlO5yYWbbOic
Ydca687wKsOR99yURq6eMxOIs2XddzjRqqBfC1/9wzXj9ciqcxhjsWtHDhY2HeOrjEkOc2qo4w3h
wzNuXz/lXJ7DOlBtY/v+J9jZ0F0e4caBvh3h71va1Tn25CFcJ3z/GJEttTrs5ojmGuITJRZMf6t7
1zJi7nb4zRn+3fcpX93BAcj+GhkSfuuJl5/jju7DONK9/xn1sGM3TcyXd1TuI/uBLv6A7uNDzOUF
Zr3HfrAmX/4l5vEE3S1FvsYMAfYWOXqf6T9/iX30LgJqstp01Kg79yIV6Y5odxewe4pddXB7gSSw
sYfVhhaV3W82G+qbF9jTx+SL7yBWcFtanmhhJn/7p4Sf/tfU+QoZb2DzMX7YUt2GnPSAjC+uoHjC
tiftPNa/Q/MeMwy06wK1wx6uiV6wB2tyLeRlJCvVkGLj7i7hjfDw0/f56Pf/Cd3hI0wPxejYu6JT
oSZC3uuANSUVF1nFbWDR3fHKqQSlVUNnYV7MiS0LndU1XmpCWBwO3qnApFilyNQiBNOYSyU43ccL
gvUQow5HJcv3gTkpjebg8hK+e77n6sVTHnDJP1p7fMo8vjdgrYDpsEFNHz50THNm6DqCtcq7EKWP
rlYKolkHr5ZG9L9jv7vBdqhXvGqAVRqs1ytiTDQMBbgdb+jziN1fcP8kc/jRQw5OPsN2RxQTyM6S
amWqhhev3/DXn3/O7vyKRyXxnoPjeeLYnrI+WtHZwHa1pQuedbdCasP7wKpf4bynG1Zg9LzIzUC1
Kq1qQqOQaqKlRCqROO0xAjEmas7kXGkGrLGklKnZkbIgxRNTYkqaa4hlprWC8w3TyhKmBPvv/uTf
/GKeR2qbkVYWBkzVMFBt1KqRevWNlwUYsxjUpGJRlGVrbWlaqXCltaYHQRNc81p30z8CtKqVNqxB
yCANUzJlqQquek+36lgNgVXvKWKWkbfBE8jNcDwMmLBiPxfuLl5B3WHdllIr1R9RUgMfqe2cls4h
T7SaoWSKNFZty9oOHKx7DiyIqUzzC2pLZIQ5Ttim+E4R7WZiwViH9QbbjN4C0Vui1EZcZBwxRmh1
Sfs3xGnYw1nD613lzT98Sby8pZWMJKHOupd3Bx2uP6L0B0TjqTmR51tivWGcXzPJE0K4IawM64OA
sYVmhdw5UjDsHcige6wZlbyIM4Rg9TbvGjhhrJkYJ/Z3O9I04kzFWat4WWuxZtHLtkZHxbeGmxJS
qwpaisJm8vIhH0Rv71b0gO6sY2r6e8GyA/MIc4WNFW5qITdDsPp6NyLkRaASS6MahblMTQ1R0Wjd
K7eCMRmD4KRhmh6k3gnGNKaSaBSV1YSBuVQFLzQd3CG6i+qdZ66NqLBPYq54rI70rQc0CNrsEtyT
QquRo67XFG1Ra9VgWNoGVfvwLBCjWnFN9+RziViBWdQeF4zarAYrum+lEhosTgkKhZPFK9DQb+Ri
Ks02vkqFD5xX0Uq1dFbNdAeDpeuATcWuG1cX17jUaEGgD3r523jMo4F0d0Pa74i7kdflgkubCI/f
YZ4nzD7jj0+IF9/iJHP4j3+Xen5LGO4hK0fbboj9Abu719h3TyjN4j45ZP/mFXH3Ah4dc/3yS/qT
d6jXheHBD3DtDDmfsEeO/OIr5KynPX+K++Qx5s0LzOUtw7/8Z+yvdtzlO24uXtNWB+Sx4KZrzv6b
T5j/8u9Zv/OItrsCmbAH75P+7jcM7/1jxv/8HGsfUr40cN1Y/4sfEL/9Je6Dh6QXX+CHE+q5o7g1
/uSA8Vf/FxIc+fJruFeI/obxr/6CzR/8Ee31jD9bI7Eg0x53tiY++Q3m7AH1ak9//A7ty2eYbkt/
9iH59RfY9QEiHv/oPpg1tV9TYuH2i9eEMiDRYpzBxAgpYw8HxvNr3OkpbAJhvQE/kFMlmUBsCty+
3hdKgYNuzQ/++T9j++BT5EioTvkdpem4u1QlPKZRa2WaR1G4zNsKWqkGaY0x6sC11Kq40ir63SXC
Lut3tUHJhm9D8km5LnomNCEuv1YsBmsaOfM9lroCtjYNrjkhz8J3L0b+76+/4vPzb/m9LvPQZ0ya
eXi8IlWd4VfrMNZrDc0IvTXQKsEHYomEzivkrFR832FaBadEzlQTSKOWCajENNNtAsZ1TDuhCyv2
d5kyJkqM9C3z+JPHbN79EQebH9BsT3GGKpYMjKPw4tk5f/XVl/ynp6+4fpLhZuTwkXBwsmJ7sOWg
79mug+7LnQELLljCymO8wziHoSf4nlbAGQ+i00ukUfcThQILv71WIGvWbI4JcW9hZgFpnhihNcc0
6+qxtkypmldb5uEgniKC/Zf/7R//YkwjZdL5Pq3qwj7tqK3ogd4SkiatnZEUTWreHuKFSsY4h37d
G0Q0iKCGNsWs6usefHA0iZosbiqlME0rcFLfdiR7DBbnB61eofpMrfRoQMo6w74JV7OQoiXHc4op
mHqIY43PFuc2rOUxbniHFN9g/CHNrvHuHk06Vn7F6dEBpjeMdWQ2O+Yyk+JMpkEprIcO6yy+WwFa
/Xr7B7/vOqQ1gu9IaXHEC8xUrGmqqjdgWsOJQVphFSz3Hr8HwyFzVH47rUE2bLYfAIYpTjA7yniI
CQbDBt88iQnTHdENR+ytxfkAvicWoQVhbwrVN2W9t6JIyGYQMYytMLZIJVNbpJTELu5JcyKOe1xr
UCO2gvXKQfbWLt17GCgEC75kSkmUpX/qjUC1bKwmXbMIuVT2NDorxApHfiE+LRLmXCsbqweYR6BW
qhGcM+xLprc6wi/VYKUQqYg3zGlm8B0VvSwJWrXpvWPMI0m0Gzq4FaFZahYGHyipYZv29mm9fnBz
pne6Hx9CpyMwaxgcXOWREBw2V9ZOMKXhaay8Yx8znbXcpURZ+vClZY58x+1+T8CRcmJwgVQa+5y4
Fzp2uTDYwMWcuciNj0Igz4WN81p1855UDLkI1jVSyqyGgM0VqfDXSXdp74SOZ3Pj4RBIKINgtXEU
Y1gfCLmz7PKehrB7sifHjv7Y0i4z61OhvD7HNEudR2rf8IdHbMIx3nfYKRD6DfWq0HfHpPmcOs8Y
cw27jD/5lP0vv6K9KnRH71PvCubxITef3zHtDpjPL2g+0J+8R/n2nNXxh+Tffk54L9DkG+r+14iZ
YP8N3cN7tC+fYo8CdfsO7TdP4fAek7uiHBqSBE3rv/6War6iCxW5u8GtAuW7V8i0h9Uh6fkF9uPf
IX/zhvB7j2g359jVChn31Bc32NN3yW9eYu73pPiS+OpXSH9Evs6E099n+tNf0+cThg8+oV19Tv/T
d5iufo08vEd88TUcPEK8p9w+w97/kPzst4RP/yvK84jkQ9gNmIM19uyM4gV7ekK5uaO2SPOVLCPJ
j7TdG4aP72OMIeU9Zu31IDhak2JlaoEpG/a5MuK42GcGqfzsv/tHHH34U+xhh+01CFeqgrtKEozV
SlnKTfvnTfTzUlXLXCrL5HSBiCxpddWA6hgeAzUL3vE9Stosf00FrFSkLiCTJZRrF9ocTdC2v/5a
UgXf9IUfY+Ppi5H/78sv2I9v+Emo2DZztgpAwa97Rc4aw2As3CVcbbiisi1jjc77jT4Ueu+wzlCq
gqFKytAqcVQyZpWGcYEQBqYoNGuZpolpv0fSHTJ9x3ufPGB9uOHsg3+KtWuSOAqWWKEay3ST+Par
5/zZl1/wq+/21NcT3/3yFiuV4b7hnbMjjjdrTPB4cVCFvhvwPmCqJQSPFI+1HTlV/LBGrJ4FYWXI
8w7feeIcqVH1r6VqMya3oqjrZdVRpLGLE8UUpha5yXs2B567eWZlO11JNIsURwbEWeyf/Ot/9QtT
G9OYiWNm3E3MY6LmRk478nxHzntymWg1wVIPoFSMUf81shirdFagB5mom0+UFQtk/cEs+3Ul0Qli
nXLkrQHjEONp6HjUuI5c1PntF3CJWfzlInBbElcOxgHKTcbXHbV06s/2kSlOtE5IeaaVBOWaWmbK
lDC+JxzObLYr9nJLlB039RWlOUQGxv0tnekJNtB1Huc7pFWMHWil0PUdIhC6brG4WaqppJbJUmmS
yVIwkmEZQ9c5EsSxCrDerDl68Ih2tKJ5PXRLVs1YvWtI2VLHTLq7woUzVsM9DZ4MHmOO2IZDbm70
ZnzdGrdjZIozHZVQgGpoVvddEchVgSfTHDFAHCtlr6/GVmG/q6Rxp3WPdAelaN3NGa2MlERnGhsK
oWUO63IYF21CqHlMsbAzKnMJYpiLXghiraoYbYa8CBOmkumt7uQ3TiU01EonBsngrSXGQrBeMZQN
jDFMKRGs1t8G49mnyD5OHHjoqWycvkKkKS73JpWFuob+rCQRnE5XpOnlMNfK4IQBlaH4rJcFbzou
55njfoutFQd4KuTM1inAhxCYClylmZV1OCusglDmyJE1tLmybZZDZ1iXykOraytfDM41jRHUjJVG
by2Fxkyl94GpFgbrqKnxgffkqiHGVVhc813jZor4ztG3QB8aRyeHOOthbzDHlvym0kLD9GqM97ZH
yp5V6DDZ4F1HvnyDiRmKxfbQ5gK3LxkePsLnS1ZHa0zdMf39n9N9fAIZ7OFKqYQrIW53TK++JDx4
l/7+Y+qzjnwO7uQIubcm2UweXjDvnmHWG+z6hHZ1q8mMZDGbgdKfUjjg7jdBa5gx0ro1Ie+RfUW2
Z2TznDrvaA8eE7+eMauf064HZMrIPFBeP6P78H32//Al5uyh7qyTgQNL/OI/IofvkK/3uO4h5e8q
XAbc/d+BZ4L9cKCdOmQ1U+ITWn+EXZ+RxoRdvYPJmk2x20CtF7iTA9Jf/Bl+e4R5fILdHhKkJ8aZ
OkZ21zeYjaWkCeyO1el95t0dfrWltYYbDhAbaEZriOOYAMPt7UwpiaOTLQ9//keszx5i1jo6LgvU
q8x6eOJ1W1pQjoIEoUxCESH4RsowGGEu2k6xRXXH1sK+CYMT9glt94iGsLwT9qURjNIjSwMflP/u
RA/5YGDOjVKFsOz0rRVcVUukNTBl4e9fj/zHr5/wob/ivkusaTw6GMAY3GoF1uuatThkbGwONkgG
Gzo9y71V1HKpBOuQUjG10lJinkZMa9QF+NR7B8ZgvCMtzvLdeEuO10h+RV/+isef/R6bd3/GwfZD
ZnEkHFW0Vl3myu3dxJOnz/nVky+4iHuIIOmSn/z8hNPjDWfbgWHoaSigrKHTBcTSBY8Ng2Zo7EK9
MgmREbHajW9UpOj3MbURS8KKPnJE1IhVctbQXG76Pea03x7EqVBKGm3JOghWJ5kWslTs//g//PEv
lNubqTWRa+FumkhxIqaRkmam/cw87sjjTMk7ai2INHwIaiyzXkftzmjfTpfP38NmtHOso5mF678E
J+yStrBKSHsLthE9II1oG1isBr6cc7SqFaipViYpNAeDday7AV97mu/IeGw4IM0jtXkNXdYdRhJN
EqWMTKnQyJzcf0i1IOWalHeYVGj5GlplZQ/xYun7Xkfn1mg/0yp6qQHi1UlojWCtKGx/4TlkjWyr
vQ7ISTT4YS3bjaM7EMJR5ejxCXl7x7B+gKSB/VWixYzUJzQuiPmWWQqlnjOWjvmNh9YR7/SATmmi
l4JpO9p0zSpnpGaMaViUH+wrdKYScqMTRxlR9r71lKJUtxgzaRoZb3fUNiImEToLompW5zqEyso5
bEl0UjBzwouGVdoyXm80tt6Qc2VtG53oy0HZ8IXBCVPUhGpdpjKIMOXKxhoFSRhDSuoFF2u4iYng
DbFmxBvGohOebfDMaceBNcpQxoI0xmQJneU2Rpxduu5GwEZqbWw7R4qJ3igy0rWiAZyYGKwmbbGW
WBu981hX2JeMGJhjwqNNAIdl8IFpHll3Cu3ZOEOaZ0oxbHrHbsysgseIxRi4LZpUHzqFUqw7wdpK
aoVSMxPy/ZeqE9g3sE048A6X4UHvKK1RrCci7MWxGjrq2FiHwNYbBmfZnAbmacKXRm8K6eUV7uaa
fJ3x/QElKkfeDQPTPmL7Q+xscasj+kfvke5u8aeBNn+D7WH31S+J0x3u0SmOC/zZA8ZnX9OGmfnu
c+LdG+rmFeX8CeHUUm9fs3rnPrIqahA8XlO/+IbV9gGcP8MdnSK2g6sr3OEPKS9H6jsn1KsdcTfA
QY+8ecbmrMd2EX9UaP0zSp+x7/2Eetlw9z+j3ST80TGWHcVXwjuHjN88g9NDpv1TaucohyO1q7Tt
lnj1Jeb9h+TbjORDWtdBrHQ/fkyrr7HHR9Tn/4DkB9juAenbK/zqVLGdqy2cv8bcP4FUiV9+jf/w
ffzJAe7eEdV4qrHEmz3pfEasJb2csJtD/NAz70fwHcV6/HZFzJBaU2LjPFNTZYo64fngd37M2We/
jxs6pFeSoxJPhTbJQoBTxnpOCuxqVZiLUj1LUSWqdsOV0ji3il8MYTnrSgra4jdoeKt2RLvM3CMK
qWlFz6i6UORK04zMyits5q39DCDYt9Y3ePVqx189+45NveaT4HjvZEMvqnd2viMnCHgka9itZU3I
WwsVq0THuFjtEO1m50hOM0YMpRSqgHNa6fVDR0qaacpFaNOI28+03Tc8fv9nnH78cw5Ofg9jV0Sx
IJaCctjjZLi5veP5s6/55bPn7KbER/cMf/jjAz4961kFw0G/wjqnHfiUdYogSnYctitoomyF5TwQ
U5UuadUrUhvk5TFcl+9LGwxSF4dGysypgjE6vbWiUq+qZ6upRjMTNKaWKAaybSS0RWT/zR//61/Y
qr+gFTWO1VKIeSTnzBQTt3FiGhN3uxHBUVJZoCB2scao4Uca30ODlQ634EtN/X6HUGujVa1/IRrC
alK/TycucWuFF5REXcJ1xnXUBTyAEXYpgUDfGsEZVusDrtsBdvOAFO8zXfW0UvTqUm+VX03FuDWm
JcTMbM4O6Ld7htVITr8Gu8Y0x7h7g/U90tbKGUZ3/d5YassYWSxn0vCh192uc4gVQtep0L4o3EHr
bBZTLa1ZRSU6SxcsW9+zdhuO/YZ37z0gDCdE06vhyEEer1RZOMz4o0zbW9q0Yl2PCUkIpdLZTGg3
yPyKFq/o40g/DOzKzDTtkE1HpC0TEfWje3GkVvWQs0UvNKIZibs4M6aZlmfKOGGlUtMe6x0iKgVw
RhsLvUBXCtZFbC449AlhZQk+lsph8FAEZ/RGa9D+ZkyFA/3UYkS+f8FbGqlUrIGxVeoy/SkLu2DK
+mVwHSc64wgGYlLwjKlGpQjimJpd/pzM9DZQW2PlHCmNrN4ewnnC+MCYC84a5gq1OoILS53NY6qG
b6iFksDjGaPyLW9zYxQLTZhKpKBddy+OMSaCdJRlB2maJxeDc54vp5EORzCWVCrBeWrR1/N5qjR0
nHcxNzbOUQWtSAok0yjBckelBkssgvVqCJyqIAGaWLp1x9B7qjTsxnH97R3z8yvmekMRi304MEvE
3jtQG+DVa0zwtBi4Pr+ldoF8cE7ht7C5pG6vKfaGsrZMr1/BKtHCLXG4Im87vShvH9BuLW53hsme
EAc1Td2+wH3yMfnFV5Sr12hoZYW4HmMeED7+CfXpNXLcYd85ZLf/hnQQuXv6F9iDibq/pDveYNcz
ErdIPaV8fYe/9wOsD5RpT9q9oL7+Nf4PP6OlRnOGcnlLTRPm4RHp7jtkWNHuzik3M2Z9TPnmChMM
5eYJw6eH1KM7sFfIJlFe/S1y9i7l+RNIgj19gKmeshPKeaR7/B7lzYTZCfbT9+mOj2DdU7zHdD3z
qzdUqaTXE/nJSH+0xq16wuZQudxDgGpJFebYuL2aqMaxL3CXhO2jAz78p/89q6NTzGBoTsEjTRo1
iWqNi47Km0GdBBbSgm/1AmNtalSrVWuYpRFzY+W0d26MkFulQwOucamb7hYrW6zLirNp6NUtYThj
9ZWOUSpkqopmjU2/vilgWyMV4bsnV4yXTziSWx51lvsHgVwSfd/RasUWwWQ1wTnRapmxioK1zimn
Ikbs29F6jFpdsxbXBcY5KhfCNnxYNMjRYl1gd5uw2WBHWHvPo598wuHZp/Sbh0RjwATmpWo1pcq8
G7l8/ZQnT54z3l0RTOKBFz48UqPeZjCsneJqK5rpGXpLaMJwPCgx1AWMXVFQC2n7HghjKTktF42C
dY5SGi1r/bsu65LbMVNb0otLSxiKTu/UocMc0dxa0Tp5bVYT9EbXFPbf/9v/6RfCYlYTFaQ4B1Ys
uVZyrtSkHFkrFqmNKaqTtUjSNPtbsa5x0Bpigu5Ml5dXW97lrSmBrlFZnrmwOGNbUwOaVDAoD/zt
jUTELqg/h3VWRymxUIrB4AnW0nmL6QzbwbLtelwt3N3cYoL2U02daHisNIyJCjDYVlJ8TZKRy9uM
6X6AaWeKjow9wQ3YpuY41xRq4KyoKg8IXU+pevtyRgMR3WpNs43OO7x12MXxlRuID1q7MGa54FQO
nGHVB47Dhq4PHJ8csDrcUsuISGJ79g67i2ukDky7QM2NsSQ2J4fUcsHV698S6jXzzSvKbmRgw+CO
YXLU1jPdWaaqBxJV+9EpaRAjBI+IYU66QqlodcWLMO8zaYrM+z0t6Yu/lT0umEXv2Snnn4Rv4Guk
MwVyoZhMywUxBiv6AqnA3HQsN+aKt4JdxvQIpFrZGss+6YXAYqhN9+S7qhCfu1YpC87WVcFYYZpn
euuYsk4GjNWqmbGO/TTjfQ+l0TU1JOVS2PieMevlRKwhVQ07ptbou0CsOiVqreLEqvCmFDah4y5V
+l55DNPb4E6rdGHFLmeMseyT/ox62zHnhMEshC3HHZXUYBgGzlNicoGVeP1iaVoQPFkN7KeCd56u
Cxgsq2DZFQidwVuLtwbB0VuPdx13GXy35bpWYqf1GcGyWa9wXvn82Vv2RijDhqkUukcHtDST7q50
/1k6LsvM1c0Fk0Q2HxjS01/qpfS64vwR7SJSx0b/4D7x2VfIg0qx5xA6ppsr4ucXrN/7CNnfYGWP
u3mCd28wx434/GvYNGLcIW5N/eYpMu7p33uP6bd/ibn/LjOQ15799Jz99ZfIMGFq5uCHn1BfXeLT
GX59yvz5X9O/d0x58Vvsu4ly+TcY+x3tZE3dV+zZAfXiBf7eIebVDZJm+tOfEH/zAswh9dxijn6I
+Hu0m8bqbE27eYP/6EPy7TNkWFGnRHz5N/h792EF5nBF+ov/F7u+hz2x5G+/wz04gjThHzyktoAc
HVB3M/PlHuMt+yd7qBoedvcCfujI04x0nlIsqRimubKfYZ8ad1Pm6PiAj3/+Y04++hmystROuQ3t
e/GQgDTyrH+fRXcqC95VOe5toakJ0gpB9GLZ2/+SPbGgF1CvbAZnNew5F62WNiCITtDMwobPy1d3
a3poG5QnYpa3nEI/Gw7Dbsx89eKS85vvOHV7Hh4MdCaS7YI0lYb3jpwTJOWVl9owXkOxwfOWLavs
+RixC/jMeUMzIKUgpmCafq/WUilNsazTPpLSTGDm0Ycbjj/5IavjH2D8iiKOiicV9XrM4xX78Zxn
X3/Ny4tzGCNrGzkZDL0DI1Vtb8YgnaEuZ2bXBbqwofMD1gZc2IKxeOeVt2KrEjNTRERx2hW9ZLWi
L/ZYCqUZ7qZCrDPSMq0mmmSkleVS0ChNM2m0qtNgo+HISMM5hwfsv/uTf/WLgoJetHOi45pGRbG5
FW+M3hAWjnddBB/OqGGmNWXsijW6ByABeUHwFcS55T9MQPLi0tV/n7UOI3UZR2owzpmAqRnb1A5u
sGg22NKMwdbG4D1r1/Fo1fP4YENnHGdry+naEg4N0ifG6x2pTdAiLd8tFYi1WjpcI/rK5auJ/c1E
E89hOEUk0rUJWwUjFfGD1o5S0mShC4ReO88+BEwzWNfrtMHb5YNXGNYrrIVhPaidzVisNCiZVSfU
lhDJWFvxwWJspcfSi7D2DpGeaCrD9h51quyuEjUaWr0lp0zt7hjzG85vX3AjL3lTb9nvd5iuo3Yd
qVlKKHibaXkkmIzjhnx7jek9znkoGev0IKnJEJvFFdWP7MYEVYNocZyYp5GcIr6plMR26v/Vw1cw
khlMpTFimYg5YYInlkIyholGsYI3jZuq2tTbUghWpzlSmLAC3gAAIABJREFUoXPCXSx4t2BRbWNq
lUwF79iVgvWG17ngDUiN2GpwTriLM0PXc5cKkxStgtREsB2+gPGOubKofQ1jMXg7kHPFemUL6Iew
EcvMJnRMZcZaxz5nUhO8c6pidUqwi9aSywxN4S9lTmzsil2qRDxGMtXC0FvmlgleDWyr4PUF2QpD
gNQSXRD2RKxvDEG4iFqFeVkS4j1PG7wRQ+8dJXlCC8S5Y3CBq2rZicUOgV82WPeBfYQaev13ReHo
dIP0lvnGY1sg1kR35ElXF8SrPSVWXl9MzAcb6s1EdY17J4V29QwjnuHeB/QffUK6eQ7PKvc++imd
c3T9R+TrRrlck26gXLzCupG8+wbsHpkL1m3JuxXtxZ7u0c+Q8g4tzdTrS9y9NYQCncX88Ie01Mjb
A65++SuSG6g+EKqn94+ol3uG4TF13EPY0/or8u038N4L0t0F7f1GNYE2OqWtRYMJp5RnI6w31Lgh
30SKPaT5Fcgx7J5R757jDnra/IwWIvm738IgpIs32PAYG88o5ggTBvKrJ5jDmfj6b5HjDSIzpg/I
0Slt7bDDQLy8oZVGqTC+mdm/TCSpbD7t9NJsQLqOaVeYUmNXKzcF7mqhOMfHP/0hD3/yR/jTQyTo
C/wtc/0tfrtmlau0ha8urtKi0UDV0rhx0khZ+Rq1Lid/hdTUQz5X6J3inQF6b9hnBbeMy849VvN9
iG7OKmSqDZzRNHuh0nWNKQnBgtMpMRbhxfmeVy9e4G5f8aivHAXdD/fBU3LT73z+C1Z7P830ncE7
wZpGHzypzjjnyTEiTv9ZZ8H1jlqiriNaVS2pWSZ+Wdjd3OBNw+WZ00PDwx9/wMHpZ/T9GbEZjBuI
pZKSJsavXz/l8vw551fX3Oz2SJ7xLbMx4JYJh3U6TXTeEVzPer3GGMPh2THOe8QYQr+mFs0d1apG
Nd3PZ5qxzItCti6iFRFHLRWs4Xan62yDBm1LE0S8Pm+b17tNKcRS2ee0QHMqIrBdWawx2D/5k3/7
C7OMDY3W/hDTNKXtwIuO03UHsPB7m2C8I+ZKTJlxvCPXmVb3GKm0konjTJpnatEAUKmJ1hbyt1ki
/JXlEqFj7GULtOzegwbkclPBC+qzrhj9jQsdg7dsVz0H256V93gxGDEc9p7VxpGO1thhUO3p4QnT
7TXbh4/w3mK6TOgrLjfsHvphw1HYEP1LanWMKSC2I7OntI79HEnjjLeW3nh8H3S1YJtWnMjK4GmN
EDq8MTgf8D5gjdUqX9VQVzHQSlYFn1E8qbT/n6k36bHkStP0njOb2b3Xx/CYGQwy58yuzK5SV1VD
i260IG0akNAadl1AA+oGJEB/gv9Iv0AradGLUrdUQ2ZlZZJMMsiY3MOnO5jZGbX4jEytHCAQoEf4
dbNzvu99n0cJaUiJn/1o03F6ekG/OSGtFN72uDCQpi01Rw7xW/a3V0zzHt06LrTj+PiEo4dPmO5v
qNmyTxXbGbqQ0fMHYm60eotvD6nIHie3SpwEdtFsQje1nBIbxmtijexy48N4IM6JOM8UCtY0DEUy
EuWAtRqtK75VTAFLleqbUlIZqwWvxNTUaWH9l9aE6laqhNyqHCbtIiZRGnY50jnL1MrCRigERF4y
zhNHvhe1aa3YZqS2oxUuVwbt0DXK92gdY1mcgsqIDAPN3BY1pM4EY5lrXlwDjTnLKPE7LnVGiRu9
aUpprLRFlYwzViqILVNNo7aEQf4tN84hhH0wtnFolc6AJuG1tBwylUFZbEuYatmnSG+c7MS0CDi2
rfHMWlYVVsphiqEZyxA0H1phPWj+jzTzVlUe09AZjtEMzTAEz8qLQ8FfaNqmUntFs++IvMGVW8bb
G6Z5RzKNnbph89xhaqHFK6oxsNlRypewbthnK1L6iqxmppCZp0ektGG+vkX5jhYVegNNOWm9bI6Y
3+4Iv/oLDl++wT17Tq0T3g/olz+lXr/FfPJjoOFOB1qOZB9Qa0N+f4WeIe9e0718SWl76vyK9qhw
94e3tHNNOakkXUV7bDTh6BfE/+sWe/qcqjaUrwL+o6eMryeULsTX71DlDqNHyh/+mv5f/Iry9j+j
zo9occIMxyhtyL/9EvPxM9o3r3H6XNaNf/8l5mxNuZnwp4H46j/hzzo4e4Z7uEZbT7w5oJyhpMou
JW6/KrT3X3Hxz54yR0Vd9UzNsC+FsVbe7TI709jWwvOXT/jhX/wF/tFzbFgYE2W5cWvZayu5pFGa
RJBKZFEjS0ApZ2E/KCUJ6s4YKFVu19+50FVjXv5DrlnYGcsed2wyR1Vac6iVoMS1MDcBx5TFdVAr
woWvSrTCSiEcLcU0w+fv3nP19kuGes2J13gtwvayKECdMtRYKEnEFNYpwpFB64TrpUhvrUxD63fG
z1IwXkRfSstUOU4j3nlaTrSiSLGS5kjNmb5lnv3kAUfPPqVfvQDdk42jIdKbVCq7m1e8fvM5129v
mOeMqZk8JmorOKXJqkqwWxeOVgPBOY6OVvT9QHA9YeipTYsqt+rFH17Eo+5lolxVYxojJeVFjiNe
hnmOglrPjZYSnopa/OhaKeJcaNWQZkFg51gARe8ls+CDxmgnLJGmMf/dv/lvPxNhfFsAL8tLfOHp
em/RRpNzk51rKcI5bo1KIS6aN1Uyqko5Po4z8zxRckTTiGlE05Y9bVwezE1uiaqhVJHFTC0C0sdg
tOw9VVN4JahCZaTb7K3BW0fvOqxzGGfR3qKtwQeLD4bz457nDxxHJ4H16QaKpuwzZb6nzLf0wdF8
ZXudcGZF7SqJwOGwZd5OjLf3DIeOkDXtvqLnkRZnvNZ0QROGBTwjgXLUIrQ3yqO9kzGbDRgtwhfb
DZgF1J9zYy5FiEENHHrx6kpvxFtL5zzeGi5WnhN/xiebj3DjBbe3PVP8gpY8rQpZzvtT1NizqU/Z
hGdc/s0rmj5ibAf0dGA37lC6UDgRbG1YU62hOXGhF4d8CBUob5hVw/fyok0aVFAcxhnjG1NKbHcH
5vt7nGH5GWd8CKjSsK6Tjr529EWOYjrLQ8Fo2Jckh8NF2hKb4GW9Eexk74xAFpRBt8a4vDD3OeKX
CZBBk1KiVVhZx5gq1jkylaLkkDHXzCYM3KSRzlqyqfLDMo2ZTLCBfZrY9IZWMk5rnLLMNdKFFfvc
cNaIblZr1gt7PjnHlCvJOHKWW4sxlm/HPRvvaSgGJSNDs+QuttMetziU70vCWcX/PU98dHrMb/YH
NsGjkmGKPQqHqZaV7fkwJdZWHrDeWjqv+LvtzLnz3FdFsxalEllXHvjAdoYf+0BYXMvWKKJGmgpN
QquhMzSnWJ0EdlWRakdbn3F7+S0lX2PaN2TuifGS4agwRan1lGtFfFvR9412/oz57YG2+glp/wD1
7BP2X14yrTJpdce8vWKqDT1XuSGnAecy4aNz6t3XuFPY/+PvUPM1plNoEzCbH5L/+gNmdUy5LODP
SFcTOEcbjog3H6QKdnuJ++QFbXXC+PY15pEnzZLTqFsL3xja8DHl3Vf4Fz+m/vY9dKAGS3Yj7QL2
8XfoTy+o+hrz6XPqbaS8ukQdf0KdLKZ/SjocsEGh/XPK528JL39EYU87beSv/xHaimYc8fdvCL/8
U7QH9/QRaX+QClVM5ODYz4kP33zL5meB9eoYvXlAbYbtXNhmzYep8KHMbGvk9OGaf/rnv2L15KeY
viM7RcuCZhUY12LOXHSoTVDgKC1BNUlda+YMnZVQqtJKEvVao5Viykj4c7GyOSWcjc1SOwW5XXda
YVCkImP00hS5KeGRLBPW2AQ9K6N2maEqJWP67T7z+uqa/+ftb3ioD5ysDK5lmq4U3agKjJYgmwda
KbhgcIgl0uglbKyk92609O1blrCvaoBVqCz0SoUVhkWtTHOitRGfRx6cah7/6qf0q+eE7oJYRaiV
qiVXmKc7Xn/zWz7/8jU39wdUycSc2R0SPXZZbyFh4B6OVj2r9Yazi2MKivXRCSk1jB5QppNOuFGU
PGIc1BypJKwSd7r2AiIzTZE1pFzQ1gkAqTVqieSciaUyRtFo76csaNuaKS1L9VjJinSuleAtsSYy
BvM//I//02dNLchT1WFNhzYCItFGbsSlNrSXWyQGivRsJLofoxwcS6PVxjjOxFSZxsI8iaqOUmml
QsuS7FPLA30ZTysjijyUR2uHbnZZ1IBXGmU1TQl033uL9U4IWUYqN64LKCxeeaxVrLzlvFtx5AY2
xnDseh6cnnDx7AUlnpLGwri9YfwQBQJgDc07Jj3x4eoDpWyYfCGqFePdlsxITTNlvUP1K6k5VBk5
44TyJba5gmoy7l1cgjQl0BZawXgrMYNaqDkxxQmNWVoDsl8uZWHkl8aRDTgKx71jvXLMqvH69p6k
jjBhRU17VLM49QCle6zJZBqjn9keZcbpFU3tMCFzf3NPHiP5g9QgbEoYsydoCe+Vmtl42QfTGhrD
WDLGKGJu2GqoWKYIKWZKrMz3B6b9Fk+FFFFKY1TFLpAI0xpOF4bW8Dri8oxSAmPJOVJao+ZMUVXU
jVpmMK1VegNjmgWVWJd6jNfUOtNZ8ZSfWC8yCya01cSSMbpSc8JoSdA3FMYGpqbxNjBGRWccBkO3
MPBjlqBJag10EH97hWNv8QW8VgIFMVCX65FXipQLm86CLjitiUbkMt5adrUwGKEH0uT/GQG858v5
wLXxmNYo1XHhAuNcCcZRFlWt1jI+9V6TS+LIKCyKU2votLgUBq8ZW+TCD6RY6DA8Mx0lKYKyskLR
Qt2quaCdR2EJ3nJkA0ENrPwKkqHMjtt2z32byFpuJ51vxFfQRo+Oa+oM9aBR+xnnPyaYj7GX5xjT
U7Yd6mKDQm6mKND+nHyItPs9w88/QasNzj9gnnoYG/7kmFwPtM1b8uEd5tmAfn5CunuFOuuZ9p9T
jg7U+1fC8r+7obU95odPia8/Rz+Adj9gzYaSIf0uo7qPseEpuq5RuRPtae8pttAuVqSrS9qgqast
6e5z9PkJ8bd/S/jFX9Kmd+i1o3X36PtvUZtT6tWvUaFAuYJ1R/7DV8xv3xL+5b9m/vYtXN5h1UB4
+Snq+IxqOnRWxP0Bvem5f3vPfPs3rFeG1ZOHON+xG2ducuT+EHkzTVy2zPFZz1/+6U85/uhPMOsz
0IacIO+E6+C8END+aEaT6pLKsotOSQ5uU5QdtjfywvVay9rUKmKpzA28g+so7ZFYC70V/XFtjbXT
7KeCN41cZEUGwoQfPMwFeqMZswiOnIZcG8FIriVoUEVxf8hcvX1N3b7jgZebey6R4C2pZgZv5LZN
xamG0ZXNKqBaIQzh+2mt9poyR5RuEsbWLAFqeZGnqWJtoBVFS4LMTvOBQU+s9S3P//mf0B+/xHeP
UapjQoKzc4EyR66v3vDF77/m2zd3TPPEEDQ1RVrNWKfRpmGdwQ+eVR842ZwQhiNM6HBuwLgB8Hjr
xNrZsqQEc6QiL2+VCzll2TbHJrfsVilJmjqqNVorlJwZp8g4i+jqPooVbyow5kJa3A5NCdRMG7kY
e6fACuvF/NVf/dVnvfOsQo/vvHS+Oy9RLu1Qygn+QzsohkwCoxZoTFl4VkUezsoQsyz9pyRwg5Qk
5Sc6u4JexibSuStCidN6UX+KzQatvxeNNL2EO4xedvQGSkNp88c/YywGi/eawRm6YOi8ZT2s6GzH
cec4WzuGwbB51HH06CF779m3ClMiTRrKijo5WqxEBrY1caxOKPd3tDrQ+hWHekDbIzJa7ERLuM1p
qCWji9i8yAlnPLWIPFhZKwcZ74UHbXpSrmjlFz7jcgIty4e4ys1WTt4JHRRVF9gk+tMdR+d7jo8U
JkXseMzKnLNmQ+kUzV/xtr7FrjTb8UqAPSnw5uvX7Hc37LaXUG8JOTOsC9p2ZBJNGbTTGK1RSsQK
ukLJjVIEzKIWH3rNiZIS+3kmjYmaDuz3O5wuEKVXabRe+qgNpQuBgimFTmdWKWIbdLURlCxTHJXO
aKZUKUoeROMyCtQUem+IacQ0hfvuUIhin0eKs5giKX5DJpWE145cEtoZ9iUza8WHWlG1sTKekgor
KzCK7x4qrTVOfGBMCY8WHK9SJJvZUVh1nfRBrVlqeJVON1QprFxD5UzvZMR2nTJra5hykwdm/k4a
Udnnyk/dimlqXOgVJSuStigL2xY5W/f87eGO5MEavaSWNarAqQvcjIlj4+QzheXYefYt0bs1cyo4
22Fm0Uv23gt7YPDfo2u99ZSkOdt0DNZQtUb3PeuTU+pU2c47tneZkmQ8q00FJoI7RT/YkO6vUW6p
2gyaOR2Y7r+iui1578jTCfu376B7yVwD1Wq6n/+MfLendivG37+n6EeU60bMV1huqB/2dJ8+IN98
gdYTZTsz/e53rE7/lPtff4NiQ5sTxq+p0ZL+cAtTT3vnMEfntJuBOA8U/Qnx9R0mrNE2YJ9tqLsb
qt3jXpwx/c3fCcXsbis3o+uK6k9wn/6S/X/8f/FnP4K7A6o9Rptz5q++wrz8mDIl7IuPyHOg1Z9D
OCVdgtkMuKOGe3GOPXpINYY6F2puqNM123fXxA+XdOuH9M9O0cPA7TRxlzJv9geucmRH4Yf/5Dk/
+fEv8Gc/Q2m5bU4TjGPBKJaXi4zUm5CaqVFJ/3gZsdcmyXa1aI+tWdwOGhSaWFhIj5mEhNxclRF5
rt+t4PjeRliarJwOtRL0d9KkBTgDGNWYq0xQdWv0Sl7o0xjZ3d/z9uvf0Kd71jajWwIic5kxuoFp
1FLRy8G9WwWM1hQlk6TS6h8Ph5U/msuMkuC2MrRaBB/bpHJLSczjBPPEpmucPT/n+Af/hOAeY+05
M4qmPTlrcm2Mhztef/07Xn3zjv04Mxghlu4OB1KTW7B1ms4q1quOo80KYx3Deo3Goa3HKCdSLhuo
JWKURmvpo2kll4vW5F1XVaXWvMhlBI9tdCHPZQmbFw5jJjfFoYkTYyyZqBRzi0LiU565SWjYaEct
mqoE7V0zmH//P/8vnznvCWHAeUcXLNZawWVqQ5ylS15LXlKWjbagXhtFpC3LsF7lpRvZIMcs+8dS
UMiNTiF9wjSPUBU1x8Wf3qgYgct890JfSGSqLcSg5daqm4Iq4yMBjSwvQ724Ymms+pXIUZSmC56h
71hv1lhvODnuOL/oWT0+Y/3sCao/Qg0J8sR8d4NVjjBGNuaY/mqCUWN1TwqBm7FhWDO6TCkCxtFN
giUNsR3kLAGHghbLmRVQiLGeVsXPrXuLRhLVtRa88bJXqosetYHS+nsEqqQIFCvrOO4Cx9Zw2p0g
NPA7sh+5Vm+4M6+4PLxjGnfkfmbcTsSxsa+G6+1Eto2iLP3JCdr1hPUJyQ6MqqHsgHKWWuRmG5uU
S5tqUrdrbdEsSR5C0KTy9TAVttuJeTww7XfoNqF0xgcZWVvdME6hyARVcEV24KFUdC20nLFNbqVz
yXRWS6BSK7Jq1Fax2nCImY32Sx1S+rMzhd5aSjmwthZdqjzwlMAuvHdEFVl5y5Qza6PYWE2umd4p
xphwS9izt534iVNm7WWkXrT8UmXj8cb+UTmZKw6NqTBXkQnVJsCaVBIrLUXgWgtGOeYiwc/7kji1
gbWz0tO3gSkWlDH0TWQzQWuuU8VYzX0tVKN4lTPGyOH11znxSR9QWvzqMxO5wSZY6e0riylI4FDn
xWupiChw4tbWyrDuLV0zrAZxJvjVGu1XzHuFq56yLeiiGKoEKFO9I44fqLWRTUUdB7K/J6k36FWi
lGvYTcT9juQNMVuaXsPRinB2gm4yOmQ6gLfk62+wtgc7Yu1HaP0S3gDtOfG31+ifforyG7bTLfNa
U1PFxQ28r7jjT2k3GuufYs+ekOcdDI+Z1BYdKnacsK5iu4n8D/8n5kSR8xvIb2FtKLcz3l7QZkf/
6S+pVyMcCn6wsN+hzh/Tdg3XDLg91q2xzz8l/affYs5fMv76C9zziu6+xeWM+8En6NNj4TpMM2bd
kXJj9/4OdWPRwXD2w+dM08yYK6/vt1ylxL1pPHm85k9+8SecnP8Csx6IWcbb17tMbYpNZ2XMPPD9
zL2WhafuquzQjRZLGwvNrULnYM4aZwXbmoq8bA4zrKzkQDpryBR0UwxmER4ZS27yOzpX2MbKsddc
x4ogwhpOCeY7NxExlVxYW4VN8OH9HTdX37B7/weOzYhvkdYmtE6y22+KipW6WlP03tJ1PWkq+G5A
YalVDrIpN/l+xihTilokhGsUORealtobJUNMlHGPzTuG0Hj0yz9hs/4E686p2pIQgExKjXma+PD2
S7753ecc9ju6mln5JgC1IopnbTSDs6w6w/nJmm7lWPUdJkjd2hq55GgrGm2rWTjzM86JIlVrRS5R
1plaLU0jjUoJaySlPx0SY57ZpYm5NLYpMhVhwsSapHfeMkYb1HLYqVoz50aucrkoTdS45j/8+//t
M22djEmtFRNQlYDSHGEsUjvLGVLLsqNUoheUIJsS+boSJY+uCkpFFSUwgJYEwtKW2H6MpJQoxO87
3XVpuGllUaotnvVCremPu90mHyBJ1X1fhBOLm9aoZgUjq0EbJ8E97eTm3vUYP4BRrAbPqut4uB44
6wb6kw31bMVcHaVcEm+v6XSm7zPzXaYqR9tsuLWK2+09V+NIrSu09VjVWFmBxbRayamRa5LkYi1y
StPCAtfKUuqI67xULKzAEIJ3BB+gGbz1yz5eNJmxJpGJoNBVEbTDoVi7QcY/D49pm5mr+Su2+xum
+4m6b9QM076S9o1pcozjhmkqpDQRi6I4y30aSCsv/vOmMQ20qehmiXNB0AEK0zRhsNJu0Iqk5OSa
TWWfZyZgrAdSK8zzyDxHIc7FEW8K1BnrLLoWrA0YI8xJZz26JazKIojRFdsamih7vSYiiSlmnHHs
s6gCvTWUUuSBUouMn5vUWToLpcxyMymNPnjBKhrFoAOhyc69lkhvlwNKBW89GakPblPCByEkayOr
pYpi4zxTltF6p0BR8Koyxko3yD6+AtYYppJpSkQWXee5T2Jl09agjVjjyJm18oTWMFUxaHC1srGO
VAqPO0unCkNTnGnLQOOjfoOuBWUrayetEE2htMrJMMjqy4LyjmwauqvsUmTd9cy5oExPrY1DLayH
jpIafefo+w5VK5tVT9aecX+GPX3K9XvDu90bDqkxqcL7HMkqcPLsVyQ26M0TmluDhxpWjNdXFK+J
DXI/kH2k1DuKusTE1zRtUNOMPT0l6sK8zXD+gpJm1OoR9UZjn7xg/uaGMoH/9FPiJeQjSzMz5T7R
Disap1TlaWWDcmvmtCcfJqp3zIy0FKn73+MuFOXdl9h6h3Md9eYP2JPHlFuFsg/INaBOntI2PYf/
+A/0P/ox6k7jn35Eq4py+Ab/4jnTr/+a8PQFmBV17Cj1EXpe4188pf2NpTs/xz5/hD3ZUGNdAp2a
aT+x/fpAerVn/ekJR2cn3M4HbmLk7XbLVcx8YyP/9V/+imcPPsWuP0YZw5RgLI3tVPFG0bmGDWLb
W1SK5FnG7wVRlOYKdUmrqyJ5pyXnhkaRlmdsLOr7PfyYi2RWioBMmlHMVcuOvFX6xXmw0nLNrw2c
lpqnMbJ6sloJnVJpBqMocebywzveX32Jivc4Uxb2uNTJWtE41WT83EBXS3AerRTeBVzw5FgwS/vF
LA6RRsV1jhIjBEOpDXRHq5p4iNRiiGOmjjOD05w8OuLk4x/TD09odk1WmqatKKGzZnv/lldffM6b
99ccDjNWSXMmJ7msGSMGSKsUwVr6TcAHh+96VLMYHVDKo32PVQbdlKTgtcKaKkoYlcUel+WrvA8L
Rlm0FxPcFDMxJ/ZzZI4RUmQqMymOtJaISuyjh9wwypGqNBYssm7xNLStC+isYf7Dv/tfP9Na47SF
psmxELPoRMcpi66tZGGD10ZQBtvq9y9PUNIJrNJbN9osYwe9SO8ruWSpceTGnBOplWUHJOP6GhMt
S91NqwotQkvLHlr2Da02GguwBkF66v/f6F9rUbLq5VpvlMYsqVeCVAqstXirGLqe1TqwDoGjXsxu
65Njzh6c41NPeK+Yt5kje8zsZtzJGVl3zFeO+5xJNzvu9+85PrP0RsJbkJnHEcZE58PSTZcPvdKa
kicJdHlLyRGjLWjhAFvvsCawPgpoMtY2DnXkMAsysFDFyW4Fx+gcdL3Fdgrb72Ezoojy4ZgURp+g
WkdLQD2i5h64ptaJVmA+BLa3Vh6GYyd0o9LYdB6mRjtEStFU29h4g2yiZTymdEM7zV0StO02x8XP
bchI62E3jWzHHSlO1HmHNULoM1ZTS5EwJBmjMk41LIKAtXmWX4icsVbR8iIS1IbXcWYdguwBgUOu
zBRWneV2nvDO4GvDNs0+FuIy+dimmdAFdMoL4CExt0jTImNxdjFxWZk0HWIiBCMVPaW/5yioBcc6
eM88T2Sl5KRsDMrK4eto6MipLCCcgq6aI+/ZjjPBGlYVstZczolD9VjnmVLEug5axBlpf6QWGbxm
ypGzYPE1s9HQkowV14OHUhi859UcGbRjEzZ82CeGbgNZ9Je3FbYReuu4SYXgFO/TTFENUytFVYwz
tCItj9B3WGNYnQaGk4Hjpw+Y0zGvb96zbyPJKQ4LndEmiz0eqHVHjoE2KlqEajfsDwYBDEP/g48x
dwlMhdqTX3+BfXxBjVfYR6eU6T15+gqltjTfMKGjXr3F2nPi/j317beUFknjB3K+ptaZlBKH9I5Y
d9iHH5OrJoUzUrtHrzXh0VPy9Bt0nWG8InzakUpEtRtqjZT7Ay08ZP72Ev3giVgJt41wEShvv8ae
bVD2QDMH6npNvnuHfvIEdfyEymPSmw80FcBryt/+Gv+ox/cr7KNTWmqYtSfOjbt3t4y3M/Vtpv+4
p1qYWuN2m7m8SSTr+eGL5/zTn/8X9MNHmLAht8qcYDfLpKk3lc4Yul4MlgrIrdGyvMjJcr3JqeEQ
OFIp4I0iZ02slYxkkVJtzLlgNMQU6ZyBXLFK5m0OF8p5AAAgAElEQVRq2bWX2rBaXpq6NToljHlr
NNtU6JZGSqWx8TLR6jToCuO44/LyD1x9+JYV4vzOKdGUMCSMkgOFNULG0Qo6Z9DG4IMnl8W+WBs5
zihdKWOk8wprAF0lvV8kk5RzpihLnBKHaUKPhZWOPPrFR3TnLwjhEVU5EoIgn1OjtMqrb/6ev/71
73mz3TL4wtE6UChEscXjnYQJnVacHnVSPXYdnR+o1eBDL/W9xVCptcMPAdUSvu/kJe4MZpnUhS6g
aqNb9VjvibESFdxsM4cYOWwjNSVxoZcEtZBUY9aQtKHrLMaINnndBVlROnnXqaaZcqIZhfm3//bf
fdZaoRX5B5wOe+Zp5n43MqfENE+UnKCkBctal4S7o2BoGGbkBa0WPdw8j6QyE/NMphCT3NJLkd66
1Zqas3hfU6aWmVRmWAg5MUamcVpG85W5TkLaKfP3O71GRGvZs0ATFq7Wy7hR0bTkJTGGljUojdYe
5wLOdwTrWXUDp/2KU+s5MQHfBvY7z90ezh//gJwabXJofc5439i4gdB1xHTFYf57wvCB880xqhri
IXG/m3C54Y1dGO+COq3AnCbpJpaK1VY8uUmQtkopVusVWoN1HqMMJYtatjWNaobeW1xTlNZEQ6pl
/D2EUy7CMW59xPnTj9i3A+iBeXsju/lVT4s7eem2gtJHzK0nXJxg7Jo8Tdz/4RUPzzaQA1OeuD5E
dnYGJQ99RcZYyE3UuLFkStHs5gStkUpiShJ81KbSdGSqO766/s+Y0hHjDmsaWhVUNRisjM50oNaG
Mx7dBDAUlMOT8K1CjTQnP1ujHFZrUin0RpN0xFlNQSA2XmlyrAsWuFFNIKFpxuGNZlsmSdXyXTdT
YZti5b18Pq1mboWsinwumyBfs4JeW2IBt4Rc5IZimarCGBmnB9r3xDinLDEpBtfL91QqaxfIzNIg
obFuctMRQ6TmTU0Yp9mrgrKGQy18KIaNsUwJWPIFrg8SUkoZrTS2KZx1HHKB5rBNVMBrbbEl8Wzd
U/NErwumQS4QlByyh6EnjYmcK8E7VIX1yuMB6xRHK8fxpsPMDhceYHLgcBg5xEI1A/n2Hm0Vh/df
UA5bLv7sX5HeZ2q6Zbq7Jm1vYL+jqWtabsxvvwE3yHiygZoM7e0rhme/kp/1MFGHidIpzCdPOdxH
WA/EyZOToswX1J2hPjnl9v4rNqc/xR+dknYHRj6wvfkS97hHdSva7TvG7R1q3WNcT377BvXsZ0xf
XKEe/znVrJk/XOJePKC+vsSdBdT1DWEz4Gyj9gp9dgo54k6foQ6BOjXKtWf+3TXqPDD/9n/Huiv8
mcc/PUI/fUI9HjDDEfvbPYe7xIe/u8R/gM3Pj0hkZhO4u55IxhKPB/7sz3/Bowc/YbQnAqIpjRGY
ikTOV1phtSas5YVeNZS4qDib1LmqgTkJPChmOX4aLWN3v3AmnJHPTKySbymt4YwhK4nJlyqCld45
9rlQFrFSUQvlEQmHGgxOSypdI9Im04RoOMeJr29e88W7r7ndHViZjG4ZT6UUuc1r05hrxBjBOHfB
0HdewCjOk5PsrWsqpBppOZPLjDMyAldmwY5VQXbRhBx6mCJzTtg2cfbCcvrxE/rNT9H+iLlVqjJU
ZUhJcXfY89XXn/PVm3vSPLO2lt5bapX6Y6RRqDTdUE7TO4/tLMNqLXhzoym6fb8uBoXvrKwWTQBV
UCbjgqWUmdAPNCph6FBOPPF2WDPtI/tDZjsl9uNIKZkxJ6KKjByYVKMaQ8bRK0/QBm88WjU5xLZK
1uY79byQ9/77f/1vPovxwDwdmA57ttsdH+7umeY923nHNO+obQKVFke33NgbMNckIINYqVFu8ZQs
QI0SaSRiKhSlmFOVHxBVRCl5JueEUYVUCikL1WccJ2qKTPstpWax0pRKSUU66arICSaX74lIdSHp
gKTmBUUrR0ZtjaSvbUfV4LxDYbA2LDcjy1HfE5RnFToePDrm9KNHRKO5vH3HfW105gV6nOjbzGpQ
hOOZrC7J63u0XjFtL3n9+88Zk6YfVnin6dayd2ymUcosNTanxKRQC7VGjJNJhjEW64PIObpOTuJa
9mFJNViEHUq170fyRmuccQTTMdNzsXrG+dETSh/o3ICaHbU2hk2gxDtQS26hOUxbE+sz2ryiHhpe
wcYGcs7stx/I8z2HukO5wG5/jw8DVVcockOoNUt9UIuWNBiHxxBCpbRXtPprrL4lpzeY8jG73UyJ
jTgmNBXyhPEa6wJaZaxpNJUIXhN0QptCbyq6RYKesdHQaYuL0t1vWhK7J94y54mz4OXW1rKIK1rj
bOiY88zaOExThCq1tFrA2465ZLRy1NaITX2/xll3gnnsrMFUwTQOztOqYu0MU8703sDime6NIefK
uuuIRSo9NGmHOK25mu4563q0yhQ0IyKvWa88h3nixAdcbfQGnNE0CmunISnWylKR3IjFs02aoRvY
x4h3Aa01sWlWPpCqxnU9SVXqErR81RImVK7jnYiQVOO2WO6bJRfN4AJ3Y8b2nqRg0op+EETtg+Oe
08GxOQn0J5bVgwGV4fWHr4j2iP00MvcZd/wAa88ID18yX8rhq5g1Snla70CfyyHIQC4T9sk5qET/
5Bk2HlO2K/yLH7D/9RYzfEpOHel9pV7dY08eULrC/vU3qBcfkbsjqr3AvHiMft0IHsy8R68q47u/
o+lMPQA3if6jH5NuRlQ2GGdh5WjugvGq4I9eMu13MDpS/gYzWFx3Tv7dFf7xx7StQ7k1ahvh7haV
PNVDff6C8dW3qE2lnUbKm7/F1UYYPOGf/RTWp6gHZ7RZczhEbi8PXP3djDnX9C8HKobbu4nD1Fif
rvjoR495+aO/pJgB5XpSkZ10zIvwqDVsLawHh+1kOiblYkUphZJkHVmzopSKQvarwSKYYSOZJqPk
0pAX49+cC7XK50EjjYkpNzpniFmAYr2MX7GmEatgYmU6KhODUjJrA6HCWltcKRz2t9xdfsvh+ooQ
R3ob0RQ6a2EJ67VWv0eFuaYYjKfzHV0IMhH4jkSS8/I1Qik4rWiqYEylFJEsNaAoOeBMs8hYQjnw
8KOH9A8u2Bz9kNoMtWnJ1BT5fd7dXfLlF9+StvesaAuFLhNr5TAVus5RjSWEQO8D1nu6oV+mqhpt
DEo7jA1QoXNe1q4tok1DUXD9Sto2zmF9RwNct6IBNgRySWzHmcv9jne7vYzXW6bkRFGR0hxNGbK2
VGW5i4XeWax2UldWjbkK7dLQyCnSOzD/6r/8rz67vvnA4XBgv7/n8v6O6/s7xjQS08QcR2rLkCu1
itXGIKarViqtVkqNzNNEzDNGZSBRa6GURJwglcp2LIzznqon2am0TEozZXmRx0m0pSknYpyY00Sc
MilOaBo5zeQ8kdNErVGweoi9xjQh2+kFJ2iXl7kxsttQWvbcYoGzko43Hq29rKRcQDnN2fGa3hvO
VoZnjze8/OFTfvTxA/ruQFh/INsvsE8a3dmanG4x3jFt30PzVLeAZZTDWydOX5pU7qqsB+I8S5Qr
K1LMMqpBYaxeBD3CggfhGFut2PjAYB0qFzCFuUzglNwklRVmsA7iFS6Fh+szLtYrjjvDgyPNyq1Y
nZyTi2JKEzSB9KhWcfaWzUYzhIluNcOwJbrXJL6lV5mgO078CtsaLRfGOWLtouprikrCNU1LDWc1
QTVa3WHNY6bZw/QDUoFDLNzuJg7jyO72HhUj1jWMzZBHSh6/l/3oErHOEVA4bfARApqVAtcKOPns
KKNldI5DUbhNM8H0zDXjF5+yKYqV08Q4yu58QcjONeEKBGvJJWOXPmzvPTrDlAorN8gZ0Vjuo6ho
q4KpZax1XM8Ji3Rwg5Y5UckRv9zqtREJQ1EKbyIlRqzxHHJi5YOEAWtl40RA1DvDnGYMFl1AVYd1
0nw48oFKYnBe/raqobQFpTjxjkZlMIFOG3E+B08FggHTCitlcEpxXSsbYxhL5IHv0BpKNmAUY2oU
7Wi1sV4PKAWdMgx9oOs7iu+4mzLboHgz3bM93PHo0QtOz39BLAbrFSlk6d3qglKOljdEO7FdaW62
Ow5mBfcO15/Rbz4h/+YN+sdPSFdviZsDqduT4zuBHN1+IDx/RKkfOKiRu/EfmIdL2seBQ33N/eVv
0JsCA9A3YtoTHp5Rp4RTmWl3Cdc7SBfY+wuGH/yMedQc3r/HnniK2pLtDYot1pxSX91h7QVWncJd
xlx4yu419tEFZbzBnG1Q64ekP/wDpV4y/+Nv8SfPadtEd3FOePmSuhbeRC6ylri9umUyW/pnFntk
ySrxze0du1boH53y9Mc/YXX0hGY3lAYxV5pSlCR0zpYLwTSG4DBeQZBbORrKrEmpoo1mjjKdzEWg
Xalq5lyXUNx343doekl3l7bY0CBYzT5KuLjTmlJgZaWNoawm5WVSYBVTLqy9ZSqVYJZGUmtsnCIe
ttzfveP9m69J97ec+YImo2si10giY1RZGiEGXwpH3rKyiq7r6PpAmQuh65mmRKsNjQQ6u07GDdb7
BX1q0c4zjxHne6YxklLG5cxZp3j46WP88SNWwzMKmqwUFeHmp5R5++0rvnx9Cekeqyq5Rkopgqhu
Bqs7Vs6ysh0nqzWrfs36aANK41yPDgGlIfgOXQq262RWrQ3KOQl0a7PQ676rNUugtVFQrqdiGbd7
7vaRaUrkVOSdqiGVDCqSqkIrhcPQKU1nDbq05XCuvn9uZDLoJiu0P/vLf/5ZyYkSJ+62e/bbHblE
cjkwTgdKiVCj7ELmmZZlxFImmffnJCPyQqW0jCaTykiLkTxXqIo4J6Yi6NS8JMFLKbRamOeZXET9
OafIlCdyzrTl1l5rYZpnxnmm1UyqkRwnCjM5R6oq1DKhaoVasUbqRNS6TFbt4gBWGJz0zpUY2Gqt
VGPFVRsCzhuGznPUday842y95vh44OjRhvBwIJuMyo22z7jJkG4c7Xpgjo79beTu+hbbdqyOHlKK
pJSbTGJRVZKYujnpU5YkZD6VsU4gzMZaSpNfUq0MRht8kDpH8F64ww1B7yoIxtGUwjuPt0KYO+k8
PXByPHB+fMTp8QVDv6Joy1yF8mRMY7UGP37DiZ9gvGW1OiYfIrcTjPUBqZ4Qa6G0yH17w9u732L6
owVVKMCLmiu6NnKRQ17TGd1W5Dow7z27V41q5LaRMrTWyCkx7kZqTaQ0UvLEOO7QLaNbhXLAGAtE
ca2nmeANAYVWBdeUNBss5JwJzjBGMUbYJTTirWMuEWMsqUoWwxoNKtMZQ6wTXpvFB63RTVzEKxfY
l0rwsh9rSII05somOLYpYryiNM1d/s4DXem9ZZdHWfloUSIGDVOcWBtFSgWjnYz8K3jr+HYa0T5I
V0ArDkUc9p0OlByFwKUMVllsg20C5zt+N4903nNAOvFGS+tjCJ77MYH1aGcZS8U7TZ0Kgw3MU6Y2
x742vDKsjOEwz2wGzz7PJC1hqNs547xjTBG8w/debIq10XTg+OwjbL1A7wy//OknXDxcs62XTPEr
rl//nu4HZ9yWe+ajgD3bEEPl4Bsfrq9QqxVMmVAD6u0BVRT4gfz6DrM+hW6g+BXVRdTJHXyk2O3+
Gv04k9aa/dUteYrM40RJCpUmdDiiOEscG1Eb0m6PefIzxv2WgkN1j7B6w/qHL4m3M6aN6OMPDI8D
Ld7QDreYiwvybz/HPfwhar2GdaC2e/IXbwk/+glcFezpE9pOU/ZHHN68J20T4fyXqH0jPH+CfniM
Pz1B2Y6sKzOK7e0d6e4W24kgJ6J4P2Za6Fk/vuDRJz/C9RdE66kFohbhVaxVeteL7KSzBuMVJixM
LgVxlD5ybdJJL21xGKBJOUt+pwoJ0qpGbjK5msvSomlK1JzItCtgyLnJGJfGpGU0/yEVOmMFOrP8
udYWM1qtDEbRSmN/f8m7y1dcXV+J9a5ESs2kEhlLJmh5Dkg0zGCdw4cOYwfCMFBKo1bRapecMLag
siicoWCtQTmZRDQjXg2tAuNhYt5H7FywceLBxz0nz1/Sb16i9UCuimokDFeqZhzv+ObVl1ze3shK
VzVyykxJSGzee46Hnt55ztZrzk42rI7WdGGFcz3edaiqCWGFsSJy0l6jVUM5u1wQHaVMmO+IlCWh
TaDmDMrQ0NSiOEwzl9dbPuwO8vcvQmSdqqLSkbBYLEEHrNL01lIX9bQsSIpMbVQRSFdRmH/5L/6b
z4yqom2MkUPKeFPJtVHSSC17cr4hpsQhViqaWCT8FEmMZZJw1PQNlS21zHKrr4qG5fZ+ZpwVJf1/
RL3JjmZZll63Tn/v/RtrvAuPxiMqMyuryCpIhEhIgJ5BIwEaSCBLUgnQoATxGfLJqBEBaSaRElmo
ZGZGZnqEN9b8/W1Oq8H+I2sQQATcPWDmZnbvOXt/31qaQmGKM1plclootZBKJuZCbJWpRkrMpJyu
O/bCXCIxJ5YURfGaE7kklhjRtZIX+TMUQRjapshVRh+1NaoqV+lFucIKZO2hVAMt6UplwBiPRuOt
wTnwwXCzXdEPnvXg6cKaYXXPZVqj5w3buIVzZp5XHA57dtOeU0nEywW3veWUJoz1lFKQWqKSB/q1
xy3M+wXr9bUOJi/ypkTiUVsj9AL50Urj+444Z0p1gKVTPUo5bLH02tABoRVclcmFDxYVOtxmIKwH
+qEnlDWmD9zmwrZW1OkZV070AWxnOB8fOeQLaEWMM2OZIHjK5YI2HWte4aPG7BbcMdMrh42gU0MX
dVXeOipWvj/OkG0EIwxopRppWghaMcbI/nhiN44cdheWeYY6YZTYnWgZVYWcZJ100Z1teJUFXlOL
gBkAkxW9cdgkhwZURDeDcYpSE845ljyTKzSlmYuiKiuOaNeJLEFVaSJcITBLLgRtKUW6uFzxk15b
cpFgjrru0ZRTHGLB94FcMkYZzkv9U1d0KRnnFJNqoDTKGpZSMdYy5UywXpCwyhKUoeYmdqyasdpy
WjLRKI668fd54WdDjzGKwco0p2JQtmOfIlYHVAGUxtYqGkxlOGd54f1DyWy8xTXBXqIN79NIFywz
jWSkjLgvmVXXkWPDOiEX2tB482pguzFsb3pQR46X9/z+4T+wO/7AnopZV1hucNngqzAZ9Lxgm8GZ
QFgKfbGo7Ok23xLbSCmenFYUe0dOmVSO1PZAMZ9wW4PuRmgebGb+3Qk7G4L5Eqc3tKceLlvqPFBz
j2+vqG1LTR1N99S5h5uM3jTSMBKnfwfugg4j8+dH2Djy7gEzbGiv7pg3C/rFmnwp2O0bit/QDifU
L74hG83lh4XjD3/E/9P/QqBI509oM6NWGv/2C9AB1a2I55nzw5npXHHO0N31XMbG7lzBB16/+5LV
q3f44SW1KZZW6a1hKhVrQDeNVeBaxahG3xkJPXn5iqdJxukpS8c8lYqxYjTMTbSmS2miGEVudDQ4
5EKni/yaFpyqNXJDn6/Al5QLQSnZyaJYW0MqhZXR5CofZy2RUGDtNGW8cHj6zPuH95wuBwYtq1il
iuCQqaRcqM1iru7w7aZnEwa8c7jgxLCpNbklcYZTqSnitaidu1VPvdLx0JZUxCkyXmbm6YLLC4Od
efPzF6xffofvXpOaoihZIaUKOSfG0xNPnz9zOl2wpRCso7YisiVVebXpuV0F1qvA3d1AvxlwqxU1
Z2zXY5yTi1bfYZTCuR6jKtoGCWU3yftQMhgnCUUtDa5a5T2VlkScMvvDxA+fDyypYq7LlFIrRimp
Txu5YFZ1tWWaKy2dSs0FrlOZVjWpCGjH/Hf/zX/7K9/1aGMYhgGCQTlNKpljSRyniRwbtcAxT7Qm
vt5P04mUJ8YYMXUizb+mlY9kPlDKnphHYhUE51SOVH0kqz1FH6V/V0XmLreywjTPlJgotZLLQqoL
c85c0kQqGa0XyhWLp0sjpkyJhZyqmL1ixpApeaalmVwWailQNRXp91pnUDXL6KMqzNXfa7T8Grpi
rEMbQ+gGrJVU42q1YbAdfdfRsub9c6Kmwj6NZJd5mn/kEDJt3ZOso/kVjkCLSqAppWBrwxp3Rewq
UZGqhtaiSrLVyIuiyQNYNYWxTkhAIchmqWgsFo3GGBmPGivs8nY9bUvDXehDIXi8N5SWKPbEuXyg
poyLjhJnrFvRhS9xW4vVL3j+8T/x4ZipbWCeFroY6Jc77GWLPVfS6Zk0vadrA1wmnAuQLLpzNG1R
1pBivU5vHEVl4viMuhwJ6wvanSjxj2jjOMU9/+nzE//x8xPPZwlf5nlCpYwpEasyaTqj8iJI4DQJ
F7kurJzHt8bWWIaiUC3jtKWQiVqzUGnekhFwkdWOXOSgtKhKwpJRJGXonGXJIl2ogHMC9fBGYaxh
rhnMVR7jJBGsmmJjxUm+spZpnnBW02tNrQajpPPubWBMUXIU1rJvMrXRJfOmd7AsrL1n6y2XWtAe
8tQI3uOVkq4rhlJg8JbaMl/1axwNq0UYMdfGzWrNpcxU6ySB7qQRUbPivlszzxllLbNu3KjCrTbU
MuMtXFTk4BrZW35XGvcrw+OcuPUdpmpKE3PUpWhMF7Bapj/djWVqkd35iQ+7z3x8mDnHSnexDJcO
f4h0rqCWxDwdiC7TjBeBSFR4sybViWk80d4ExtP/Q1zvifFMOT3S1gFTHN69Qa/f0PRL8lGzPIN5
+UsYt6SxUemozVPnAzSLffMVdUq0CCXNKKUwb24p+z9ifv6W/P43sLKki6fVN9hv/znj9zPK/5LU
rzC+4s8TLTn8N57z//d/4L/paMGSCJyf3jNajX3zBeP7M6wDKp0J9y8wwxa9WYHriOeJ8byQ4yIr
OlsZa2bfMnHrePlnX7C9+Rbd3ZCKoqCpVbFwRZk2qazlUnFa4b3FmEZ1wnbPi+K8FEqVelq6VsqW
KGY0lNzEDeo6+hWbW2eMhHSz4KqXUmlaap5JKWJp5AKdtSylsHFOgrxKfAT1unO2INXJkphOOz5/
+IHT+TO3RggnhkZvrjvzpjHKYI2jN4ZgLS/u1mhrGXp5Ef5kE2tFDgO5JoLz4B1KG/ywYony7FZK
UzBMsTDOmRhnTD7x9tsVd999R7f6GVUN5KZpTYxqtTTStON8/szh+ch8OTPHWS59tWGdwzrH7aqn
7x3rdSB0AesHuZhRMdqjtcZqJxAr7a98/SzT1vqTJrxRmtSWS4nSHsuJuhSWeWE6z5wPM49PZ+qS
0KZSrzIzpeW9aH8yjGuwSqqQ9ifWSpPLqsMClbwUchPNs/mf/vu/+VWwnpe3N6y7nsEFmf9rI5Q4
ZTmrxphHita4OlG1ohZFOh7Ff30ZqacL9fgHzB7aaUHtM5QONU/U6QeW9omSGzYdcNygq4WpkGNk
yoV5+kCrM7ldKCrKS69kVK6QF1SWEX2rlZQiS0qo1igxU2pkmifQiZwXljKTo6wEWk2oHK9jiirj
XGXRRmAviiqhGXWtvmmFQmOcx3iP9UKr61eBzdCx6TV3t5YPU8SGDtRMmRZe3L9iy2vut99Qz2vq
cUJdCq1oUk2olkVKoipaFzEEqQSSI0TpnwA9DRoY58gxUUvB2UAtDe+89K29F0yqafjgSTmTtRZJ
jFY0V6lKOvfWQ/Cg3cKw+ZHUfWAzVF69fk2vevTqJUN4QRo3fNgVWmi4LjCfH0hmT56e+fzwD7yf
fuSUMtxvKMMK1Q/YIVArdEOH0RXbYN4V6mghQ7zMuNWA7zt0PnH8/b+lmQsxZS7Lj9S2RjnxLMd5
YZxnTCvE8UyNM/MysVxGptM1pY/oTL230gPXDcpC5wJUObQVE7G2sfWG9+OJjdfElskti3ADjXGG
Y1q4HXqBYOtMp6/ucKM51YR1jlQys9LY1niIM6tVx1Sk0uPFGEGvFJc5ErpAK4VFN3LNeKCzhZyK
9OordFqCczrLqP/jlBiUxVXoMKhFDmZd39jNM9Z6WixYF6BpPJqbruN5GTHWUROoauiM4d8fLrxb
rZjLjNWQSiSVytY7pjkRgmOuicFcefLGMGjFacm8cJ4xN3JTTFnznCs/W695miLWdsTSWIph5QI2
w/1q4KV39LbnPE/UZhjrwkzBjLBZe3J9wq8crS6k50dayty4N9izYYhvUZ0h6gMpP7G8mDnHP1D0
wHR+pMQzjTvU5wZbz/IfP9Dmm2t7xpOHSP76lku+MOqRYhO4M92772jHA3rlaDvQGYbtmrDWmHrB
3Gp4/A3+9S1qUtAOoqFkJqmC0YXwy7ewjOi+QvsBZQ/Yu4523GO6Fcv8A+rwPe67b6nmQt48kz6L
IrZ/9zO6V3co3zGVxHIs7D4faWtDDRJsOiqDvtnw57/4S7rNN6B70Rs3Sa5rpVG1Cnu9CZvcOyOG
Mav+1C9PM4yzWMbEWyL7dYX8f1RVOKNZSpGX+1XZaZXgpUWUpQlaSFZLbfRKi9mwtitBURghy3Xn
vuRK0BrXND2VTinm+cLp8JEPDx8ZxwMrl4WVgLRWYgFVNBaPKcKIv18PdE6YEsYYcso4b5nmBWdF
AuaMJgQtK7e1I+co1eUGKcmh5rCfKPNMKDM3tvH2z9+yvvuGbvVWfPE6UBrCoC+FafxInPYcH5+p
y8huujDOM11QOG+47zzBGzaDYz0MVKNxvqOUjFb+6oZqaGdQuWKtJs8n7JWfUnLEuZ5SZvGfxPEa
YLNM45klLeyeL5zOE4+7HU+XI0uWvBi1sFxhXivtMM0wGCvPOFXl8qcUzkCrUqez1V4rtbJO8FjM
v/of/tdf9d2K1fqGob9hWA90pods6ZxlwHE3DKxtz60fMKojR405a86fLOZSMbFQHwN2+pa2fMG8
vyG719BvWEpjSp+wZqZwopQj5+MfmE/v0VYznd+Ti6MoTdJn0DPKNHIbmeaPsmvOEY+l5CLWH4XE
9ouMqktNtLIwpwvLfGFeFuZlhFIEWtEiRhW00mhjpT+vnBTeroly9dNtXSmUFlKe0Q5lHDQl6XgN
xltWXuo8b7+8Z3P3kvuXX6NS5rJc+PHjgeX73cAAACAASURBVE+PH9l/PxFzR0fHuEuStPaSWjZY
lmWktsZljAKxqLKTrqVJ1xvNvCziTgeslZOqBrouoA1Y7bC6oZoRpaJWBCeHMWvE1KVqw+lAyoZO
f8ML/+d8cfsLXgyvcWiyLpxxfEoHnuOZunklyVETSSgObmTWXzKXQOhfESaDybfE6SRMc28Y20x0
iUiDQUNfaWT8kFjdNLT6I8pesCrB0oj5jrQ7U4Y1NRty0MyXCWMc8zwxjwnVCofzhc8Pew7nMyQ5
7drO0lrByBwLowqdtviW6YzC18JKBzoUK1NRtVJy4dYNpKuMQjehc/RNoapw2Q2ifyxNhL3eKFoz
lCZj/OYca+WoBaw15FTxxpKzjOsChlQUnZbQEEYzlcTU5KaflUHrxhIXeu3JRUETRHFs0thIMdI5
YfaX0mjKMtVGVo1MwXsrPVwKvRaXZnCeKcMrH0RVXOVWVipYrVhKJpmKcY1WM52BFQ1bG6YUggZv
GiVn1kXTtczXzkIpLLHgnWFOBW01SwHvLNu1UA/D4Gm2ow2veZ4M1BueP/2O43Ki1IINa1TaEtZ/
QWvv0Lwm3LxkYuIS9pwHw6X7gdTPhNtXqF7RUqG6gfzwEWVfoNR76s6RTgupW7B/9ZbL59+SV5ak
k6Ttc2FpDRVn1BipuuK/eUk+FOzQS8jtxZqyu4Da0OYV80OmpnuW93+grL4g7X6Nvo2EtxZ1+AdM
+5H469/S/5d/xfLb/4C7/yswt6RPB7p3v0TbitusSPF7yocPrLoZ++W39L/8C5YcSday/2FP/nQh
3Dhmk8AanvvKf/0v/jPCzS+ow0vmKnAYr4X7H5xIirzRojWtirU3WKMxQSRV1UIeG/tJoZtCN40z
MmGChlaNVBrBaeJPwqMryKVp2bUGazinjFaNJSuWokEXxipK41QEba2b8NvX3nAq0kjxLdNpha2Z
3fmJ3378PYfjnrWd8foaUEY4teLlkFWmsmKnvB06gnOYay03xyJ12JSprYjXwVx/vq2/amMF+52q
aGPnWBjnEbNUQh15/Srw4tt3DHe/RBnxndMcucnkIy17zvsf+fz0xMP5wofzkec4MqVIcIpeFTbB
sBkCt/drmXjYjqotJUNrmpqbXMjjglIFw0JNC7bzcumkQUtih6tZduYN4ngmzhOXy8xhf+B0WTic
T+QcSXFBtcRcG7FUhtBTq1RRjdOkmtHaYjWsrWFJjZYrpokPJdbG7jkyK7E2mr/9m7/7lfUrjOtA
ues+TuO84PdWnacLHaEL9L7Hho6Kw/lAspmqIrlljqdEHDyFnsvTnvH4iVZOlNNC3H1G58RQXsGx
sqiZOT+T9Y5h/R3aJjQFq29QdkUt8uBk0eg04fCUKmauWhTaOdKUySVDzaQcmdtMqrJ/n2tijDOl
FOY4kmu6wlzE3221xjhLU3IiRulrd1MeklpbGalYL5MCozBK9pJ9P9AFx6u7LRuvefWi4+au46AU
zQVqNLTdht5uyc8P9NGia6MuF/zqH+UsORVylFpea41WoniPm5CBakwoGrYpVJGPqeZ4BeY4WsuE
IIl6pzSmNWwTelopGec1tSW0bTgjBqSVCjg0vut43D/x6fzIh7jn+/E9u8uZeXpPdQtd33P+tGM+
SM9zOYJuhbDpuYwjp8MH8n5HTZ7utsMuHuMczBbvPGVRTGeNtpCZMM3g9EuoX0D/LenSUbxil0cO
pw/spx3z9Akde+xpQWlHWQ5MGJ7OI2NOUnmsC31QtJpRZGqcMKaiasbWzKAMVl13grkw2I5VbQxK
47CYJg7nmDI3vhewhTZ0xl6FMI4pZYLvsUg4xWjFqS68XXWc04XOWLyCJGYhxlLYBsclZZEHaUVK
jaAt55i57TpKlj3oYCXk1DtPykmmKzXTecG0LllS8S1rei3O6N5p1tYQa2LdB07zdA0NAi0AIt9Y
B08kEbTBmIJqjbVXUDJd77jEQsMCknRee8HdBmMppVKNxjvDpUr6+DQneuOv1DKp4TWtGIJlmiPa
K26GHofjfKgcd1vW5YbTJeO0QqeKC2uC3rDSWzrTCX+8nUiuZ94k1PoK0aDD5Ia5KLz5AkpDaLOJ
aXci2kaxBbaGuY4cxx2ZExdzRK0ViTM6LzjbU+Zn6mzJ50R3t8LUhXr6AV086cPvce5rcvGo9TeU
sqXar8n+a9L5gv2zLWX8e/ThM+3xhE7SisifLrSVo8wTZv89w6tbdI2UcaY8fIQ6oc6F9V//V4Tt
llKBZjm8f8KvHXbjMb0jLQtuDe+++w69+TOyW5OqtHHmVLDGSGNHKbE4XgEvUAleYxzgFWgYL4rW
xH7ZriNwriHPpYB1QoXLSM6jIO2fKTeZVjZoquKUAMGUbcxNciOqWgyNzmpiTAzekGvBIo0TDThd
ifOONO14/PwenS+sTUUToRVZGSqu4+6CNhpvHbd9YNX1GGP+MWNkFDllMU46jTVG9MxaXlq11GuQ
TA7S49Q4XUaM0qT5zK0f+eavv2V4+SVd9w25GTSBjOBjSy1M52d2z5/4+PnA4+XMJS0cLjOazIrK
3eC46QOr9QrnRMOsjLS5qJWWI04DOZHjiGqFWjLOGGiCwNZanrmKRF4mGYfnmePxxHlc2B9OnMeZ
0zQzjpGSM1UpqpYwojJXsU5TBKNoqQEGfW1xlVxISeGVux74DZXC0Bs63TC1YP72X/7dr5zr/pE1
azTWW4LrCFb26sEHblY9fb9iMwysux7XWWxnCWtP9iPd6xWmj3Rf3pL7QFYRmiLQQRYAzXTpOe1m
clRMz44leyiv8XkNc0BH8Sf7oiBW2ukTbUlUZ1jmRNJQjKMtmbpkWqk4KqUkqWPkzJKE0rXkTC2J
WiM5Sp1GYPnXepk2onNVBtPyVQmo5XaurJwujaeRMcbTmviBlfE47+mGjhA0dzd3bEJPp3uwG7S9
oywrjke4nBZsdJxOCTdB7Qv9/eq6A5G1RV4iea7EnHA+ULKIHUosKCTURWtoZ+XfrSapiDLCvlda
YZ1BK7HuaBT6p5toVVjlabnh1YBqmuA72cdqCEGxvxw4nx6Yj4/UKXF7H1gNhjIf6LaVlhuJHapr
HB+OTOeJHGZqNxGGwPx8wdstKWameWLMmd14ZJzORHXkEnc0ZVmaQvl7Wu9wDugT8fTvuBkCTg3c
D99SpoKhkMsFZZ9pYcN5eqZqAV/UGknLAjVRSiTOJ0qJ1GlGtYwl4dy1RtYqgzWolAjaY1sTxn4V
x2PwnvFqjFqy9McbikSj8545VzFVlURv5UGbmhjRlpxBwZSuXyMgl8K68yxVKnylFk6qYpTU19ad
Y6mis4ytcVISInzOBa8NNRWpvJUkAA0McxZzW2oFenE4t7IQrMMpS2cdpcpNqlRp2Q1d4JIkUzBl
eeAYNJfUuHOBQ17orEKr6002SNrdG8fxqsMMrVKqYtuLY6C3hhSL6FhLZqRhnRcMrg3cbAKHc4JU
mVTP8ekB042cjyfS3qBn6Nwtl91Mnmce9j+S05k6KC77A7HekEYEmGQVzBG7fkerjuk8QQuUYUWy
d0Q9MB0XYrhhOhRp0MRI6n/i5Vv0cEPKEb00akxUVYmtUF2j5oAOt7B6RZsHWAeW02fM3R73Foxb
aKMiXTLt6562OaJv7nFfrmntEZ0MxW3xX/8Fx08XTo8n0k1HSJ7hZ3+GudlghoH5uDAezqjeQe8o
CiKwWm3YvP4Cu/mSVAJKWVqtLLUwOMeUC1oJha0h3z8lF7YrJxAqL2LKsjTmWplSo3dyUxPwkrAA
nDakVgVn2uQlvuRKrgpvFUtpAlOqDaNlVy8aip/66pZcC8YajFHkVAja0FEwqkA68fz0gf3xI7vD
I61E1qaScsJoCaAphRwWi5Aue++4W63QpdH3AWXEMoaDWhJh7WhlxmhFCI5WBJCTpoIxlrhUUs4U
RHaiSsGpxjffbLl59w1d9wXW31IwVG2EG68tKSXOxx0fP37i0/OO4zTycLhQ0sIrr3m97Xmx3eCd
Z1hv5M+UCtpDAdMMukoOwRuhlDrvaS1jnHTzuYq6Soo0NHEaKbUwz4nxlNgfLhzPI3NujDEy54VU
5WtcmuBoU5XwNE1dD2aZTMUidWzVBMGdtKIoyLWSWyNXaf54YzF/+zf/+6+UkhObVk70kIh8XDlw
weC7QNf3WBvoh4Ht6gZvPcFbUcv1G1bDCuWs7J1Xhn57Q7i5Q68HwmZLW99RwyA2IpNIeWKrb+nm
A6EMKJtRl0iZ9phaaJ8fMbuGyYZSt6RpBjfjO8FkpvJHUAdoUMtMyZklTqhWySmhSxS6XctQohT2
50KOCY2corRpUGYKMuKt13BDUwWtO6jIixN3tcJ5QZP6gG7ggiAfQ+hYe8ddb7m/tWzfOJZNJvcL
n+cn5ulIvzRuXm4wg/SOa2lczhdyLtQqP7itFFIsf8LllpzJOWO9RQRolaortSasU6hrGlqrijMW
ZwPNaoxyZKWw2lGBWDXOWpQyBC8VrWUpzO1AUUe6JfNyuEWpJ/7i3R23cWHtIhtnsUURdU8uEV17
jLckJnKrVLPinGY+Pn1mbCPH/ROnGvnhw2+Y0iNLGUlkKgMYhx0ctkLLZzieCdXTmZ5gb3F6Lez+
5QKccepIVQtT+kAqkYhB6Z5FFVLN7MYL8yJEwWW8oEuklomu19hSWYcOd31ABROoMWKUo1QD1hOv
AaRmtHTLNUyqYpWjolDNEIyhFtgYyyXPeGvl1F8MtcoL/SY4jtNMbw1ONVKtrCzElrjvDedlwmmL
u1Yp9ZWytXUO1SJeKWxrVCKD62il0KwiFAVK4ZTl0io1OHLO9FYeHPkqKsqpcBs6phTpnEdfBTpe
Sxi0s47TshCMJSmILTNYTSkL2nk+jAteX4NGrbBVmr5WbrzFZOkSe62E++09+5QwymNokA2roUdX
CCFRV/Bp32jmlnjpiKPBtTtI0N+8pFwauiuUdSYaQ1YLT88PqNU9KSXcaovr7ikkEo5lmpjrTPYK
s77Buq/RNWDZkI8Rzwty7JnzieHujpzA+p7ergjrV+KO3q6oL15y1pH84o5oT2TjiKfv0Xea/ovC
+Xf/F3Y1wtOPWH2DuThSnVF3luVhInS3+BrgfI/5uMG8+BYzrNi9/wMjkbad8EOi/+ol7uVLqoXz
7kTVBRNE95xyZi6N7XaDffEl/vYbqA5rLKmKuMfSqPUqHkHBtVEUrCF0BmPAarmKt6JYFpGXmHbd
pepGrFd/i7ru1q+sdyzUKiskq7kGQWHOhWAUp1owTaxptEpvFamJ6W0pV5a6rvgW8SQux488P36Q
n/3LkY0rWF2oLcLVvlZaJucqUBWtWHcOZww+ONzgKC0LPjlLBctdLyTWWXFgWLF1LjleDXIRRZND
b0vcOssXLx1f/PIr+s3X+P4NRSmqkoqvNo5MI04Tj7uP/OHDD/ybTw9My8zucuB1gDeD58VmTdd7
+n5AO0NG8getVawF3cQ53vceZQs+OLAVHYysA5QQI0uOKG2I80SpijkmLvsL85LYn0Yuy8LTZeIy
zZxTZskSBky5yHPh6rk3WlFVYdGQr22deu0/K0ENyDRZKVq7Wvi00ADN//wv/+5XwFWT2iR5rgsK
MUh5Y2WebzzeBrpuhfOB0Mk+1129rM04hn5N8AO3my2r1Ybtpmd1v6JfdfhhoPM9Hs3yPGJ1DyZz
nv4eygzrH4jLyP75By7TnnqY2b2/MNsNumzIseHWBt95SjmyxN8zxj9yTg9Ut2VO6cpzB1WLYGJL
JqbCVKQ7POdCLYV5idRYiPNMiZFaIst0oeVCaxmtHX/6G0bTlAEVQDs0AaU60E4g+zqgQ4/3nqGz
3G4D91vFuy+23H8xoDegB8PH3QdefvEa03n5WM4T07RwSUepKxixz1WahFJKIk+zGNqubHBlZAyn
AJVkfNyUdMGtU6hgcUNPFUoN/dBRk6QuU20Y3XBeMaYLSUUWPjObyOIbygy0boXzK0q3wZoV2W2Z
TGTKiWWXqcuCsxZrHWUUTNOnh2dOKXEshTHNNBsYx4WlBlTYsuSeWVUmJdpd2kiNZ5y6oG1AK4Vu
a9pSWd1t8UNgOnwgh8ol/ZEnnti1I1P7zKySoG+r4TIl5mlhHhfyNBOPCzpngpG9nXVSGbHG4YwW
KUzNtOrAaJbUMK4nNSMeAmWoWbHxnikl7oIn1usaRCmaku7tkioOIwlUwANLlZ5sawUnUndJoxo4
L5lOdZQqNiRFo2QljvXSGExA5Sy38tZIDbwxpBRx4Sq/toa+OXTNDK6jZhmfJwRcUdGcasY7T6MQ
kYNFUpbBBp5zRfvAQysUU7GmkrWofpeUQWtS0dAsBYgJnLYsueGcptQst3pdOKXCYC1pESGTVxlr
LDfrwDwvOF0ZjxP62EGOnPIzmQOKQuJCqgeKu5DVREKz6u8JBIxLrHRi8FpetvPEaXrmMj1RtKJb
3cNsiDaSn87UFClBsdRCbDOHy8TucOJkG8a9QzeN0QuFRMln/JsbVN/R9u9hfUsqBZUNet0R7r7G
5VvqWeG7X1LjFvLAYt+hLwV7c4OKBeff0n4X6H7xirZY8jQQVytayCib8Ddfs379DUs1jBcBb+km
Dom4LMIcMIbtuy/p1m9puicDOVe8FUmKMaIt1dfEeamFu+AIVmG7K1dFKWqFFCUnMWfhb9QGRoud
MTYIV8+5t4pWZdXiNEyp0luZenmrqdfG0dYbUqpSj6OKBKZU5pJY+4CrwnNv44Efv/+ex/2e8Xji
pYNOC7Ez0ziUjG6NqRZKFk3quuu4v92gKmzWPcYZEXIZMbUNRpjoxji00tQC2gfmeN1Dl4XWJD0e
55k+zrzcKl798guG+68J/QuaGajNirjn2hIqpTCOO3748T3/9nd/4GkceT6N3BL5enDcdYFtL7Q6
FwJU6QoZZamLyJ8MhdVqQHtwrl1JcRXtPTUtKKXFqhbleZFjItfKcX/i09ORh/PE4/nIGDPHJTLP
MtlrUTTRrjZ6q+XwzLV7r+SwrkrDlz8pTWSSwvX50qrIrUyWj8cqzN/+q//tV0KdEVgJNV+1pddO
tLXiIm8G5QzGO0yTHq61Ct95VqsB64SNvl719KFj6AbuNwOD9QQrL7veBfqwwqstN7evUdYS/YwO
PUv4wFE9cUlnnp4vZH3Hw8MDxUFtihz3hN6DMsTj95AnCYHoO1QOlBiISfPweY8JK+KiKPXKI65N
HOaSMSHlxDJHxnFimibiFDnvJ+K8kOflajzIGC1jF60LSgd5SJieemUINyzogNYO5yxh3TEMPdv1
wN3dDRvnWG1WlGHFo/U8xYl8eGL5fGQ87KiuEnWjake64kJTacwxUupCLgXT9J/Qi7lJCt4qAZ5Q
5Z9mwFiHsR4TPEZZ+l4kAFYpVK60IqO1MWWwkmptpWMVXtC8w7hbQh9w646tVry8u+V2fYOzjVR3
VCYa8Jc/+xlvVpaiFlblFU+HP2C0Y729QRvP/vGJpTWK61F+y/Fw4q57wXboudGKoVrMacKsPM32
KHtD0z3HGOm3d7SkUPYD3brRrSZsF0FlLnVHqpla7ogpEFNG18aSG7Y1cixYBWXJsrMj09KC9wpK
xHiLu/4AhKtbeTBGgiwaxpTonJV1yJUpH0sR6mBrDMZCLrQGTglPeuOlwSA77cqYE4ML8sDUmtMU
8QhLfkkzzsBYJgYfiC2jlISZUhZxSqqVfmU5xcQRwzoExpwIzrHkyF3f02q6aoMVS61475lKRvvr
iBVNUI5WNFvXU5KEJ++8o9XMjdaYHNk4T5ozg3LcWg8ts7GOh7SwdR6LSDx6Z1Als7FSg+qtYsyF
mDUra8ixMawavRds7dAXXKew28px95EpXfC2MOaPlHDi6D7wKf3IQx3J2pHPEzGNrDeytqrnI9FZ
lvDMoZ5oYcVX//lfYswLyvGCml5Q9oZR3zMvMyZ4GneYVujWLxh6T1cy0/mBp6ffE9MTZUrcvh1Q
PzwS2iu8GrBTh4lr2qWju39N+jCRF00r9+jXa2KA/OM/YPyEOh3pu6/w63dwBv/zF0x/OFM7z/T4
PeMffk2riv7Vn3F79yVTEX5/2c/4Qchh0xSpGKpzvHz3AtW9Ybb9lSon33exyui2toqyimNasFpz
6zydbxgvL/qmoaZGahLmXPJ1VF7BKgnRVuT3pqrkMdHE0d2aIap2Na81gtGoKqPtXGHWgJYLRNEK
VRrBGLZW0dQCbeHxw+94/+EzKZ7YKngZRJIyF+m5t1bRVQKpDdFL364dd5seY8A5+RyNM9SSrqTM
Js/czlFzpWk52CxR2hq5yGHifB5R9cKrTePum3s2X31L330BfnvltVu5tWojVc0p8rx/4Ne/+Z6P
+z3MM4yZf3LrGJRiO/S82NxITVkLRMk6T1oKThusM1hr8N7RyFjr5WZsDZpEjZGmMiXlq8a0kmJh
mQv7Y+IyJz7tDjyeF5acZaq4JFbayATRaloSsXhsmoLllBpjvLYRsvyeZWlymNNZpg82AzOVE1pX
rJoEQvWTj08BpSS0MaQWBdiBeMdVlU+gNeGpYwaMiQzW41qixIngV8QYBXOqtejnqowr9rszNS6U
oZC2C3ev70lp4flwT1e+4XKeONSfcVx+y9weuHv3jqffPJC2a7pNxz5OBGtZ6YQtmaZuaZcNtneU
w0I2AvEgGXzdUo/yWUVXaS5TdKIjsSqKSk/TMCKuyRB6ztozLwoXPCF4XqU7VqsN5u4epwKogNGe
YgqlNpq6vuiNYP3kb31Aqw5tZNwX8oluGOi3a3Ix9L7ntw8HfvP3v2X/7/9Pbl9obr4wfP3dP+Gb
n98IA3uOaJNwGHK2WFtRqmJ1xs6JmgsuWKrNOGMFXaslNY8z+GFNrhXdwapbk/KINwYzOFbTwmk8
oeZKKopFI9zu1rgL9xxXJ47zDTUfpfKCw3UviB8vvNJfcR/OPPz2EXX8zLLaMBI5+wnrOtLlxPmj
JqYLRmtU0eRhB3Fi9/zAUidWx5GvbwY2ZmZlIutTArfF+ltwMLx+TQkzNe8xpmDCDdpuMC3S6VsS
tyy58sdxxKk9FsvbboAWqYPnRT8wxoVYMi+8ZfpwJviOPo7YsMUrA1Vx4xrznLFBk9JMrp5qNc5r
tDXs5xPrTkQq5gqSSUWmIceSUEZGm11RqAqqZbRVTGkWp7gqNBMp1TJNhdu+4xCjPFSJVFOoPnKM
E1u94alEtHeMKlON9IsWMjeuY04zgzXYqsjVklTjaZl5PQzEKoc9jcJh6Yzn/92f+PlqTWyFpjWL
LiQyG98x55m1coRWydUx1MASK94p5mVhbT27khmMo1nNp7nytjMsNVFLYtKKUgNZaY6loJz4pZ0R
KVNQiu71Dd85yXDsPv6G5fiB4N5wmRe++uf/DDVdsLsnBh4ZNZS8sA+Jt9uf83yYuCyGfmVRuydM
t+YUIxrN6fGIPc2Y00JQFd2O3Lh7dtOMd2+xWnOqM2r9AuIjoevZjzv2fcJtPe9evaYNllJ2BGNR
T08M336N+mOmHi3L08Ll8wm1uiGdEq27p6gJ3v4z6uk95cdntq+/pEYw/+KW1j+hv83YzUJrE8cP
n3B1oL+MLClhVzcENRFVRblAIoNTaGfpt7dosyUvBmUVrQpSZCoFrWSXrRAFci4GqyVH06zkeupV
fdqqAJjmJP+diqCzxlpoTYAp6ToRMlWmjRrFXApBK2l8XDMlRTWBSVWBYMUmNx/bJHD5Inhqjdim
uExnfn08si8Lt0uh+YrGixRLJxilV10obJzYMXsrzvQUZ4ZhoCC1PHKBXMSKiUXZSk5Rsi4kUkpi
y86iNq0xYWvGtxk3eNavvsC7N1h7QyZQqwIlh2tjDEsqpKY5XM787vnA/32a2ZwivwiGtRF7WRcG
EvZqelP0vUw1vdV0XaDVyGo9ULIIwqRTvmC1ZxmT3M4LpJTwriOnSiyK3XHi8Xxmd7nwabrgW6bM
EbWrrHTA+Co98gahA601pwYxVZamiKYyxULfFPqK9FVVKmy6VnLOdNaRaiZHQzABHQLmf/kf//Wv
VAOMpA01QheCJgLEyhXi31BVFva1/nRDVRhtJSDjHZ339KHDmRWrsCX4DdYGun5DN3TYvkNZgx8C
eINdG1brFaqzrNYrutUd69UXuDZwe/8VP/+nf43ztwz3bzA3Hru5BVuYMozAvF+YfzhQz466BBqR
7m6H4gnLjxT7AdWe6L3oOmudSXFmik8sOTKXGQU8nka0Usw5oRrEeaLVgnMVrRUm9DJ9V0bc7c1I
qK5k0A7VmnwjNY023fWbW+HCit57Xm089xvPZtC8/fKGMkTc5oBpI2r5ALWxxJ7jeGFpI6UGGbUY
CaTQIFHYTSOqiphBK2glUWrCeiWil6vdzdkAWgm1yEny26yChOe0QV/FDEF3qGxQBWrRdFi23ZrB
Vu7WLyl1odP3WDbYy4rxseL8inM7ckh77r78ivPjBeU8rnuDwrBMC259z3H/mWWaUK6Sx99zfnpE
5RPT7ohKR54+KT5/+Mz29p4U95TTD+TxM8vu1zT3kd6u6ew7mLf06mv6OmCrIV0U+XjhePpMrwLL
uFBdpbVM1Z7eO0rVPOyPLCkzXSY0GWOEpKW1IdeIN46SMkEpVm1h4xyGhFOG3mrmnDEucMnCZipa
XR9EliUXsoIlN5r2TKWw1MLGepacMDRiTmx9R/7/mXqPXUmyLO1u7SNNuPuVoTNLZFV1EexGk8AP
AnwAgmJEgAABghMO+CL9ciRADvg3u/tvUdVVlZUi4oa4yoWJIzk4ngVOA4GIG+HmZnb2/r61ahs5
bq2hlsigDTEuuKowWaGKoKtmTZELO1BK21vaqrAlY5SQakRs6wiX0sxRLcmreYyJeO7Q3wlMzvD7
Uli9pqMwugb4mWNgdI5DyuTauNbFGFZJfCIgVogxMRogJA5r5MYb1hioGo4FojGsUlGqUbUO9RzE
jIIkYTTgozAo4fb2hjevfoGJPY/L/4DTewAAIABJREFUkfVpIn9+hnhimp6wsqUzf8W6LniewXx9
rvcI/bt3SFnY709cdzeY8IrpcaZ0jmIdwSlOMYD5mhgccYqEo+Fhiiym5ylB9jfMeiAuR7qux39W
sATQW5R/idq8aiHg657Tj38+gzsu6V9vcZcD5eGOcnXFfPhISlt6eYPZWfyrnvjpjww3L0lZyP0t
h5g5/aniXvyGfmvoXu/I8wQszXexFkLQmFe3vP3b31B3f0XwF0QU5cxXjymxcZ6cc9urn7vfXpoy
eRzP7HTDOTfUhnTrUigKYsxY25wQct5Zh1wwuq1GzXnEvgBaC08x462hyk9Qpcqa2+h4zu0hW6W5
Ji6sJqeMyZn7h8/8/tNnTNxjWdj1iuewEmoklMgcIgqFVMVgDJ31jN6z8SP9OOBse2BapVC52Tad
rqgSsU6IayDTDHBrgpAiyxQazjsuWFm53Wle/Pq3bK7e4O07it6061m1SYeIbpKmBKf5mfd33/GP
f/qBf/9xz40uXOXEbWcZreWy7+nGAdf3TeSl23+gtwbrzvVVVZpsrOZGGK2FEhdKzqR1YV1WSmgn
53XOHI4rdw/P/MPdZ/6vL0+4FHh+3MM640+R3VVHlkwkkCWge02oTe+MbnYKIWLKgioTPRUjiVRX
KrFNaChgBUgo7TBa45XCaGepeW1vN1owokipRTJqrZx77eSWk0OjkFLJKET1nEt6gMK4LbUkjJz3
vMog1oEu9GZEr0e67YZSV/y8Mqwr+/0RrRtr+srcUIZCed1W2Ckldi8ry7yS6xYrQiQhZSaZdlWH
MoLVrNO5zD/9wFL2WFMw4QLrvkLyJcZ6prRibG0YWP1EUo5D0jjVk+KCF9vwlwFSDiCRq9qcv8aN
KDZtLiWemht6kZLO8H3TXOycX6HFo5RjGCu+H+gv7rm9veLu02cWnfnX77fED3/m+bs/ED7/M16v
mEvP5a/fUuWAu9wig2KdA7kX1JTb1KEEaqjUNWKU0O8MackIAVRGaP3Fskasd+SYUP2ILrkxiPWG
oxzo/AWH52MLByqNqo7VNsgCsmkIVePQXqHshuvLN5y6LeIzpTwQjpZuN2LHseFTwwDOwJqYjpWq
eqIrqJwJqWK9JoRLTMosV1vYHLDakKZ/Z+cELVd8+vO3XN7+HLv8CtVdo9w1+fhHbNdT10ynK6+V
Ql1oTnlA5AHTA/GC5xSIWaOp+JjQVljTiVoC6mklMXH14haVNngztOyB1SCGKVcSJ0zSbYVShSLt
hVVKwXaawxoxxlJKu0laDMEkrBG+HGe2ncdSCUUalKkIrneEaaXqyqEkqjgGgVgio+tY18yoDEVr
YtQ4JTysgdEJObeHrNGaHNrK5RhWrLYUMpXAzng0DRz0aZ35TeeYiChV2NUmmbnZOOZ1pvOGcH4I
X3nHc4hnj7vwqDS9rxxSYmcsxxB4ZTtSTGg8CcdzWXgxuPMUCaiaVTf710MJ9J0lzhFrOm52LzDZ
sLwW1g+Of/7DypflO2r4M6+vr1nQFJc5sdDzM8K8sNvegheUXnGnDaO19JsBMT1eBszNhlQLwexY
zWf2dx/x+UO7fq822K5wuRyISeE6D6cn5umBUXaYpz3l9Mhw+Vv0BPrCoo6R+WFCbCUFTXdlMTWQ
YiF/PKJWB/d7utMJ1z+TXi9E41nuZ/R4Rdn9Bk6eXnq8XLH2MH/+f0j5P2c7/JznWZFXw/IcmpXL
WHhxSfE7xFxQxBKyUK0ml4y1LcCllGrKKWlVx1QCRg/tmtRtR15yg8uUtbY6bQWMYGh7d6uaCtRK
o8L9dM2CwttCyhUtipwa2UxVYU0Vb2ngI1Wxogi1srEN8NWJENcjT/dfuFwWNhLpnULIaFPICVIF
KxYpmb7rGVzFW8flpsd7j+9GRNqKUFQhrrH16lME3TwH6jzSXmNjvz8cVmRZsQiuLvzsl9dsri/Z
3L5DmUuqdmQqpaomjCpNfZxzIIZKOD7w+PEzQ4j815eCWjIvLyrOZC63QyNtWkvJqt27lcFIaWz2
HClWmpgMocRIjeUcXkutEkduK9KYWPLMmmF/CjwsR76dV65t5jRH7g8Lb5ViKGPLFZjW6RcFJawg
mjVEliiIEUiZQYRBLLZESnEo19jwqbQDdoc5XxsGbyxG6TZyV6opOqGxrsVoJILSmhICRZ8f0CKU
ks/pb9Ui9so28EnV5KqpuVUMck0opaiq4jpBVKJTniKNY+6GQFhnOr+lpMAyhxYmCAveaUIIzGnB
n4MNpcCaIqcl82xmcgp0rlDHDUtc2H/6gFeJxVxwePgDnb9i0FdsthfUrBGdWod7F1hLhK6SbUfK
ma0xrEsmm5YanSWz1ICo1HSfJTLsLlFqhGoRM1JLg8+ghKpqw4OqloSnmBYyLBH0DqMXLq86tsMV
G79BY4mnkffzG+b9Kz7d/Y7D3b/Q33T8TE3c9Nd06S0H49vuJkWM0ihnWONMdQZJUGvBKk8ikjcd
LiiKTaw2451DVUNRbQVSQ8F03VnvZ1ulL1Q6nZmMxvrIWDU0+RaZSp8r45rZ2oEllvbilVZO6xum
y1/y5ZQ43mTicmQ1ljKfSDLhNoJoT9EVfUpI2FEiPORK8Ct+7bDzM6ZG0qqp9oa87bj45j+Q6nPD
HZo9ZTHNqjY9swRhpUMPglc9vQhI5nn/T2TzlhlP3T8w5Z+zGztuxo4qMKhMIrabpdZYn+k3DVnp
um0z8J3d0VIKKGE/nfB+10AfWmFrJuWGCA61sjH6DM9o/oDeaDoxLDETqm03SqOJqRAEsnLMcaWz
hpgDFkONTVBk/UBKicGeQzjFo3LlVDJba8g5YjWUmvA0zWwqYExLv1enOdR8hglpYojsjEWlyIVp
xq5IS/xOIdN5SyiwcY4qhZJm/sYOvJ+PDKZrZDvt6LVmyY1S9hwX1Lm3vtCyCpMUro0mlBaMnbDU
YqBLeEn0YnjnHAvCN/ob/vRD4ekusq93XFzcsimXSBwR0/HwJWPWE3FdCOUTB3fPuLsiTxlqxHSP
pHjC3WzR/hkIxP6R3u3ovGe48DwevkBaeVKeNayYXnFahJISbrnkyl5xnBND3hL3M8EIycxM0x/Z
/OIbgplhybhNz/4P/4jeDpjnHvP6G9Lpe47fRuStkPZ37P76P1CrxyhHIrLYC8IrQS//L6P9r1ge
Z7YXt4TjF/Kc0BeekxuppuNabuhNR4wtbt4uuYoRRU0FqyHWBkta80qssQXXEo3jns479Nogh0UL
OTQYTKrprEo940yVcIitvhlSC0q688l3Z4WYCloJIbTDQiea51zprWvVMhE2qgHjVS1M90+sD0dM
CEBlu9HMcUbVihSFjbXxMFD4GDHWsdv0bLoRbRVWO0Jo3oAcoGR9Pg9W/KZRP5Wp5NpRcmVeEsta
2MmCnmZevLvm8u0b/PAG52/J9CCOkCMFjZb8lwf6ujwQ4pH37//Ev3/4yN185P7pwDYcueo9b642
iNFkrYlFE/eR7cZQ9xPVtklIVmCTJseC9hayJqTU6HY5tkPivLIWOIbC0/7EsQjH08zjHNhP94yS
6fFkZxg6R9UK2TYIUCwFLx6VBVVgPSUoULoGpoklU0tlGDsgU7Qi6dowr6LIoti4Dq9NW71Zh2kq
BoWoDNX8xPdpTmUF4lrQorlw2xthdWfrTWnF9zZ+7yBnRM68X61RWJAMylFZ8d5Ram3dblMxqqOz
W1JYkF0hh8wyzxijiGugSGiWHxLTHFFhYTMqOBjcEsCmFmJLhc2vdyzpX5j0M1+eHnhVHNRM+fEs
H7GKRCb6yspTE9Z3L6gF1pRx0ixmx588wasjzBOzBpVXwtMjyo0Yv0G5odlzqkDNWNeTjGre8BLR
qgOlqNJedpQI1lyi5Imrl56u6xhtz3cvthx+8zXv777mX/7x7/nDt/+JL3/4e25urvhF+Y4X5le8
vHiDG66wKtFrT61CjUBpSekwdYQi+JQ4uRW7GUBN1OGnn0U101JuSNlSK/2mJ86VzbYnrQE1R8Q4
lmVpL2oCYY0UsTjdglT7U6AqYVlGppCZl8jh6cAYM7l8oTwHYrEodUuqT1jfIWFtF/AmY8WiRYH2
BEYOnzLHFGHXUS6E8eprDl/u2F0llDmQDntKPZHLSEkDugwU8Qylx5pEWTMY0FRO8TNrcRyC8MUY
3vCKpRR6B0k5+uyw1rJ/OuFd+8Jbq9l0nlpXvPINo6otQw604frMVAJZ95yC8MJ2rKxNxSiVNa8M
xnDMLUviK4Ss2FhhH9u+MqwJY3ULCZ2Z2ktKbI1jDmsDY4QFlaUhZOPKVTdytzw2LWatLJLoNXxY
M8bCNkFWlV5p1lDpbcdhWblwhpQDg9J4qSw14mzPEgJKW3RxlBgZnCGmhLOapxh4xrbgkji8VOac
uR16pkMgqRYknYvQWcP9AlfWN2WmRHRtPWNjDZ/XwJvOsGjHc4LdZqCvmW++foWxwlUf+d2p4iLE
L8+UsjCsW7R3bJXFOkWuK1pr7DiQ54WUgP7AaiamfMDYATEZq4XqJzamI66ZMHliqBzDBUFVvk0H
Xr1+x3F6RkrCloXTVkjTETZbQn3G9gdKeSDlHxh2F+T9e+TiZ6T1mRROKDdQe4W8e0X8855VLDo4
xGtKviDnSH+548v9CbmylDTg/tM1m/KOfEy41z3e9cTrzKoKYVhQ60LMhc6AnDWYpPNBoxWMmso3
N9rbU1rYqOYSP3OMOFuCWiC2njGwNKNarQp0JeSMFUUq7fteaO0JrTVLbchohZArOIS1tr+3AFaD
xVAksbWKrhRSVcz7Ix/uHgjryphXeqvQqVBCoZ5PqqG0kF0nQldhEMvoR1S1aGWoKSLxjHquCUwm
hoDWQsyRmBNGFLFoQhFiWBkkcOkzA5nbX93ih1c4/wbwoHvWXM497AYdq6KI8Yll+sKnT3f8/vv3
vJ8OfNyv7D88UuNn0uZrKpm8JpTN5HmFqlmeVwwQ5wVrNdYbatRUJaiUybWchSgLUIgxNvDWHHg6
zOyPicfTzJIW5pTYlGfCqugvLO+uR7Zoqq5gCpqCKZUiiVAEyapliawQc2ImMNeJoAURg+iAN2Nb
p7jG09cug2urcn32g+j/7X/93/+ulIyU0ipT9cyNVT8V5lvXTXQLYWQq1no0TSDS8vEJQZOlttGO
SW3nIQ1hipLz7uH8+3VLIlrlGooVMNrhuo5u6LCdxncW3xmMcbjOo6xlHEY2/YgTx3XX02nH6Bxj
39Fvety2x3rFhR/ZOkd/2KIfFtRpIfafUDeZafhCtSvD5itCjoSyUJShGk2QQjL5bGpLpBJJ60JN
kbQGpuPMft/Y4svzxPPxwGn/RA0zhYUaV4zSiPUocSD2/G8XkMZd1tphjGNzuePF9SU3V57Liwu6
yxfo65d8t3zm4XjP/nTP8+F7ag08u5W+NtVfSc8YEro0qEKtipwr07K0+klcISWsUkjOlJSIcyaG
hMlgDGjRlJoxplIl4UZD1zu0hmF0kARtDFI11jSNaxXYOYcSRde3L5BymUlPeHtDXA1SFOvyRIkn
WE441xPTTCGR5khaIqc5shZhniNBbdkvnrl2nJYn7j7fkcYTXnl8CFj3hnJ0GDtDXqnrEyKRog2l
VFI9m/jWSJjes+aFokZs6jCxUI4Vh0XKSkmFlAKSCnldccZgTIUcsMa1poIyECPWavra6HtWKu4s
0Qmp+eAVTZyixZIT9LojpkxvG941S3v5nWLG922dhJaW7BWFVoq5FHrrWHLhWTfLUtCVYoQ/pxM3
/UiokFAc0GRlOClHyhnrHFlrlpKbLUtg1IYYExpDzo2K1xtNrInOuvbQN55YMiAspbDPmcE5Ug44
USy5sE+a0fc8LBXxTWpTRbiPUJJmEE2JYLF02LZ+q4WIMHrDoUSiBskZNLzY7SAkrrcNfbxxA48/
PPI8J2T3mjVVntOCudlw8c2GwVmU6lBWUzvF/PiZfUzMSlidZXj1Mw7TERebs2BFsX8yPE7CwWTm
HDguE51VmOcTaTlALAQp5M5Ad+DknzG2ENwnhitHNyTU8iPeJVjuSKdHRH9EvbQUcyLef4f/zW+o
NHyxXke6zQ5cx7TA0x9XlruAq4Y3f/uO4esb0Jp1XUilsoTCqmHqHa+/+TmiepJoUqkggqlCOE96
0nlKlM6AEa80vip8r8+T1AakymtFtLCGcg4uKxRNuTrFzM5pptzCZ0XkfF9vvslOt/yHsvIXMmWv
m7+7VwpyZmc1YxVMyvRK8fnHH/j46RMlnPASEQrz0uhoz3NkqaWdzAV6beiN4WLc4lzryCulSTFj
vCGlSK4NoJTy0obDOUJSiCiWw9y4IOuR1zvhdmu4+cVbtrdfYfUWbbfEpq1qtFDOuGOgVM067VnX
mX/9/bf8+fsvpOcV9bDysgR+ca25vhi4vRip1oPvyFVRi2KaZmpqeu4UAyKBEFZEK3JaqednZMkR
rS0pZVKuPB0XfnyY+O7+wNM+cvdxzw/vP8MKen8izoGhNnhbJLKUgChwxqFFKGtgCqdz9udHZoSk
FUtS6NICe0pUu0+d5VBeKzba0IvFIm2CWyv6f/mf/6e/K6W5ypWSpoUkIfpcKVDNuWy0RnRLRiKV
WtpovRGNDImCKN1OTdIqb0Y4J8IbCrHWlurU1WB1OxlILRjlQVtEGbQ1WGsxzlGVYM2AUg5repzt
scqwsZ7OO1xVOG8Zu47ry4HNeMmue0M//pKh/yVuc4NxI+bthtUbppiZVMSpLZvhLXmZmyjDdKiz
kL7UTEwruS6UXIjhRFLCaQ08LYEpR+YYOK0NaFJybH32aaasM8ZVnLVNrKEERUHO1Sd1Dm2gLNaN
WG8Zt1s2g+dqc8HQeVZ3xTJ50l3meJe4f9hTysgqFsIX4vwnNIbOXTbKVBJyKkgx5/59RkeIIVJC
Yg2RdV7PQY5WlSopQMkoXTCqQ/e6Af/7riEZtUMr3TSv6tzBFoN1wuAVzrbPbbdRXG1GXr7sGLc9
+8cD01OkSmlVq8OeWltdSnJoVLdaSVqTZ4/ITK2KYdnx4/TAF3dgfVgpDLyx7yiLpqwDlC3hVIlL
pfRnDKIV9oc/MeUjSRSn+gX/LHRJoVXFR1BrJtRE3gcWMjnEhv61ggbWdWpSjLySw4xoBzXinUep
FkSxOdAZ0GUll4gzjlQzRRkWmuFKCkhObExTpZpzhajzroWJaGIVVQUvGnLGSZOqgMJ5QygJ5YSc
Vwaj2vSlwFYrQkxcuw5XcyPSeU+uhY2zPKTIjfVITaSqcaqtuzbWEmLGnbGdRzKdOVfbjGJhpXe6
wSiyagjZnLhUiqlEus7gTZN49NryQyi8MQ6qQoqiN5YYA6MznGpi12liKZxQDErIVeitxYnCWsVg
NNoravSU8JJlrcwmcD//QL554OH0H7l8XZvMJX6mmA110c2cli07rvB6h09btqYn5hO92jBeXmH8
DdZc0NkO5W7YpAu2aCRlBl6huCJhMHRovwM1cVJHyvEz6pAwhwDrBWXyrLERymCge/s3lPiEc2ND
DP/bvzCaLe74yMXtr6lKcdKZxy8P5C9PvPrbLZffbBlubqEKy7KwHFZSrehh4MPVwM/f/RLFjiKW
mNoa6KcHRWcLMReMlVZNEjCloqxi6AyihGIaVCbn9r0PqU1NcwGjm99CKYVWmlzaKF+rRh4LuclZ
NLRTOa0SrKUxElJtv7+UzFYJVgRdK8t85MP33/K835PTHhVWlpw4xpWgCyu1aUJzwmuFrxprFdux
pypp8isFSKKSmPMETjcdttR2yq5NB7qckdcqBi43mtdvbtjcXLJ9/VtECcpdU1RPrkJFKCWiVHu4
giGlQlhn9o/3/MPvfuD+6cj7H444nfjFV47rFwM3Vzt629G55jbXSbeXpNKANSkFIJFDokTBdYY4
JYxrh1hqaZS2lFlS4mm/8P7xmfunmWWZ+f67O0INbbW87XFjh+k13aCYVeRUF3o/tudjbSC3mpvj
PaaVwTrGbksXhN4MdMqfzeiOEcfGFkbtsdImge3zFYpS6P/xf/jv/m6d1zb6I6OkySZ0zS3UZs5o
GtNuSGLbBVilooylUqiqtoS8bghSpUD0GUOqauuzi6bU2JjQ/ARHKKjcgkiiTDMJ0di2oBDp2pgN
h3Y9Whm89fTbtv/oNgP96Lm43jHuevrthsF2KGCwjqKF/sXAcDnAOJDFUrTDqh0lVlJRFDTGJmpd
+bL/eyQ/ENJnSnpC6ZGwZpCujZ1qZj83e1EokVoLtURiXjguJ+a4Ym3BDw7jVEPISsPMEhJVfKM2
VY2Iw9gR5zb4vuPiaoOXhGRDVDs+Po/cPRw5ZOFp7TF2g/cD896j1SWFkbAeiMESUmFemx+40Kx0
sayEdSGsMzk0mUlF0KYF98S1z0h3qq1OlKIfNuRccKanUR8EpQqpZHxn2kuPEooI1hp2XY+rws47
XOfoux3KXlLdK6LqUUbAJioZ0w9IKqg6UO01OVrEthO29BbvAptS2V1tiSfN282vSLqQnGLdbNgT
2OtIUTucHQlTYehvUfaW/WNh1lekdEu/e03pOubnj5hes1+eyfPM+mVBqkZbTc2ReV04ThMhzcyn
QA4rKrSTuzWgcsWaisiKYaGsS8s7lkQKniyCrsKl6yjL2lLsOTcLnFFkKYxWM4f2UhRSZk6hddBz
xhvPnBaqztQaoa5stGENJ3rlGapG1zYarSWx9T2fp5ULbXFisEURayanwO3Q87BMbG3XBJelvSgs
pbAbRx7mhawNoxhSFpRVTCVhjObb04KxpqFjK/TGnBO9rUWhSmbOiU5ptq5CtVSr+JhTk22oSlKt
CXDKlaM2pNrCdiUVypoZNz0pFEZvGXeKZDKmG5uDevkOkyZ6B5fXr9mUa0ZnWdMX+que6fmPKL+Q
Ly03b15w0UfuP39Ll14yx57TE5yeZk51w5ocX56euJ8O7FcICP4S1OiJYaLfXWNKZtx0VHOJWxR6
tTheYqMiB0uxkWDaNMj6R3T8iDMH6tM91hVMn/E3l4z/2W/bWFjBh3/7B2R65vYXL7l6afEX16zz
RIiFMAWMtXSvb7n+2Vdsx3ckOtoMs9XQAucX5yoUFFY1lngusJbCaD3OKpxu39mSz0HlIq1rnhs9
TqOZSqGTs1RItfVnrUJSbc/rdLv/ttVne8gjiiXWZg8rzb1tpcFlVK08Hh743Y/f8jg94/KpKarr
DKVQ0oqkiJaCpr2A2t5htcE703IpuXHKRVdibH1sYxX5jFuGBpmJEcoaGUrlqtfcvLuhu7miv7ht
PBS7o0pHLhURT0h7jBoba73WFhWNex5OX/in3/+R//v7T/zHT0/kjys3BPpBc9G3w4qyFuM6UhFC
aYpmJFHqSpG28kilTTDWOSJopLZVZzaGFCtriDweVj4+79lPkefHwLoULq4NVxvh9e01dS2IFZK0
KOvECVEaLR6KZr8kVFZt7F4UXe7R2mBoxrXurM7eWYuVwmDBi2BVa59pFEuFtbbuvv5v/5v//u9q
riw5kUIkp+V8qUXEQIrLeXlTEaUpRc4fksD5wxdagK7Fvlu6mpIRU8/gjvoXuavI+Qf5KZ4pCm0U
pSZEBPlpmVRUa8IrgyjbRvzW4FwHCpyxdJvxL+IYNwx0nacfesbtCGLYjT232xFrFNve0W86Lr2n
MwMigioTYT1gayakA8f7b+n9S0zpoGj0uqCrAamEBDm2f48RDTE3x24OnJYGP1hjwBqNVakRw+qC
qEzOsb3ZqZZQqMa1sa0ItSbEdDg74KTSS2HbWba3F4y3I9fv3vJ612HKJ75+9TXdqUNiZN23dkGk
Y54jiKLUjFUNo7iGe9bjxHR8z2hfwNoS2UrrMxmK89SgMQistY2KdzbQlVrBn5OfWiEKEIP37Wcf
nUcVsFrTO8vGGbqt4fLK0V/0YBLZ/BMhfEGpSDc0lrVQIGzATMTwTEonjmHiZHqyUmBfMpTf8kIZ
6iAc48Q+f0c1iuInqF/wfmwShHxi092gc8/15QVXu6+5GTqu/cANA/kxoOSEPU7kKpQOsmmpv1Qz
Ia2sa2BdFuIcmKcJLU0C43x7WBk5Y5oLDKpgYoOtmJrptGr/B1I4X+lghEBpe8GaCSVTjWbOEeMU
C4koCS2JQ1h4uxnJudn4JBdctWx1Ty4th7KkjGjLkgszigvTE0LCG80UM72yzaMdC0Y5YhIUipwV
vTeNGhYzL/qxVaLEMJeMKEVfLGsIfG17fI30ADXT2Ya8vasZEd+kGcqSsyKiW95EClsDqQQuzhKL
NSVutcFl6IAQUvMT5Hp2ujcy4O7KoHfC6Apf/dVXvHl3zckXdN+jOqGkxgBQXhHnCbcdCHZhcoXh
7ddMNpK2G7ypOGtY5hNWBAmKJUVOJbOysDIRbSSoiOQPKPcR6zL95pJu1eQ5IHEgq5lkNaf4B/b5
gWOYsLay6QW/uUE5T1UH0gtP9YJzA0peoJQj5ZVP//CPoAeGn/+Cr37zV0ynSO0VT/cTp7myefcS
fvmW3Zu3JNrI+BDaSTrVRkIbrSUmsKZ1xY1tn1NKiavuPFb1wrkK3QJxEcQIS8hYJX/ZtVsNa1FY
3ZLnTgtTLogInRGWUvFGSLVBY9qevbCzmhAL104zAl4UOi28v/sjp/vP5HkirwHJKylmYm6h4Swt
sDk6xe1uROnCtnfUEqgCziqQjFaVZZnobbNDkipamTY5DBWzglORq7Fhsjevb1D9BusuKVIp0lPx
TUpSMqUsIJpc23o4lsh0vOfu4wf+z99/x//x/TPb04kxnHj5TnG97diOhs536GxJtHVljgmNYNQZ
K6v+UvZHq4ZqUaWQa2aaZkIITCHwcAz8+HDgaZ+YpoX79yfq88ptr7gZttio6azHF8dgDKkUljOY
6jGeGoOgakxuUTNdK0oHnG+ZG/GC7xsfI6mMUeC6BrixvSIjFAVZaYqqBAqmEJlCxKy6Qe1XxzoH
xo1H6RlE6LoO5zyYCrnhR2tKfKGYAAAgAElEQVQuUA3imtauAloSVZ3tAecmu5bm6RalabQ6dX6Q
VaRkRCtqjRgtNGtv8/FKEURZSmp/fgGMMmjVOorGWCoZkdgCfaZSyKgw49yWTg3kMFNS4uKqkOPa
fMpr4f75mWlemZNGmY7KisknrvwL0v0dc9GIPuFtx3j75qx/fUHMFWMH6pm9K3iUOws/YmLoDcen
J2zJxNPM5mKH7beI9tj+soVRiqXK+SEJVPlpvD3Tba94+6YgyvH6+pL/4psbcq6oOvP48My7iwvC
20gIiYfPRz7/8R57tUcvhe6yY7gQVFGt/1qfMeaarvsZObTEaVkKIc3Y3hLi2mqKsb00Od+xxoi1
vnXZvaPmSLWFzlhKatmCKgWyp9bK0FlGN7CugV0Prp8ZB8X1C8fuauDu/S/5EL5nNCMhKO7tQigr
h1LbdeAdpNROgz6Q1DVhcTzvD/wYV5wXHqdPGF9IQ8a5jguzoYaGmTykZ2LKLMeAiHDVC/XhO3Jv
eT4eWT4U5O0tn59mhMRl1SxLu6lst1t8p/CpIL7y6WlGa084rYyXMy+UoEyH2wzoYuhsm6yoGij1
iM+KpBIhBpLxLBJbQ0QUMSUubc8xBC6NI9Z241Wq8d+3vuN0OnFpHGsoxCRszMApziitOKSI1nK+
PpqlalrhZaeJKSGqfa863TgQx5gQ17NUgyhF1YY5RLwoprBw0RlsjiRWnO9Z18J17/nydOCtH0i1
EHNDlMYCnVXcxSNWa7bKMAeLUob3odCZgSAzRrWxaiGCER6PKze9I4i0kJLQCIiq436ZGMeRbQ0M
pdB7jTWKt7uRJIHD4YarF29QayGdEqHsUV4RJsHakUkXlnikHDzr7z6w6AfG0OFqpNiZ7BRRTdTe
8/z+yO3tK2I5sYQD/eBRceZYNbvnjpMaUXuLqwajNZuvbpiPP7KMnk9/DC0H4Sp6LVyZl/Sv/0uW
jz/C+HNULERC672XT6hvBtLxHq++sE5/xg2/IubEQmV9hi/3mWIctzcv2L76FbH0JD38ZU8u0lSg
nbKUWNrLLharBKkQU8Fpz5oyvWvHLIS2EsiVapoTQomhSEs/i1bMpTb+Q/MQkRs8Dmea0MOdA2S2
dXgQOZvVam2shnPXWinhtB7IYebDMvPDac/rshKOC0LAu8K1b6yMLND1zTkxWtdS96Vhp9cUsVq3
KbBpKX0jBpwhxoxGk0LBSeTqtnJxtaO7vkG5Hm0uyFIpdaRUSy0Ba0ZqXlBVyPkI9EBHWp447Pf8
2+/vuL+fkW8jz9+vvPutZf/0hVc738K/KdI7Q8orRlmkpvOkglY/VkIqpd2X1U/Qnsp8OJIrEDRR
FF9OiYfDzHoqrPuEfU4ofUSXLemw4L3HOYXZWqaY6LQlZ0eIhU5pwiIU3VZh3oAzCl0NRSkoBmsV
VmtCKkgRjNM4VHvJjoVOt5czrZrrviIYf67tSCiEUpkL6DWfdxITSglltEQ/4vuBnAoxthqZtS09
q849yxILWp/35rTnc1WmERCqUHNzMmvrKTWdE5tt1IS0nYhISwVL1dTizmSbBqDP0n5dGNppsmSM
8iRyezmohV55kgkY46lxptSAM4YSUuMCryub7SWn5cjxeCTlheMSeXwa2ecXPK0HPjycMFvNVzc7
8jSjecR5QwqP1HpJ1YWaFQsbLI4lK7oiDeYfIuTEvN/z/Hyg2+64vL5Gadu+wKqHGFvFR2lQTada
YnsoGd/x9u1blvXIu3Whxoam9W+/RkgkhDAHvvOP/P4PwvtvH+iTxuVEd6x0myNGfWb34mt2vmuB
Ds4wgRrJIZARck34zjLPglhHCgllOnIOZEVj2lPw3lFjJuSEHzw5RkQao7lKC1h5HEUVhuypo0Kp
mb/+6pe8vHzJz2/usALPn458er/n++VI+HRP1o7oB0gWkzT52ZKvb9k/fGStE7PZkLqB+9lQnoTD
CfrO8851zPUR11lwHut7drUQV4OOE4Gew2nm+6dP7HtLmTK33Y4Oz5M8UNSJvBT2udKN79i5aw5r
pmRFbzUflxObp0SUzPZiw6W6wroRZzeEGPBYFiIdmpxXyBGtSpNMWM+SNapaliSUs+Alx8BgDCFF
dE3NppczXdfxHAMByDGisSSg1kive+YUUNKqPfY8NQkxsnM9qSTcGWZki8VWy1OIXHc9x5RQulBK
xZ6nMO0EbziuCUNlTStrzWwsnGJAfGUpsRmwVGGgcmU1MSeqLcwlc+sV15J4HzOvB0usBa0thxhx
uudUC7kovGnu7E5rphKpAhtjOS4BPzh0rlwaxeVl5Hk6st0M3F5eEE6J5TQTui1OCYcA26tLHuqK
O+x5+HDPXVxgvOYYEr67orMDV1eVEIUSj1zLiV+86ElTZdkveNV22aflGqoFd0VNPdX3LfyaRpb0
kZoS9uYF2+GSclo4fP5APN6yfNJI3IEVyvIZ0z0Q+mfy5iW5L4S1IrsBK9DvLnlajyzS8eVw4iiV
Fy82dG9+hu8vmeOI0T1zza1J9NO0T8pZ6tN2wKIEKRWjBWWENZc2EI2CPsdwROTcU28NpTW3cfxP
3E8rtKqpghRr27ee/dlOtb5640+U1k8XYY6ZnVX4mnG6oHJkmh85zkfuwon7kOhTIC2Bl6OQpgga
rLJt954qMRY6U1nWyG5oIcwSA1Ucxhg6r8kxY3xH/f+1b8gL4xaGzUh39RLbbUBvUGYkrCfEuEYb
LetfdKJUIacVpT0hP3E43vP9hzv++PTEv+5PpGnh5UtH14FRFxjbscSW9k9UIrFNJ6S2lkipWCUY
MVSJaN1O/0q19sdpypxKJLadMXdLYn/I6FPBxML1NpNPR3bj9hwCr5ihIZpjhVPKjT1AZeOh94rn
EBmUoVOKTmlisC3LVQRzltVYgZ3xZBXJccVqB0VIZ0pda5k1UI+R7FqYQrcKUC1CLoUpHVFK2pQ4
a/ohEeKRUhTzFJECtvMtwGY9Rjc7WdHNNV5oJ2tRmUxFVdUuRK0wZMo5OENtQIGaz/pWEVRub5o1
F4pq1Yx6tgDlWhGtKH8JcBRQlhhU61gbixKH0p6qHUJBGU3WMPpEsgEzBLbh2PbLceH5NDEOO/rN
wuUcGB5OfJo+8aeP/8LLF4ILjt4vdOYVqQ6IF+alcEoJU8CJplBIgyJ62OfEHvDzij9MlBBJIbDZ
3lKtRrJgu4H2ONTt0lpDs74poR82jezU99Rlh75IDX5QAmIsy+mIcR1Uy/yvho9/P2MfID7+yHCT
ePNVT1cGctI4075s5MxpfkaMRXIzIZVoqRicK4Sl0HWVJJpqFEpbYk50rklAOt9COVkpdBFKzWhT
WcKKGW0DqRgL0SCdtKmPE15sfskaA5vrTPdqoTzO5N2/Ms17TumEmmYyhZ/9/G+YUuU4GUwMTL1m
4ArWLYOupMmg8wP7x9/xYDLZF7pu4HT1AklCOq5shhfUYctDKMz1msvXLwmnI9pZuqFQ1D3Kv2U1
hYenL5Rl5IrK1fUFl0PHpnMsaSYcY4OrLCtKYNwkjMsgGuM6fE5UXVnDyiienCI1V5LxpBzBOtYY
cV3HEiMHhFGrhgW1isd1wnqD0gXJld5Y1iXgTc+cV5RoSk2tn6tgjoGNH7mfphbsKrbJZbQilMzY
GZawstGCNgFq4lKb9pJgFSFGjkXoteE5By58zyEEOtez1qZlrEp4jCdunWVeT2xtq6ytZWnOhrgy
Os9pPdLXypw0S02AcBRF9ob7tNIXxS9MY3qLNXxKkXfG8JigFMNlpxpVb7NBp0h1Dlcq5XhCjRGd
BvpXCW9gWAs3KfEyRN4eX3D35x2fPn1i3Z94SHuEz+QonE57qrIY8ST3xN3T94hycJp5XBJSJ9ym
w/mFlP8ZNb7leEp8fH7gZvyGvY2EdU8yFn95QVAF/26H+etfc7o/0d2+pvaF8OmJtXjUesWVfUNC
U/016vbXSP3/mHqTHkmzLD3vOXf8Bht8iiGHGlisqq4mW91aas2FKAiQCJEUxZ9Tv0oLrQRCkARJ
pLpbbDVRY1ZlRkZGhM9uZt9wh6PFtazWIoFAhMPTw93CvnvPed/neaGkjkOChcpchYvPLhle/wAZ
X7GWBslZEU61PYzLuYlQcjlnhtrN0FtD1ooTg0mFYjkDZ5ohra3FziUkmmVrreCtNq67NId6pXnS
E036orWZ1rwIxYKXwlqF0FLLWDH0RpAMxhoOx0d+/XTH//J8x6Os3IyZ03PiZqy82XtOL8K2j2Db
3n+wFmubKluNQU3rbotkJDUvgimCtYEudkxzotYFTTPDaNntA91mxPc7RCJiNhT1YAdqrqT5CaSy
oljXt29AmUlieHm55d37e/7vb2/5Zl1494dMvlu4/syzBsvr68umVK2Ksc0yJ2LAKLkIi1P8OdfF
9+wObX1+xDCvM7fLxFM+cXuc2YxXfPx05PbTjD8Jb994Sj+hJbIWh3EWoueb08Lq2kQ6re1w3VnB
1IrxhqvOMQaDxyBZsVFADPjGhVfJWAfZpMat8JE1p/Z80LYeXepKqUoMHhdsh5XaaCJOqbUiVUkV
YKGqkpKlHtKffOHHpSEow3qi8x1dHzisD6gKLgSCc6jzWFOxvt3wTHDU1P58dQvOx1afqgnnBkpd
scajWqnWYDCoSRjnKFrPH9sQrlpqe9h7c/71ecl5hi0Y20Ynwtj+IdTG9sVlrPuebNT4vHk+MWwW
Lvczr08n1jnx7vKZty8D72Kg88JyONA7GMYd8/zAMj/w+PE9cfvn9EvE1Z6u6xAV5qVQtJBropeV
pc6Yx8S6HFlOzyAW7zqqbYl/Fx2aS2OgY9suO1aoBSeWYpQ47BEqVvoWMIuZzbXwY5PpR/j6ywde
DjPzwzXPt/c8p4p/ecR3njG19P5qFItgPQ0d64S6zhhxsFbEVArNy+vGAC5jRCh1bZUX00ZxNgY0
53OFRvHq8Lbt47besUrCVE8XoXQNM/s8zWy7xHbXMb4aePXFL/jjN1+z3O54Th+Z1xM8XHExTqT9
yOgCw35kV3seNTNpwaQHpM8QHBs78ni8Jy0rTzKh7yfmw0L9/Jrp5RtejNJtv+Bl6vBk7sPMpHfs
Lix363ccHw9IUbhdqfGJtW8ymzllrGka0Vozh9MRfS9cXBU6u+A3kWga1jLGEUPCeMdxWRicshZl
rY65KEUtU1045gXvfXsNG1r1jcrGWR7TkdGPLKXixbeVRmqqxu+91ospFOPJxiC2peWVjA2OKrVx
FERYVNl0AVGHU9BSCRYG75jnFRMcp9pyDEUVEdNkNqpYD0riyll6McwInfMs08xoLXMxLCWhLnGk
4jvXIEGmjW+LUbQmPjOCXytPxfBdMbxxlqzKooalFLxx3NdCcT34Sq2Gy2HDOk9YE/C64FIlisC6
cCOWVE5tJJoSX7zuqelz7p+PfPhwZJ7uSesJvx14f/sd3777ipvXr9HpgYP1rHVi8QOLbtBZ+dxf
448zt+Ia4Kp3rP0zSz0Cls3lDbfpO56eP/Jl8aRcKSel3D+wPH5Cr0eUCbu5onZ7SjaYPlDSSrna
c1cr9piYnWUYR374sx9R9z+kdiMrnqQ0Xrpt+2+DnqMsjYuwlLNe90+Fc3icXvjH+0tsBvH1TxNN
lbYvx0FeoJMWohMUZ9raMlphrYYg7SZcMGwdTLnt0L9P0luBtSr70B48wQieyuP9C88fH8hPM1dz
5motPM2V6wvbHkxjxBhDtJaNj8RgGL1vjRlvSGmh1kxwgo+WcWjo6bgbKLUimvG5UFZl98piosV3
2/MxxGFsx1ISYnbkfEvKE6ZmynLE7j8n5QNIYHq+5dtvP/Lv333gP9w/8nR75K058vo/F17VxPXe
0w+BRUv7d2WFXitd6KEuxGrRVKk4VleJWrExkErLdR2XlQ+HE//v1wfene7arXheeffHO1Qf2Gvg
uVaGXtluPkd8RcUSPTia3CWVdgFyWEaaQa+WBWMM5VzxVKtk0w5visEYRbQSTWuTldoIGdG41nDQ
1uGvLKDSwEL/9l/8D7/0vcGaRp9CLGJaSKJpO1vP1AG1BuakTFNuiMTc0J7zvJBqYVoXlmVmzSvL
2VNd1pVUZpZpbvzb+g88XEWxZ8IVtWAcWOOxzrcns5qG9CtCOY/YRYVSEohrVYvcnL+i2jp6pHYj
1dL638ZBNVTbUoS27zBG8MYhzuNjTxy3WNfRjxv8EBn6gdBHNAyEfmBwA75YDM84/U+YmJjre+bR
M9uOwzxjtoEwOJaiVFNZy0ziyLKemJYJI8pxnnl+eWKannl6fuQwLdw/PnA6TCyHhbqsSC2keSKn
ldN0xLlGRGv7HQtqca5r0wxj2fQd/eC42nnGXY/djWgQTOjJrkANVKmk8oxW24Jap69aZiGl9sag
GW8bKKjkBWqmLjNRBVlWHGAKqK0YMSxLgmDRpSBRCUGotXWtVZTQte7ppm9MejDshgGs4Xo70jnL
tbthiDdcbH7ADz77Of1+4HENpClSc+KHDMRwzfF+gSXzkP7InCdyVsxqGP0e2PLd7RFuvuS7h1vu
NHFwhudTIo4XGCzuoqPrHdVnjMwcyztqX5g1o2IofUdnLtBkUBGOc2Gh1XwyMFfldErcPjzinCB1
xYf2cJaaGytbzmS+vDYPQsltdJfbxCkaz5SWM7oXRDq0KsfiuPQDa84E76gFvLMMNvBcZjDKmguD
D619YKBzFlUIwTDlTLBtlF9pfGyl0gch58TOhtZNF8PGB5zW5kUviWAcR1Pb+DcE0rryxvfnEGxl
mSc8wmg7TvPCJnTUqnRigMxcMsEKf9QZ788a07zwuffYsrJzlm+XhTfGUnShktgEx5xWnBW0WIpp
66pDlXZjq47NboO4SLe7JBshmQ276zdgN+w3e15tdmAtlzd7Li73fP6Dt7x9/Zp0GtB6QSdXFFor
hdOGfvyMzXKiK0eq+ZLH1bIdrhonwo14t8Oetsg8c93t8AV2OdJpT3fw5LQgT4mc2qQtfbil55Lx
88/orrZQIcsFZrjBjIG1GrIKr19fcvPTnxNufkT2I5PxFGApbcxuSyG61oywKMEKS84Edx6aq+Fh
nqmq7LyjcwbjLVXPU1MjFGmj+XyW9NSzuSUgFBo/JGvznZeqCNKCeLX10WcFaw1TFSqFnQdba+up
z4+8+/Zr/vCH73h+fqKbE+Vx4dLBdmwhWWtDey+Nnt5Hqhqsa64Pp63aHL0huMqwiYybERvsWWta
aRgFpesNw8bTbzrcdgu0W7lKBFpGqdbGcy9pxriI+IDUVh/7+O4df/+H9/zNhzum08TDt/+RVxeZ
L68TYTyx3wU6355xYiyIYdt1dM5T1raKQAVj28esKMUoRQ3HNfPxWHhaMr/67pavfvee248P3N1+
y/HpG8yLcHn9IwYpDN5ghsJjPpwnycKxBE5rbeY2a0h5Ztsr+96zcsLa9v8KLnBMlYglL4Xe5MbC
KO1rTslQbESqZa2mOVXE0CJryqorWTOumDb2s67N7vtgmeeVYAKQkVwaFGBt1/+SFTSd++eWNUOW
Sl0hW8VWqNOJ4B3OWA7TCWPai9SJIcaJOEeij7hupOsuqEXxLqDGIFIbataAVG02MypWz7UgsTSM
e20jKANZc/PLVmljmFzwtlkMSqmItpBdpkLSs9hCwYZzyA7C6AlAXGb6zQHbta93TTOHwbGsnpw3
lHzBVN4zVsPMgJR7bu+f0FOC60t6VzkdK2X+gBvu8Jtr5jiiBDRMOALBW6Y5Ef0RUYM3nt4bauzI
a4cawflIrkopia50xNhRYhPENGdvZHc5kPoDm92WnGce7p7Z7584rNekkrg9fuRhvSclS+efSHKL
r7/FugNzek9n/wlO/hLVSq431GXCmMA6TQiesqyoKtvLi3OwZU+uMx7IqYJmonPktOK7CFWx3lOK
Iuc0Z7aWoReqEW76gWnOZO3pxXK9FzxbjLMc5oVXT5Hb37/wchKWrrLKLYdx4jjfwZOia2F28Jif
0VLp91vUCNw5QvqM5ROUg4BbebafWshkWmG0jG+vKOvA6D5nUMvx5YG38obLmy9JTwv6vDIfHP3l
ljUvHBnaPrwoxqwEsfQPn6inI6wXsBe6fkudnwldRPNK0bOdUHNjF6wLzkWmmjBVmY3woJmrPvD+
9MIP/ZaNr8xLboKeooTQcbu+UFxDccba9p93qXLVBabUpipRhSCVSOUhTbwZRl7yirUtEW20CSYe
DifiMDLnzCwVxXDUysZUvl0WbjrHVBYWFnbAXBNdF5iXlSLt9pBU6DVjasE5w5ob5cyJYZMNr8Xy
1ZL4c+uZUyZI5aVOeFPAVO5y5hLlkAtrsUzVokUYOs+n6cQQe4xzvOSe5AyqhSF61hKxQVhNZbvt
GXtLfZm5HnZIXpjTwqWprKeJ4a88n322owuOw8uJ958Wphfl6Wnl6XHH7fJbzPFrij9Q9YApUOaK
2Ff4qSOdOk6lo/Yv5GnCm8+R+gp3bdD1AR3fMs0nirtiXTZMDy+8/mJPsoLf75ifM6ePhXoJ++vI
qzdX2O1n1O4KiuBt4CU1/aajqUmtCAlt9b3SmgfKWcxiLWIcHmEuC6cibIs7s9sVkwUrNIVqhUwl
S9u5zhWibanpdIbJVGOpKLO2NaaKtuDiGUzkjWDPyXjRwv3phQ+HR5byRKknQk34vDIW6NfA0FsM
DrHSREPG4K2hFtfanbXgRNlve3yA8XJoiXHnyRnW5dSgYVHo+h7vCmbYgASqOAShpFML/NUJtPHe
bYgYEyFnSjY839/xm69u+dXtgduXhXSY+fLiNdfeEMMzwZ0I/pK+F4wayikhJuBVYUlsjKFobsrs
3CZNtQrTAgXhec28JOXj8Zk7c0+RW6aHR0jK8eWWmy/+iss3FnGRKVh2+0tsypyA113POi1EK0Qn
aAHjld46WGdsnXFuh1ah5pkNAVcT3iu7EDhOuXE8MBgTm8NDWv0vGyFJZZ5XsgGM57QsOPWm7Ual
9VcLGUzAd5CWjNNwDqQV1pwbn1uEWgrVwCKVrBUVg6Y2yjutiawVQ4GqmLN61arl5XRk6zpCF+n7
GR1nYrfD+R3UdouxcoaZOE9dVpzvKKUgzjWVYFVEKmIU8Q5b059CcsG0N+GqGbGuQVSca3YaWrBI
sqVai+aWyq8lozKgaUVNj7WWzc4wDBvKvFLevGE5vvB0eGJJM4fTJfvNn9E/H5ifC8vmhZfkKC8r
Lh4w8gzzHWX+gCmWwQc+Ls/0YyUYYTOMrGulK5konlNZKNE1RraulFyZq2Xbd4hoU9ZuDMz6p12a
D5bOGIJzlFjxbPCDJ+4i67q2Ec8nx+H5xMvhG6bTyq7bcToZRvcZSiEOPyLlJ6wPZBZqEYytzCnj
fNf2+2LQpwdwHusXcqn40CFlxQVBWTG+YKyhCnjnkGnF2LaDcradurJWXHBUCjfdyMFZNHmihdOc
GceO2Fk+dUeelj09hZSV4/wtIS3cjxPHD8rENTZ0rQe76RFJLG4msTQmtW7xoSK5staVEizrmri4
h3I6Mg0dPTuuh/+MlCfu7u9xVvFeOZyegQ0Xl9cc5qYSvtRE5yzeB55PJ2peQAprmtiMe9BKt79A
xWNtxDjDFoPRTJQ24h7WRGcdD7UgPnDKiWI8L65SlpVqPWnNzY1cMwZpY9KsRBvQUrm0DimVmirD
4FlSQc+j1BvfIVS8wmiFac101vE8z2RriUBOQh87Dimzl8hcYMnCHs8xrc2hnpTe+iaP8IaK48Oy
UG0D5wQjLRCbMxemhfBeG89dqRg1rCinWqlSWoXGNCtdkcyMY0mZqgZflb0LSK78OsN/MVi+WyvR
G349w84OSIZVYB8MMWUkOrJVZBuI1WNzZRfB5YUurZjDjv3NwiZanp4O/Oyn7Xv18dMRCYb/45u3
fPjwHrm/5+PdJ7j9lrG+ZaNb/CnTdZGxu0SOFW88m27Huj5S31XidosJA7aO6Lbj5X5CUiFphTEy
54m72xNpjOz3gfGmp/vsx1Tbt265wLomSq1somVdoDvXzLozdGquELxlLRnnWt3Q+ICUmWMqDFlZ
50IczphQAeMUVsUHQ02GYJScIKNEb5gXRaxl0drWsmfyYGfgVAQnZ/mWqeyMRdZCiEKaHYdPwv/1
3cpfv3the0r88LJ1kGIHcspsusi6QnStE13LTDaOnE5EpxSpvL7ZMu4UGyxxEylzpmhmmWecyXQh
YkNHGHs0nXDhqoWnaVU6LSfUjdT0jNihtUxcjw171tMTh5dHfvW7P/KbT8/83acDx2nC3N9ThoUw
vsfJlmDmVkdbHull166hNWNKaxKoWKy0pk+piaLtIPQyZ05V+TRN3M8rv3/4isO7X1Oen7nadnB7
R6cVN98x3V1gXo3UAql6jtnQR8E6w/XGUeeV4D2js+TUw7EwDQ5/vET7Nk1WK2RzpOSK7YRTaZeh
Im06bUXBtJ+BAWrJSGnrcS9KlkqPw/7bf/kvfylGSLZZdlDANPxr1TbaUStNHdous61TTetEaBWi
bzUmj22j15LxVhvFh+/BGZVSMlpWljwxn5pyjpqwZYU6U/NKZqbWBKagJePOoyLRhmIwFCrNQW2M
ghQERavScBqmUdHO7GM1DcTQSLTS+vG5orUiahraUhWqJ6tgfUCMEONIOFOO+nFslYFxoIsD+92G
y92GoR8Yx8hw0zNsBZOP6PwJV56YPn2NqzfYeU9+f2TIDpPfAx8p6zs0WQRLSu37bGpBTLuRT2tq
t15jqCVBVvJaOL5MrHNiOc0N26orYhRnmvXIxQ4XPbuLHcEHxhgRZ8COGHdJypm6GlIJCNcYvgS5
xro9KoKR2IKNKGo6pqINjmMjQqCkCmpR0wAqJgrOCrELjUjlGpWqasV6IWlFnGKsax/vHUag7xzB
CPttxFhD5x1DF7HiuBgu8NLR4zm9+0T+LtHnN/TrDiHiw4iJkeocwY9orcxJ6DvoY+aiC9xsN4w+
YENHKm0/JpoxS8VPyisUpaAAACAASURBVLAY9luDiR2rnphN5dlWHtKJ+9tvycPAU1G+fTy0G5UF
5zPOFtQWXqYTaZlJ69pCcJIpaWo4XJpj3Gt7www1owW8ceScwTW72xGDV0c414dSqQRj0bzSOyHi
WWsiWEspEKwlrxlnGzRpJjWjXKn46DnmteGRQ8eUM95FpnVlcB6n4NQgos1J7S1o4os+smgloUTv
kVLoXce0LijN2vWSE16EY1L2NjSnQtYmD8kJJ8Lv5oW/6DzHNLNWy0Lmr1MiqfCUK1+6hi+dk9KH
jGhi10XmvHDlLUMMLCiqnsfqiCbwPsMBx5Q73id4G3dMeLQfWbGkuMMNO1Y8tt+x0LO9vGHsIj4M
XF7u6IbA51/uePN2w2evd3x+c8X1q9cYO/LwMPPxdMuyHlhkYrPbQnmkZEFSIXgP6UixCWt7UvQk
LDb0uNPMzT9+S/cqEi83fDwc+PTwwNTBFz9+y09/8lPi2z8nxQtKDWTnOaXSaIsotYLQJobt4d2K
QE6EpJlo2gOtmTwbeqWeDZbRexBpwK8zBrSW5lJtl87GBlGUBSGjjSlxFrq0c0SbgghtrWTUEIvi
TEt5rznz7pt7/qevfs0f/uaeN8HAmpgOKxeXFusECQ5xGTsY1FRWhSW3id3WWWIUXn/xGmMtcb9D
VUjFcDjOlGllc7UldoFuu0M6gwkdhNAwsa5ryXiEWlaMhLPsKmN8M0GmZeE3X33Lv/vVe/7T/ZH3
jzOfW+GLqw7FcBE/48J/yWheNVysDIAjuNjS9s7jrEHUNr+YQM4VvGdR4UkrT5q5SxNff/oDnz78
nscP32Fmj5gOo5YxXDJ0F+So1DgyXr1mN3SktRKtJVrHuqwMJoI0ottaCvTtwLzYAylYMu1SvWpA
CZQE1vmWWbMGsc22OJcVa2u7JEnCkik1n7uJLfdi/9W/+le/TNpCUVhLygsqQi4VcUKq9U/VKnMG
GoixLa1uA9YYnG07bG8dkivReYxWjArGtJO1/qn8n9t/KVHKzDRNBM3My5FlPTDPJ9Y0kZaZvM5t
by6NNrau01kRWqGcAwG1YoxrbHITEFNRGgVLTAWpVE0Y08hamMb8bZMIRbX16Uul2dPOFTpjAqqG
LowYG7A2sN3uGfuBi3HLZnvBdhi42uzZdz03u4FhjHCqhLjj6X3i5V1FHiKj3FAfZw63X+Pchsen
I+m+o2pgPZRmgQqOmcqyJqaUqVowopRcqFqYlpnjPDOvKzUtLPMBQ8O51lxxrrUNQtjiQocYR+wD
MXgGbwm+jcX6YU8pEP0W6wdCbC+YQiKEnqUUjOtIFaS0f/BOBVELVXHeguam0o0NGOGjR7GE0KPn
/Y41kTVlrPPknMC3UF3omlQmescwdEgRetvhnGPwjj5aiiaG0GBC/eY1/dVrws0N/ZtXTDjyoGT3
gB0ysfcUnrHlxCYGRk2MPQSZIT/hRNDeMNfM+nygzBNWFzQvWFOQ8pFJnzg83fFQF8Re8O7uA9Pk
QQyZGcMzwTsshVIyRfTsWp6QWjgdjqzTgqV1V+PQDIFeFKkN+BJpr8sg4DXxykeMJqI0MQUCvWm/
ji6QcyUrGHWND19Na1WEyKQwmRZUTFqRIJxyovcBrY2pDS3/Yo3hVArBCSknjFV6a/DaoECHdWYb
AmvJFGnZgKUsjD5SSmZ0HSYrkUqgsi6F0VoomYCj6sKVhWCU36WFR4G/Twt/1AKqPJfCj8Rytxb2
DoKWFqRDeZbKfoh8WgtbsZTS8ga7M5Z0q83saDFsjcE7x6qOVCx+2DHnymw61IwsZqAGIUnAbDao
DdiuZ3uxZRg2vLl5RUB5vbvk+uqK3eUPONUdhxo51YVcjjzob8DN1LgSP7/miWdq2OK6Sw6HA3Mo
SC6k+T3+c9j98C1qLe8fj8wIVzfX/MVf/hnXn/0ZMn5BqpZiLDlDqkLvDVKa+hI5Q7WMMNdMb4V8
nk4iepZtQCqJzjbGuyBE67FWMa5Vm8QqpZhGg1Ntl5JzQM4aRStYIxQ15AIbYzikShCh0jIxogVb
lc4LWiqH4wv/5/vf8e8+/ZHqD2xi4csxs+mEbRC6oR3gg28EunqmBXbB8rr39M5w9Wqg6zxYA8Yz
HRPrYYXHlX6IjPsNrt/j+h2CQa2n1obHrsZRy4JUR0knxG3ag8d5qijpdODh7p7/7dd/5K8/PFGT
UKaJy5JJdeaq39BZR28MW99jtNJbRxDD2LXpR7CuuUikobpryiy1oCrcHidmhKd15Xme+PD+N5Tn
A9GOxKHy+sdv8bvI5nKl84nhasvuYkcvjk0X8GrYOMtUCmtJxBhYa2FFwTZ+hbOw1Hs6HxFNRNeA
OcY2b4axgjXt9h1FiFqweWW0lkEE0YpRMOIoImfxlsH+63/93/+ylHb1rhSKCqW0oFmtuZmi/n89
CWuFIO4cLmjaVRWDb1FZXPWIgWhDG+Wq0nnfbvvnRGXKC0ZXvGRsyqxpYckL07LwMh2bNH6ZKMtC
0UQtTZKS11Pz0KYFY+oZq9pOn0abeARdCSFgbOb8t2y1OCPNgW3lT4S07/9uhnZzN6a0T/R9NQTb
/Lxqcda3E7aNOB/wYUO/6YghsttuGLoep8JcHaUMxOGC8hzIz5nD8wsfX564vzsxHwfWpWedBe86
TDA810eKesQ55rL+iVCmtbLmzFwqj6eZaW198KwLRQtLyuSUWvCl8/iwwYexoXOrOTOdaQ8j69hv
9xjtENnSxz3OBbp+xAVP7PrGMjcG6yJLrci5GoFAta79/H07PNloydpMXsYaNBucNA62c4GcFe9a
wFJtI8tF8YyhR5LSd61dYYzgQ0DU0A3dWX8IwVls7IhXgeF1ZHPT8erNyOayJxhpP3MKaTlxmiaC
ePZ5YFM63GqozuOIdOGSchhhuSIuI/XZIku7Eb7/7lu+fXjPx+cnptPM/PSEszDGDb0tvNpFfH3i
Zf2OZf1AlIGqXVtNFcEWYV4z95+eSFO7qdsgDWGsQq4ZrYVu8Gg9EW2DfkapbCt4dQw2oEthcJ7E
idEFqhZKTWxdC8oZPHNORNtuGGtKBGeRWnjVDUzTAsYyeseiDV871YT3wpQTVitb3z6HD4ZalWh8
81AnwbvA07SwjaG5lo0nVzjUQlTLsq5snOM4z/TWYkM7eFinrLmy8T3HUplUeVLlDzVxI5U1Jf7K
Cn8zJ36fE1e28lQLYi2/JSPe8h9y4YDypQvktTQtZFE2zvGk8IeifBk8t7XiredjTgxd4KSVx5yx
LrAUcN3A0zqz+h6NA4fV4cZNey1tdm3kHPZcvLrmqttzdTnw+u0F21fXzHrFYTlxWr5iEy1+0xNe
v+L54bcYn1kvPCf7kbncs6YXTqeviK8Lu7c/5VgyT1PGDzt++pc/4e1nnyG7v6CGnkOChGWu0rTE
Z9xWdKbVjLyQSssiiamN+W7kfBEylAKVdnF6mRLeWTppQB85I1xxlVwapjnV7xsM/9BkSLVgzjd2
p0KwUIppafoK/vz7g7U4A+uc+Hj/Hf/z13/k9viB193MsC78fKfYNLGLntG6pmmFJgsyMHRw0Tuu
h4jtHOPl2Bzn0jJZ03HBJcVLYfvZjtBtcXHA2IDYiHGxrZvEUUs+TxwKen6vhnZxK3nm+e6O33z1
Lb/+5p6XZeWbX98R1we0K+w2jm3XY12zIW6CxUjFB8E4JQaLSkGl4lw4U/Igq8GayMNUmNXwcigc
1sSHT3eYOfN685qLeMH17i3j/hpxHetakXTB5vUP0TxQPXixnOZEVmWiUo1SjWUqM2rBSG2GQjKD
je1nyIJYi9ZE0fa1WWcRY6hiyKXlG5R6nlavZG20Rms5r5+FOSXsv/lv/8UvTaveUUujl0lq9Zn2
++dvZNEWpqi2SQLO3UaxYLW2W7o1OA8h2oZA8cJaUgMYxBbYEKt4wFchFIsrFp1zEzssM2tJzHXi
+fjSRA3LCmkhLyem04Hl5UCeT20CIErnIxaDdQ7rLZaMGItqwqg9n0K/By4o1hmMWpyxLUHoGkYQ
0Taep4VGKudlxdkQhzgEi3GudeA7jw0Oa8GH1uUfuoBDwEO36ek2PYtV5rFSN5nkOuLNF5zqiPM7
ghnI1dENG+LWcXh+IcvEPD8x50yRhtqsVNZcSLkgZFb9Xi2bKcuCL6U5jEXadCUlakqsywK5oIsS
fMSpg6nibaBzPeNmpBtGXIj04xbFIS6QBbBtClOBPvgWcvEOQms9tCWeRZxnnSvGOmopGN/2e5iE
dYJOK9EHrNB2ZmIwqoShpxYhxNhYzt4gwVFyYRgCzgjjEBidp+s8F5sOY5RhdFxf94x74fLqksEb
hmIw6UiXFrwsON8jJ0XDJW9++GM+/eGEm06EOmNM5XgZeDKe2wS3L57nxwSuOcpvfE8XKnE9EezC
RdczJ/jmj99AvGbwl+TqGppVDMeSmFNmqsrL4YggzKel7cbnGQuEUKk544NH1kQwhi4VnEQ6MZRF
Udu42ja21HoQhzNtd2alsNTMJvY8z1OrchpzhoO0N+8YY0O7WksQz1QzznjmkuhjZNWJdBZ4SIGN
9RznI/1ZaRzE4DBtP6uBSSsGx6ytk7sJgFTEcTbeVVYKRTzBRn69ZlQqL7WQy8qWREfhJxZ2qvyi
c6za6lUJYcJw7Ty/Xwqf4/huScwFLpzhj7Xwlcn89Xriz7oOaywrlc4Lj9Q2bbCGkzas0VIVcNzP
FXzkaU08qyHGQBaHCR3LYvHbHd1wRdx2XFztGC88NWZ2rwJ6c81qf0Dmhse6UCRhpLK5vMGaAZ9W
NEfM7hrdLIyf/QB/8YqpFvp+4Orykrc/+zn99gvc5nMmFZLK2fvAn6Y18aykFVo9KeVWWaq1UhWC
Guz3N3VVnHXUUlmLtgrYGXttEIwHLc2x0YgA7aF+qhVnLHNplx13XpcGY5hTq/Xm3NaTTpq3YPQt
ZDdPE3/77j3/469/z+F44EcerlS5lorXgndgg0WpZKPY2NStfe95td/Tb3v6iw2okNRQquXThxdk
SYQEFz++pt8N2LjFuJ5KwdqRnCaM7ai1oGlB3ICWcp6+ZsRHaiqcHh749OmZv//mlo/3E199u+Jl
5YevDT95e8nWGQYn9F5aqNQJvbMEI3TW49SwGQasNspiCJ4s7cJ3SA3HnHLh8f6ex8d3TO//luuL
gONEDAVnT+BOvMzP5ONT41HYPdtocR7IC0/LMzlElgRD6JhSaxv01bTnnjVgA9EYVFITlSmI6Ulq
8c5TMO19uLYVkCFRyy3WFopLVNu05+bMGFGBw8s99r/55//1L42h9cCrorlic9tLI6UBYfJKqRWL
YMSce+Gu1XgAa9t+oHWlQdVgpSVtffAE0/CALtB41e77LqWj1kohtOW/nruVJeElcDgtzGml5IXp
OJHnE9Px2PCbacaK0vUe49rnp6znLn1uJ0jrcGdCm62KMw6HoBSqQrENl1f5h5qe1lYrMecanJUW
QjHYc4renPG1Hoq2cTweJx4xEYsQYodxBjcEwhDZSSB2kTRfMAwd9w9HHk4n8uDJ7oVXr/c4tyL5
SJQTkr7D2yOmrFAzJSk5L2C0SQKNsKaExTClcrYGQamG5TSzzgslJdaXE8u0UEqlpMJ8mklLbXCJ
rmO42mJjR7fdYkKHim0PWpQYAsE6ggt4a9EQsSFQCjhvqdKIYmtez7SpFo4UIK0LVSxrKqDtTYdc
8cG122XXoTR8q3PNwocRyln4EZxj8JHtbiRax7bvmxVMlLFzIIn9NrAflbdXO8ZLw8YtxDGCgSU+
8WAOmBWe7245PXxNXv+Ou/U7vq2fOHR3PFTHMVXMckLzCTNEfvr2ZyRrsQdLrh2yjqw5cZozh8cj
Muy5OywEHziua5uS1EoXDOLhWBamUnk6HDg9z6xPB0KtUEqruKkiTvHOo2UheMHkhPiKdRVsJYjj
WEpDfpaEOodBCd6yKEzaDm8nEtZbam2v3TEMnNYVQ2O8mxA51MTvjLBxllOqDLEjn01vJTfcpXOR
Oa1tf18rg7OkkvDWMfqOkyaMg0PNvNiCt8qvjkfGMDClxL4bmGphNcI/ioF9Tfy5C7zF8FYCXi1W
HG9jz6e1aTm/LpWtNzxUJRThZ6FnXSo/CB6pmRsHPYW1FH5sDceauOosR1aG0NLaf1cWPg+Npb7p
AqdyQlyhYLhLM7EzLHmh3wyUoiTtCeMFmiwh7BjGLRev3vDzL27Y6MjeDrxX5dsnz8Xbnm/e/XuG
TWCMPXLaI2lHMdecaiDPG2Q88er1l7x9c8nnP/4Bb3/6Z1y/+jHJfQYx8LIo1bSbeGdt818Ag7ec
0vmSo4LadkM+nPGouaw4aym55YAQw1ygGsP3CoZg28HMxXZREdMc6a1mLKT8fQ2uEozB0RLbCqza
ADSKEG0Dd4jAYNvnmPLM3737I7+6/UAoJ8qy8IsecloZ++Y1N98TLj1s+gAedn1k30V89JRqSFkp
CR7vD6zHlU5h92rP9u0rTL9DbGxdWOPO5rRMRdDliFrXvjdSEZrQBet4vrvlw8c7vnr3ib/98Mh3
n048vf+OH7xN/Pzta7zAGHuicTgNDY8skc4Foot0nUelvZd7f7Z7WsuSWojzkJTnOfHxeeG5zDwc
bik5c3nxiikdWE3H5C+Y2GDiDW+++Dnb/jPedFvM1jNWyMfK5DPiKrs4MPrMlVWGJdNR6Z2j1Blx
iWqOLa/mLFk9YEFaA6sPkVQqtoKK0vu2vlZeQJYzPyCQ2xWUk6Z2wPrv/vl/+UujiqlKzbkpONfU
RtC12aWSmPNo2mLU4cTgv985l+/fVLQZcc7UIcFSLXhvz7f5s+pN6llT6ZqoxBskGmxnqLY0SIVA
lrbPKKXV6ii1+YXXhZJnlrJibMXagpSFUiZKXZGa0dJkJSrt4aVn6lZbTykFS5baOu/WguQmKWnr
c1TbiVnEICW1G3pdsdLGIFIVMa6N4sU1Bd4ZiuN8JPYRIw7bWbRz2KsR7TzDj6+YO0e4hFe/eEV3
5di6SicVPz9jnr5BH/8fooPlcMuannlZv+Gb2//IczqypEQXm3a2ZG0hDtpJMy/KmirTS6Ksifnp
xPHlhXmeeDmtpDVzOiU0V7ou0nWRzX7Ex9C47WpxwVPEItYSfUcXIuM4QnVIF7HRYbzD9n0bFYo0
/rO2Q16eW0hjnlcUyzwnrAmognUBa5p9qesjkutZCNOmJuIsrAvDGHFA14UmgnGC855c2sPOiWG3
aW4BF3pcF/HdJdkJ2e05PR84HZ6Z1meuPrvg4oeBsLnDdBNHnUg2k9RSXmZ4PDS0bskgA5TEoi/Y
dKR3l1AXkqk8Hp8x+z1PL7fkZIjxksNpwayNgDinzFSeW+pclcOSuL2fePhwYMor6/Gl9U1JdF38
Xl54Dj0uOF+xZIK1DSULOK0UhSSVqbaw5u3hRPAdYwjIktmLw2Zl53rWVHBq2AbDpKc2Pl8nXoWe
tWZKba4dpRCc45RTe/OQhpDMKjyXTAhnSYhth/KSV+YKXy9HXveB23XljevZOkfR1n1fcuXKe34z
L1za2CAnxbB3Hk2C18b1jlbIzvBchLfB8aEqP3UtlR000ZPbwdtCKZm3KmyMENucjSk389htqoxx
IKI8pMLeBu7XxNZ4nurZ5qWFrInLODDnFdsPqDEtGOYF4wxDuAARLvd7Xl92fLYP1GvQ2PNyGNFj
Ql6eeDk5nm3lOA48h0iyM7/4yU/5p7/4nH/6V/+EePMTupt/xGy3mLBlrYZF/8FngdB45CIo5ize
MS2oK4b1bAtb5Xyx0IgYPcOx4PuhV6K0Dr8qnXM40/bsSNOgUhvm1UhDu2oFq+fwHYZS27TSaEvI
RdPWAL1pxkUrlcPLC3/99Vf8zd1H3uhKPye6NXHZVfa9x4eIYggOoqncDI6bvudi7HDOIzawZsvh
sHCaF57niagTVzFz+cM3xO0eMR24sdW1CJR0Agqa1wZboVIlYW2gksmlcHx54re/fcdXHx/5w90L
eZnZJfjZZ5a3+w0xwNY7hq55RYbOMwTXQqGhrRSssXQu4nzjZIQQGp2Phsl9Pq08nRL/+//6jpSE
u9t7jOzYbq/wXOD62ELT4jBqsKaw2w0QAuZct7TjgHSBEB0pL4QQ6LwyjsIQMi4sxPCJXbcnykRw
Zw22NPpmtIZdhJQLm+hbA0tpuG1OjP2GLGBth0ohm1tSvSdJohqH/a/+2T/7ZZFKXs63wdpGqt8j
dsGhCkmV3LC/WFXU0AIVpp0qOLtdG5DfYcRgRKmmNMkELc0txnNGwWBdS8g7786j2v+PqTfbteTI
0vS+ZZMPe58xgsEhM8nM6qxWlYSGhL6oC90IUL9Yvo8eQYCuBQmQBDS6uhtVpSwymZyCEWfYg7ub
2TLTxXISAi8YBAjyRJyz3c3W+v/vE7rYiyWEiEgzgprYSLz2Qu2FrVRyraa4q5amX3NFtbHljW3b
ENRsP63SSqHkjd4b2kwvKlp3P3nF+/03223spV1xXtBSDUDXdzStGI7PeUcpV5zztK7UVo2/HCLi
Be0wTBE3REL0uMEx3sy8eTvx9mHk3ds7Ppkm7krkmGYmH/G9IPpCCDdwGFieK6t8yYfLxvX8lo/B
0xmJw4EuA0trtv/xgVY64hqXdWEthdfrE9flTFlXnk9XztfMeVu55Gzu5NKYpoSLHvGJrTSQAC7S
CEzDTPBxN9t5cI5hSjjvGAYL5YR9d+O02YO/VLx3aC4W6NpsXSLVvOzRQ5Nq+kcaRStIp5RKcIFe
K+M44qLHexgOE93tIRIaIXmGIZCSY5pHppi4Pc7MfqSoY0xveM0Tfz1Fanxg+Px3fP6bL7i/HZhu
Hum+wWyd1/vpniMD+bQwHW9I8YAbAk4a22ThycaZLS60XpkeA0+vT/ibiU/e/A21FtJaqT1zcxjp
ZWVKF2YnTD4SxLO9XIjJsebM6fJiYbpSGAeht4JopdUV75WxK67D6ByhN6Lbf+Zk333uNdGA4y7t
bQN29KczTOe1rwQnLF6J3shfw77rrK0Qfd93tMFCn90qhos2kkQ6wpQGalNWHDdjRGsjilGqbhFG
6cQujC5YwA4z9KUQieL5uWbeBmGjM8bAhwqXUgkdXIU3U6LUwJ13+O64EeGTOPDjVngQR28m7qit
se1I04VOC45nbdyOiWNItKJ8Ehzbtu5aDlM8O4TXujH4wEHh1iWGBlEih2E0a9wwkVujepskOhHS
9EAYPZ/e3+L6yst5QeOBy8cnXj9suFtHC0qXkSiO/+HLL/jbv/uC//4f/j3Twx/p81dU/0B1I7jA
Ui3lrKq2ntw/q7MLuIYRGzH2emmNiyouRHIXJjxe+HVNWHonxsipdiOJ7YrkySe8CH6CXi1EtQsU
6SKspVOdo7ZGFyi9sWIHtdxg8hYXil04eBC18O33P/yZb/76V9bzK1xWvnKd3jK3o5hu2QWGBMfk
eDwemYfAYZ5JKZkBzjs+nl5Ztsz5siB95d2N4/GLNxzevaP5iMR7Wq+2upNAzSdTcpcVgjHupSnO
T6hubKr8v3/+lv/414/84/tXTutG3c48HiEOMCSQGPEh2FQ2ekKI3EyeMdpadBg8+IaPUGrB+0aM
UFqldXhaVn48Z/66VP7rh59Z+hMv+c8MxzPuznPVV7If0D6xrHZRezge2LYzNUcyhTklZOrm+hBP
colJhYdhhFaIQQi+71OOmdYclQMVqFJBNqYIXQoi9jxAPKM3mVHvz8R4C2z4aNrX3iJbd0id0HPA
/8//4T/8qeSN0pqNplozCpzaD0jpFe0WmOtYtc2JdYz7Pu6pvex61Wr7aJS21wDERbwztap3juA8
gtWd7FTQ6f2XZHTAS2AaRlyzf25NiPt+XlslV/tK6IHcM6hyzYWtbFzXwvm6UOoGNESV9XpBl5WW
lbqutLyR14xqtoR7K3Zgydkwt639aoOj20m6UXDe5l3yy3i+V/ye/g/eXvTibeqACC4OtmsPkegC
xzQSvHAz2MkxusAwB26OI3FohGmg3wjcfEmRd5TxS6TdcTx+xtHfcRdv+CSOHMaR4C0kMvpE7YKq
sNbONSvaGqUXTtcra4e1NbIXrjkjXfCumukpCDFEalO0dXpVNq0E689Y/c9jK5gp7aFI68o6sfBH
zZutU3rdWw2Kts16tWXDSae3BigBw9nSoW55nzIo1WTOAAzH2e40MeKDI8Sw62od0zjiEKZ5IgbP
MCXGYbAb4K447FGM9HcI/M1Xt7x9mLibb7m7fyTGAecn3Aa34Z7Lc2UrC+HmQBgDW8mk6ZFJD/j+
BrcWZhqhZVwTLucnDvPEdrqyXSrzPOFdpp6fIK4M44ENjMPuAj055jnsoht4Olcu543tUkALeVmo
dTNvUTdxigHAGl7arxz2JRdSGFiqEqNVp5505Th6KpmUBNWNjlC9sGhjipFVldshUrKxHWYXWbeF
KUZK76QUWGqldMecBp63lSEELtXxOowkqQzdRretbLxJnqdVObjERTyhRSOddWWMycKc0gj7lfHN
OPDDmpkaJBwpCM07U4UOgVNRDs79Su56HBJLg5sUuFbHMUYm7yjqmVLih+K4CYFNIYplVmKvPHiP
aiHtrvosjdvkyZqZYkQEXIr2sSSQotUBo0+Ws3GRLh6Jwni85TgHHibPY1A+e/c5YToySeH840f0
0Pndmzv+p3//t3z5d3/gt3//P7K1W4qbbWXovEFhdqFGr52wc9ln8fbn0zsxOJs4ecemzcK3AqVm
5hgttCvCdScPmvPc6km5NUKzwOUcAiEYA15+aSBhaXe62ymfVndTFcs89U6pjeDErIrevlYR4eV6
4v/++s/8b999z/V0wi8bBzIPIxxHh3OeY0rczDP3U+LmZkJbIwwj2kBb4ON54efzwnXNnPLPfHbT
+OTtDXe/+Qw/Trh4QFxEtdCbQ+uZls+05UzvGy4luq47rdSmN5dz4f/4z1/zv37/wg8/b4RN8ecL
t3PkOEzgEyFGVGTBiwAAIABJREFUI6eFgHORIQ4kH5G2h8a8ByK5N7Ja/3wphUU7p005LZlTbvxw
vnKtyuX8TOYjNzefkI4PrBrR4PDhHb5P3E8PPKSJpDdMLeBEOA6BwzTggmcMnTEI3ludLIUJ70dg
ILcDMUSam6liF2PfPIMEBhECA4cw2NpaHCHZ0iSMt7TmED8jbkZLwtUJNKI1weoJtTZcrXTnDXrv
7cGttVBWqyJEb3d15xxaKrUb4D44jwbrnrv9xq1qKd8Gu4qvGHIVT68WZKNZGnrwZuyqv+pU7UFT
NCM7zz0ITDFRqmH+onroRs/aaFyr3cz71swF7gNjDGzXbmGgpZKcjf2TC3Rvp9Y4epxExpvZsH8h
gku0Dj6NOAlIxHj07GhFbYbGbcWmCd3+3AxQ5/fKm91kG51h6lZFcB5K5VgnVAtNlZ4rW6tGrtMb
rstGvx64akGksmphjdkyB5MQcyJ0wRUhekcST+iCNoc6oVZsehAaLgsSPJdeaWLYxy6O1JRaHHN0
LOtq2YJhpKFUTQTXmMYEuTHGZIeV/UXeWyNIQHMlhAitcAiTmfW6GAEqr/TsWddKq9CCeccn59my
4nHknJGuuBDsgecifcukwwCqOOzlpiXjh2RJ/RQQsbXGmBLresUPydLdDxNpXPAIc/K8HYSyRj45
BLZeGYeBl2vGvf0tEm5oesNtTUztlt989Rt+ev0Zf3PD/XqBpTDUGV1WYt4QvbAMSlV4KYVjGuDn
nxilEW5uIVx5+vgzh8NXyNYRd6YRkSpMMbFibOb5dmB9VX7+cOLpvPA7veJ95DBGxunE4Wbm5k7x
YeQw3yC1cEtirZXqHasUHJb2PamBMooqXjpJOkUbU3Sca2Vw0KriTZRMU09yAckdr9EqkS5R1fGx
NR6GiaUWQhSEzjF0DqGRVDmEwFpWRrG9elPHEgRVay5oK9Y4aJm6LvxutFva1gXNjQfxDKHzr9eF
f3McuPTGkBxLtdHifUqcqHxxGNEK0xAoVCNGBqGUQvKRrQpHBEpHg3CXPKUXogN1jcF5ehdyKzwm
hxclpIA6G0OKeLZt483xwFavxF2Z2bD127pVxuFAaYX5/kv+Lh2ZxwM//PQ9L6Hx8nKkTUfeHg/8
w3/zBz7/w7/hN3/z71jbLZt3rN3/WjXLTZlisIBiFEsii6lzq1pmJFel+c66770PQcgFDs6Q18GZ
otp3ITm3c8DtcxxdpLTMWipvtDEUD+EXrKsNS0MT5gjLZqPajP+VMVL2Z3du9qJHxfIwVC6XV/75
9cTX65kvY+EwZzRvzCnRe+eYAndz4hg9t2OkZ3vGguN0Xcgtc1or57Xit42H24Xf/OYTjvcPxPmI
dggyUbEpcC0rZXlGWqEuF4ZpRLQar56I5kr3kfd/feHlCXxzfDE5HpxyyReKixQXzeipgniPYGu5
yUekZ7IWRh9Zm9Uyy84DqFkpqrwU5Xmt5NI50SgOE1HdDwR+h/iEtMSgkfr0kXjfjU3PxuWiPN7M
NK343uhiP7PNZ8o+YRoHv78rodVi7zo82UcCgtbK7OyilXonVOE4eXxIXGqhR2/CLBntEt0qTmFd
y+4GaJSSkHYhHCOhb4WKfXNCtFRrrhZc21qhL5keAyKCk2C7Hu8I6s2eU8I+Uhfi1mjB0YpCtAAZ
ztuLRoK91FvfdyQeD1TniHRKU/Nzi41tcAFVOygUbB/uIkTURliiJO/QLqy1UWtHe2EInZwrUZTX
17N9iLynNCVFR9FKChG5mkZvXhIej48D3ifSMOD6gZBGgjq6RFxIqBXwrSYnQggBzQUnRqbDY6rZ
aiGHnrPV0maHhriPWBW6jV612gO6lMK6vuD8RolKXwI+Fh6jZ5tNiafriRALaTrghmRBKYGKt6S5
d2yl47w9UHrrVj/CmdVOOmNqOEloL2TJ+NLt62yNJSsqG9EHppJx0hn8RtsKcxro2vYXrbUY3BTR
Whlm+6A3NzKMkXUZEL+ybidjjOu+1wNULXS5abOpzHalt2a7wM0T/JENxQ8JXRa0y69cgDBN6FoZ
x4hzjjQN+DEZIjc5iI03/Z55WYg0/HFkHALjmLisC917hsFyDcf4lvr6QnKe7DvTqJxlJR7v6Guh
L/foUjnlTHY3XF+feBmNrf8kPxJxuFBYfrzi7uA8Huh1YcyeaYJWM5FKDFaNu42TCV8muFZ42q6U
nxvQeRwOTPOZ49PI795Wxrs7Di4Qq61pNDemlFhzY4wD51rIvfHJNJPLlWMIrOUKwZN8omvmGBNr
qzymmUvO9ufrPZdcCCnyUir3c+KlrFaF7p1T3fAOXjRzPwwsdaO7xn2MnPLKaxj4dlVuhsl65JJx
AlmVMXm+XU7cxYF/1Y3Q4I0TTptyG4Rvc+c2BDb22qs4Xrty9I61K905khOee2V1ka0J89Co3VY9
c+oIK59NnkvP3IzR1JZVmUKk1mrO6FKYnD2JaodDNA77EAd6yaQATqo1WcVxbRtzmMm1sXZHrcqy
npnSQIgPfPJVYhQDkvz48jO/e/OWd5Pn91/+nuHLr9DjF2zNs/ZAbkpyFlCNweE7tt7wntbtJo52
IgZRKlqIzpGbGb5sh/7/648j1Kb4GFDBpqbdIEJzGnjaMoNzKKbmHLrt4500NoQoQnU22aoSzafu
POdqL8tjFIp0DuKR3kA6misv5w/8tH7gUc/cuUJcLtyHhhCJAYZBOCZIsdFbpmrF68SiK2u1y9VP
ryuVld/fBf7tH/6Wu08eSfMbxB13b/uAakbw5O2VslxhLUhvyG2i5iumhqmodta88v3zT2RW2nal
l5U6roRjIcsrRQRvSxdS8IzB7+jZirjMEBytXS074Tx1f1aX0nnZMq/Xxjkray+8LBt93Xg8dsqU
CP4TDuFA6I41Nw43nxKCTaGSFF7bleNWiVzwcqH1Z8b59wQCH0vGxRtcGKhEe0f6ZJplaYg2isBB
HK4pvgrBCQFBejCKIBEpYqx+EUrrbNVC36clc9kWwhBorXIQIQ2NUPqG9sZaDVKSokeasKmimi2t
TMcnaOUKEggSaF3I1RGcAUCUbi+9JkgSWjXTjOsVh72AmvzCZjdVqv0cmpfXyy+jo4DvFS8e3bLJ
SZoZzKKAtsrsHUurBvGXTgzQjISCtE5TZWtKrRXvhUtptFYZVMjVdkq5NlxM3E4jWoVjsrT1w82R
Xhfm4y1xnKHb2LfVQiDSXTf/tW6A0dFa3sxlnTccnlrVDibdStxpmih5ZXSBrJ4QEj46+laQG8/p
ZTMGQDhAWFk34zgfhoDWSjgkcikEtYSpdkfcw0vOYXCEgK0xdtSua5BCIHel5IKPgbWeCMluyy46
Tku1DiwDpWdGP/B6VYID3yC0zjUWmm7cRSOmpa1TFyEOUONM60q6mdBuh5ycPdEnIzJtFUIzuUL0
VIXzVphHZd3OBDqlRNQP+HOnLytpPrAtC8MQqUUYZztQCI0QJlpfiPMIIsRhxEVDg45vj7gfO/Pb
t0gTelCGAUKEeYpcr5nZdc5h4zwEjrdveP7pn3D1AvM9fnrg9Oq49sjHq/Lx7NHrd1S5ELuyrkKI
gev5PZfbyPmTd8TTC0EcMj9wfv2R33/xGVmvhBAQnyF4tnymtQGpcOM9ZZi4tg61clqu5B+U36SB
cq18+XlhOsyM6Y7qlRKg9syRwJMUWm/cxNlaAT3Qu2NrHhkSm2YO48ClWa/Ze4/LC8c0cSorPXRc
78whcYie17VycJ73y5WDdFILNOmoa7xslcdx5KVmSnAEdbwNgdkFZNkI0XzSF9f5UAornscQSbWg
vbG0xtIqD3t/2Cc414b4yKFZJsKwlp0hDDx1x3s8kwhVhMEn3p83HuLEtXRUPFOICMqmHfHWu/3Y
CqU2YuxsXhidtzwLince54TRNV5LZhwSZV8L9GYQD8STW8GFgUVXzroLciQyxDc8fDbCYWI+vWF8
euVxckyff4Xc/AZloqqj9EZrQm32/5duvZkoIL2R9udaRk3AUxrN2X7dtV+iO3a7zt127d5HNjXk
s3f7rV47fU+PG3FOuGyV5KMlzj30bh32Fjq9wBjhmtuvsipVYQxCLkYb606oXait8/H8yj99/57H
VflSElwLiZmjFx5SIsXOjQtIU0IzVoknQOlsWjmvG6eSiW3jMy/89n7g069+iwsj6fDGtKT+QKsr
4jxVN3u/VKUsJw5393gE9Ra6u17PrNXxww8f+evzlf+yXs0xEmEpI4OLaJ/xbmYQTxTHWBKueVJw
5FyYpkDFWja9d3tHZc9LU5asfNgaX18zg3hC7pSz414i3QP9ltSFpBNxnNha4/Y4cC1WV01945BW
+nbdp0SRMH7JUd6iRTjGRndCVCNgZhoqjiQV6SbQya3gN2XABEq+NsZxJMWBJRcupRFSNOSzemqG
3hwvZ2VbCjU3wrDw7s0bqi74HvD/8A//8Ke8Oz8Kag5Wp3Qxx3NygtSNro2aC51O1UaXxqVtdFWa
LOR6AbewtQ0VtfN4M5mKE+tjaq/synMLoNHs39trT+ZMF1oRGh5pu2fbB5z3e1UuQfCEOFqgAk9R
T3Ke2i3F2qqnqaWncxNWrZRiZftclKUol2VFaFwvhVaq7dWLojUTnTKOgRA7+ErrBW3ValZiCNpe
7cHRmqEseyv72kAsfOcrVW1qYPz4ShMD3ThnoJ6iZS/RGckpt8IQEz2YBckHxxQj45AIOIYxkmJi
TImbQ6KLZw7OADFhIKZI9B4fPbUbRjKXSnSV0TmiWqdZW4em1NKprbLUynVR1lYozYh+eQ8XQqYs
G1vZdiRoY9uKJUWr6XVdF2quVDr50vCdnSwH02FE1OHZf366Ij1QK7QeuRQHzVLQpVQu54WyLSB9
R/x6yrrZ76lZ7iGEiDYluIhm+xCABU7m40QYOrdvbkAUHz1xGhlCIiaj3HnnKe1KlpWnuvF8+Zzn
6y0frwOv54n37QMLP1PCyqqvrLlQeyDXzpY7MRVu1sxDyrx7CPz2k3u8/IWP138lx8B8/JzmAlns
9xgGGINx8sdgTO0e4ZSVf/n6I+dT5RA98yiMs2O6m22E28D1QnVi2lOEMUbylq1Cutuy2v5Zuz8c
WUom+mi3OoteobUxhkTRwmH3IYTYuRXHUDKHIdG6YWY7dhg8BE9vyiFOaKnMrhNoBjGKwchlzQ6Q
Q+8E6fRemL3wVDLvYsAVZQyeS1f+QuM+Bf5TLfy03yDPWEL/ZavcSOS6KffO201bhehH/pIzj8NM
EjjGxBFBS2aMQCs8ThPaobbOHB2trdyngbJtjHv9SdJoGRWFMR5pWpj8SCSSM4Q48rwsqAs850oh
0X1kUbi5f0eVmftPv+B4/znx5lNiOlCbiUlaN8mJs3GH3Zx7IwT36y29NJvqRWe2tejk1w6x6521
KocUuGblNgZqU2rrTDFQGkxD5GnNhOBxUkkuMnqD0BynhDj7Nb9grp38moFa9yTz1hyrdqbQ2RRu
vDB5YfAKNfMv3/2Z/+fbb/mXDx9Yzhdefr7weANvHoKt10bHISbEGUBqqcLWG1trnNZCK4qsG++i
43dvDnz5d79jPD4iwwMi0VI0kuitQK/kcqZtG221l9k4jXQptF5pubBeKu9/fuabHz7yw9OJshTO
L98xyjOfPR5JrnM7TABEHKE1fOs4FCfNbuMtW0and1rubGtGG9QsfP2y8Z++XzlfGxTl/dOZvl5I
ycLZN2km6cDt8Ujskd4Da7bvsx8bl7WgLZGiY0hH7u4eSKNjDAnxkFxg8onkPKKdgPEFjO2iTEFI
vTG6hu+V5B3OR7wzBPlpK1yaUgSyU5Zuv9505eP1TBk3PrZv2Px7bm4eLBAokXBehWuruOCYvMf5
iqrHN0V7pipEMtKhNkevw277CVZX85mUrSONFmK08WiLFQnWRW7O032y/5YPhBDwCF3VqhfNfqfd
O1pTXPCIA22/3OY9YU/fBwfdedZifNuA2K1ZHH5T+sbuAfZotT1WEFip9NZJrtO0MCPEXPFSkC64
Blet+DZzkkJ0nZpvCONMUcX5AReE6r1pZpuQUqBuFe/jr8EuE9xYz1NQq8llu7nEHelXVenV4eOE
5pXWI97BEO/IvTCoMB+M654wTvsSR6IPaFe8D3jvcKlRq6n5HMJSzKdcRcmxGyyoFarCWjtOOlvp
gOK9Z91MatPEgoZzT2Rd9wqMKUDX5ojJqjbB3J8EL7gddSpDY1TLDPRuid7kOkUhTSOgkDpSBzRU
vAqbXhlSJJeKUllbp1Q7DAVV0u4B2FaHy5keI3lbEXGMhwlUcGmgRVsFxDDTl0q6vaV1pYt1Y3uw
tPX1dMWHaFx+73l+PbO5Rk9CuLnlk8uB00vh6cNGeeNx5594mRKljmztYGnb9czNfMf59BNdVvR2
RestL0+NEl+JN/8WbQuX543FZfwcrRbjlK6dTReGACE4lIpvA7kIT+8L2zTy8I9n7tXz+OaON+86
nUR0iS2v3EZhyRsx3rKpgUNycFyacnc4sJSNMQ5spSGMVA2cW+GQ7O+D9zt6WQjece6bvXjqRvKO
0DJVLeX+ujamOOCrowiswCKNeUzU68oxWWCud3t5fdg6tynwU1k5Bs/Wlf9cMp+IMcHvU+JjEz71
fp+8Zf443/LcrCnzL9vGWxcYvKN4xbnI10vmYRp4T2X2nRIyXTqPyX5mxyFSq1IQmm+0CseQ0HUl
+YTrga0U5sFRHfTUuZTCmCYGTJbivWfTDOPAa9nYJPCqna0HqgQ+LoU3wy1VK2X4hIfjvNsEHdno
29S2u8y9R3vfd99tZ/p7PPYZjMKuAW1mJLM4MdHD2iENNrbH2UrKKG/CUjZCSmyqDD7slDCHSOU1
K9M0Gt5XhNYthCfuFyCNBd0OPnDSxrU2BqdI9dxJ5+gcoRvv47S88HR+5uvtxOu6MlEJh5V0nEiD
/ffSIRlnonW2dTFmWRNK6SzbRrms3OjCl58/8u73nzK/+xwl4lygNIfEySBXvZs1s1TklxpwitSa
iTHSSuH55xMfP175y88nvn1e6Vtm0MKnh84X948ck6OGwOg7gxN6W4wn4gsteKoz7bZznXOuJCDn
RlG4NrtULKvSXiver1S/cjcXgh9BmoHO1ONWq2SXLhAK13XDHyJzb7gRzstCcJ6UhIoj+MHWLyGa
sjY3g2iFQK+2Zm7i6N7yTz5YZiAdj/u0hP0CCq84ssCoFizeVgt9IpVjes+i/8yns9W2O8/08I7a
BP/3f//v/uTUm4wl25k+b8Wc494AqISAYuO9Jo5LbbTWyd322ZsqtRs2svVoJ2Y6WxFyq5QKpXYq
lhy3v7Bdr3Sqdqo4lEJtYnn6bnUXWseJcbBbbzvBzTqdWisiFh7patWf6Gy84qIg0Rnz2HVCNNbh
FAJe+34LqLbP7wXtlaJXq+tpoWo1Xvd143xdWa8bJa+UXOwHUyvbWtCc6U3RnC2Tqc2mHApVs60Y
VHF7P76qUmuhtY7WQi7261ZtteDVVIYhQERIMeJ8sFVHGHAukuJIwzF4IQYbvaY4WFguOUprBAwm
01s3RUNrJm/IBemOUh29Qmn23fC+Udr6S8EQqNRerR3VKrU2VDpLLeTWudTMRSvODeSyV+hqM/pe
6yCFYXC/ZiMqVlPxWAPhJgraMoOzm3xrglbM4qcKzg576/kEpVHXje2y4J3tO1szYQ2C7fjFakBQ
CeMA0gkpEX7xh++BrZgivUWSJBIz3h8JMRqu1TXCmrkLRz6fIjdHjx8d/jihTXn37o9cTpkoAYmZ
4BYOnx5gUMraAY93N0Zic5E0Cq4qyJXaL+At7RqjfR+3Bj/9GHj62FneV45HzydvZ27vjpASBGtR
dOdtJSOQteJ3UlwL5sfW1picyVVG50nAKJ30y941RPKuG/7lkBy6cKkN8Z3cG8knRGxtlqJpjnyM
LE1xkozBoB2Po5VC2KEpQWCj26i5d2pXFlXeiTA5swtWlM+8UAVuunBwnQsWsnxflb8fZz7kDRBc
M6nN7Izcd9jZFUhnEBC8BdlQhhhRlOADtRWWmhmHgaVkqusGJfGd4iPde8aQ6FimRryQRTlr5rkU
1HnebzbdcHtaP3lH7bb3rrKHfJ3QMPpYV0OVSwcvdoS3gGKgtB2yxS9ZEKX9wm5Xu1F3QJtlac6l
omKYEPWwtYJKJ4TAWg3j2qqx11e179mb0eiQMYjlUmx7TG1CCDYWzx3ODbbuLNzblZvBcxC72XYt
fHj+yD//9Vv+l798R1gv/GaufD4pnx4jg+s8zgemGKm1kVtnrZCrsjalZyVuBXd55ZOh8OkffsvD
H/+AhISLEyIDTQSRAS0XaJ5le4ImO6yrkcbRmkgCy3nh2+9+5l8/vPCXp1dKM/8H5czvHj5nkhEh
4nvi6APSxCiW3RGd4KKnVHOHtO5YL5Xl2jg/X3h5v7AWZVsrP/9w4sPHH1jO33NzB8MY6KVzxPMu
Ru79xCDmdR+SQNm4HwL33jOPE4dxhMFxd5whFIYYmdNAcJ0QDYMuIkYIdHbgGrwjBIcDBue5OSaC
i8yHA8iIhJlF4Xkt/LRWfrzaBLvkBsVaYq52wkmY5Z7H4ffcpM+58W9wLZpwRn+6MIlVzjrCdnQ8
vz4xvjtQX84Mg+DmgdQGmhwJQShVaDutptNxYUNRVIw3250wilB7MVKUr8aDL561N6IozhlrXLzt
gKsU4y17hycR2d2/WNtJFRA7udbmcERilF3UYuah6tTus10QUba9Azo6T2seCc4wtdgqQDKoKqom
a/EpIu5CofPxXDlrp7mE95ai9d5z9IlpGvDeBBziPeLhMMykX8JJPiCilt6sBq2xl2ImuIGqHe+V
XApg6tnaCiLNICN9lzG4YKD+LkwpseW2d+c9wQVqXQHrhKo24uBRbb/KHNbWGcTT1fCJSgOt5O7A
KaU2S4+rotrNo5Cspx9TpxT7s3Fi9bVL70hXhiHBCsch8rquDC4ytIR3HTCWQUie83K1759zaO14
OlUdh/GAk8ZQoQV72IUOV80M+35WojUlcrE9Ys8rvTvOfMT5RBom/DwzTgeyroQU8dHMSa4b4CXG
RN4WxnG0A80ErU0csiOlxJBOyClCyJQ2wHjDcpfpmpm854fnV6btkfNp5bvm+P67PyNESl3g9cTN
Z/c89sLQT6g80/QTzpcnlAPnVhF3wzANlOV7jtNnhBaI3aPOpEaPR8fnf4Sn/3jmH9+/8PgN/OHf
PDMe/8Lv/rvB0rPBoB8jQm+VtTTiNLIuG/MwkbtNoTwWujyMA5etMsbEtiqzmwn7izalyPN2hSis
ZEpqHGLgukFwhUU3buajkcw8DM5BU+7SQNFMGBKlrFyaw7vOtVqo0W3K7AeetspZ4b+NiV4KDeHa
OlEC6oSlVlxMPDXhXjzLJvyhR4YmzCqMznFSE/N83SqK429D4INu/DZOyJ72XjtsXUk+cqqeNy5y
KsrRzWi1ZswYuwXmXKBpZgi3JInUlgl+YOsdkZHaLyy94qSx9JXJRdbeeIyTjaudY4wWphp9QJsy
OMGpoFgYrqIEcQbnEm85nmYEzbaTNGsTgojlhKTvE0iDg2mriDNb5VpWgkuEBuoFrR2040PgQmH2
nrMWe+7sXAzBUZsJbUp3iDS0W0Bw9sIS7DOxZnsW3sbA1I1l8PJ05i/vf+CfPr7iflx4PCifRccX
YWJwtrYkeF6y0rtjqTumtjlK2Ziy4s6FY3vh88/ecPfl5/ghIn6gOgtsiUzUVo0Kup2o5yspjTSB
EAdK2VjWzHI68f1PH3hZCj++njktBVc8w+i4v3mkYZ/bJu3XLEIrDdx+YO0mv1G1wxUo2XVerwvn
b7/n56//irwZ6WHi/bdPHLwnjI07OXAXb1lzpTdH3QR/UMYYoCgxCnMY6N5RxPj0XTxHf+QYPckd
cFQb/YupTd0uP3L8EqR2uGh5CqpdPjY1AE7D0Vxiy8pprWSF7aS8fLwQ33Tm2DkOE857Ju/ptze4
dktkxwA7j3c7Bj3l+qfzX37i6eP3/Pzdt5S+8PTdP7OtP/Lx+hOX/CPX+Mzl44lLdYzFMXmHW1ZC
BdcqUpW6mRpOFWpprFujZqFrx6uJoXtR6lbQplyXFVAW3ahbpmhGq4XayMqIs26z9l2/qsY0L9uO
c9sQpwQsJAP7STl6I74Fq73FYGNuUZinkdaxMb/3DDEw+EStgWk80jQiEmg4xCdKh602aq2UXLls
K6ecuZSNp/OVq25sJbOtG7VUallsauCgl0rVQlMrx2gxgIG2ju/ePhR1H5e1RtUK2AhcGlTtBAmI
Cq46xBmzue3zjeA7pZhFjmYjPhGrM9no29j00jrsPuQqq6kHqdYiwLzAXjKBjpYLInmXiog9SLoj
Z+uutw6NZk2F7vdqm0lxfvl/tqZ0lCKNtWzULuRisoXW7AY/HWa0dITAJs3CWNLorjKOntJXUrDD
Id4yG3n32+ei1Ky00ui1ky8L5/MZL5mtLDhvAUgfrQGgtSHDSKudEKfdUOUIydOAlGw1Mo+OT48D
n94N/PbhwBSFx/sDh9HjxwPr1bFuT6Q3G1k+cLzzvP1s4OH2htQTbBdahg/ff8dlO+91yg5hxPXC
lB5x6om7C6DuFMVhchzvYJoqj9KYhs4wd+4ebsBDGmYkGxnKl84UBhIN183s5nxn9JGcC4lgE7Bm
iV4tDXG7pMMLzSvXujG4xrqtHL0wqvXNx90LLXjWagYq2ZO1yVnb4Jgi21atltqVU1kIzhLdAc/3
deXReaY9ad1UKF0RLzskyHPundzhznlkrfzt7PG1kLBxdO82mfnQKp8NM14rgcStS7gmRJeQDPfD
xKwBqXbgDT0yiCDSSN6COj5AGgOFxjElVCpx772zVz43LbZLrw3BcwgRcYayXlrh8ThTVIi+E8UD
1s3PrTImq6w6dm1wgzF4fiG8+BB2FDZkbRyTJzcTRAWxtqcT26sfkmetCuJIu566iylH1XvOtdN3
PfGijbtySQEfAAAgAElEQVRhIPbOePBExEbtwYQrPtrXImL79OQEbULTzrvJMYgwBiN3vn8685ef
/sL//v033LUrX8TKO5TPZiNSOp/oRIoIpQ68XqEUTy3G/S+1c5SNz9443nz1jtvffgYp4uIDvZtg
BjfR8sUYIK8ff1WJWl4LXj++8v7pla+//8APrydKrVStOFfJvRKjZxwmgjdsq2DMe9int15otWAF
24qSDTJWN7Ka4OvcTyztFfGv1P6Md1fePXxKdI6b8ClpiYh6+kvn+PzKcPSk1AhHxcdKvE3I2JEh
MMyRmOB2ttXx4ARfgaJobbjakQ5BDNE7JmcQr+ioHYoKKSYUDORUK7lmntYz65qpW+bp279y/vqf
8a7gqIwyMgwwpYEUhOS9wbamwVwOfmBMCX89L3/66ArfPH/gWTe+eXri+5efuG4L5yb88PEnxBWe
z89Mmpjnlfb6Iy9PX3P94RukdJxG2BxC2G/UndwqXRRdNppW6trQmilbsRddLywtc9oWFi2ct0rE
I7kQtOG7GlO+mbhFaWhrBuqg7w1SdgONpcrjjnUL++2/9b1qhiEWDYAPzlvykBCIfqT5wTi4zhFT
Agl48bTSCd3tIb2G1s7reQOBU15YivKSM9tW6dLpxUKF67IidHIx4E3Z1wWdzlYyInZbr1rQuqHV
bs5G0HO0nZkv+1/eGRjiF/9xxyYWOeuvo0/vzKsczEBvNQnXwSvj1LFacqLgyd1ZUlMavV6JbCSX
oZ0o9RtaD7y+vqf2QpNE3V4osUO/knxC1WpX3nkUISN7L9qmLUpjy5VtXyfUUg0Pq5l5HHAYM793
2UfyndaV43xA22a7v3E0UuF+iDCtoml9QVnqhpNG00zdLvS8sl4vJtjplTTM1G3B+wHvItqdfb2q
jIeJLkqKQohCFOXuELmfAp88HjmMjmmKHKaBPg2EQ+C7LpRj4rVcCOOJeGhI7xzmT2n5yMs649dH
1ktkXT8Q5s50f0PoJ9ryynD8bPceW+hmVTMZioc5Ot6+TTzcRXyphAgSjefsPXg8oxjEZY428tbR
m1CmO+ouTppjQneOt+ud7iEkz4WCHzznkpnTwKU1UvdoMzzvGEZyUTvcqlAcpJjYtDF5TylixEY6
a+/MIXDJK6Pf65gdTtrIUvl8SLzqxhCFj10ZBkcOyqKFGuG/tM6d95S9X3HwxiqYUzK/ehdQx0Mw
mci5Vl5wPLVKD568d6kHL9TemAZTv4o0SjNT1ZxmzprxKVC7ElNk2g9zQ0z25+482jJrsc8qrTKH
xKqVbX8LbyjvBqtZxWA38sE50586xxA8OStD3NPtdimm9oYPBnYRZ2hRnLPn1v6gZ3eT56rUbpXQ
a62k4NCmeBdZ6OTuGbxn6Y2Dc1xbQ7wDB0kcD0MADyHZh8XvY02pUHcGReu27x+dMDtnK4XgkC58
fFr55ps/84/f/MhhK5y/X3k7LRwHR3QBNwwsaha0NTdTJ6sprSOdoCu/HZWvfvPI/Ve/Y3zzlu4C
LhxQqk0ZVWl1peeV/HpinmdLnWtnWQvf/fTENx/OfPeyEIO3g3C3FMIYJ5oboTuGYBec3CzAu6mt
U+2Z2GmCTUV3QVDVynevF56b8v3ygevrB/L2zDBVXNq4eftHzh9/5v7NG8b7iR4uzMuF0BV/sNbQ
dDfhBs80T4zHSAOG5IneEVsn9k4oStsaQWyc2XbVbXed+TCSkiOLg2hrp9bhVAq1KNdr4ennK+ec
uWrm+fTC0/KBf/2//k9KGbidbkkycjzOvLk9MKRIEofzphMOIdrkZ29K+AJ/um5XNrXwkZOElAvT
aSWUzP9H1Hv1anJlaXrP2i4iPnNMWmYWu9jl2g7GSMAAgqAb/bL6NfoJmntpMNOjGainjbpUXdVV
xSKT6Y/5XJhtli5WkLogCBIg8+TJ80Xsvdb7Pk9YGtuaiEuAy2i367s/cH54w2UuzDSKZu6m9+Tx
xGNb+DDfc3f8aLKImm1EsRQOf/zAEqzUP46V0ziTK3y6TKSmTHmiUaFUWrEKzVwqzdlOXqn2oJKK
VyVrtRRrM0oSxVK9XtTqCl4QXQ8AAt4Zz1fE0ZqnScD5CDFQveCcR0XwPjA1+4AMyRGoK+e+mdDA
NeaaeZhnpBkOs1bzxU9LhVY4jzNZi2nuWsF7o9FVqYg2lmlEivGLXWtmJqvVcJ9iKfRlmkxkI47c
zMCTS7CErFqPn2pJ2kq1F75UynqDF3H0wUhqog6aGFazKsEvxr73C7U8EFplPB+ZxhkXnqPePtCX
y1tcdDg3UIswrx3bmHpytV3RUh1aG0srnOaJuS08ni6rE0ApecFRoVqKv9VIzXAcq1XvrOBoLHMV
ko8EsXyFOrNWdaljrtC7hEqkqUdC4JJtJ39azsQYaCvP3zdHLQazqcsqOcgVHxIuOpRKGCIqsNn2
hOTYXW0Z9lsIjt1+R+o8IVoA8XYTef18y3DjuLp9hQ/PmfIV0ykQcuLu8MDZVdLzp0yXI8Q9W7/H
ZSF/PNHnDfVYUAlE8WxCB62x7QIpCpvOMwfl08d/IfY90zQRpdEDw36LBI+4RCCsYUJlzIWl67g0
R/PJ3Ae6HmZRfArMi+27k/MspbBxPaVkrn20KqdfK6MIMfbcl5mQOjP7iVUfszSGkDiWSuw7QKmt
UrVAy3QhcL9kriXhxLFIozjPnVb2fc9/HQtBPLk53o3wKg7856lwnZLdxMRUkNRKDJ65FXwXuQd+
kxuHFPh1s8760TWeDQNHXVdZAtkVNl3iVGa2XU9xjVPLxOjwHq66ngB4F3F4alaCdExztixCzTSf
mJ2AC3ifWGrl6bC16URThugN6ezNSpe8t90+zlLuCtF5e5l7vzLWjbVe1AK8orqa6llvp8bQiCsO
26sFoIpabO5csJd39RxzMTBWs3R8qPC080QPKQgugKtWWaOJXXza91cEY7b3TkjOktqd2ETt7uGO
f3z7B/7md++5bYX9tPDnL3uGTaCtpLLTbJjcuhTqkmmt0tUMpbANEz//0RX7l7fsv/oTNCRc3Nt1
S5MdcJYLLU/ky4nQRXzqwXXkCm/fPfD12wNv7kd0KQwiUDObaPXX86S05k16hWMqdsFTZzmFLB6c
Ba2npsy5Mc6NpQbucuD9oXD3OHE8vacuE8+evqAcRjb+K7abK/bXT1hyRuqMzA8c64GYhfJsy+4q
EdKGTRq47iNBAl2MJO8ZfCA0JZS2HubsDaWtrA0vC0fugo3UC/bOmGrhOC2cp4njuPDu88j//Zu3
fHzbON995g8f3vLh8T11ukMePuHbhX1M/Pir17y8HnAI25RIsaPzHYrgvCN0hkoPFpG5Ab1wPp2Y
ORCl4bXRT0q9XyjnT2yq8DgWlieRXfA8+MrmSsh4Pp7ecB7PiOv4mCK3ITJ0z3m1STz28OFXb3jy
1Z5LczzcfSKfIuPk2F4rkgJXO+F8ObBMR1r0uKcvkG6LVsH7iLSABnP4QiMFjwt20wnO4cSQq0WM
e50tKUUwsBtN7EWGKrVZQt2JQxSiOqpWNuohCK0oTSzFGrtAro2Fhu88ulRQE9An57kNVlFzrRKK
oCWbf1giCxXXsuUHROlHby9tVRbE4BNi4TuRBS2QUqKsnG5pSp8SznmkBcsoOFPT1mLZgebthpzr
gjl6sr2otCHS6L0DEqUUBudoXqjBQndNC7UJXrbUumGeA1IHUr1ivLvDt8zc7Sl5wzQPbK7FTt5l
JQZWRetIDR3aKsV7xvNswI7k7FTeKi0L3jWYM10XOVxGQMgKpynjOqhloUcpllumE6MNdikwFdsb
ai1EUaLv0MnqV62ubHpXqM1xrgtxFmqbyOMnNtdb4yIQbNy+KnQVxbvOxvNRcYOQlp40BHSBTYj4
VRH7TDx5nnCD58thy882f8a53vHm04WxJn71d/+dr9uRy/SGP/3q36Ahc3d3gHxAxkC5v9DPNyw6
sb9KeH8idx6/KPuNHRZia2gQdptA/ekv+PWv/oFXV1/hJeJGIfjE5vaWfntDrQuDNnKGGDtqvbDV
jn3acZoWimQIjugcWTKzLNymKz5PJzYhIbVYwlkcUQJ9gGld3VyaHSidWk88aOO8XBhCb0HVYIeF
C0LrrAbXhY5aKlchMaw3zp1EDnnhVjx+qfwCx2uf+GOe2MeON1X5y+jxa/21S5FLzvTeMSLk6Bid
42Nt/Pm2Q2rhz1M0CIc4kEak0bmOJguDA+pCL4oPwpgXtrEzkEuIeHVMqjxJWw75wi6Y096RSHXh
blSu9olcMtHbs2IXE3vnaKUSo+e8KMNKyZtpvOgCS7Pwam220lK1eWHyQqmmQQDbaSON0mCIjrxU
/Dox7NY1Q272tU9zs0YRSlLHIIFjaWx85Fir5XTEgqteHH49JNDMd+VW9bNzkNcUvqrhXb+fDHTR
0WpjzMrXhwv/1+HIT54I+bvMVW8a6rxAjIG7S2GcMsc223qzVWKzKdxOMj/a33N9+4ThxR7XWT1N
vNkfVYRcJpb5SJ1napnpNxuqr9QsnM4j7+5OfPN4piyZfWhc8sjtJuDTOtnbWtgg+silZLJUq7a1
irpIa1BFmGsmTxXflLKMPFTl7tK4jA1xlRiv6WJlite0IbP54ob91UCtFT1dyKr4/obb7gva7LjZ
X5H6wNUQ6YOniqPvIk1l5UBUiig1OFxtFvpujakoQ0pIEaJGLpOtxUiRpQr35wt//PbA9H7m8Dgx
jmc+/P53vP7qp7z/9I/UdOKyT8jlyDYFdJPgmbDdCz42boaIECnZ0aqweDUSIgvJCR5uf4lLoOPa
iZ7JTilhoIYtRzzTUkAjj8WCB6fYeHxQqva0fovLcBoXxlzYVM/ObYmbjnkWPr//zDRn7k4f8M+f
cHj/kcv8SM5v0cs7Nmli+vAWOX9ku2RSOSNzI892Us05U0VYykIuFuQCxe58jlnMC12x2D8r8F+p
iDOSXEFZms24fLO0p6AEZ3WeUk2mIGI1k+TMl96cTcJjMiqZ8wH1Nq4avBA8RA94R9d51MGCUL15
h4tax96hLCjny8RSG+dpplUYlwmqmg1KWAMwlvYO6lmaIdRza1RnMQ9wa9rfaj8IeGf9Sy9mv4ri
7GttA8EFywU4T63YyMYLu65j320pSzZ0rROW+cKhHHnMmVKg5EqLHaejkk8zyQX8XJH6fRLe4AhV
Gpn1cKKgdaFOUJfP1GlBNNPyjPOBQKLWxJhnzmNhLBPHyxGvDleBxZjWUTw+dVSElAaW6oGE94EU
PUPf2YnUO8tEqvV9a7HWRMsz3nse7h7NGd6MMx+8UMtsdiQaMURidMS1469NSNuN5Q+crH3wyiY5
eqd89fKG27Tl6ZB4sttR5Y7j4wPjOTBdFuLYcI8zcmp4VcaHC5f7TJYd93nhUitpY2uHTQz0QUhi
8I+UTCV5GD31HJmPF8b7kd1Vx3a/I216WpnxPlJypfpArQ3vB5ouII0hWl0shchYGtVHFoXLKk1a
tLGJHYdpAh9IoedSCy70nGsh9j1lahQNxBCZF2GTAtqgD5Gtqt2ggTnPbCSZ9AShqbU4YhSOmnE+
8DFnvgiBph7XHKTEfyuFJynyOy3cOmg+U2mkGJlaxceO/1QynRdeB8ilcR0ExFFFeVx32dsEeWXe
z9X47K0o2oR9NDnU9TCQVaiyB/XU5gjBQqOK53Geab5jFhir0qWO2mAbAg7rE9Msmdw7hyL00aFr
it6t2GrvhKaro8JBwcRSoDhvhMywXkqKBkQaZfVb5GYjZtQxoYgPTLURfGSu/78FMgOdeC61EqKN
4p23X9NH8N7GuXxvjKyWL9C2rmEEggenSm3C/fHC3/z293x+/44X+ZH6OPLXrz0wUlHmJpynhc/v
J+4+j7jLhX5RulJx45mXuw1/8Ys/4+ZPXtM9fQlph/qt4WTxNJeo05FlvlAuZxsJp97wwLny4e7E
r97cc5kKXW10KFtx7JKtBpumH0RfkzamklEa9/OFU1nXjWU9AJWKKJzuPjEeMw/nM5f6AL6yHTzi
C2FzTZNGIRCvXtAPeyaZaZ3jevMFV8OeZ/sbboaBZ5ueJ1cmeNl2kRAd3ntzTARvvpI6Go+kVVLA
6sDqjUTqKj7Z4ag44bFO3M0Lf/fNb/ibf/yPfD4eOX7+holHztM7Fn2k5EfOcSG4K9y849XLF/zl
v/1rfvGnP+HJzRXeO4JPNHHgheqVKSrNSims+g33S3S0J6kNqkEhdYm6LCx5NlE9MGvhpI3Hc+NB
lSMz43JmPJ2YDxPzbDWy82Xi090Df3j/kQ8PM2/e/Z6SnuCHjmmG1AJXZeYyfyRcHvkwfYO0B6b7
O7Qk2nFgeiuUg+cy1VXvCFkrxRuClmC9TrWhlwXqioEVWrVwVluhtK2Bb4pNpVeBhFZEKs61NaTR
rCLn1TSLYnSzBgx9j/fKJkWiUxu/eCPU9dHho6Xzv/eyV2waIC5DK7Rqf1EKrRTyVKFaTRCt5Gzj
9qLNOuulmENb25q8bBRVtFVzt4sl0nGQUkCwyl4Sq3H4EMnVoasPPrd1fBo9KXhEPEPX01TITigt
UJpHY+A8Z2LcEjeJ86XS+p67ywid+exjrkhQU9c266vLOsqvtXHJlfM4wqVwOb9Djo1cLohzFBzn
pVKAYy2cy8KhnG0ctQjjbP72y3IgujO4nlqt9lgXx9AlaI6hTzgPsQukLkGD2HWUtbpY1ZSDTpXT
eMIr5DoDSp5HWm2GXFElDTbuF+dxtRkDIQZaWXAhkmsxG6Ao2+2Wpy+fg3dcX13j1XNz84qrq1cU
2eE2rzkvjvEuoyehZ0CXAXWRup35EO+4uxScj/QlMHSeiEOqWY58iKjvaEPHw1z447ffIp/MpHd9
PRBTIKQBRcjFmg61mlPbiQFSsqtAIpJYirLxA+NS6LEXRnTWs8oFtv2GpWb7swnWe3Vih97dMEBp
BN/oXSIJXHshVEO5tryYk0ALY6lo8FxqY9clHsWqUs1VqiqDBC5TBhU6aWxRvgxwX2deB6GysJOB
jTg8ShXHb5fGT6Id0mIIOPGccQxdz6gLz7qOQ8kQGm7VkAYXEIXOe4J6q/H4yKRCF3qSWhhNmqeq
ralOeWG76Vmq0sdoB0bn8Jge9jr2VuXzjhg8IpZsdzg2zg6FQQQnlrMxWqPdnnX1X4jqWltaXRdq
IVDE8i5LrQzRMxaDrCxaVmGP41IbyUcOU7FKLiZZSc6O99e9BX+9XxtBBSQpZOvbN1VomJnNgRmL
ldaE335+4H/71a/54/EdZTmznQtf3ijeZy4qPM4ZxXF/mDmfJmIZcXkiVmG3bfz05Q2v/uxPSC+/
wA07k9zIhkpDg1Hh6nwmX2bmy4XNJq6ThMDxMPL1d/d8d3fi+HjhOno2TtBc6Lqe6mwak63LauvJ
uqCtISqWPcDMfJ8uRz7cv2e+jHx8+477fOJQZx7riXN5oIhyGT9yKp9JodLtHF88ueFm29GYuO4D
uyTcbnYkUbap58WTLRsvXG03RG8hthQS0UcLgmIHssvK5c/ekUXRFGhBCZsEzlnNu2W+uTvw5uHA
u8d3jNMn7u4+UPMB7YzZcgqPPMSZm5c/4nX3hL/6i6/4d//63/H8xXOePbleq+NqtlKxwG8Te+/Q
KkGFIUaCsKAsNuYVWYNIgXFMhPgEhhmZDhQJLK7YqDoGcrmwTI7j+D3hzSQdWieie0YdLYnswgta
KdwdH+nnHS5XcIOhKz/Aex7JV5F340Koysd8z8uwpSszt12mPw24qx7XCbHYB2quC9M8E4NjFovu
JwkYFd4RvYEq7Pdme60QHK0JSaLtz5sxxWtRQmzM1ch1gp2Yo0uIOjZpIJJJ0hNp5CBmSyqwi6af
7KUhKwkvxYRvwkwFdbRqsoJaMxvXWSjLGa1LVsRElII0R7sUmzZoI/u07o8h9R0+WkhDiqMLkdhF
mjScNFi1htL8mo61G1yQQFVHSkLOC9ve4BN91LXq5PA+4GTmTMH5xO4mMatSZMb3C/OycP1F4Ml2
S3IN9aau1WgMasFTSkZrgQoPhyOhOspSCWdh2Q1IvaNcFkQyLt1wGpVJAuNl4XG6kLaRUD9y45TL
cuTVdib5FzxOH+g3VzQqV3FDzYUQnM0OFdI2Ms+ZzWbHXIw736gsixLFpjvJKcs0I82aBnVubK4G
8nnk5tkt7QwaEz4Gcq7E7UCrCyF2qKoFeEIgOeHqdofUxrOntxY+Sz03c2MIG57fPuHN3ZGP3wqz
T1zefmLTJYb9lo96YBpm9j5z0c+03BFbx3xaWMoe3QQcgdR7ei+82ATkSYfMXzB+uPDdNx95+vIK
DfDyJz2qPX0wrfGVU04lmzM9wXEpxNRRBWIQRM1r0IdoN1Cx0FWXHJ0YcGjTJcbSuJZEXgqbdax7
Vut651qR5Dk1iMETrHlDnxyXydL6f1wWXIONgzw3riJQlBchQhOyNlwUxpr5E+f4MI38iXMcqjLR
E4PnTS78edpCK/yVi9yKveR6L8wC265jUdj4SHKJO525kYQTRZpnbJa2j94gURvfU5vS+UTAHMhd
8EyloevtzveG5WzBMiNLcQwx4AvMAbIop9a4Cp5FqxnmbMJNDUrNBusxRjc0LPOiAUqDiFL1e0Sz
1daQRm3O6pjaVjCVUtQhrlFXaUs16AazKpMT1HniGt69NMV7ywbJitX2iBkSDY5mN1ddC1xqgTkR
c7TnVvjudObjcubaZdKkDKJGuVw1HJ0PzLlx1onYJvrkcVTa+cDm1Z7bZzv8roN+Y79vNeWbYPjw
vExr5VjBJ5asRiS9jNx9PvF4OLNME/mUrfWz83TJM9YMztsY3GFdczUT5DSOPNyfKTUQkgUXv/74
gd5X3i13jOcDNXoeTkdaSNTjIy4oaTvYc/I20HWB6+SIeuH5phF0YeMDTzaeIfWEEIje0YeeEI1f
4ePANBdyq2RVq+J6T+6/z2Q13BCJzhPUdvrzUjhMjfux8C8fD/zud39kOd9z990dIb7k8f6ezdjj
4zVpF/nzn7/g+ctnPA8bfv7lS3bbgc4H83UgeJfWaY2iWhDnjQvvA6qZSwaP2/1SumeI7lG3hbaD
WIldopYRLRPoQtMZEYeLWzuBlYzTiDbrHqusc564o+HRJVsUQ0bY9dQwkTkyHWemDI+PM5+O9xxr
I93+iPffHXhYTHZQUcqmUfo7TvoermEuJy73R0St9jNrIdPsm9s8tQW0wqEuiFvj0R6Wmsl5wvtA
rd8nISta1EbXrSJOKYw0bRSqBYR8NFlJsl1iEPtQmtHCxn8SBHUO75N908VG/FFWUE+1F66vln63
/9zgD7k1e+AGNeuOVnK2YFtumakVHs4jGhpjmSi1IlrRVuzF7irBG/Q/eru5RufN9Laa67w4Og8h
eJJrditvjZg8IUYq5nY3rLXpETeDjRqHNLDrezap4+X1jquUEElsuh0hdASXrPvf3pLn/wcXG17O
eHfAhSOuZIL7Fg0jl8dfU9wI/opZE998uOfcFqajUj9ODK2wKZV4mnHyhujvLPB22LBMEbLHtQBz
sxBQU8QnXDDEb+o6RAyuo9UCXl3cmLnKOxtBNriMI7nO5LxwGQ8M0UA2WtXEOc4RogW1YuytQhXc
CvgZ6Dc9lEbsTLjSdYnoYZsCz6427ELkyX7HJuxIj1tudlum6YSTR8Luimk8UxgJHz5wex5Il0YI
W3tJRrcGxGz0Lt4e3HkBdyxM4ilNudr3gCd2W6iV5AO+NaI4ggpzNh56pdHEkan2gvEeR2NIHeIz
Q0i0WtiFhFslOFtvDOkhBJbKDzhRHKTgGIv97GStTAKnAlNVNiEirbJ3gkMRV9l4h5Zq/PdW6Z2l
xJ00NuJ4kytfho6FxnUIII4Fz22IfKiV/ZrG7pzVrLwIT+PArJVdjNQCn2rjZUzUFog+cVoqzgea
2mi+D9b37yRCrXTBxr2KBzFgCxIsS+I8UT29c/TOU1u10a823AqUQRze24h9iB7X9IdueXMQxHSo
fecoVfCoBeVawwerosYgtCb2vFwPBslZPdCLOeubCq05jrmxSYmH2tZ1XwXscnK/VF4Pnl1wqDNx
Sl1pgFrEDhTFfu6DqE1HOl2FPMLpUvgvf3zLf/vwW8J8YCuFTXxkKmeGZBrrIM5UpW2mL0ficMH1
F7r9zLNXjae3T9m/eoobbBeNbGml4OOWWmaoDZGElkIIiWWaGcfM6XThzXd3HI8j85sj/TjR942U
hD45qtiaALVn2FwKuSofzzPjcWKelFgKXV1o05H7//fv+fTxDQsXHo/f0e8GtBZ2FLZpT1827Erj
Z8+/4lkauMknXl7veL694Vl/zZP+mqfDU3ZpYOgGrq73II7QJdBAiL155p1DvNnvJDjyCr8KCLhG
pJKcsEm9sQHEsRTln98c+e7DyKfvThw/3ZNPj7TyBbU6hu2P2Qyvuek2/NXLV/zZV6/46vUTXtxe
rfXaCNHqrrmt4LRmDP7mlOw8BUGb45wbXlR+qc0sYJARJmgTWgvaTqAzONtHt1ZodUGLOZaVCvTg
XthBwG2g28EyI+XM9/2JfnMiTpltvGU53DM+jDwe7pjzSI6ec55xmx1tbugm8Tg8oP6Ou/HA/eWR
h8vE50/3TOeM5i00ZbxMVkUiMV5mmsCUC8tSzMud14BEqSx5oa5mqbIm6BXjmjsxkYu09cNXFKcW
mOtDWNGw9hJv1cpyRcGlgGIeXO8M5ecEetcRCEixf6Y1vDfqFFJJyRE6hzqPBjXcYdBVFS7MrZC1
GSQnKEGtKuLahF+rLjE4e7C2ik+J5oyFXta7g1e/gm3sz1W1rrQ869h3G4PbiFjlAxW66EjBc7sb
6HrPdhMYusjzXU/0kW3X8Wy/R8Q+7J6Atkakp1ToXAd6hZctZZkhRDY3A5IXgruluT8jyy2Hs+ei
jq5F0nhBzmc2KRCmxvHTJ7R+JFfYbK6pB8/lQ6GOnmWCNtnB0Ukl+kBZCn3qQDPRNyQ4SjXgSPCe
Yc6lG9oAACAASURBVLslxQ15tj3T1DJZZh6W/4wPOwM6VJsksTTLVGQzYTkHUo1X3orS7/a23AkJ
ccEscDHQ5sz++pZt7Oi7juu+N21scpRD4A/Hd1xa4e27f+Jd+8zxfGH+DLp4ynzChSeULbTO8biO
9wtK8pHsHWMt3L97z+GbI7qJSFSuhp5uY1mI4C0vkoJnmZTRKYs6Omf7eBXlOm6ZlpkuJbxCUg+r
JKJPgbEuqBPmZlrTLka0FYZg2OFNUBxK5z29CEtVYogcloVZlbnMxql2jsOyELuIomy8Od6DVANi
1MwmeN4X2AkMAjvxXIWB42Ip9KfOs/f2As/F1K1eYZe6tWqpDM7TKNykjjEXaoiMNXPnGilFTi0z
xGRtkJQshEllEzvmWlEJ6x7agXOcqtL5QCnfw2MyREt5z7USvSc3YXCO0CA4UxDP1VYUBWu4NBri
rBJaW/2hbeCcfcZUbew9tXXnLianil7QavPBSylUtTFtUTNaLqoG5mqN6AKnClfR8az3RDFVqpqG
3jJDNs0n5xWwYmEpUhBDbjd4d3/kP/zLb/j20zt+No28OCo/T4kXe0MrMymhOcqSeeJ7njy/ZSNX
XO9ueHr9nC+/eM1+6Lh6/dpAttIjEg2U1QLL+MlS/ig+dYgTTvcXHu4ufPP+wG++veP+kK1p0Tc0
Odw2GsJWlKpGgPNOOM+Nzw8PfDg+cClKOcE8F+7cifF84J8u/0ybZ2iV3aXyJO/5+ct/TTx0/PjL
V/zkixv68Q1P9wd8/BVd93ue3nZcDS/ZDFs23Zbbq2u0wu56R1B7fiQf7b3ojIzqnNDyuj5VtVzE
qvp14o3kKREtxhvJRbmMhT98uOP3v/knxk9fG/my7WnaI2T2L6958uWOqx/1/PRPb/nxsyfsN4HN
JqHO47tEkYB3Hd4lWmtWkdbGqMKyFFoRihWK8MLVL4UKukB3A25P0AHU3LJ28a4/YAX5fmvtTZ0p
KF4W0JOJTttKkKsX28t7UwM2JvL5MzUvSPC06hEZIAdY1i+oKeSA1Gt8+JLTxx3nyzW5voZwTTk7
Hr79xFJnzvfveXj/hmN94GO95yFfeJzfcKkjEZjmM7msqlV1tKZMc+OQL7Zfl4WFEQnGya6aqc3h
qsepx60wFpFmETrxeBeozU69KpYmRVl785aYd2rJU2nmqvbO2a7Ue0RXI5O3XZZzShfWvrmzkX9z
lU0vOC0kKldDhDytZHi1k6FX1Ful6zGPdM649UtZ0DVJV7PiC6gLNqpLHVIFH4Wui8BCcAZpGGKk
VoMWbFKiC5FtTHTi2A09MUY2Ma3IWfu9RBcpzTE1T5BnRPeEMidac7gpEKOjS09o9YxsnhlcRByu
zgx+Aqks44XlciRdb7jozOP4mbuHf6Fd/QhpHW3acZkm2lQ4vP3E9PkdZXthnN/QsO9zQqnVtKut
2HjOefMJ72+v0Kq4FCAkpsUellqfkGSw3fUi1GkVymRMr7sZzGu84nKdgKRgAqHO4ESEYICfYMpd
cbDZ9XZjj5GSKsc6UvutqW4PI33OfLF7Rl88l7t3pJfXTNuB7DLaCbvOvudKZUgmTBk2kfBFx9SP
nC4zWWeu+oE+NfrNFhccyZttDfEYJFmIoaOo0IdkCXUsdV2y3fZKM0pfU8djK2iwt0L0kaVW0spX
v+RC9JGpKruYaGKrmtLUus2pYyxlJUJYV/oqRpayQFVyKTjxZOepNdCLZ0vgWUq8WypPXSDEgLTC
yxAtvdwqLc+mBQ2gEkgxcSkFQqRJoqmnd8nyNOJ4XAr7bgPAosImRZp4kji8OpBA7yO52c/hog0v
nikvxOjQdaeOc4w4grMRfhc8yQmKUdbUQfLu+4fnD9U07z25mD5V15Cpk9W26IQ5N0OtYmjqtIKa
PMpSLUDXgFwtDDyuQd2iNrIvHk5qVdxZhZddYB8c0UGKayhKVzmLUaStCy12kfHeXurBQZ6Vf/n2
kbtvf4f7/BHuZv60KS+uPQnBV9gMDhVhaSe+x0V6PLfXPV/cDDy7HXjy7ClxP9jnwTlzmTtHzROt
LtQ5o0UJ/Q2lzJzPmd+8feDv3xz4u9+feBxPjKcLw7YSrwyxG8Q0otogl0ptwtSM0X6phfcf3tF8
4jwujAfBny58nj4w1wntE26wEGi9cqRwYNvtKPqZ3lXa+Y8MWvjRj/9nohv48tnPud3dcnt9jZNA
SgMxDYgEWAVH1QWrXTehZs9SsQkKHpytOmrD8hfmFeU4wXGuvHvI/MPvP/Mf/8P/SV0mcplp+YC4
SH89EYfG02cjr3/0yC9ebPnFF694sd9ys+l+uFCKWte9D466Bl+rNHLNjKUy5UwTx8PF6rtBXTTU
1+JgKbhmYQN7fWREv7eO1B8EJOKMjUztwV0T/DUqb1E9U7LtmHT1H9MKbVzv89JQXZDlgBLARfBP
UN3CfI3GB2bek5eF5d2JPI64BofTR46PHWnumS6fCB+es39acUNFpq/x+0rqX9B1keAi0r+g8wMP
C2y314SrLbvtlqaOhcqsiqeSsqPLSlBBNNLawtKKqTujoKUxKWxctMDgypT2Rm2hqVXLNFuYpRkF
xSpdPqDi8N5BsyT5dogU34z0hbc6RTUsZueUk6+kZkE6dSZpmJbKKEL0RrxCCgmhVs9cRxvN1SN1
rdSdSmEbBkqB4Nr6YA6ghrANnaPUiRCMsx6aBQ43245AJHgY6CmloP0GESEt1vkN4thEWwEsOdst
p4F6Ozh1fUCJlBrwHVBH1N1T3IHQPWPb7ckXRdyeZYT8oqPcdPRp4HJakODorn6BHK/Q+Y7hyRPK
2yPH9pb5uxPTvmfsHlkOb3j6V8Kf/OgrpiqkPrHrhKJK2m5YlkJKiakqpdkLr7SZIUVkqbiYCA4u
02dC99JAR8vMMiz04YrTw4lGxffJAk8xwmUkxt5WLrkiPhiNKwTD+/qeEBS9ETY3N0wOzpfGd8vM
8T28/Xgmtwu7k6eTyngTuO8SUx65v88sQ7AQYF+IMSKx0g09NRSS7Hn2ky2//vvf8/lvf8/1bo9P
M7vrKxwbXLS10CwN1xpJoZURIRFj5JSNNd1UkWh74cktDH5ASuMqBDO3BUdW5Vwz3RA4a8GHBE7Y
+JUcV4RtEqalcd135Fb5HDyDDNyNB56EyKlOeJfQtuBDh0TPZRxJfaJopQTl1Cqb4Og3Hf+0ZII3
RKY2x34dKzoRlqYMXaRKw3VCCEouE6nrOCwzXYiIrHt/V5hy5kXq8dVY8U5MGHOdes7LstZSClEi
pWWywI1EDlrwwfrwwXmKWHgsReVxUXbBk50SnOCcudx770y36oyIp8Hho609ROwCJE5WMJLDe2Us
lmyvllZaX/CNLjimxZ4juVayNqbaOFPofcexNLoYuCAszqBRRRshCjQ7yFaUVsWqumrZKakgwUxv
cQ3T56Xx7WnmP91NtNDY986wo2MmdoVuACce6swmXaG10OOJqbDxldevXjD0Qnh6s64SjdHW1olk
LdnQ2lopZUGXE+fHM3eHBz6fH/inr7/jlL/hdPma4cUT0v7HbMKeZVlIrkdX+EqVwLFc7ADmYS4T
Y7b142k6EpfE2F+4qj/l4t8yjI0hRDqvbIswhMD1U8sSzf2Ar/+GJB3jpefV1c/YhoFNl+jTYJmq
EKi12jjbK1NVtFTasgYOl0IpFY2eqo3aBBFHRzQxDmqHEJQ3h4l/fnvgN7/+GnhkPB1xoUKsPHua
0KUR+idc62/593/67/n56780JoQvlPW2L5iEyKvYM0aMOjpNE5dSKepRUUrLbAZPKxUvkn8JI7QJ
WFBmRGaU05p6r98f/9a/r4mJaqcFH3aIRJpknJtNzckJlzziI1SrYUBCNa7/vy3itjauJyFtC3JB
6gzFNKRtveHbWF/IBc7zzCzKrCOX8YqTPjDWmYf7E+8f3vH2mw88fn7P5XTP199+x5u3b2CIjEBx
MNcFp3kdxTdCc7Sx4KuHRZHSkKCghSaVJoXvuXTfj6brWvKsFZy3XjbN8Ka11lWFKsQQDQCBwws4
ccQuEaIlb0HRFhDn0eqpGnA1GPhGBfFCTdYbbyHSorebdvD0LpCr4it4FaY5k+fM6TJburVVg9is
yFyzvmHpcCLSLDiIOhNVYMlO19RGstE40SklnPekLhGSyTt8SLZPahaa6b1jKx6vlX3XkTz4aDpT
H3pcvAUXieGKJIE+9GxST3SRPnW4WWAIBCLD02e0OhD3A9EJMzvuvrnnHBK57LmrHa48ZYo7JoWq
kdOknC/VbjKl4tXZ+qSPlCXjkljWohZCMNrfrotQKsF3Nj1Sh6rJL8QLOc9UNU1uqwWaAT+8d+TZ
fM7i1nGi92g1S0ebGz4kQtex7QdibGSFMSU+TYk5eR7lhF7tOE6PjMuJsUXOuZrwqAoZkGj2LW9U
pBW1Koyh55JumU8feHFzzU2/Q+IG33laKbS00kQiFrYKHU1W7WroyCjBBXv5+IB3hkQegmcpGZc8
E42ywnRmzHGfq5K82RWzWO/1XCrb4GhV6cVRy8JG4bbvmebMVQz46ui8cfylNjrnmSu0EPhUKykN
HKTx33Nh20W65thLsAdT8zwd9mYQ9IlRlRQsoIQEUhw4l2LrJl3xz82qT0Mwatym78A3mrf+8CLg
g5HyvHeMNRN8ICDMS2YXEk1NplJaIznDql5qZRMMetQH21UHceY+QPHeaI3RQa42eZM1YR6cQnPr
z4tjNrD0So+TH0byTSG3alqkalCoxzyheKI6Fg0k7ziUysZ7dgg3ycBRztmUIDexX3vF0Pq1DROw
HKnt/+HTXeV/f/Mtf/Pdb7nWI/M48tMr4eleDDUmZhk7HmaiWHYleWXwjtcvbnj28pbt8yf0O0u2
+7gCTlZuPgjiIiXP1FY5n898/nzP2w8nPh8PfPh0x/jwzwx+5MW2Z9d39GEPi00BXFCKg4XCp/mR
Cryf3/Lx9DVTOdohpkxkGsfzJ55un7DZ9Ty/vuF5vOJp6Pii3/Py6TWD/0Taz8St0roTblvY75/x
8uqGm6Fju93io/E+GrDMtq8oVS2wNxlQTMv30+lGUwOcSWtWXVz/amIQrPsp87dfH/mHv/sjxw+/
I8mFZTzgfI+rkZdPfoIfA3/x09f8D3/9ih//6Ofc7J7SpYiLCZWA7xJLgerMhFlXnsDc4FyUuSjn
yZ5NIbp11aF4tP7SPiVGQLNdur2AkRuQtIbbenuRWzUX/I3tF1GcS7R8oemIiA34xDvDrZYKBIL/
kt7/DOQFTT0xvCamgVo+IfoR9BPwaPtqg55DbbjhCdJ2aLHUMVIRLaiPlPJIyUr9PKEnhcVRx0DB
kS8Z1yVKH1ia3Vwvh490OJpmLsuBeS6Emqiz5zyXH2QJ6iu5FWotNv7RFUqjZvEpiO1XgVYX5mxd
dsFOyrqOXnQVIKg35KdEQzFWFVp1qxgFu41g1SO0oVXstiIOIdHUgj6eQOeMVEQ1lWHvPG3JSFFa
XvDVVhe1LdTFpCsUGxNuhkTLajRAYR0/G+0tOAs2ibfxoYJ9zRhgomrFB78axRwxxrWzH8wO5wMh
QQiBbd+hztH3ieA7NmHPLlwxuIGUOjsY9B1x15F2PdJ74hAp0SO7iPa9BTN3VyybDrd7yt2s/L6M
TCXB1Q35UpguMx/PJ86HiQyUxW6nKZrlSMtseNnlAh7yUixU5wx8k7rAUgqCGp1PLJg2Xi6k6Gjz
GdcabZkMIBT8Kp6xHboLCZo1Q3xM1JqRvqOVisZA33dsug1Nhd99gDQ8RUW43B0oU2ZxDtI1XgNh
caTRk9TyFZ23wI0PBtiJPlmP1wktT1z3G7qmDIPgyPhkABRp2dzkmOwja8V1A5NWqgq9TwhWzapV
2fjIrNVEGT6SG6SQWNRZBUss7OkkMDfTvy4YFyGsX4844VwLnQ+c54nclD70tGpj5rlUS5wDWSGI
txWXF+618mX03CDcuMB2JZhtg7cVlPecRFi8R1ygitCHDRmld4EYHL5VkmuMy8Rt3+FFCcF84tIC
yXlQs86VsqzAFzM5ehegWnjSICxWB/J4nLMD/DZ6nAhJLOiWFbbJU5s9DN0qS07ijGkR7eb+A755
rcrmFQW7NCiCIWdVGJywrLme3JSicMrG3IgSOFdduRiOw6pWjaK8GsIa1rV/JxYJWFn+lm4PKzfd
eSFEmC7wf3x95G/+8DvGw+/4ghMvj4Wf9hWfF3CKaCI3qC5wnjIaFmLO3OwqP/vyC66/eEJ3u0fF
DrCshEfnI7Uu+DjQKOSSOR5nPnz4xNvPJ/7wcODjaeS7jx94tS+8ePaSp7vXbLoXSLPQrQ8BxXNp
1YLB04nDcqFzjfvljibK4Dfk5UzVMxsnbDjRbeDF4LkZGrc3A9vNBj8oPjV8/4que8Kz7UueD6+4
5YZXV3v6mNhcdZTm8F1irkbzvCzZFLFV7eLmKjnbMisExzJn44ZoxYmjamCksThHaZ7fP8z817/9
zOGbe/T8mRg98/SI809BttSzkqd7/qf/5X/k3/6rf8WLq2eICEO/J0uiqgOXrE2k6yraBSowlcpS
LCtUq//hz7mUyuEy47t/+7/+sh57yOA0EDYv0HoF39+mJdgPnnSYHdlINXAFBLzf4vxiTlYtqK63
2tqsyrSeakQN9o9baPoAeiLIRCl3Fs7isoYoOtCN/VqScfWGNOwZ4kwhofTAjG2EeoZhSyll7ZE0
HJH5YjfQ3bZnPD4Yu3ic+e7tPzPqidN84s39d4xlYbxkCMLoKn7nyb4x10KphlAsFUJxRn5qQm2V
ljNelVYLOTeWmmmu0mTtuq87oNYMw5pbs71OAy/BTudqKMjQjFGPs575otl4vyi5NJzr+P+YepNd
S9LsSu/7WzM7zW29jT6yIZnMJKQSq0qAII0EaCRNNNJYcwF6BD5R1VSAhoIICaCKpcoqMpnMjMzo
vLl+29OZ2d9tDbZ5QncSg/Dr7TnH9l57rW/VAr1zSNGqWIMlFb0B1qL57yai0YlgmEui0DCoO59S
6HuwnaHVivUw5UQGMooRzdLUqbrAeGprmi03FWcVJBODw1R9MTsDq+CIscMGCL3HOMdqUBd2v+pY
O4P3jvPVmo2PRNfRxchqiHRDh40q9bvoCTESfMdqcARfGfrCsC741R1+FenWK4p1PNTENE98/+E7
3o537GXPoXmeWubduxs1inWBViumNU7jzJzSMiQKceG5Y9Vp7K3gnaPkog7kovEY35yia9H8qwmL
LCFLY5KojFrqjF93lDwpitcIrVaCi9TWuHh2RmiJfgWbVeDMrDG7xJgzr6++5ov1NWcm0E0zux/+
yHF+ZNcq0nWsukBvw2LWLAwxqMkyOnwqSCk4K9RpJA4Ba4WAJSw3WSfCjAUfFoJVz6now6uZxlwy
mz7ymEaGsNJN1yjIhKY+iGmpU821Ei1Eo9v/WfDUJvTeMVct6zkWoVWhW8pijNXXURctXYR9meiD
kHwm2IXXYBrP3cBDEa5cpwuCg5lKbqpOvZfG56s1h9pYGXX8zpKJi6u8c4FTrjhnGXzHnBPbrseJ
w7kOqxxWeh85laSydtOBdS7KftjEjlQa/aICGKupj4T2vRcRZU2gIJfeWw6tYtRoQ/CGUgWxuhWn
qtWyoAUdi84Hi4EVa7BL4sUuN+9qILWmrYJ5Ii39D1kKfXA04U8tlGfecBlUXevDR/1UFwbvLdaB
R425DohBlYDHnfBvfr/nb//wn7iUW7pa8Xd7ng+V1iaKsezGTEoZKYm23xHnA5dl5PXzaz59/YrN
Z6+w/ZkGIGKPMR3GhaWqWRcVEUeeG7ePD/z4Yce3uyPfHA68e/wdWznw01eWqz5gjceHM44JBXkZ
yyEn7TuQwqkmxjzq8MolF+aSSM91u4TZ0cXGzz//jM9ff4FtdwzbK8JmQ1ydYyOszz9nGy/ZhDMu
/DmbsGUzrBj6gRDX2NApTRMY58ycsyrBuTJXXeCM0X8/GkjVimERKM3QjFc+pyy+kgpvHye+/+aR
8bgn7f8TaX4g9J8Q3BbJiRfO86vXX/GrX37JF6/OiTZgbKBaj9aNeVJplFbIy2m3GG3sy1QFRukm
SJbCXDLvn245Thn3L/+n//lvnv/0C+TTLwmXr+kGj6Mj208hfTTCrYGC4agueNrycE96S6ZXuTLo
lgcN6wJ2iVNhvMrt8kRtj8ADIkdqmxcZf4U1SqPDr4CKkSPgMG4gbl4zz5ZWDjpQmAlpR0zoKG2H
pBNIxhBoNGiJlBLzeADJWM5pJ8fx6cThwyO7p5Hbu8p0NEwy0veQ8z1i73FuS67w5m6k+Y6cDXmR
Dcc5kaUouIRKaYWpZcQa/QewlWYc1VRSU5JPboIxAbvUKiI64UkTSs0YMRRTEaMyXUE/CLNhcWFr
Z7lF40OhcwiWsWkFbBaDsXZh0DuyE6wVCk7LWTRUSOcNpeowYKqhzJksmSaVWgslz3hAWmOcM2Ia
qWiMTlrCGdE2taSxPozK9bZzeGfpvJpahi6qE78P4ANDv8WHARd6Nts1xgpnFz04R4gB6z3W68PD
OkuIgcqE82vEetbra7rYU+ojFyuDj445Wg67R27uHjiVmfdvT0gqzN5x4QdqG8mpUcrMdBwpU1aJ
rKoDmaYtgBSNDLqmH67B6S2w94Y5HxGjrICU9UN33E94o+766C2YotFBqz+fiZ3GdhbDnImOGLUx
bOg8xhuGq5770vPh/SNUON3/QBss1R55/3DLh/0dE5Y8rZBtxRrtHxj6DieGII5N7GhSSbmwPxTq
UmPqjdANHQaDN7rRNgnUamgm0NxAWlpBHkumW/Kth5JZhcixVjrr2VWhD9prUFpjsI7Qlr5p9GYc
aAS0tOVUhM46plxwLBJ8nekAWysWZf3XUnHNUkrDUSlV2LhIwnIrmcvged8qWBjFEEPPJI1mAxcx
cEjKnp8FsvFksdzXymAUZWqtaN7cgQsgXjGcp6aQIESJjRlFuDaxHAusrWcWQXmLhlnanw6NQ7Ag
+j7ugiO3RhccdWkzU4S01qHOzeiPKcqQt1Z9HdYoNdIHSyqaIw5GjbreGHKR5YbeqKKDdG4Nbw1T
mQkhUhdJOxrNpn/SGzos0esDHD7G4AwxQtXiRvxSneqW6WIcDf/227d8/91/5KIdOD412o8P/OUn
A9VUMl6l5OgQq1yOKJU1kZ/99BXnn12zev5iie1uEKu8duM3UJtu563QrOdpt+Pt3Ykfb3ccaqak
I+8efsPW3/NsfYHIBTE+p6FKSwJOKWO8YZLEsU7cHG6wOFpqzLNgCNjskYPj5v4DuUQwUIZzVv0r
XH+JX51zdfaMzfaS682Zen+6gW49EEOg63qwTt+nTRWTcZpIqVIFDrNGgqWKUv+KRujqYoIuTZUb
I8rsLw1yrjydEh+OJ3797Q1//MPfMX/4NbSRzq/ooyf2lo194uvTE//Nf/ff8uUX1zzbrjSiIJ68
pG5MM7SakaYk09YsIoZStH46JXXZG2mqGLfKKU+MNeH/hy//kvL5nvvHR56mPWWaONyfeL8/8k+/
69j9kGnHB72r116nTGm4oDzkJhZT7jAbkMNOHfDdGlJZ0KQOKx5B+5GN7ZF20HC8NVB1MGhSdECo
evf9aBmh3DMfPDVnpE1YJ5iuo451eZDPGAaMOVPHR1sh3GNkokye3SQcnn7Ex0BJldXLF5jjA1Pd
c//4Pa/aS+b0A6+++pKH3z3wxZcXPL25xeYtjA6ZHe6LNbOtnMyMaY0QvN6vcdqOljJZIDRHkIK1
EdNOdNGpfDRPCJZN32HrEq2zWtrSgiWXmegDdcm0StMPE9cstRqirYxV8K7gq/6dUwSxFbdsB0Mf
oTbGpjKlyRBa09w5UErBpJHaGvvxxITBNb8gTj0eYTK6pYsxpGqxziAUUs0Mvoc6EXyHtWpYss4i
ptGf9aRpxptAzpnOdHSbyGE/EYIjT1mlUSP4YYPzhtAyZ31gzJmYEyKO3uoW2Fqjc1p6YaQx+Yp9
ZjA1cr6deTwUOjuymc55mHbc/dP3/HB3w7PjK97c3eB+8SXuvND6QMs71mdbrPRaLFLVYOUxzG1i
PayUzb8OnOYJ54QaHK2eCG5DSuqIGY+ipT3jHu8MJVRM8/izQE4TxkZ1IAWHcZ4yFWLXUVKmP1/z
1dCxDp5vPtxS/6oifMm7P3xHzpUSO+qcyVdHqhfWYcSbDU/v4bKDU26sfKV3RvP+znJfHKex8Fju
mWyi/Vj5wj5nvV1hbL/UAGcujKOOiTYIc7ach56j6LvLuMBBEpu+J7XGYDxFFC86OMNDLQzOkpqw
CktbYDNces9UGs5Ayo3BLpuygU0fOJyOrLxG37zX75daWMeOIjNrpz8+AEGEUz7x56FnP2W23uOa
0EwjBMNjKrzqtXTnorMMNrAvhs6plP8iBnqjdbKdC+Ta8H7gcZ5Y92vKXBWJa3TT6YxjX2a8UehT
NGD9wNOU6LqBKmhhy9Kedm4Nh1I4izoQRKctZYZGZ3Xg8V7PFx+/ijQilroUtogsNuEG0iphKY3C
qMyfjeAQxtYoRs8XFatmOhOJxnFsuu80ZPGXOEaEzipm2gV9sNgKNULJ0Kmgsygu6AbdDG5OkAt3
KbF6TPzs0zPe39+Qc2X7/AXiFbYTvGP2J6yfWcUjZ+d/QVwFqpkxZkUzmmDCRVVzo6c1Q82N5gun
aeTu6cDbaeY3+zu2JhPke8wQOchExHFq6lIyBnbzzDifMHMktRFjKx9ufmSzvsTOiVV8yYvzC0Qa
+2eOF+GnrFyl73XwwEai93zx7JxgDefrgSqNTgZ6HzBiWIWOkvPCHsl6Eq6OMVemUrE+EKo2AIJb
mtsKLqi3w1s9oTRj8FaLeCiVlArf3Yz8/i7xu3+4Z/zhRmmfOvWR5pHeG4xsGF71rK4j6412lLRS
MTHgrUVyoRaztGs6bK1aadxUOT7OicOcCUZA1G923B+Z3u3Y5wl/dvU58+nI2l/yWdtBnUgvYO6Q
cwAAIABJREFUTuxOI3/x9Wf8/s3I9z+cuPnxnvHdt5j8I8KRWkeMPOkDyHnMqaE9nw2Z0yJV6gvc
+Uopka7rMO2CJEeEpKCUZYdU9/wSk4srZBqVW+4rzjxh2gEh0doDjE5jdsYBHcIKrMeaCPUJIz3Y
LcUcqS1iyhpJP2BcodUjzQmlBqQWvn/8lvI7mLsV6wePze+5+fYduFe8zo6VW3G2E1aDJ1Ew3lBy
wvuC2MzUEojQxy2StQAkuKITV8os8VBEEuNYaFnhBM1ArYWuCUn2GIl/otx9vMNLdVjXwDnSaSL0
UFOjJt2yjXXE3kNuFMsSrwBjO2LQh6Jf4iS1VvJUyb0a5LIxHI8TXXA4J3g8IlrB51lqRl1gFvBO
2JVMcB4brbbYeYsl4FYBiiG6HnGW0k5sNgNznlht1gpe8J4+WOqUscFRp8LFaoMxhpK13S6XmbNh
Q62Z11vH4D1TGtUgReGi/5SnQ6YyY2OjuYHNdKT8+u+Z+47t6oKHpx3fPs1sXrxAPjwyXEasP3Jo
37Be/4Qhb3CuI9kZkwrD5ppBgj6gjcU4obdCTjPWBCqy4CwtJRusjcynRvOVyR/p3EAuB7AdJnq9
s1tLs/KnjaiVkVU/UG1Grs8J3rK2gbUNfH/9Z0zvP/D7//BPPI4fCNstrSRmN3D37oFqPLergHtZ
se1E9IHt0JGb4GNkFoedK8cPR97vZ15drkkPe+xGWf6dBWc9Z6YSKBxSgc4zNuGis2TJapTDYMQR
rGNMjWAVudqqgIepjqxsB8BgNJppmqhxUyzVNJLo7wmbadbQW89hLrjmGE1jNI6ND7xNE8+sY84F
J46+dZRqWMXIaDKdg7uiZ6s1hTsxfGrU4GWco7SJTRfwPjJJYuMCQuHc98wtM1htI8w1EqrerVeu
17OAEZW7jcNiyaJ39GNWUM6AngHW1iOmKU3MqpSt93U0Yy4VZzWe9tEqVRcFLS+UNxElt/lFRg9O
zarRaiWy0DSTXgRnPFNrTEb9BWI81lbmrBjcjNZvrq3hUC3Pw8dInJ7eKpZumSesg+moMTWpulX6
CK0YKoabp4mzww7uRpoT7FFXrRu3o/nINB9UAWqFIHDlPd7f8dlX/zVx2xMvtjjpEBcUj4ueZ2gF
F7dURkwYOO0f+e77W24fDtQx8WoUct2Rn7ZsLn6FMc+Ya8AZh7MK+TrrI7VWfrh/xFthTgfmp4HD
3YFXF88581cMtz12qlxsLNtug70y7Hxi1fUMK8dnF+d0Hi76yNAFaI7QRdJctY3QqqcJ6ygIDUul
Il4WRkBC4sdBSM2VNmoXhFnYAblppMx6y2wMh1z5zW7k799PnH4cuf+n32LajJiXCCOldsTYU8vM
T3/5Cf/yX/01wyYSeh1A6Tty0ZusqQaXGxHtT2jG8TRnyse4mdF61mPRlsI5z+wTHFixR/CPbsVq
u8LOAzVtGFxls54J88gmHXlxNfGrn2W+u/2Uf/z7L2F3YL9/ZHfckcbvodxDm8F02PaBZi8RGYBR
ZQF21DoDB+b5pHI5FWQAVtBFmB8xJHUQtoaZKkYsQoSszVIf83M+DmA6yrzXjZwAzNh61LsCDWML
OE/LEzZeImXEGkurnvmN/0h4Vx58Vgb7uzdvGeYzdjfCw/EDuDueeIXkxLObC17/9Cd4MWyjp7OZ
FA/cTv8ev32GCyvGfs+KLVYi636LNYFTqniblhME3M9wHgekLvWWoq7WUIN2otM4LTK5eMdcM1Qo
SbuVT5MhmIAXRyMxm4a4j+Yn0eHIGxoW7z/GBwURT2oREzOjNDpnFHW71A26Wbt6U8m6IYtKzZOd
qbK0OjWP7zqOp8oQO6h+aYUz+khodWmP8hjRNilvVJlZ9dqbbbq2yIJumX4bfugQqURxGA+UyoVV
/Gfo1rRSGZrgbcD7iThFHo4ngoHtvnD5k59gf/ELrHPsd/eEeSSHwuN+x/HUUxpENjxnzTF2zOOe
JjOx/sCz5lgbwXQDLYMXqNFT8gRdR26auR9TobOWNGUs4G1kfBj1lNRG4sZhg/Y7m+AxpeLiipKV
c+Cco7iJ9bNzmjN84j3ZCEN/4E1/zd3j17z9faGejrjhOaX7jNsPO7IXSnfHh/HAYAs///QXCJoP
z0aYfUOaZZomuqfGu3f3BAIXnSYWbDyDokNbKYUSOhoJ5x3WOk6lLnfogojgzVJT6Q21NDbWYgUG
E7EYbINNZ5lKVQojkJ1SEIsRhujZTYmn5jUrax3ZwuM8cRYc388jk/F0RWXLCxN4yonOGh7mieYc
Y4NbaXzdD3yoiRY9qSW8j2wo5Nq4GDY8pZHnQR3qqRmaM0ytctX1HErFuY5TNRxzxq4CqVQuQ8fU
JnKrTB/9AhI41ELnex5y0WieKzhjeB5gTGibVRXWVpMBWRrBw1iU3PXxq7NQKgzBMGYULY121TcU
+uLsgmG16AOGRuchJbjuAoecOPOex5SxprIeOvZFwUGnBheuMSycDG8Nc9ZGjrx83q+MvieNg9QM
wemGLg2mCf72hx/43cN71sbgj4Yvoud8ZTDDT3gcK3kymGTZxI4uCbHCi2f/glAtNqxwwzlNHJhA
bRlrNdrapCLW0Ioh5czvfv8D7+4nfrg7YKvh+P7IWCcu61eEds44FYKPnKaTqnGuEvyAtBOBE95o
g+PV2WdMD5Xr/JyL3UD4WCnbQwlwsp7mMztT6HCsO886ejZDhwuemsHi9BzjIyVVjZYZ9Rl575dJ
SAc14/T5UDAEq2mfWuqSdBLmXPBGzeBzc4i1TK3wf7675c2bkW5/BP+EpB3OZprMtM7RBvj6V3/G
v/ov/ppXF+faBxKVoYBdQESgaROrKYNmBEXZV4WiSWUedTsvCLUJd3PmMGduTyO1FfwsK8Q01tEQ
wgqxMJaZsC7U6cDlhXBVZl5dH3n2/JGVyZAK/+67B97/4Zr97TtOTyMNw7yzqvXIDlhhuAdOLG64
ZaNuYNbgNJKjGNUZkaxxBxPAdUhzUE/Lvf6EleVNkY76IDfnS4rzY6RuwhiVR6WtsK5DzARlRtoI
1mDEYP0C2RBRrvnFGW0sDNM18+0Rf55JUkm7Hae0p/me++MdeyMUUxmsJaTE+dkA6QLnHzm7nGD7
gaewJtkVL579jL40KIVsDeIsHuF0eiBsnmOt1rgV22hF9TAXIkU81Ykag1qmyMJ/bkZzji4gJVOB
VCvd2lLmhAmBSlHX9QICKlJo1dDbxU1vGlI+yuSGWhNWwJRGlUKqhf08sg5RH9ReFiC0unV647HZ
LkQ7MOVEL4FZ/NJC1Ck7PXqK6F3ZWAMSkAopF6LvmUvC26C1uLVibKPMjtAJTTJdGFQFmQsuGGqq
mK6jNMOKFYQZwprNZuRsO/DJq0u8saQ0YeSKND5yf3pkv9pRnOWUDM/75zQTyblREpyOI3EcWa8e
eZQjw+YaGyIhdKTTiHMBJwqUMIsppcaASQVZCA2lCW0/Kc6zC5Qj2BCxzqgpiJkmWRHKeQSvBRnd
WeSyD7QiXAw9G++J0TN1hm//8TvSbHn33bc45zjuOtxN4ebwDpk/cNZ9xib2hKCb38pYTsawHw/Y
0eHfdYTQYWJH3J6x2lqyVGJ/zVQaQ0ukdCTHtUJXrCUaT8qNTQh66giOo1SaVbl5XBISuTbW3pGr
kJp+EOaim+CYhJV3S72mZdt1nPJMHxyPKdMvFMIyjXzdB1LJnKznaBpvTOZT3zPlxDMTuKuNL4zK
kFEMXwbLk2ReB8chV2LokQquGHwITDVhLezSuNCzEqlm+rCilpnLECh5JFlH9h1ZoDbd3B2O1ioz
WuZyzIlNH0hN2MbApE20WGs4NuVH5GrxTpibZWoV6xXJ2znDLPpfBW7pVxVFwramKRhrRBkUwNw+
xgErg9GHci+W0erPJc5wksK+CedBYTjRBkZpmObYZT3NBaOOJmfAFohWtLbYCN7pCc8J7I6F/+vm
PX/4cMe/6Avz0SA3mXf3O55/2WGN5/1d5dgav/hqjY2G+X1iinDaFPKckDzhukua1MVZX6llxthA
KyMilWne83Q68WE68ceUeS5wcb1mWyyD3RK6jv00c2YrtRR2D3tW52uKMxxOJ2ScaGajRsaVEKRC
yCTvMCEiYjAbi6HHTcKZiQyh5+Uw0BmFYFnvVL2wVjvqg8YuMYYpzSSZcc7iWsFZizVOmzycoRat
5c4VvChds9RCkUZBuwx0iNGVaZpm5PaJ4zdvmOoHbHmzeLQ19bJ9CX/1k6/5L3/113x5fcHGW87O
NuCcYpmLGm5rQ83k3qjiKobihLFmUipM80yRQqHQpCBEzjtPdF79FcHh5xJoJMRHcFqJmX1PZwzd
+XNMTdRcwI186k94KcQ2M2wOHL9+wcPTzzidDrw7feDp9hlP39+zu/lAmo+0WbPkhjOdeSQiJupW
3YoiuLAYGRDjgBkhY7uKpEndHNWomcyKPhzMsCzrM8asabLHMC+3fQuu6gM+DJDRGz9ei+ddo7WM
UBDRCsb8NFNz4bHekOaJ/fSIGKFJwU4N7MSuQs4zxV5hasJ5GN4+x7e3uDaxvXR0Z4Xzq5f4ULCH
W6gR8Q3WkZvHH4mdobTMixzY+g4OJ/xGIFrG95bhyx6CTsdKdoIsmZKFnDNnoo1fJVtcFKxXF3zD
UJZTgLN641B3a8M0HYeMAbxjWqbbQqPagGlgKdgGKSeCoNQ1YzHFkckE55hzxTilCVqMGm5MYUwz
MXdY12mDlK2sWsN3ltUq0lCZq9QKJlCsQolC7PRN4zyGRgga56nFEJ26eZ1XSdH5iguOVITtZSRM
VtMLo6X1EVOaphyGSGmV4ypizp6xLmrw6efCmfFEG2ilYocLzFE4PTyy+2yglJmwv8V1jXW8JtPo
wxkW6Lyl2EbXB7zVYTT2HXlOuslNE9jKflfxLrLenINU7OoMkws+9LSm5w7bdUgu9CFiy8SLl+dc
nPWkXJiA/8x+iekv+OYfvqHsj+T6PZHnyM4y7naUDDdPJy4uMi/PIjkX9TFkx8aek9hx9/BEzYXk
4FmaSGmmP9sQbGbwatz6MB/I1kErDPGcUZTuZY0hCUQHxxnWnWUWjfhFq85ray1TVQNeFn29GXSL
GbxhzJVV17Gf0mLYhH0eedkHjm1kEwBTcc4RjPA+J6KLPJRMZ7Qb/ELUd/OHPPN5NzA1wZsVpXhO
GYah45gzse+QqkUgvQFjBd91jGleiGNlKWhqeCMM3pPLiLRM73tyalTJpGLo+0CSxmZxhwdj2Cxt
fIN3PGRFkGIMicbgtI7WL6Y3bwwZQarBRkhFl48g6m1vAqnCJmhmXqSp7C4aT23LJl2y3pKRhrfQ
mcCHNHPEE0pj6z2lCkcR+hi4S5XNMqBnUbMd1XA5GE4Z1n7JxTe9ve+fjnyzf4DbI3c1s6VR6pEW
EtFsyBFWG8PQLKshEK2mlktJ7OeRXBJlmvFRqGXC+LX+GzTRmlZRhXX3eMI0ocwFf3wkeMvri54u
bHmaJy1LcWvmNpEYebf/NWduTei/5NhOzPOINRuShxwnNucF73Yc5YDEa6ZRIGnF6toJ58ax6eBZ
n+jNQB8192/LwpjI0KwlFS2WeiiZp+PEqg8MrtFHTZI456nFcEqFspTdeDFanWo8joqVRjDQrCLA
T6nxx/3M4/sHeLhF2CFNPRb9es3V9Zaff/2Sf/3LX/HzV5+zHXr6EIn9mlL0TJ1apjTDXLIum3W5
u1PZTROHaeb9fq/JKhG896ziioc5U9CTReyE55uAr00jJAVHapqzDS4y4ojOa6hJDH4o+FDxMhNr
4+x8JKfnHOcdjZH742fspwN393vS7sDt3SM/fPM5T7tbJASmtz9Ac8s4eYuhW7pzE0LRmzgWpNLG
EYvCFmgqJYvolkk7IUSMFOI6ksaMtAzO6/c0AwO0YMGcYVirdC/nwNPya3msnzE2Lb9+Zpx2SyvR
R/3MIyVBtdAKx6PHeJBWkBbJcqBwjzUze9fTEXk43rDarHl384FLs6VuEvUs8mF/xFBYueeQDhRz
wE6JbVoh644adVN42s2sgtWe4waHPPPu+/dstp/QrKEzlfPOIMwIVrfw5jg0g28Wn5UtHaPFN4up
luZ10q80ShAF6zh9sbZWoRhEgprdUCJRiFBaQYxjMgWJhlNTqapzHlcLFsgpI7MQVtDKpJ3wqOvY
i8F2AW8ccynEoFFG7/XEUYo6eRwOGzQXTtdjvMXkBrZhxOOipZIZOkNwhmCUADZ57See9qNKmd6Q
UmJrK/3pxCEVcmkMLhOwqvDYBvNMPN/g7XOm+gfm0mNqh2trfrj9B67P/pLZz/iwCEkOOjqMzLjg
cdKW6uqizIZaOd4nYuwIocdR6dY9SSrRWeY54cQgqdBqxgeHQ4jnHanMPPvkgslb9tJ4wZoxvuDm
n77n8c0Nh1zw8gqRS2ruOb4PvDeF8frE9cZxtQ7aNDgIc9ZK29vTRP3+huMpc7YZ+dq9RPqeYbUh
sMQnpz0766mmw+G48hqljE6bBk3w9LYwFxiipVV90CUjZGMI3nFMiVUQlea9xVtlkjsc90vios6J
TjS+2pfKWYjqmzEGWxvPxVEsvCmVT71nXzLBOpLIYvSyTJL4ou/I0jiLgUileo8LHQ/lwKrrSHWG
oG5fETWNmVqxwVNF1axrUZBMsGrEdFYViRgsg4dDVVm71AIhMBuNrnWukbJWn07Lh7zK26LFP1VT
JVLVf/KnrXyR1g0KnRFrKAbmRaaXjyfRJqhNRg+B1lpqzQQTmFuhF8uFCWqUM44HqUTrEBqpNo7A
YxOVrTF4B7uZBT2tdbcSDGM27I97bh+fkLxjtCO2q8z2e+bhwNeXl7gGlzawbrDpvdIXO0+pjc2V
4mrTPOFaXn7v0EQjoWK1/vmwP3DYn3g4jOxPmXXOyDSyufyUPqjSZp3jROFpOvKUn6gE3r79kWef
XWHHxrDqKOWe9XrChQ9s3CNXq79gnoWVjbQkNLMm4JGFx//qouNiPeOYENOB1VRJmxWmQ2saSZsK
x6Pwuzczn7zMnLuOqVSGKHReaEXBQjT1L5hg6bHYoFnv0Dm8txRTmVPj37+74bfvH7l//A4bbggN
Ws38/Oc/xfPIJz+/4D//+pd8df2Kiz4Sg8evehJNPRitkkphrg1F8jhSq9BUft89nfjweKDVhBHD
qQpX55GCpYrDWVhZYbPqMC3hfvU//i9/0zAkPEkc1UYeqhoGKoFZDAmnbU/BY3zADueEroMQ6dae
ruv55PKMV92KF92aT6+2fHq9ZfXiGfniNYezV1TraN0We/JI22LYYswllCuV1InLKqlSvLF+uaMr
D1lz5xbMgDWZfjXQasb5M1q1WigjK4ytCkdwZ5CXPiOxy/bvgQHjXi3wnAFkj8ikAI0uLlnjBWj3
cZJeSPbSBCsnYKKyoZmm03c643Sw7FNjnhy4E0cZudk9cLzd0cpMqIXN5oo3v/178o/fMc437NKe
26c3lHHGrTbklhhyw9QJZypln3n3z5n9vOXxwfH2DvZGsK4yygls4WrVk+bKNGaFDDSIxmGrgitq
FYwTWtY4jCsG1xodgViNUvKawTYDdWEeGcOIkAxUa8hOoSMYQaQq/QxFjRI0o59zRlrDViGYDm86
avG06qjNMTfLPGkcPOW6ZDuhScNZB8Uoja4GHAHvIt4FbPCI1wc21hJcj7URF3piP9D1K4b1GkH7
3F3Q7+tjRyswOM9gApswaJGLMcQ+UGNEWuM4Vqb9OWm+YDyuKWmgGIdzgeC0395aS0lC3ynzvi3t
gooZ0fuXwemfxQcdHNry/2om9AOtVjxQS/rT8Glx2C6CWFbOs+4MbqhsLgzl8IEp7ZjnPfOcGboz
YoKHdOLumz+yvXTEXqi+UkOBtSWZyqMk1kSejpmcZzrb6HvParPBZEs0EZu1D702g4jT0oci4FQK
NlZjVXPTopRcITqjzWrBaTGFFVYqchG9JVWH844khvukBRKPMrL1lomJrTV0QdiNiYblqVXEwCyJ
QuVySU5sfM/NnLhwHQ5BrGPtvHY/G0fOI9tu0Fax2jBGKDLTO08uGe/4E7d83fWMaWYbemqzivgV
R6n6ty9i6LynUrgtldddz9waxqureBscuSiYZXDq+bCmIeJYBbt0OqgiJvLRDKdwl4pWl3ZG9cPe
WXLRTzNv1E3nkIXCZ9WEhd5JD0nYS2GfKwGnw43IYuQziBWmIhQDY6k0hLWxHJthbYVSRAuGmmbQ
fTPcPxX+7tvv+L+//Ufa4Y755oB7fMMvf9qxHjosK7ZdxGa9g8dgiJ1jiIbN2vHV62cKSnp2pecD
11PKiC0FCeomr7Vwf/fEb/74gbe7I292Bdsc59s119tOmf3WEKwwHx8p5S2n+XsOxw/c3Rx5d3tD
NY6L9XOQD6zte573E5uwBTPjeI6EZ4y2I5rI83XPJ+cDl33k+dmK6Fasug3WRFr11CSkItRWSU25
IuNcebif8GKZ3glu5TGl4cTiql3Q3prvD3icFboQcN4vBsOg/R+5shsTf//2xN/97S3y3Q+Y+kAj
sNme0fvAs8sLPnn9U15cv+Ll5QXd0GN8VArjrMPnnBKCZZorJVt2Y+U0FUqCN7uRf/7uyO9vHhmx
VO+Im47qlgbEhRPhHcy18f60w/1X//3/+jciOm0d0Yq435fE1jfmBt9Mmmk2xuGbR2zEGsdULdU4
rO3p/BrTVoyT5ezsnHXfY/2AXXV8db3mZ6/X/NnPP+err1/z819+xZ//8me8+OxL7OqS0/4tgqG1
R23H0Kcw4kCc9uqCx5iAkR5jEiKJkidqjdS6wUpGuAK+1Ae1DDDt/3/o2p0+vMkYOyLyiJED0g6I
nHDbAZnzAiNGfenGKylPRhYWGLgVxC1S18AlBg/MCzgnQ83keWLcNaadYh+Dd0ieebg70KYH7j8c
yPZECYnRNx7aAwcEs7ngNI7Mjwfy7Dk2z/1oeH8QTkeD9CPtkIjxieE800mhMuokWRI5z3inMmCr
DSuF3DIlJZIUGjpBG9MweFrONJSEZBZ2chkhrtTZ44zBe/TOJBarlku9HZeq5R5GMDUgRs190kRz
uU1IRfPKxzlpo9mc9Q5VG2WesVjqNH8c03DeET8S6aKjLQ/ej7dHHwI06OwA0uhiwFmL8R6coVkF
yggKs7GiTuvLfkWko/eBKFaz3I6l6negSk+RpdyEwHwc8R7mOpHrpDjINGEtSuXLmX65S3rraLVR
ZcZUp3EYD7ZaPSssnfQ09URIAKkq3xaxuKBubVcLqyFgStFcthjqBENOpA+PXJnAZe3x24QQWL9O
nG/O9S5oHWO1rLsBGx3vxhPv7+/54eZbWFnWJrDuApv1CusinevBODqxpJNAVHaDjR7rLLPRW7+W
sWhGwzn1pCYD26A3yYCSIL11GKtgorW3jEnjbFkSZVHfhlYYglBTYbBOs/XLJptL5cJ6pQ46hdWs
nWUbHL40LoMnfKxolaId4y5yKhVje2g6bDtrmXPlMq7Jc2IdPKUVvNW4Ya4T2TrG0ohLkiNIo4+R
Uiovhw5psPJeX1fAsy4wVuiNvradd0pPtKInhiLEhc5GU5m9NcALpyp4B3UpaLFGGRRmwbwao85u
MHTLzRxbyVnv9U9ZvQAr23GqiWAsuyKYWokCuSS2Volhr0PU+3DTHPXcBFpjqMKwKJ3v7u/53775
Lf/8/R+xp4lnfePrdmQ4HTizWzbdmqenymPNlJyIwbFyjc4KX7y64MXrK4bLK0K/0Xu5ksv1MxpH
ozKnibvbJ25un/jf3+z4cJM4jsL8VHh9HfAm0zuLs4K1lWhHfJ0ppwcen5643jwj58pEYbX+At96
OlOwNZLchIlXytp3gU0w9F7YOMOzs45N9GxWK5zrkRxoWKwEppSgKNUtp0IeM8ZUeoHodagKGILV
nnrvLT5oLfWwCkQTcMFRijbpWQy5NZ6mmTcPR/7d/3NL2e+Zn0a221eY4jg/j5xd9Xz5Z7/g7Hzg
85fPOF91f/IvtT+V6DikBmpRE6U0jXje7Sdup4k/fhh5LCdMZzlMd/hwRqPQeRhixBpR+R9hl08Y
GfAiKtdIblw5SyuJf20tZMvUDF8Q2WVZbohaSnJosAmRMTeycUztBFZIw5YSBV9WNLPlzF3AOnOR
E9FU4quRfErcHR95eJZoVyvG/s94vPkt7biG0tMen5aWq4AtnkZZGEgO07+g5luQoIhYvQwhZsbI
CcyTkuTqqJu4VMS0P03OWEG25zhf4PG9UtAM1P1heYwL1gUMPaUGnLugFkGYwBTd5gtgJogT5G45
UidEDkhbXNzGkYrhcA/0al7LkzCGCbLl1c9/xurFFX/4zX/AdIGzZ5Vvb36NnzzXacVDd8XpXUdv
P+PDD8L+KMT1SFxn9uktx9vGplraWcfL/jn3pZKN46IN9BK4shvOukBOZjmgVZzNGGeZWyL0Z+Sc
FMTTtFLRGANe43zGQLM6zZqozGlJ2rltmtW7TRFGs4AzrJYVWKM3fBHBNzhVbSyrTchUYmfJk+aW
p1YI1nAdA+ILw3bNOM7go2KDm8I7WnWEPtAm/UDFCNaomaRJpTpDnsH5ntJUSnUm422g9UoBo1fg
SYvgomd3SATnqa3Hem01O80TKR8J7UTb74kTlNbRWmPtPb4I+6zZ5lo7BVO4SMkJMRvGpDEfecpM
aUKqcvrddkvKsw4kokOHsZZ8mgghUOfC9mxDnArjdiK3wvnunC//4q94Hz3T/QMm77AXDXjJzWnP
+3cd8+klX7/wvHoe6NEq1Rg6Pts+43f3b3kk8Os3f2Q1O87WG64v9gzPzpBW6f1AmQohF9I8Q81s
Vr0WgRgPTg1fYizH1ugdPBRDv2TSaxO60JZBu1Kqo3cNK5ZgKmfe8zQKF77nx7ky4JFimKoOWTkp
UvnUMtdBX0+lycJQN3TOE8RzyokuRmWZm0ASi4mWyXrmxRW8KoahG8hlYkMgFCHVijETOYhkAAAg
AElEQVRamzrYyFQLNIXtOMlE63lKE6sYqK3hTaBVp58y3kI1rKMnFVGwkBHF5TY9Xzlj1b9ihIrK
59YpojOKoWVDXJiaRfT9k1rDLyTB2hTTKqILxCyCbdptPbbKXITT3LQR0CoKO0khN0P0wr7AxjqO
ZWIuwqO1FBRgdWiV3lTWNjC2wtoE5vHE2+M7/t+nG5wp1CkxPd2werHi3A84hMsgPNzes47CsApQ
LafJcb1acX3VE7c93eYCY63m4GrF2o2ayaQCgek0Mh0yx1Pjz73jYeX48Dhxvi14p3AsIxUfHT1b
kvyEuL7CX6/Ypj+wSq8Yrl6xsYEQHaa8xHavicYTAZ83YIUuO2px+PPC2bAieGHoPCFaBd7gqBWm
pCUxh3mmVt3Sc6tka0mhYLeWlDPWCtY2auuQVFmtLC4G7T/3BkzFRiUopqKGyDf7yv/xh5G7B09L
EyEObC6E519e0U8zr19+yctwzWfXV5y5juWvCExjThVjBnLVDoldnrk7VeY58ebhwH43cz9N/Mff
/MjUfotfeZ5/ek6P4UW45pPVGadsuD8WahFcByl1nOYTfoulNEuzhdL03miKsok9WVt/bOOPeeQi
OC7pCM4yLUYLb4ViAlIb2W+hNIIY5P8j6k2a7cyy87xn7e5rTntx0SYys7IyVWRJIoMygzblgT30
3BH+Gx74H+ivKcITWeEIWaRIVpNZlQ2ABG5/mq/bzfJgnyphAgwQcYF7zznf3mu97/PYKxq7IDnh
XCLYApzx7YwLL9jOZ/bbJz77/Irf3nzO7f33PP74LenjAbkpQFuTjuVnRB3SWJpffMP03lLigOYF
SpXA1nGXrw5rzuQMikflCvFrtAiUBSTi7Yn1fsVp9GiUPx8YwKCaKImLgNKQ81IFMuIQHTBNZbJr
tJQ0AA0iI0qs7HsymIRWkDNiLMZBHEo19txUecL7n+8xkzAdPM3Wko6F7mzxTzOm27MqllaFs8zk
fMc8KnH6gb7seWFbmnzm8dMf2aTnvF9GzskRtWN6FmmHiqks2xbOC2JnpFXyaaC52lFmxbxylLam
YFWgdVW/KrOpqXMUTYaMudQq8iWQCCGALZlZAHWUXOscOVcOfFoySzFMaSbqhAuOOdbGp6OOTpM1
DDmzDYGTHdm1K5ZUA4BBKiXrT6YoRCnpItOB+n8ztn6PuZjtpLrkRR3BFEqyZCuEjjrSbD15HogY
pDRYX7BFscly1Vf4R9MLh9PM0+mO/HBAVbj/KfH81a/ZBBj2e9Zu5PWLjiCZzjuWlPH+sopYwKly
PI+EDMtSla4JxTiLDwGN1dleYqrJ1Fx3ssYHtDieP7timiY+X2/pykKzfkXzzV8SeuE8R+7HgouC
jS1iz0wPA8eysGk88+oZxQir1nD9qiUfHpHThObE480jDy+P+N0Zo5bGe2JnuXKg5cxZG3LO9NaD
gUNWXgRhTIVOKuColUphW5KysvVwnws1pasQnKuHGm9ZUmLTBk6z8tLUB/Jhmsg4cMLJQri0Rrzt
iCmxdg5zwUwbhPtxoncWlYR6gzXVJLdp1xwGWIWAxgVL7e/mrKxCTywDLnRVUWoNXuAUI941nMYR
YzwxK527cPE1sW06jjmBD7V6ZQWxhkOp/PdCVVYWqYHN3sCcDdsLuEUrUIxJK8xlTpXnniuqHaO1
qulsDcfZS8hQ6haJpGCCsEyZOvXNOKNsveWwnGn9RS5kDJHq2u7Dio/TiZX3DDFRsKidOajy3LcM
44mVdagtzMdHbh4eefp4RG4zzUPk8Jv3/FSec1gLz/cr2qiwb1iNCTtOOLmlYNnKv2LdBdrVFXJx
xBvxGBHEVl6F1H4Dh8OJnx4H/vlwZo7VD//rNz1rH8k51QOuMZi0sIigJqE20LRv2VytCHFFiLDZ
byklEe1MLjPn5oy6FpvhZbvGBuGZNTS2o7U1TJk0YYsjmwxWiAVOeWKaMw/nkcZlclJipubCnDIX
GLVUkVHxiMykbEkxsGnX9XNQC8VWxIq1lpyUZVx4/9PC/G3E3U5IaxnzH7HNjpf/6t9QDidW+zV9
5whcsg3iKlflgps7LxNPE2QtfHgY+fBwIp0TP76753g/4eXA6d1/IcYnVp8/5y9e/h0hCjYZ4lhf
b2vnuB8XxBT2jSMtDc56Xz8c1UApF8e3UlgoxmFIdBgmYFZzYX9bgjXkAskYJFVCUKUkpUvgQ7GN
Q1IkGkMsEefWaIi4kunagZAOuPmexrb8rl8zu1csq4+c0w+41FLGDMNL0DNlCQx/vIU4QLlDSCjX
F6RDixIo+QGMqUMUEdAIecaWhswB9AkdZp6Wj+gkKLkmQ+XSgb64zuvuPoE+gCxYt4a0YGSNNVQn
+TJgO0+c1nU/r39yKUX++y+HLZUkVyH7hSKONM6EHkxjYWmZ72asu4LzzPH+hqYpJN+z2jakxw/4
HHD+I63NxMfEzIElR/TDA+QzaS7Mw4py65lKYAnPGe8W+tBR5keMMZxvP/Hi+S9xzY7l6SP9l9fM
ZSAFZbeqfmmTFBn6S/ugVjeaIiRbe5cYpVATvYLSqDDmSLBN9cHHmoE4DhOls5xzpCuBWGrFpTeK
aO2PBtOQy4JtAyYVpuNY622S0SI4Hy8KTcs4LPUgVQujGIEYC9Z6NBWM8XWHFxMOW1GXwVMkVTSt
EealJfhMzGdcsDhjaXImGqXYBZMUdWCMx4dX5MfC4Rw5/cs9L77ccc0JdjMPxw9c7V/inEcUjLNo
LuCVMWdKjrAImvOFuX8grHtcEy4K2srTt01bU/ehVmCcM/jGsVu1nDcTQ2x4+fUbrp5fYdLMsGQ+
3j5xNTue7iI6DDwkJX66YVmvMKuWVlpcV3jZr+nsF5xmz3S7cDdN3L+5p2k62tVCq4q3HderDQwz
6izDcsS3O0qpoa9OLJMmtsZSSqGlTmHUCqa6gXBWKQWc17puMUJjDOdFWPuW85AwxeNt4ETGCzxM
A8HCVDINtn5PLta/uxhpjeWRBK5+YP2wJN6GpnoSvBBJGNfijWVWQbxhKFM14ZHIVOjHnKta9ZAy
0TjmUhhKDbflnGmdEOv8nqiFhBCkUt6ssZxywojDSGFOytpVFkQjdd/tpSClfkAHB3Ouu/RyaePW
VVE9UMRccwmqlRAndViIXEA05hKgq4urOh1bec+sE2oL3sCska2xnPJCb4QxKk86skstURPOBeJS
aAUckZwKBcd0iszTE//09DNlPJE/nOj0DKnh8O5n+nVDs95Q5kSPp1jBpQf84fdc795y1doKlHLN
xVxlKNXgVL3hksE68jwSY+TmPPAYR1qT6PeJXbDYxRDPBVZyWadWVkUvgVEzz8TS2J6ihkQiamRO
NSyWwxoTJ3IeeNH2+GBptbBfucom2FjmdFlzaQPZXMRXAsZyiDPHXJgVNF++PrauQRB6awmikAQf
CraA5MQ0DfgmoMZCAW8tOSfIyhQXzncL4/sBd/g9//avv2C8+pzrfcsLGtg2rNqG1brDlMr8w1YE
dxbHLPDpnDhPkd8+TPzDtwPzOBKfHhkeP7A83ZLNPbZTVvu39HJNuHdsV45maJhLxDQOkchmY4hi
aZwlNAanNlNMwpT6gvuTW9daixSYtZ4onxfFJUPItdPojMEVi4kVBhKsZ8mFUiyjZuZcqoDA1vCP
Ok9rhKzlgiJsCS5gimfdWv7Gb3nZd9xe77jZP2d9Sjy+m7l9NzMcb1H7kebFCmZLHBxSOqy0lGUm
pQm0AmsqS15Az8AZzXeXitYJJZImU33umupfy1SqnbW4YEljRNuIMR7nWsrgyBSM3aOmJY4PlHKq
dRR+quMm9wacpZgZzglM3cdbNcjYULJF9dKX1x3EK/T+NXmxmCKMHHgq94gewK6Q+IGYZvzxDbEc
a0ZP7/g4L3y6KSBHTGPYkulcZC4nslnIUyTPHkmPvPCFla7IMdRqjDqm2wO9m9i+2GBuVxzmjwzp
CXO9wzYrTB6hf47YQCmO3CmdBLC1slQwmFRxrEj1E/tiSDrXbqapghi19UbvSdgixDRjrKcUJUXL
VASVmeLrWK9owliL84a0lMrdHrX6vI1lPE+0bY9qpu1CfdNdVkAxgzdcAlIVmh1jxvmayveuVlGs
LZRccL6S2socya5KQJTAac4gG5x+wWAUJ4n59IG1N/h+AZ2Z4y1zOnMaGmIc8WGNRIu56HAxBWsc
c07kolgKhxS59oXppHT9mmQU4+rpUTUTXFOrc209VPW7nlcqGMmU3Ybj5kjWREoF/2xLdz9TSDzc
NzycLYfDxDwstG+PmJQIn61Y20AXGvZXHct9Yibz8/snpjmx3z9jczqxfvaMdXDsG0drHDclckwT
k3r2XUuMhZVY/CUEhuQKmbmkvEVrnzqjhKIspc6oRGFl6yFg4xpGhMM8Yawj6Yw3Si/COWaCSwzx
jJpAFEEFTlp58fumZ0kLnauwokHrOiVqZttZlhxxTUERYjZ4q6SUaIJnzgkRw5yUpShJDWNaQCDm
ykOICKciPPM9x1Spbd5Uq5ozSs6GtYdc6s6dP4UfbWV/d8FwWpTW1vBb1ELvhblozUhckKvB1MCc
lypvqUCZqnP2l9+DNcR4gYVINVUG8TymTOMbvp8P7GztmXc5E3DEdGaVFx6XmZWzTCUyFVhZw2E8
s3UBa2HJI8fzDb+/+0hMA3aMjE9PMH2gk2tWqxXDJcSo8xlTDjzfGV613/DF9Tc0TUsJnnLBjHrT
1w60uNqzvvS343hinhfcMnNlMhvJrIJllet0ofWBkqtuWGxAc6xqV7sQ2q6ir8vMtESyTJhcf+9c
x6bb8/R4w7Pd56ycYd/1hBBw4hgxqHFEAsepEKy7oKuVUjynCU6Tsm4u0wRTpTkuWETrlEaXRG8t
jbeExmEuMKhyWaEaI5DBYRhy4sebgd/djTxsIrsuIDzx1//jr2lti08ZXAPWkFIiNhBNQ2O1MimK
MJwi7x+PfHdK/NNvBv74/33A5neEeKDtFsLwEblqmUrB2IzguRsyRxvY2EyH0LpSJ0nm4gYIhaYU
7N/9H//Xf3hSeEhgisVddJBSlJNUitE7zYgWnnmPTRYXay2pgkNMXfKLsJTMrIVRlVwMN8nxPtYb
81AMH9Uy0HCyhkLVcSbNBONZe8/eBV77lterFV88W5PWHae9Y86e/csr/v7vf8mL7WvevPwlzWbP
i+se5ZGcEmLbi0NdqwlONlQao0ckXvCCqVKTtD4Q5KI3dW7P5vpzzJLJS8FIh0kZkwoxJSgOLUcs
kCRV3eKbv8K5HTlGbJMxRFiGqkzSur8r7FBWFO2ANxWGoztMeUueFdIjXYqstMZil7LGuA3FtORF
yWmLqmKCAwk03dd0ZUNjAy7vsLqBA9w/zsS5YZkD0+nEaXjkMLQ8njPznHgYlYfpkZvzDad4Yv3y
GakVxod7zvMnQlgzPd2T1xPH0w+UC9xmHkae7o7MSTndP1AuKfeSS02q50yjjmWJjENl9yeqO3zR
VNO7RLIUlEIhMetENomkGZWMMcoSF4pmTkNiSHN1Mc8jOWbGZUZzpmimkPG2Ikets6RYLlxspaQ6
Ro/zUitAkrEYvL2sUlCWtOCDo8QqnxBTR6vOWxTBXkxH4gOLVfKqYFePLPJ7mu0A3pDDI5mWIVuy
SmXn53JJvRtssCwXslQpeoF9ZGzONN4hUgidR8uCcwUpmULCBkhxJjQBCxdHdPUarhpX1azO8jQV
bh4TN+fIp8eJp8OZT9ORXI4s9oFu1WExBBdYBU9xhlIMT6fIx48j0UaOw0DrFW8dbd/Rmo5ipEqD
UmTVdFBg2zjmBGqkqk+Bra/ADu8q7bDIn249grWGU8w0pnrdE4a7eSbGzMoJaV7orHLMmZMWgvN8
Vxa+6Dtu40TfwpPJFKuVf6CJlW9YykLn6ljXitC7jpQHWmdQyTSm5liSZLrGkdNC5xpadbgieITz
stSqZVbEdYxaSC6AdZzVsA8eb4TaHquHi84Kh6L0wZFKrRmp1h16I3BMysYbMjVIqBeAljFCzJXW
dpE2VvpYFlojJApGLoAnrauvJdcuzZBrdS2WQsTSe8c5LaCWqShb46o7fVF6a7mJdY96jJFzTKxT
JiwLaxJWB/LpyPv7W/7jtz8zf3tGf3qPSe8rkz5YdLNhmi1jymQiOj/w1Zev+PrLX/L2i89pnGH/
9su6O7e24rVLAmeRkhAXKLn2ut/9fM9vPjwSDEzHxN7X76kiZAtLHJnNRCQxcq71VY3keCSlM60N
eBqa4mroy1i6tmPTdWzbFZ33vFhvuN5ssVj2213lI0gNMdeHMMxZiUU4TJnjMF8O/BNzivhQ4T5J
M1aUkD2tQmuU1dqy6ZsqnTIWYy8iJ1EaU0cvhyny/mHkUQtpjKxzYLcK9LKw2V9XqluXwcy0jUV8
ZtNtWK1aQr8iFXj/eOS/3Jz5p08Ldzc3LO/+E/n0j3gz4nSplMVUTZ5xcYR+Q7tb0bkO5yzqLYsX
kqm99M7XrfGl0lvoKaxUaajqx6UonTd4hblE1kCvBokRJ5cdUMksGUIIRF8oWSkukUVptTBTo/RX
xnCrmc+CZ7pUwnIRVFqmBEiPcYYhCY13bJqOVdPS6oJtn9huYfpiDUvi5dbx9Vcv+fHjkR+fXqAl
0rx8w9U5oTFzfvcOZzvmJbGMcDreodwASnD7C0Iv1ReuGtB6U0q6kMcT3jvcF45pMpSHhnD1jPn2
h0t0tZLQhBkVQ779EdbfIMsVpXgo9xey3fLfx+0yYEpHYcGjJNPX9UB5wOiCx5CIDMAin7AmkOI1
uBXY17huj85n2rCuw8R8IsaJ6ak6dp+mmWKAnC+UPUHNiJKI+hFRB2wJalm4Z1HhMa34r//w/7J/
+zfMn/5A3Hxi0iPuGHH3D3RNy+H2PcuyxvRXhO45D+9+h5aJX331P5HSPTY0OF0R+gZWC+Uc60PX
BKTN1SVsGzQWSmMRErimjry0UBah6ywyKyOR2VIFHsXQtIZhmFhyYcoVtdqIoVhDCA7XeYgZkUil
9zaUQu2HI4Smxhtzrjz1mEv98WHwvgGbMV7ojMObAqlQiqHxAec851RopbDxnlebLePUMS9XqB9o
+jfM5kgsM3b5nnH4DOs6dv0VK+tw3oGaqtLUhZIWvFeWacDqgDcRv11hfK1Smk0FcxgcOetlH29x
O5hXjtAI3ivzqRK43LJw2ijD68zTcGT1tmP3iw13P/0WkxbK6Q1ppt6EjFzQzzXs+Hgw/PBt5F/+
cODls5G7dwt/+zfCF23A7RquXYfmmbskjMMTJvRIccyaaY1jKYKTmsZOCK386eZZcadWBKPQmioc
MWoQyey1qs+y1nF4I54pVz/BOGc+sx3nKTNoZq+BpuR6MMz5z+71WWptS63ineM+TzWFJoZRF3qp
6z9EmOaM4kgIS64gpIdxqTlsLVhpcSiHCxBmyJnGWTKFOUPvahWoDY7pwmVPuSZtmkv40zl4TGCD
4Zzr33GmomA7C1OuK6lAfTAbU7vo9oJo1WJRAzEXgoWcDLUwWrHMIgYxsFdhLom3rmfJC8e4YIzn
kCpLopC5KxO/tJ6nKbLO9dDxzHt6SQxPR/LpyKeHO9L7I+YPJ+T2hFk3bF9cY8UxL4XH88gyjVyt
O15tBOt39Js1PsD65UsgkaPg3KZS4XDoPF1smso8TpxOIz/enTjFRE/m9T7QWCXFhDgDRplVmKXW
ZQsJLUe8es5DwUwbus2G+aCQEmjEm4ILBZtnQtgQPPRNC2px3rHkyspYUCBVMUxOjAlOS52+jqWQ
l3wR48BxSuyDR0tBTM1oJEkUYyjF0gbDKdYGgmjdj1i1FyOmuczzoNwsyFHphpFrXvOsbchD4en+
AbPObHaetrli1QR2bU8wK0KzZi4TE4Z/vB/58R++w8QDOv6ACZ5kDLHv8P2a6fAz0zBibeD+wxM2
X/HozzzvVjz/5RWdMdiOixsAbCp0RrD/8//+f/6HFkNIUg1iJpCzMAssWtiGSoVyBVQUk5RFKgGp
jmLrRsJTOKWqdXs08OOyMJWIJ+F0JktEcmEvARcLKzV4lM47eldPvE4qDxxxiA2kYnFe2DTCNy9W
vFoHxHlCG6DzvNyu2W+3vH255V9//Yr/5d//mi+/egVtYLaJZ19c4UMhpgm3d1yFl3TS0fI5K/8a
1Vgfgr4h57oDUt2hQyHGCWccxXnwDbQB07eoJsQ9Q5oteRgR+URtn+SatCcgbC/1sC293WLbPSpK
Tre1224cqhNFRqwbQe6JLMRyxpi5hqzsQEk/ofm2OnIV5mEipzqRsFQEVMmFQia7CMHU0VmJqKl5
iCMnjkQGhpotcHAfjzw93vJUDtw+nRmS5YdPd+SSmWxijAvLdM/TcsNwOjGmwsPjA1r2HD6MjE9z
VRjmyMMfvifnxDTec17uSG5m1OMFOakY5xnKGRGPimVWxdESF6VBagdeLrkNW0foY1RiEshC0YLm
CCaxXlekLE7qGeYSSJrHiHWQc9W+ppyhJEypfnNrKkO7et21nsxbqa8LW/7MHshqMEW4alpsFlpR
vLSsupdY9kDBSeIw/o7l+DuO83vO048grzFS6JsGLuKOy7QOgzAvA855pmUgBI91NUVrbH2QOx8o
cao6x5iwwWFtven168C8ZLJxpCIM2fIwFk73R569aTDzj/jhkc2raxhH7CmTnw5I3zNPM2nOTMXy
4f2C7eCI8tvvP7LoCeNnvnje02xammaPsS1zSjyeRpzt8WJZN/6CWK5d9CVmel+nE95eyGYXjjkI
VgoYS1FlTIVjimxbyzgNdBQMEdFMd6Ga9ZdMwcZ4RnEcimUxHf93zLyylkEKK1v1upU0aEgls/Yd
5yUi1KrblLTSELMSfGDJpR4GcmFMdVo0powazyKGyViOPpCdZes951xonMGJIYmhGOGUFe+Fc6kO
9AQsKqx9rW8a6g07+LoLH0UIBoZSu+bTpQJYLhOMzsGcKoCn5o2qhCZRC+3nUil8WTOWS187p6q5
1YyRWhlcyDgDP6Uz12JwWvBlZnV5r1w3gXE5c3868NufH/nPH275+Tcj03c3yPKeOPwEkmhWMzc/
vMP4hjIrgx3Z68Kvv3zL52/X7PdrVq/2iLWIlXorB4wzlxpfRy6FeZh59/MD//z+nh8PC4djZJ4G
vKl1MaxhinV/HHzgMJyZbUDoGdRimx3JW4qE2hdvF1K5I/MbjHxisza0rmffrthvOjCVoa4IxVkW
MmNMLGVhSYXTGLk5jzydR055YUgzTpQsNcchtk4MjdVKJvUF3yjPth3GODIR7x1aMlmExkDXdpSo
PI4nPp1Hvnv/B/B3/OVfv+Xqs0DTOWIw5JwIXvjy+ef84sWety9e4LuWpl/RbDuKNkznxB9+Gjg/
btF7Rwgv+Opf/w8s6YD1Dd12X2mcuUPyFXGBRGKQDN6zWTX0zz2xJBoLwSrFnEkiOJMCQ1E6rfag
FCNiK8zeZ0dZCq9MQyRTcq63ylL7yfkS+KhdZUElo5rZlMIsiZPNtGJ5SorRwpSFdZlr8MbaC4Xd
EglY22OtZ1pGZp3RcuIYMgOR1giusTURKrVatd+0eMm8svBiZVg1LcHA61UiLhBWLdkkjtuRPe/o
3ZZf/Jsvebh5j+aGOCnzsOdMZnAjgS1pWcidYThmpsYg7UA8jGjyeN+i8wlJ4FolDgfEb/Dtlyyn
f8G1L8nTDkn5UqfzFD1f3NKvL1zwa7BVBBGHW6x7JKczVgLX/YaH0/3F6HSmzCMqNbRX4g+I/wqr
FqcvycAmJeZw5KC3iPUEH2hWe2KcmdLd5WEY+XPaT4TkCsfYoBoYtYFyAxhu70+gyp06lnOVBoyi
kAIjR8LjgTE6gv1IPz2i+cSSXrLKL7h9/1t6fcY0HzFtz/qxZd0P9O03SLNHlyea4CnFck4jffAg
Yw0eugpjScaTtQbGumZdtYNqIRac1AOL9Ya0RBZGGqm9V8QzX+pf05xJSyQET06Z0FhiWqoy04Wq
dfUCMSJBWPJUk9NWMSnR2QJYNGRKVryDRc2F3R4Z5cze9yzLLenpDp0b4jGgi1K+esL7htad2PYt
zjmWeNkvasR7T0oLPljmccJIpbHNxwkf1iTqra0UyGSCc5SodE1LoWOzV2YOyDixXjtevVjRNd9Q
NDL2Dc3rr+hWW043n5iOR4afP9Jev62h0NgxuhlaJVwH9KeB4/mGb39s+OazK378zc/8antF076m
tS27JvAwHInpzFMsbLstU/6TMlAIztamQkw44+o7+DKOzCjOGEqsZrNFFesCR505O8E6z3Ga6I3h
mAuNsXgnnBZlkiof+UEsNznRq+UwZ84k3qwcLlYjW1oEZ1taLFOxrLznZjrhrCNlQaXiMKPWEfuw
VIDNMS/clsJzKwwoo/XcppkvrENTxmu9UT+VjBdBs8Faw1KEbBQ1pvoTnGEpVImNVPmKzfVhv6tI
bihKsRU8w5/CcMAca+r9TzQ5kYqQDQIDVLOalktGodZJ18YzllwdFxdqp2A5pYGPqqxLIaTMGxNY
uUjnLcJM4+r+/x+f7vj96YRvRprr9yi32OEjsnskNc/oX2wZ5xPed9izME1ryrTQ+kC/f47za0pJ
GO8oaQHjyUkR48jkWg8bI3eHoWZXpPA4ZZ4Od5yy56rvOB8OYCxvdjuGGJGmqyx0azGlGjaxVUiS
bfXaSz+i8R7btrW65yzihLnUPE/SeqgvpVQh0Fz/nBIMS+L7cUJU2blC9om7y89JVZBZ2bkKMuuM
RUpmEzqapkPjwjr0pFyr2loKJhk0g5IJtn6e7tbXTPOe4WcB65FG8UFpW8vnL57x2cs1b948p7l6
xjLOmNDifYvbBN4+Wzid3xFWHnm+5eGf/xvf/cNPOK80q5lnXY9//pYnnSlkio3s2oZ9arnODZvZ
sosZ6yAUwcTCJAPiW9xoCt7UCoXkckEvZjpb+6ZaCiknFuo+8J6EcTVu/xCFF3RwTV0AACAASURB
VLahBzop+FzobQUctBay1ETpK2O4X4SQLL1zDMDBKnvrcLa+QIdFCHSUpgF7pOSEJ9OZFZ13qIEZ
QWLBS6LzBS2Jtc9s/Ibnuy1NY1mWQrGB9ueG948PrNzX5O9+xy+/+CXX+9e4EpA+E01ijBOb6GvS
1/TcP96hq2vabs843tGuPAcpzNnR9J/BNGPo6fdf8Ph44DQcsc6SeYGmI6IR8T05XzSa6UwTAq6c
KEtLUxwpJWxRsnhSCqgkslrGeEK6NUhfVXrNCpummprGIjqgOtbqlYE7yeh8AKkWJ6bCVI7kWC4G
tBZkQrTHGDBOCOsd87mnpEe0tH+um6CACTyMhfup9nvFe/qmRSbh6XwmLSM/jv+NjojmyO35lvX2
iunpkSIzOR54s/uKpuvJaceHb79l99XXkEz92sHhyogGQzGR4B2JOmZiFsStcMWRyoDJrh7iTKkr
kqTYYpingklQ5kgxBmwhlVxXIUaxYpimGW8MeSloXHBNQDTSdoY8XTIU8qdkuUNF6ZxhMRUPaFvD
OC9V3HH5OkYLvbVghJx7iv4942iZz8Lh54G1b2k1sTZCQ6Z3yn7bk3OmJCXGWhwQ45nGDGYh3R+q
HWttETvjQ/tn41mtKxsI1dzWrzu2mvHG4u4esMvM2DiICXO1QtgyHma2c8fj0xNDd83Hn36maIMJ
iXGImG7Nm7/cc9UFlmHBiPB4Bx9+OPDi7U80bY/ffUGfG96sNnwYRyaxxFhlNN4qWQutrbezxlqM
avWnGyFK5VcvCmqFmJUs4DycpppZeYqFQ6kQoKjCxjlyKjTq8cVhxfClCmMu/G0IfBtHtpc9ZnZ1
TxpLnRAMMaJiq8TFQjCWmEaa4CDNGARyqS0MI6RsWV1WG+tgaAWeivA6WMYFrkK1bm1weIFjKVy1
hvdjrps5U6lvvRHmVNi5mh1qbH1Ym1yTzEsudNaQqMrXP3MZRMiFKv/QC+W6UB8c3pJzZYRbqesg
lUtV09jaEMKyloaTFJ4Hy8My8ncaeEoDNhfWUrCS2TQtOo94q0wp8xBntjZxHgfS7feY9ge2r1+z
5AHXLMAjMkecfMlpUfJUWD9UQ1nTbxAMTjyaDUYVa9va8HEtlEwphmGe+P7+wH/64cSYZlbHjI+B
071UyFgTEFO4T5HeGNoQqJl5d7n6CM6WCmWaZ6xEiut51f1b3OoVnfS0rmHbNuQ0V5eFGGYS4yJ8
PE788Zy4HTPb1nE3Ju6fKmfABrjualBVpa6B61dVpqx4p2RfMdIlzyCGmBcURxAHCtY5LjUlpCgb
59nt1xzfnbArIS4F5zNfXV9x/eYFz6/2bPcrmt0Vxnf4dkRsj4Se0OwIx5kvvn7Gp909+i8B7Oe4
+BN9N/LyzRteXj/j2go38Y8c5huW+Ql/7Li++hXPG9i1glsM1huyLSxl4eCUjUm4tii+1JSnM0Kh
4kGROrIVYDY1Bf6UlR8MWKu0qiSNHCkkNaDVMJXVMi2JHAsjQoNwVGVQwUrmrFXKEqiIxixU8H1w
oAkpHm8MPltsMYhC0UDURJ4jiNASagpYM7EUltLh2x1htaIpibcWcpnZrS0fHh+If/XveDrNpE8n
un5D0yfcOhOZGHXgfJhI6Y7PX12RsufkBuJ6izcrvrza8nhMmPZLhmHCrxqEjrbPnM9rsinMfk1v
Pffjp7ovTILGA8P5HtIWVU+DRayj6MSYfo/KkXLpnELG2S/wfoc0Skn3iA+MdzcV4ceCpCeyDHWv
ow6kIbTXND4S06GmIWNhyhlpVtW4toAaxfse5xOtHeicY5QZEQMIS2pZ4hmKwYwWMS2GSEiBJnnm
eYQUsQLnMjFIDfvMRnmYZpZJ4RAZngbun/7I1f0n1s8blp/uee0a2usdoXh2qyOdVW6PZ1ZmIj+7
RuczbtXhFDwJSoeOZ9bNjqQRLjvLQuGsFp1ncjFkTVVJ6oTOBZImTKpVtbxkSnCUlOl9Rf9mMrZU
2pNxlpgjBou9QE68uUj9XCSny0jRFtISccFQUkHMiiUVrLui2ScO5sjSJo7ck1R5GneMc0PvG0pp
6PsNw3mhXfXEmKvgKBjSODNHwzwNl17rEeuE0BZEMt1uR54WjHPVW18KJjSsemibDl3q+3NKmTwH
Ssmc5xlpTphNwO8CEHm8+wPjpSqJ8bhhz9XUsXu15Zu/fcXtjyc+TSOH0fHzzz8T1j3PgqGx1zxr
ek5TRE1iWU60bUcqdYJiUcYM3tabpzFULrUavIU51ZR6VksTlHGJ2FAIxnFIE5vW8bBMLE7Z2sSQ
Mm1o+D5FfLviN6kwSiA5w3dL4n+zfQ2ftdUZvtiqVxiXjDjPMdbEdSIhxoE6xrhgrWdMC1kMQy71
oWotS4ysmw2+GP7KetpYc7ROhakorRHOqlhrGErNC2wx5CRsTEUoWxFElCHBygjpsl/RAsbYSwCu
mujmXEfzM0oyArk+3L3AVBRvqj8jFaGzlRbmtTCX+m8uWg8mrTGMxtK7lmM6461juRjPgrEkMs44
chGshAqQKUKP8O7Twq5vGVee8T5xXjL99RvkqadNHctwJKqlGW7pvNDpL2hbhzJhCIjtybpUQlyu
a8qyLBTX1PfmOPH+vPCHm5mNmdg6xftMXkaW6AidxfoGJ4ZRhHNaeOlagjGoFpLWOmuwFm09RXus
b2naOpX1TuiCgZJpLjfrkgXBEzWiYniKmd/fL1ijpOMd5XwgtBZ5/ZKYLStvyFm4Ow9sWg8hERrP
qJkuQGguKlvvSFou0+OCeIO4eik5T4mJqmpd3EJePbK/3vDZvuVv/+YL3j5/zuqzF9gUka7HhBVF
oQsrUjFI22Hclmev3vLvfnXL/3M48vgpVSib3uDjkY1xzHOiWb/GtCd8jMxLYigLn9LEKSXeYlmr
ZescxsIsHiMduVicSTPW1+6uiCVKLdI7cRSNWKkBmPnS3ntuapo4qdIXcDbXEzSRoShRM48oJ2BH
YkI5poQvlue+kDTTh4Y5J0LpsQgjnmwSYjoemHFGCSXjXSbFwk/jE39hPF4NKc+orR8qJVeD1CEl
jtOC61a0oWG1ec6rVxF3V3cy+Yu/4J//63/mVr6jiSu245619bStoqYG79piWG+/Yji/Y2l2pLgB
XuNsy343YPqG6RCxTcswe9z6BbefbpgGuB9GfN/xwlEDNuqI2XI2CROPNNZhknJytROa4wljM6Hf
k6aBEjONHZCSmB6PlJIuJ8YBg9CuNjivLBOkpGQXCfvMddfQPs0wJ7I4pmBrKjymKk3QheA8Xb9A
nkEysTtQxgm1M66scaHHuR3T4UTJHV2waDrgjCDeoZPWzvF2R55H5pyw2rBkj7OWEUVPGTE7Totw
ns68OM1kX/DpI/1hZN94Do/fMxqPWz/H5pHTUYnRsZY13h1QG0lyurxRW5zxiBSMUmUIiZqMTzWx
jqv2tOy0ojitr+kszZfka4X7KAURQ0wTKpmIMMeFVe/RGbw1zDGBFFZtw3g6XVLlmamz5KyUHJCS
WfQSuJPIar1i184YY7jKylY96bxgV562c1jj6TqLOgNOsU3tr4o3xCXXyLhTTuOJpgssp4jray87
hB7pG9KSsDaQBXwjmLjQ92uCa3i4vycaYZ5HMgErLzFxhpeeku4p08T9cs/peE800LyINO6BIJ6v
P2u4Wm24uzsz+cinhwP+3XuwjvVrhxPleSj0duHT4Y7ENdkEuuBrx9dWzr9qoRWDUVMrqUlppI69
rcLGCosR9qHlIUaKwNY1PC4TQZQ5R5J3nJwQsWycMJbMZwKf8sxfNgFEGRC2eKaUWbcdcVGcVq7+
UpTGGOal8KxtUa2p5KRV1tICd2lhF+ra8E4crYIRw85XV0XvKmehcuwhlULv6kRh7Wx9gF+sErMK
ayecMzhTMBcUjpNakeudcEoXqKbW6ZkDFq0MByuQKbgLS94YJRatoboMQTPxYr7rnGVJkcYHUklk
pIa3xNE2K04lEUJA88JYlLV3DJf/q+aEkcIxKsPNxIZEHO9APevwDDPOGPYEu2M5P+GK5fNnL9ks
Z1xraNu2VoCNpUhBLwX7Es/gQoVvmRXzfOT+OJDywouXltWQ2YQD8+EHfDizpAlfXpAW5Wq1QaW2
qAyZrFo1rBkab+iEy2qwwVpl5yxWzvShpXFS0+qikA2dcSwxUWYlTpFyF3lzmjk8PXK4/4GxPHG3
7tl2DU9zZrdqKzo8CR0WXyy6CEaVfl25FMHWCqpDq7wnZ5q2QY2SrTB74W6ZGFhQJr7+bMeXO8f/
+u+/4vNfvMFdv6Tpr4nLETFNfS0mxbiGRg1qe4pp6NbXvFq3vFlZhi3MPz5gXWQ+Tzx8/1s++2ZL
0wllfOTm9kSzfUGaRh55wq1eMhjLs7VDROp7iEInnsYUnLWWqXDhkdfPmcY5Usw4a5BcIx2tLVhr
cZcgx8YEVJXbJXLHzNrAd5pICCdTODt4U+q+aSyGOSrP8sKvbFV0BmcYl8jKN4ScERvwQWhtoIgQ
yThRrrLStAXJCxMDzlpOmiqHWYQmW3QyLGNibmaMa1Fj6VYbnmndQbfG8O2rl9z+NHE/fOJkZzZm
xesw0NqFlZxoOovV9/S20HWv0GaL5I5cPN3znjke6PoR26zp7Uea/jX754JOhrTbIe3I6YcTm1eZ
uTxnPCmHzZppAKaM7x4oy0QeG8r9QJaARkGKARaywH7fk24eePZ2R9u2HL8bsWVijaOsez6WQugF
22RebTraPFJEeFqUZWk4uUy3v2ajPU/Hj3TNNftVx3n+QAwGsYJOJ+TKsJwX/BtDMytvX37DeNOS
Hw0mW07znnO0zDyx/P9EvdmuZkd6pvd8Xwxr+Mc95M6BSRbJqlKNklpqAW274RP7wDAa8H0YbcC3
IN+SAV+CW5DaQ6ncqJZKNZBMkjnt8Z/WEJMP4peaPEyQ3Jlca0XEF+/7PGmuVbThSJIJKZDSxJQ2
jPuJlAKGATFnTeoQuVs6zGXE5QemfCLtWtw4sy9Hlhff0rjAdb7i+uZH+GZE5kfmEjidfke3/AX3
x5a+2+BdS0oGgyLDjPGGgbqIas6ogmdGrcF4PVcMpd6Xm6rNjSHRWss8R0qpVDkjihZLkIhKnUyp
CLFMLLxlyImMsGw7jnMFboxzJKSAUeFJJpxTrO154Ro2akm3B+ZomHKkGFvVRn1XqXZzRBJoqprb
/Wmi8cqUElKEMI+EkFhpz5j3sNFKbDSKektJVS+LQL9pCFGYy4IwBjgqOmfGHJAerDrSU6FZLdh8
vOEp7CiHHf1T4eIuYQmsrjx+4WjNkvvHQNpH0rsdke/5TB1+MbDaPKedJ2JIPDxEcr/BmEuSyTRG
OaZ6Ko2pVGqYQkqKMbVqY0xhipml8aSUmIrholkzTyOXVOvaLgZWredvxwmM8rtxz0Yc+wTfxZn/
vl1CyCy6+h3q1aEJHlJk07YcpxlrFBtrmNaUzClGCoUpjAiZiWoJ01z4kDObvmWUCgo5lJp28cYy
UDeGxwxJDEMUMsqVEaZQ6lUiclY3Q1Yw51O9IsQi/xIQzDUvfK66KVkLcxR8jYXQqp4RMudgnAiO
wsxZ8HL+tTFHYqmSSkVxUshJUDU0OAwnVBO7JCxsg1XBOMOz5Zan2xMPU+DDQ0Bjw/3dRDN/xtId
6Sk8PghqO3ZxZowBn058+zhwsV4Slw5VSy6CFc807iiiWKP1pI4iWchlZhiO7KaRj6eZwy5RHidI
j9zd/5qf/+zPUWvwtkO1tqMyqdI988Qx1dG+z1od8Sr0janTRmPpXUGLwxtL67t6FZkdRQtzzgRq
6PJ+yOQ5ML0/UfYfuWz3ZDuR5wZTImUsaN8whYbrtlZriQVcxJ4n0+RC3/TMMdaqs62yITUZcZZA
nZjMp0DeD7xOe37+Ys2nS+GznzynXd2gy8/qJKhbnr0XAdW52t+Mr3Iw9RgVnvVrcrbYqzWTe0kI
v0ObwmFKHIYWK5moa1bLnmF3YghHijpup3vSrqMbei7aVQU71V4TXi3m3/y7//mvQ1FssVWSEcEl
8KXuiOZcEKtMKgy5gBT6orQYQp6rglMLa+f5JggD4DPcxsy7lLmbMnMs+KJ8TmGbIi4nNGUagKR4
dRhTRfJTMiBCKIqlJg0VJWpATeGpRIxkjBS0WOZYLWJ1NFWxiKqOXGIVjDiLJGXbrln3a37//55Y
hcLGQJ6+J80PQKbxM7HAHO4p9gnpZ7IfwQ04Y/H5Ap871EFOjzgc8+kbLj95yXrT083vuFw6tuuW
1cUNfX7LtnXYuKMsDpitMOSJJw2EOCNlwXL5GhduKKnhYvFTfv7jn9M9tdzYDX1xjLsP+Bh5/lc/
ZLYDGgrrZe12pvtMGuB2NxBbw1EzXWpqWGcKNGlkI1tunv0As1JSt6Brt7hmgckttnmBnnoYKlb0
Qq7xc2HbTCzxLDUS8wOjhuqHj/kcyjmPKPMlMYHQgLSkPFb0bS7ko8GeEpbMKiV0VhbGMk6REtfM
c4a8YZwyD/ffchzvmNnxZE4ckuXd7p6uecVIDQmNkolEoq0fvSKZnGN1XauQ5/rBS7EgxSCpjszk
/HeKSgw1SRxDxGlF1uacMGJIOZ1hLwYplcNPUdRoheGkRJhniilMMoNmLtoep2Bdi1dL4xu6haFz
La2xVYOIJYWahI65MIfIlALzFFg1LSElSGf1pkgdMBRwjVLSjNjqvS85ocYQ5oDrHFYE33pEIadI
0sJ4mklaCCUS+4a87fn4mHloHFMJFAK2ucduG5rVhiA1uBVdIAFqCqkkbMx0vdA0DsmFYhIpBHIM
1dxlbdWGFv5Ly0Vrb3su5z/vXEEqnH9fIsrDGDCiHKexNmHiTI9AzpSc+ZlztEVoDQwKyVhUCn+Q
wuumYZYq8Ak5ExVKUd5MA9fG0KRAbwsxVpWyKOznAavC34wjG2cYi7AXww9cR28cjanNkY11latO
xhnLKWcarQ2NhQptEdL57jxnofvnsTm1a58ziBHGVJ/FkOrGq5RadzOqHGPB2TNZsxQWto7izflK
xZyvNiVJhc3kKkeaU67p+vOmwUmuAhnnCSWRFYJR/hgT167jOjXc9FtaLKeHgTcfH/mH3z0x/j8H
5OPIJ4sLZHrL/fB7Jha0usW1R8bpSGne0T1PfPGl51///Edcv7rBLRakMJFiIguUaarveIhgHGo8
h92J93dHvvn4xIf7kQ8fvyEc/kj/vCDjCW0LNq9ZaosTCwEkG3IWeuPxpkqTvKkq0IziXKHpLI1R
bNPQ2pYpC2IcSWtr4BgjpymyGwP/8ObIYRLe3T/xsHsiUoi02MYTOKJth8SWgPLppidpYekcicSy
ERZNYbvq8W2DmmpshIgVoWlqHTVm5eE48e5uTwyFHy16/vR1zy/+23/D8vnn2PYl4i4pIqBdrWZD
vdrMBWtqaqBIxYynmIh3R/7m3R1kjxyfKPNHFlpodaQ3V6iu8J0naGSx3BDEcHj/LacDxNZjV11l
F+TCyirOGCyY6ovWuniWnAlEurZBUqG3EDnbYTKIeLTEakM7QxaWKWFS5r/KhSklJk2sNDILZCf8
0gvv5oCZ05kqWjvppwTPjWfSeo/srcXlOqZSqeq6aFtSG2D2TCmiJaC5MrynUo1fERhPp8oaNgV1
BquWIh71iXa1ZBFG7r/dcfnyJfnuD7y/+x3+cmS0E1efvuaoL1i1CywJLzO9/4LhdFuZjv0luYfY
rcmxvsgrGTHLC/TDH2jXnxJxSOOxyxfkeaK5/CnutECOe3p3YJLI+kXHJ+MRPr/k6WS5uLxk/+Yd
p52lXyjT7o8sNh9YbC7ZHQ2muSAuWm5Phoe7iWV3yeUXn/NwemIIE7EITieSgE8z07DHpJkpC7q4
4qHJJH8izktSCoTpgJdAp45117PeGrz/U+JxRKzh4O95mhqmsuNgRqZjpKSINIIczuazYoCWkAeK
dpADpZy59szQBvy2sD1UU144RpzJ7AaLP61wvsG1Nzx9+EB4nZjCI96NtIvA5cUN0GHnZ7zdvWU6
7Lh+/ZJuucAKxK49B1oq5al3hmMoLKQl5IDDgkyoCl3IjGOFskxpImvEqKPpO4rJlJCwUsmAqsoc
qo+YDGbOeHWMaWKFJZIYpMJVDIa1cef/llJyxoriOsOQwaGYoTCUgJ9nrDGIgZxmco7VguUsYzyj
QV2dLEiBMM4VI2sU01q2XUMcZqTpkRjoujrGC6L0TUseCmYD6emBZiV4BLWW5Ur48DRx8eWSZrfm
u9sn7saW8SHz8roluT3NYknjhGAyIU+8PX5Psa9pHjK+rThS112z6K9JOTFNR+72gd4IhjXqHVbL
vzQBxlAXnyEXzgcexBYcsBsTq0XHu8OJSSwfZWYvhb9ctPxx3uOt8lWecVimojwBPzeG/5Thl8Zz
yImTZi5KocWy1IaYIq9UOcwjhzKxUcOYBjrXMswzczbsQmFTlCFa/lMauXQd38aZG2tpaVAKjYEP
IXHVOA7xTIFRZUiZF62yn+qEL5xJhPlsbuj0XJdWwRTq1EhrB71V4ZgS1ph6P6yKV7iLidYoh1i7
zFEKOSteC7sJGivEGMjlnJiDWqMrkUarqKhoNWJm8eAtH8YTZtHRoiyco3MN0+kRo76emu8jgiel
7/nD+AGJv6ewQbstQ+8R0+LknrCdWKyF53/6jP5yCzkRQyDOFWVtnBKnhPpKUHOuZR6fsNbinbIy
8OraYp487jDz6Ysb4vg12/g5dpwJHHkMCe8MrfNYp7jsKCnROoMGRUnQCFkN3jRESXi1IAZXhDEW
QooMJXOYM09D4uPTSHhfcCay3kdKnlmtDOv1zHG6RU4NTXeDFeFqKeQMK9MhNuFDZSeY4ml8T5wF
dYrkkZQjTdcx54TGCovaH2c2OvOq/SN/9emXfPqzn7D+7AdYe4na54wpkZOph0ux2HLOV0isG6Is
NWwLXF1d8cXVgqtW+bhX1DSItiyahm8fZ/LLBP2G290jR0uVkO0z/sWKxp4Qu+dhathsLzGuoo2X
opg/+3f/61/PCKeK6q7UHYRSMnPOjLFwyooRQzFga5KLnGu9YqS6k+8LfMwzaOK9JHotjDkjSfk4
ZWIW1lLTokrEU3hIgVIiI8pQlKmAGEPMUu8zkqJJ6HJmTpEQE2/nhFO4LZGnVLgLiSEVNGXmM1DD
apXiYTMhVaAEUtnTbiUM2vOUCsUtGPdPXKwXrLvEyi4x+UiRPWIc4+kB5IZT2JOy5RhqR3sKM53b
kmJTVes6kfmaIG8JzBQ3UewK0Zaus6yfbdis1vQPT9y8+JxPnr9ikxuuL3q6bsHl0vHjn19zs1EW
beLy1Zr22TXt8hJ99hJ39Qk2wLrbsrq4YiGe1eqGy/UVeyMcx8QwQUyW3CwYzYz2BmcyYb6lxBEp
yqVVbuSS59sN286wbjp88DTqWNseHyILY8F+T3IPzDrQvlry7PNrHqdHjCxwzVW1zFEoukIZKFUc
CT4jQYgni2kXiO9oZYvIC0roycOWMax43AWmFFm8fM39Qdm9HVnIc9rwOae3AxyF49PM3eNbkkLu
DcNh5DQF5vHA3enE7jCg1HBMKIYQIkkiUTL4RMwz85yIaWSMgSypEuuk+gbi2cm+n06EkpnSeOZI
V+HuXEp1ZltLynXDS1GcOFIQXBFasUgSLKb+cwnGLOxDZswwhUycZobTiZzD2b5V8E3DnGqVMOdS
+d+xEGLAqGWe6qa1lEhONbAqBaz35Jgq4SvXTnIydRH3bUNMBec9XVudy85WMcQxZJLLDClyRLk7
HNC+I6RAkZmTnDimr2iMhzRjs0WnfybtgbM11nWaDqgtBLE0bUeW2o6pGgfBIpyK0GohnYErUurT
YbIiM2gp/N0wkqQaxG5T4E+s40OauFLHMRd+nAtbDLsQ+DOv7NPMc+OIOWKyVtb6HGitY04RCzSp
4jtNSZymkRZLTomFwFcp8g2R9w6+0cKlW4Aa1BqEGn5TNYyl3oFPOdEboZHKRGjOApUs8BRrUj2U
wsz5W3guisy5VvikKOM5JBhL7ZKkVMfzFuEYM8YKc6kc2CKVE2/PVDUvVIub1MnTlEuFm1B/72NR
RizHbNhlxy/bDa/8gsu2w1P5Cm/uPvJ/fPMNj98+wXCkHH5F18/EWJkN3WKNX1oIBxbNBlkaXqw2
/PjTG3727DXd1Yp09t4XhHR+Xkupo+dU6uEv5cLT7si3D3t+8+GJ48dCG7Ywrxh3jk62XK+2tN6y
ahrCFFh4Ty5Kq5YsWvMGYiglYoywcELras1Rc0EjjBnmVNgPM7s5cpgL3z7NvLkduH06sdvvIUzk
BMZ6TNMzjwvCwWPNCuyKMRukCKdYPRHbpWXtLc+XHYvOoyXhbHXe+9aQiYgRppzZHUYenw5cyQf+
/PkTr37052y/+Cnd8jXoSwpNfUb+RRYGhULJJ0op9eAjdbxZxJy/J4lvvnrHV78dMcnj7IancIeV
kbbf0K4+AZaM4wXJbBmmR9ptT3+9YntxTd82WOPoxKBRETXYX5fI93M11vy5MzyjYKUgJdeupK/9
wJADJtfOT+OU05QpWu9znM10KTDkxB3C99GwJnGfHLZYPneQY2JIiURiIrHIghblP45H/sI49rme
MKwqnRg8BRFbHde2Y+MmNAauTWCOmW9S5iEGtiWxzhCKITPTGcU5x1KUTrQiU63WO8Mbw1Ic7ij0
8pqP339HeNcyXzpGLLvrd/j+SCrfEXIh+hPzyeH0iiYJ4+4B9YaFJtQop+MbWj8wF8v+4wlpFqwW
X9LYLYSG/dN7xAby047oHSoHTJzI08BqrWQHm7UlLy6JIdFfX+Mv+1qbysKqWWI1M5XCZ1d/zqII
Q8icODH6zPrimnC/5OJZ4fFhYJ6OFB2YTpkp3mK8ZeENbjb0eaRXweaJaZqIwxXHp4lCwrpCinva
9kQuRz6OJw5lJuwzyIlxSrATFqs1Nn9CjDPD/D2qe3J5qEn8clZPGUejjBS3VQAAIABJREFUC0a7
RuKK07zi0Fji/j2c3rAwLdnXxPr+u3v28x1X3Qqh4XD/geTgIc/swsCD2zGMcDhYpmEkYmmbJTIc
6dqCtdeckjK8Nbx4tqbTDU0UvCgSwRkhDyCaWaihsYKmhOZMg2M3TOSipHliThExyhwDrRVSsTUE
l8BKPbFqqZtdb5WcI2Mu9Z2QOmbOYivyMwsnAs0QMCbRGWGZhdgUVn0PSUhZsMYjKVTxg8w0tqnK
2JyIbmY6RijVKthvFpDqAi3Gkm2iXbToUE9xjVrKXBeWlBLedUR75FROmB9vSB8Lb35/R3+fefbs
Ge92M30PV73D6Zqm+1PmouxjqSfpADdB2cbE9sUrupxZ2cJ+f4tISwkbvBPUGI654I1wnEHPveuk
dXIxJCFbyxgmjBNOMbPSzGcGblNkJZ7vQqJkxx9y5CkmNr7jbZn5V97wlBJeKkh5FxMbWwingZX3
rDTjJWNKOSfBLbsxsjCOpzmzm0e+NvAf5pkftZ7/fJz56aJnHQqFhMHxqImltQwpMwj48wX20iq7
kOidkkvdnLjzz9EUw1MubFyt7ckZ3zol6LzwONXTdSh14W9UGUuhUzjkBCihFIaUWTtlCInWKflc
TnemMuFXanmcKxSHoucwmXCKkBrIs/AXrcepcCHCCyuMg/L9YPj90yNvTnsYJsrTb5D8hnb1nCCg
mmmuj2Q3MBw/Mg8CJnI0E2v/muLOk4AcqkglJVSkLu65YK0lhow2iRIyrgR6nbGPTzQl83DYYfst
PiTGgzKuEpET1imt8xQgROWUMyIG4zJWC4pSstA4j1GHmpr+LwbGBIeYuBszX308Egz8/u1bvn7z
Hb6fEL/DXybcmGm7DZvlZ6TDgDRr/MozE5mDsFaHSGHVFJ53noUXVp3HJsU6QYohacFaxxwSIRam
OVFivYL55PIFrz//Bd3rn2D7z1GuSXhihX8jYusibhRJc20q5AgpIo2FHDDGgGnwmxuuPruBP9sR
fntBvB3wOF4/e81iFejdgce7HWm0hO4BouHV53/GLIFiF4TZs1xZ1taTJeAK2FGFp5LYCjygGGAl
Z+FAilxgWKaCRYk5UKQ+pLVTWWhKwsTaUd0ay5gyz0R4zHCjdfc154IzmfeS8JoxOfKcTFsUScJv
4pG1UV5guA8Ja9pq4LEFlQYsuJxZh4JH+L9Pma+lIfmCC5nOFnZhokN4DAKTUsRCErwTetvTdWuW
4pBUCGnmIIlf/eoPPIaZ2z98xbPPFnx+8wldDqhdsZaWIXgkZ5btkjIlnChaBq62L1h1G2zxqGTS
8RGyZQotja4gd5iSMestp8OR6TiiaYn6A8tNj3GJUkasVzBnZaJ4IhBiJCoE9lxsL7hiwRBHtm6N
jsLcCINbMKUZt/A8u3rO/enE+53jNPScjgdKvuTw4QNzGJGF4dUXz0nfvsPFFSZ7ss/sT57b44Rp
G9RNDOGfuLCRQ7pnNx9JmslLwdmMnwvdcskpTJTFATENbXxJMZ7psUF0IKcjJeVzsneiHHY8xQcG
12OCZ5o+Ujhxkp6ri09J7/akY0CGiXGV+GgCWWaOORLGwImR4RTZhRPt8ZYsC7r+Gtlnwv6ezRam
iyeyKZziBQdT2GbhatGzoEKLqIZVfBF0zkQRSpprL1mE0zCjJhNjwrlad5ICaVaCRKzYavDK9R6c
oogWPFXhSkyoEUpJtb5YEqdQCOeMSRRwFfCNSRYNma4UQsn1oxgFawwlF4ppamo1zBhTGCPMp1C7
yi7SdR1DOmBdiyaLFsFZRzITzno0J+zVhhgjpzmgajkaB67j21jwY8PVzczuq+95/+EjF5+09C+f
M1/3NIs1Tpec5iOzKsO0Z+wKKRnGMOG8opstz7sVjIEhT8TTHrO4QLQS/7RAkJpyP5WCV1M3RFro
VBmdIZbMMBY+9YZ1CUxz4oeN4bdjxFv4OgvFW24lcCjKpsCuBC5s9XwvbdWr7ohsXc99nlCrpFjv
O23JnHJiaT0nZp5S5i4XJBfuY+F1EV5leDOfeOYseyKdGBoD70JisHIWnMC+JIoWjlLDfp2HkKpp
8CjCMQkrqaKahtq4URFShDlmOms4zhmvQsiV8iYiTJE6BYhCI5kUM84onkxScGdkbyPVdKNWMaKc
Qu1rRykstCCmtrhXpv57e1/lODkrD+9m/vD2BH88wG6HnD5SysDD93+geS5cPH9GKDtKjKSyQxqH
6xcwRab7I6EoKpW7QCmkGFFv0VzfgVJKXaCiI86RHGqV9nq74jbsCZOh7x+5/+4trXRkt0FwWBmZ
bMTpnt4ukZBoZYlD6VCcd5jW1P+nCmK0InKLYbaFpwl+Owc+FCXsZx4evqdffI3vHUGfOA5HmsYx
hAemwwGaNb6N4NZkPdHqgmaOdM7wybLhWefxzZlUCRRjSBmMc1DqFeMUM9NhpJ0SP+xafvCjlyxf
/5Bm9UNUF0zZIuesj1VHKXOdcKdAShMI5BAr/jrNVVhXqqxr2Tp+dLPi5spz+2pFCS/Yun+Nuo/Y
tnA3vuNBnjj1SilPSNiD7FmK4/jxls32Bo9ljoGlNSgZO8TMQjMNhbFUKEIVy9W7pDHHWvzPek5z
FoQKoDmmQm8UQ8YW5akI79Ww0voQlFJoVHiBcoiGJiqFwnUx3BhDCIlPrPC3caaRga9C4TPfIBJI
U89N29IaxzAajHGk4hgsTL46x09a7+E/xhOezFep8IM48/msRD2gNCCWxnvEW9puy1YTyxB4+PZI
fvlzri62PL39j7y/feRyfyRtB/Ix0YUVbbJMD0emOOGM4O0dMe/o2x/i1LFcPSeGzCwXvPzFj8kU
1FlU631WyIkwj2h5RpwnOn9FiHCYjsw5Iskzh4RKIIV6b1OGI3a55qJd0ubqH/Z2WbWLXrFRWDhP
o5ZshKyw2izY9Q0hwCpfkOaAXFyyTDObJHzSrZjXWzoR5C5Q7JJteaLliWTvUc0MJqMxEDSxVKnY
3abuWH/+07/i/dffUJxH+46cYHcMDMcHrr68xriWt9/8jjBNpDATs4F4d97MpfoQpwRcMcbE8WQ4
4Rj2R2zIHK3HNjPN7gh9y+rUY8sVcvoWx0TZ3GDjiunBIqGQhp4B5dtxYhwfKKXl9HTHs08D8WLD
VetpaKv8RAvNsmUaEznP1U/fKpIzKSfmVJhjpCFXmptzINUslbRG68p5wbJtrR1N00xJEWP4F7pb
lMT9GPkw15DaOrQsJkeeEs+8oK3SrjuSDThnkFI4zkc2bUskI5oqGrMxqDeEMNdg1FwhF6fdEdN1
qBRKnKCrGGLfO8qZjNc5Rxgjfd8Tk6CuY6E7vr8duLpwXI8v+fg2MJy+I331B+5233H3trD+4guu
nv+CUwkcTpnLZs1xlxinIykH0jdw/cnM6sZxsVxASpzCEzEvmQM4r6SsLKR6mvMZpELOOP5LF/vS
eW58y0Dk18eRV9ZzN4+YDFttMCHwUuGbGX7eCL+fZtQKn2rLx5x5biwmw3PT49JMKjVYewgFg7If
IwZHEtAcufaOv59mvlTHx5TYeI+awm9K4N9SKBnWXngbMisprM/2uIWY6jS3UrWokjFFOFHrVXNO
FUaUa9BSC8ypamWHLGdJEcznaedQhKWBj3NBxNSx6z9f6eTEytUF3lvonJIiGFPjO1tfM2jaCa7U
zeJKYShw7RSjNaewtaUuuAb+r90df3f7AL+Z0Q8jOXna1S+Y5nfI6gr1Sjzu0GaBMRG3tFz0G14b
y8X2GY1Wl6RzljlkxNhKnMwFsfUOXZ1ljpFxnHk6Rb6/D9w/Ndx/vGX/dkeXHyHPmK3nMQld0/I4
PtFaR98UfB5YZ0Floqdl4wxd15AtJCmIqRNaUdBkSCFzmAofdoVhD8fbCYYWtT15PBKT47hPhFIX
5RnBlcDmlSOEjC0zc0k8PB15+csbvFOkczh1YCzFU99pZ3EGQprrYS0ETIw8Y+DZj7/g+svX+PZL
sFtioWJ7z38ZDEkUbFOzB6UGb9M8oNah8VRbDKWAFTrveL3aYoPFmpHUF+7ffmDovuX5i57cFa42
z+Hhnv3vD9AZ9m++QvLIcGh41V9SBijOEq2Sc8a8/p/+l7+eSuJahddaQQm2JDamPsi2ZHypDOUs
hqnUe0jRSoqqHzM4aB1ZFS3ss/CZVZ7jmShsjcfkgtOCjbAG2qL1vlHgnSqDClGgVeGZMbx0lt4b
jMCiN6jNRFNlBl1JHGJgCoFXOXCRCptSXb0JxRRDFxVfqp+59w2L5RJxStf3lBLZx5HfvT1yOu0Z
d99j/cCrV69YPq65cV+w5Bn91HPpL/H5lq61dMay2t7g/ZqpJLJxiBe6RUvXLvDesWwcm77j+nLJ
8+2Cm4s1F5sFz6+uWK42ZLEcBiHogtk4jnMiHpXf/d2vMGbB092O/f0DwzggHlTC+QIvYryDUjDW
0LZKI45GhM54vDpaIyy9x9qGZmr4k+cbXm+29K3Drhv6Vz3h4oTZ7mD1Ht0+8OKHa5J/T/98ie8S
tIFiJ4x2LNcNzhjupjvSuuVkI3QRdGS5TDTljotVj20y/eqS5fISpx6bF6TkyGVCNCJUqIcwsV06
Lq9XHB/egcwMEplLJOUFBwO72ycWzYKyVXQ8oSOspcE9zTSHkcXUMo8nhr0y3UUYevrdPfbxn/BP
H5mnPXOY+XY38HjYk4HeVh1qUSGn+hG+PYzkUjjNMwOJuUQCmVwyIdeT2jEUjPMElKIGZyroSItU
o1myGDEohlhMxWeihGK4co6HNKOdpYihdYqKJ0kma6mI5Vj7vSkVOt+QS0K9MueZWGI9qYcJSYUc
znbCVDcRzjWUHGm0Ko9d09QXWqBbd2SpH+QYQkXquoI1BTV70u3X5PSBwy6yebbGiMV1S3IBTMBa
w/vTLZ21WITDFPAFDNAvF7hcyLESz7JajLOkIiwsTEmqMEKEkP+ZdFZopBBz5Zj/Zhr5mCYui3BX
Mq7UNvczZ0hSeEyRX7aFb8rMlTW0Brwqz1y9R980jpQCy7MvIOVAUsM/TgcaKdgY0RLxqTCFQBDL
V6nwl03Hb1Pmz1zPF7at4g3j2KeCs44PJRJK5bEPFLIq7+bC2inHs4jGUhfrhVFSrqQ4zUKmpuEr
/lY45IIFAvXXUIgZ1rbW27zUu3mjQmtrS0BNnWgaC8XUE//CFooROq1XSEbAO7AKS1vlHCuFpRFM
NVbzv/3N33P6P7+GNydKPiDpFnF7EidKaZjnRGk3TKdCeDoi45b9caLvTvx3f/lXvLy+wXU18Z1z
rvhpUxCjiDNkKaixjAEe74+8fzwQU6DkyO3tN9ysN3z6w+f0ixcc70e86TF2xdPtA9iM5EiX7/Ht
AkFojaV1lq7vwFUPgHOeXKB1LUOoRLgPH2b+8OuZuEt8/087cowM9juKdIzTE+uLV1xvPqNvPuOn
P/xX2BNc9Rf4PBPDzP7xhLHCl68ueLHtuVr2dUNMQrEYsfWULZxdBIFpGFmMA89eX/DsJ39Kt/oS
zBURwxwm0rmlYdRBkWr0RCBPpDyTpwklkWMgp6oOFxGMaREMOSS++eNb/uH+QL49koeJ6fQVQ78n
zROaHeXoMHtPGSLdZs315RXju28xzrHYXnKzrlc6oWTM9f/w7//68vzgrhBaat0i5MwxKnMELe5M
5QEVg/eVwd04rYx3gWSExznziPAKy7VaCtCp8iHWcdLrxnHIylaUGRi84Vcl84GMpXAl8JqIF2Wp
Bs2c+75nEL9AToKVwjLNDPPMq5RZ5Vh531nokuIUxkmxSXFqaNq2Bgaas9yDwjSPvBlPFLWU/T0b
t2bVLgk7g+qSLJ5k7yjuG7rNHuxvwX8A9z2zPJ2rCZ4svuJdbT29NI3ncrWgtR39smWzXdG0Pcvl
gsVmS9MsaVcr+sWKq+2W5WKF3S74D98d+frNV3wcDtw+foeEwng3cfpg8W7L/pBotEPVQKIGUlQY
Ys0yeDUsFC7EYY/wygmXjUez0PSKtAmzVNQN+HVLbk4M7Z5iBg56y08++SWjhdTsa190MJyK4X6a
OeXMTK1VZSN4Z3k6eB5PjrZ7TquXxCGSYiAcD2T25GmPWa+hgG9XhBTJ6cSYGubUcJxuiWYmLxLF
BYbhwDwcSVIY7Mhm0dJQX7ZRLcMcaFJDFk8pI71aVsbh6iU5IR+Y9YnBFOY885Tfc/vVP7JZf0Fz
Vj/mlJhCYs6QJXNImV2aGHPgmBIhJOZSkceJjGJYWA8oVqEkoaWypzUK1p7LcQpHgVIchyScMjTW
I1KNhetOKKZgG1PZ3po5zbm+N2OqiXKpYpP1ZlkRJlmIUcnJkWlI0SLimYOQa/oGYwqoRSWhbUvJ
ETVV/0qpi1VJmbZxmDzjTWSzbVlerHn2aUvfBtIJen2Jv7hmn2eiWB4OT3z38Q6mjrgX0m6ud5wx
slk1mJKxvkVSPFdxHM7UidGcE+Xcy7amjiJzBqOGmDLWGMY58zoXugxjCLxSw2MpPDOW01w58DcZ
Sij8SA0hRdZNw4FM23nmFChoDcWFGrB9O59YnG09IU4snDKGQJeFaxF2JvN52/DrnPhRt8QYS+cd
pQiXTjEqSIZrtexiYm0Mer563Npzg0GEkGF15o6HFFkaZaKSNXfnJHw4d8lt/dSwMEpJ5eyxFsiJ
halEuZWrH3gvgrWV725Nlbks2lQDiQLWVvOXd1X80huQVFiKsLTVre4Uwgz/+z/8E09ff4+NM/lx
BN4hfMf2+hklnsAbxuFE2/WUMKPBk63wb//iv+Fnrz9js13QrRaggpRa/U1TxNmOkuv1QiaTozAM
M3/8eM8QJlIeSOEN0n7Dou/AzFx//jmryys8Fm83bFzLKi8QOkwxNRUgSmMdvlGiRAI1iKfGEDMM
ITPNwq++fuT33x9RIqU8MB1/y3LZ0C8yRSPWRTrAUZBpZFEyDVdI53HaUrLjYrnkJ682XC8bttum
bpycVgS5yeDNOcdSiKcJWyauLi0vfvYT+s0XOHNNsi0xZXKi1nUl4UyLSN2E5ZxJqRDnIzmMFJVq
npSEnANzYtuzXy/xcPrIP75/YkDxLy7oh5HTN29ocazWHdP0wEme6J63xHRgu9pylFtSu+fli2eo
m1E5sLQB88n/+O//+pUIbYbmrIY7WOF3s+F9MrzHgFRxxEkSRisMICdhLIlEtUDN4iEZvg6FF8Vy
Gy2nnGqtTaSSmRAmhInMrJY/lsyOzBp4QeE1cAVMwVNipncLCr6GhlQJRTBaUJu5cvCSxCUwpnpl
0OTEjYFthjaYqpgzilGLbW1FAdrK3fVEtnZiDJnjhyOrKdOkHW3OeJ9Zr1tW/Rq7yDTLDSfuOMgd
kzpiVBpuKNph1NQXrLWIqbvvpmkpklmvFiyXPd1ySbPoENew3CxpfcP1dku/7Hh2uWax8NiLFetP
PuXq5gdYv6KMLfEY0MWKYRfJQwOtxS8su+M9w3jkKIljrgSuYZ4hKy6CSwmTClkLrrMUA8tFQynQ
+CWqHWJWrLpPWfobtrpAs6OPno1eI5ND/CUrd8XSrLh88QNav8YFz3S4Z56vGB+UtA+Y7oYmNehj
xjzewf2RPJfa15+mWskik1OEkil4fPcCKwltDGGeyBn61ZnMZC0X3QuW5hnzKTEdCmkwSOqwYpC4
puGIydCtL5DyEbWRgz2Q1zfEcGQcRzSnc6p6ybrvIcIwzJxC5IQwEXg/TTyFwEhEVUhMVSAjnjlD
ZwzeWKQU3BnBaaQukq6U2hEumWAzKQsx1yT0xgmtS4iBdeOZSmIqMFHv2d+fpnO/PRJTrXKqEVzj
iVL76lYtOUFrXOVdtw0mKWmKeGPqpMbVE5vrO8QYcgzYtieNAbE9hIKxti4W541wiRbbb0jNC949
Ge6nF3yXEh/DLbvpiYOcMJI57IXWXrEfFNUGJ1J/pvOkoGsdSvXZFzzqW2Ku9S0597BLyQxJ6Jxw
CrWTbSgsjLARx69PR1qBlvQvvIPHPPMj3/A2jmy95Qh18TUNtoA3jv08Y7U6rGPKCHUTtzWW23nE
lepSGFVwxnMrMwfv+ZbIpnV86TyPCGvfMorQekNIQlbLiUIsQuuUt6lwYQUrmensLo9FaSwMMbNx
ek4119P5WKBRZRdhieAMGAElU1RpPcwZrCrOCCIVjlVEaGylDztTp5xWwXupcBebMKYuOlYr6IYk
lBE6gbbU6pzkwnBK/O1/fsObv/8j+TCDvMNoxvqJXGak79D1GhEP6S0uecq8Z3Ga+K9/8kt+8Sef
sb3coK2vC5C1pJwrfF4t4axDLdkSCuxOA+/u93y92/Nw+JbTw+/I0/csL07k0p85/Ru63LJJlsVs
6JeOzjgawLeWBoeoIjaRjWXWeg0WUmGcCzEp45S5P0w4a0kB2iYRyx39coHRhC+ecirMO19H7Lkj
nDx2YUhBuXy+obiWi7Xj9UXLZd/RLbvqTTAV7mWsUmSGNJCnCcaJZ+uGZ19+wubmF3hzgZqeyHnR
L0AcQQpGGlSUpIaSzjbScKSkRJnPAC7V85TDYdRQTJ00vfn+LV8/PBJSpLx5T3j6Iyl8oG8Kl8+u
Wayeo1r49PXPOd4fyPNAHCca13Kzfc5Ff43Piab02F82wpWkemoAxli4xhIzLCVzX5Qgme9K5ikX
/tLWnfapRB6y0jjLfY58H2cujPCJCEjE5chKhG0RWlVMVrJkrozl/ysVo/mJsTSl8LnAIUUaEqkY
VCKxGB7GQktGXWUyTlha15yl85amD8RT4tpkpqJkHQlVBUex9WfssuHw//P0HkuWZlea3dpH/PIK
V6EyMwKZAApAFayqi82uru4JSaMyo3HStB5yxlm/RT8MX4BjjmjNJjlo0EqwCkABSKSIzIjwcHXV
r47YHJwLTH0QHu7Xf3H2/r61lhm3F1ZNwfpVvuVqteHnz17w5e2R/2P3kZWOvNsd4OEjr29WtKuG
dltjpWNe7jB6hY2J0zKzNQ6xYG1L1LIKGHNgDJHGecx0ZNXUiCsGqqayqFj62he0p2vBFKIZYlkd
d/x3VcPdfuTjNDD97BPe3e3Y7T4w7I4c7u6pn/Ys/orTaBgfJ4ZmwV521Kbi5EaMNzxrVqUOMVPg
KSHj2oyajGZLLZZU6Khc+J7GZrI6Br8G2xHbNaMasv0BNiXGIdIPJ/b377i83LI7fsDtKuyFsJ8j
73eG1gkPlTKfDix5hCYSY+Ti4oJ6PiJLxK86pv2RJWeshasLoTZXMBz4OJ4wsWBX7XaLVmum40Cu
LdPKcgyRNkIdnriWFciRSUeshd3xPfcy4rqeYZ9w4YmqczRNOep80vwJ/unAx83AdWsYwrF0lj+7
Ii6R5BJRZlxcYQl4EWYNTJLIasEpY4g4Y4gICVNkMVrws5ojk9FyikhFtagUl/JuSTg1dJUynoEi
VVKicSVocyabRSKtgzEVR0GYZ4xxeIWq8cRs0BliOoe/nGEaS7DPLQZry8g5hwDiSXMkhIDLgmZo
qwqNibZdF+FLPtF0C87XDD/7C+6//z2HD2/hcMTHxI19Q+sbLn2N89CJ58NjxJ8McThyt4/8KCZ+
tN5ycdUzG+FRA4SFAUvTeoIWUcucS8Yji5LOKfGcLa2rOLnMX2825Djxi/0dXiq+iZkjxeolkrnW
yN/Mmb/uO0JesK7GxMSKyJWxpDDTGcewBHocJsOXc+SvKsdxCSVlr5GNd/zXtePvl8SPpdxzXnrP
STMzJcV+yplsBaNlZWAQLjBUAh+j4cLBnEtSPecSdDT5D6XNxPKHjBFQSenkz3+QNFG6+UH/cPIs
YbrKWPjDQ98UVqyYUh12tozV7ZkrH+cCHVoC6CyMQ8aMM3klRG8xRogpkJYBb2f4VstxvX5GW0Vi
XNDOYS97nAKdwdDTuIaYIi4eqJnISyhhNBVUTQm5hjJSzjEVIUvgjxySkIt57TTCclgjw3Paao0O
17Tdc6q6w4rgZcYZV07Bpvz80jTFrYAUdn4CF5WZgIkVqCEsSpDMblyIQehqYfAQp8jaXuNDIo0Z
rWra0NOFnsvLFZbydjTFI7YuuOzPblp+eNmyqTzeCSaCuHMILy44pLgpsmLmkW2nXL+6Zvviz+j8
DWp6krGFyWIqjMll5ZQjmkYwPVYhmwI5U2cglPWTM4JJiqmLowGNeOMxIrRuRV9XxDATJsOrT3/I
7v1belE+6V+Af06VX6D7mUou6S493U0DUhNsg8vQ+m1BCF/msxtWhK704dktkQXBas2lgRbloMpG
ihIwkBnEEUsChiUn/tx5xhzpDfRGmQWclptXpwUZWwQPmS+k4WMOnJaCh+1SRlQ4aSa5jBAYjMGn
gY0aahoEwTsQdec3WYPzz4h9EVB8TEpjcgHnS+YhZlzMTNbi0omfOWWZKxpbYSvHqt+SrzN/+cOJ
9//9f8WvfvN73Pw9p3QPl0K7sigGa67JuWFIkMbXhf7TXhHzBYRENiUkcpr2eG+x2ROMZZoblqGh
rtszrtEg3pFiou56Ug6YypNSYmVX+Lpm2y281nJDvnt2ye7wgsM08Piw5/7tI8Mh83h/4N3bO9Lq
RPpwTSax3bZc3FxSt0eMd4Rjou03tOIIc8BQUtsiwgIkk7DAHBLeCLX0+Kon1y1pXrh+tqJXJewW
AsK1fEJ7UeGfOjrJTAjTdKJ1mXw8Ma0C2iSIHucilsgg7/HXArtE5UD6jp4WcssKw8vmGu+vWCVH
zg1WHDfPP2W2ju8e/4GWkbA2+DFRiUPmwDTfscg9s4JJjuDXzOGAmwNZI0tek9OWvGRMW3PQj3gT
mefMSS94ihO78SO5uUJbg5dM0iPZvILNFaM4LuoL0lLGl6dDZLPyJFNqnGINWYpBrSTbhYhlzAlj
DIecWUwqwp0ErVVsDjyrLEsWvDUcY0K9Z84LlbFsvMN5T85wnCLGQFOXfWvfNsSp8LoNpUrk2woN
AbWxYFcTmCETA5iqJodYfOxxwRmDYNGcaHpHVsuzesUwTXinZJdXQ0w8AAAgAElEQVT47nDF0/0z
5kPi6f3v8UsmdwcafUE4DRzdK+6/UR6GI28+veLmKnK99pzuH7j85AUVFWFeGMcDrlvhqMqu3BjG
DCuTycnQmoxFz0luwz4aarvi6ahEX2FyZo6wNfB+mvjntfBxnHhuDVsx7JZM7w1DXGil5ikk/FkS
81EzxsI/zBOxtfy/mlgZy0tn+XpJfFbX/CdNJbznhdkol86QFa695y6UfEAtyq1CY2EXA6+cYckG
R+GYh6xcGmFK0DvDMWVmyol7ymWnPWuitZZ4/rpBAMtaYIxl5+0KZI/GFvOfteXkbl2ZuKiCUyUv
JfVuA6SlEAWHIZKWRNjtaVCyC2hyJFcRl5n94wckPoALSGtwapgfviXGR/r2hsiRGBPGXBCGDj0t
zGGgyQtm2zCmiYwhhQJciqawZ7MRUloQZ5FcRlE5F+hOaz0mWXLsuT9ltr44GhY/4k1XXkx6gy6B
pqoQp0gsU1vNngyMSctkTwKnOVHlhVmVEBJZDCllVhtwvrD1R+84+Q3HWVnMNau1g6WicZa8nukx
4GCZLP2qZWU6Xmwatl3NetPQtv05Z1IjknCuIseSeMhhoUojl5s1q5dvWDXPwTaocUXbqnKWPmWs
dWiKZxaHICZj9Fx1zA7jLCkqztUosQAlNCI5IZoxtmZz0VN1FrOC5rpnOnxPX6+JdmEQz4urNalf
Y+YjykI2V2hQbj9ONCpcv47YC8vKWVxtwGlFMpERJRpoaweLIhq5xLBWxxWWnJTGOmJOJGNKGtKC
j0KdlUqFa98wzAu1Efw5JGJtIAahqQxBHc+NMCE8hkC0hm/zwtoIVyROCeYMD074RiK/W0b+eeO5
9IbalbfGHD1ODUpHdhse3cDHKtEbyHJiCAm0jPgOcaZWw91BebGp0dZjs8d4R99lfvws8D/8i0Cz
dvzytzP64BmXE1GU424hryw0VwwaCT5gzQp11+wm5XJdI8YQQiYCScr31X2AXtgfTnTtiuQbxFok
K2LLWFK16CIlB8Q7DJmKDDYQ4sS66zn1E8YqT1cnftV+5P/++2/5p6++53j3e9QOaH1TAnOvn5NJ
3C8Dl1XDOB2YEnzy5nOev7imd47j4URSx3rTlNpWnKmcwwn45jniPTEL267ltCSqsDC0il5n1vUl
w+Ge6tlLlhHCEbId2Fx1DHOib3e4NDGFwFX9GS4+kPSETZ4LGTGhIdtr9v7IkloMa4xbM7qBEEbW
2xv8xmOfTyx3H7DrE3MemZeFUxy46jrykMrem4ia8oISyGRZGDNU20vycknVPgeJzMMjk8DOnVg/
ZdKlR1oH2RGokOgYD49kEVadYKzDR4UmY3Ek77idDQGlskpdZ9Kc0BDxDk6LIlXRbFpn8CJ4DBOR
b/Z3XLYtxvzB252YU8ZLTQBCWEBLT9tahw25VJPSgjeKTZmFQNvZooJFkJgxzuOiKRQq25I1kJKw
exiwVYVLEJdEXXtUFdN2pCUVgUeGvm/AGmQn1F3DGOHHz5/T5Jr3zYaLpIyPt9jxCc+WAaV984y1
h7thx8d3huc2MT1Fnj7OvFme46uKlc2Mw4D1jhEDriKU6jSzKWCO1pabcj5D0Hpf44CHaeBPtze8
P+54JTMxzVzlyJKFr+LCT23FPi9M6hmXhZANVe15WBIbZxEyOxIPCv9PWugMZernLE/AUnm23vP7
Bf7tesP7mHlGjaqhUYcXw21IfFYbPib4IJlVcrQitBi+i4mf1I4lZepcTt2KoU5l6lI64wVCU+wB
Bo+WiYstMpGcIaBEDL2BGHOZOGrhzNtCk6XOChlyFuYAZDnzD8AkYRkjMgfM8kSbDrSVIvMMtiUE
z/G059vv3vI0nZBnFXoYSY9HGrci+eeM6pG7I9kbbPUVbgmEIeAdbIxS2RZTNeiZiZjRoqK1jrgU
3LKl8OjFFp1q1VTUdUYbZehOnNo9l9evmOhgyFzdlGigGsV2DqzgnJBEUWMRKxirOGdRTSwBUoan
CPvTSFRTdLOiiElUTaLmQLTg2o5qt8V7S7Yzj0ukrTw+F1Jfnyw3XNIHw0tT8fqy59m2oa8apC6g
tOIMAWM9yzyDRhyZ7nrD9sc/oV3/iMpdMIgnUdYMYhRJ5frN4sHGAofSAhUqmQfP4kveSWzxqost
NEE517lTGqnrlhfrFb33RAW76rj/taFdP6eO74jB4pqa695xWAyN9kyLECRjG0uSjG0KP3PRGfvX
/+bf/ftZlFuNfKOW32fHhkJbq5yycqV+siQlJuGUFBHDnSqtVUxWNtawxAQouxTprCujmAw+R0SU
yim1U2ZdzmjIxAtngUhjlN4VyLzVsosMzhPFMkmB9ouxrG1546ydRRLFPqQwW2FNQpdAnSNXZD5x
GaOJRGCNUufM1gqrxtE0NVXVYozBttBa4Zkr0gQJBhdPuIdbGCwfv/strsmk+USTHK3pYUz0rsU1
FSmWgFVWLVA/NRhXPkhnLE1VYVwJCCkZK+XFSMSVN1+1mGwhZYwrdUErnqyZvm3pm45KLM4ZfnN7
5HffvieM35LjxOaN55/9xc/5sx+/5s2rK1ad52rjmOuFj8O3LHpC64aH+cjbDzt8tWZ3ylgt3Ukv
Hqc1LjkwNTGX9HZUCEkZFfAVd2lmcgZd3fAQPFOquHz2KS8//5ygLe1qS3CGIc1I2zDLgTgOrIIw
hcBkHPskRJvJncHZTIPjm/dfs7Rbms7QXG3BVnz/8Jb7CMglxniW3YlwOpC7Gx4jPMXIiDCfRUKo
Yow57/kG8vJEDifGYeAw1uynHfu855gPqE6ojqwur4hR0GyYn450WlHnCknlVJWmwmDehcAccwFG
kAhLZD7N2EaYNDIm5ZTOqCRNKJG8xCK2C47Hu4m2btjZxMpWtNaVHbJabHQFA5lgycISOWt3A4wL
tXN4Y4of3RiMmMKUlky7WWN9ufGHJRHmiFjL8TCCxvPLQpkKIYbKV+RlKvs7wDqPbwowZN15phQw
lbCfPaf9jvvjx8LRr2vqi2vcyjNOsLkQpiWA7lhd9mzXFfV6TdLioY85oGqRpgEMrVGSnidrZ82y
Q3hKmcZZFGic49JVnOaJLZm388grsXwdCmv6ZWP4RhNbL3ytMzdVjaSFSmHlhfswsBXLfzwF/ktb
E4LSqeWvu5avcubzuuFe4JXruTaOJA3bqiWIIxvDQy4j7caW8XltHUuGP/GF7FZh6G0mULIAY4YL
K0w5oyK0xrAorHwJwDVGC69AEs4YlgS9Kzi9lSvgmqzgKH70lRGWkOhFaBQIQgqwPyyYpOdwVSQs
mXmecTniQqC20FcGZxLeN8SceXp65H/75vf8n3/3gfThCeGJigdI74jDA3q5RS2wRKrJllPmNOOS
wy+ZP//LP+OLH77BN8WtoSoQyppgmcO5fprRpCCGSCYlYT8tfP048u5pQHPN6XFh3j/y6afPsEa4
6HyZqFYWax2TQFPXJCt4Z3BOaCuHc45pSYRs2I+Bh5B5v4/s58R0vraMSRxv7wnvlKrzVLZi1Qe6
WnheGV6vW9rFsw4d3dJyFRybyvLmzYpXlx0XfUd9rnyqE4wJIAUURYjYMXJxteLqix/QX/2YtvsE
bMOiwpkXVEJtZ3KgpoBgz9pcg7H+LNdRNGUkDwWS40pK0lhTaoC2ArWI7ZFkWB6e+M3tgcN9gmSY
nm5Ja0e33tJvrumbijkbxDm08qSqhAWbC0frBbxissP+s//p3/37e1uIcIsRfrskdkYJonyb4nm8
UB7w94B3niDK7BMbV3qWa2s4aeTKeDzCkFKpjHnLbDPBFHiCStkJOUzp9eKIOXNZldrKLga2TthW
lo2BawdeI52Hl2LpreVso/xjKthQ1I2dZrwuVOdOr9VM0sDKZFrAEbHq6LxQ1w3GVYipEOcQUTZt
xaaySF3z9v13pGw5xj3vPnxk+H5Pu+7otzeoZtJcU68bHseZQwxklzFS9l/eRGwuI1cjUoJetcHX
Fd63uLojqynjLAnn1H34Iy4Qo0VSEA2r9SUiNZiGnIX7fWavW0KE/nrkf/m3/zN/+ZNPeX1zia89
280as7oA3+C05s3rPyWLIcQZW2WiXSAajM2YCG2mpDVVMCYVGMJ8rmG4BPhSXRGPdQ1HdURT0XYe
7Ex36dhceaSDbiV0PrFZWdom01z2jJc1p7CQ246wRMQ6rEzUK8voZmZbxveh2aK2xZ0yF+6GLVuu
Vs+4uuxYNZ7RNMzPI0sKpFBohVr0ZZAFazwpOTRdgLkipgpXbTG+IeUtpr3CdD2HELk7vuP7d295
2D3y9jdfMg0zbrrET2uQyHJ6pOobQgyc4sDDeCJrJNoAKeIaQ9DEsCROGoqMRhdqY1GTyTnjTGbS
CeMCL6qe3gs3VUUlFq/m7EDwHCMcNTOlzKCJRCTNMzkFnChJA77yqATqVU00gapxtF3Ze1pbFdGP
KXvnZZzKeDgUL4KepwfEhaAF4RrjjHWQY8BXFU2rpBRZrVpulxOP2TPGmrvTxIe3mXFvGI5FXPRh
uuXt7j/SrxPXNz2NaakrW7DjCZ4eH3iMR2zVU1e+vBxhqES4m6GyBcxT+tmGfc5c1o5TioDh+xj4
/TJxTMqvp4l/UVfsBVbOUQkcNfHcZDJwYTsWMqd5YJfKqfzSCQOJf9k3/DIlXviWIJ7btOIv6hV/
F4WbZsXgfQnFece3OfGyshwUxCuTVZ5UeWMdUZVPKsM+KL2zpJxZtFBIZjVFqHPuINci1DnRGsMc
Mk7suSkhVJTAWitKm0tDwZ/7zbVoqZtpSa3PITENR077D9j0hE4nbMrkNKHxiMsLhoXaW0I+/bF6
F1LmHx8+8L/+zVccfrOH04R5+A6Z79DlK+xVQ4fBxoxLkIeR6XggL0V5bVbCv/qrn/Pm8jltXXby
aVkQY5nDRCKCKc0M7yriEv8ISHl8HIgx8d0p8P5jIi5H+s0aGkHMiHEO65XLrjrf4zKN9wgZY0pL
pK9rVCzL+aB2v0R2ITKmzKk8zmmypRePOSlVFFqdycuJeiVU8z2v1ltaa+mbmofvSw4me2XdeF5+
1rHd1jStR60gzp2vLQc5k04TdploUa5/9Anbmx/SNm9wfkXEENUWcmosuYiSoYCsBaalGsEUNC8i
JDXkOJ4FLaWhIOKQDMa2RQQlDsQTnOUpDPxfv33P/cOMfgqfXb9k1Rs6+4H+osfamt0xME2G6ShM
j5EmGOIu4NVwmhK2MbhZPd8tgbU3fNByWr0wwmFRXovwy5T5sSkXZXCZAzOvRPksCy6cH0xRuTQV
IEQStZT6ismZjCVRIDQtRYeHFvrRKUeyqQgpYRGeeRg10lrDThO/0QVnHBdp4AVKUNDswViCUbzx
BG8IEoipYx1XHOLCh2WiiYJPBmOEjwkaTQzznqZ1tP0E1QZbO9RUeL+mWgufPldCEn798b/hV3/z
C7R74uH2PZ9fn3jhR47jW2pb4dbX3A3vuLArNlWL6oSXTM+Khg0hC9F6Hk6pjEH8RNOWcFxaAsZ4
nGuwyRHPLwIigbwUm9kyCykI4zGBCG3bsm4q/uLTBmNX/Aex/Nj/kK21/GC7xahl7WaWJOxj5qZf
8ZNPX0OODMvMfuoJIXAMM1VtmWJgXCxf7nfUTrm83NJFML6Ag/5wchxE6aoah9KKR+eA6EDVzFw/
u2LddLw/PtFvPNO85qlOIDPzx4nr11/wT7/+Tzz75AtiMMRNDUnJ+UCMtyyjEoYLpjiwSCKHgdEe
WD274mn4mq7Zcop7FrNneeaRHLj5wSVsE8ePO5JYptNCxBLihDGgjKRwKje45QKTHG39RD0nLuKK
yka+vhMeHwK2fk2eD8TmBaF7DQi7X31JeDrQ/BfP2IWJLBWyD0zhgfyJcmoVV1dEk9k2F3SuQmLC
S8U0zTjn0BCYWfhu/yVfbDpeVDfEPHCdGhYCY/YcT5HbmDiSGSRhNFCx8Lx2dNOCrVseQmA1CtQT
bdvSOUNNhfMVZMXbipxAsoesHOZcshpTOXmklBApLgUVsL6khVOOYCxKxFeeGDI/fHHNMUxgf0S7
MXz3tOb7X3/N/Pg7kgiuflXCXSLMfeZ0lfn23f+O9RNJDO1qj8iKh0PkvfdcYfnc/yltv8I7Zc7C
TV3c01MSVsaxxERNETFZLM+7lq+nHZ9Wwp964V/5ljddTSDjKs8HzUguYJWPGZ61ylfDCfEQ40Jr
CvL2Eyc8dxVREntrWPC8aCp21vProPzMFI/6SoS3MRMpDZ7f5szP1PHVlPjCFjf3ZJQlFU695oxJ
wkURToKUtH5MSmehTkqFw4RImzJOE6JF1etM0a52ajAp4WOAcKKzDo9FrMVmYYpzYeenHZ07FVV1
GknxRErl35hToLKGlC3KSMQyE4gi7KYj0zSiv9sh8YDahWQe4XCiGj8tAcBwS7aBPD2VI2a2WNdy
vQrcbG/IU4AZUgrkDNknxmHGNKXhIE5JdsRRIb5Q0JLJvF9mbiViPxV6/wrdBVKe6Nav8E2HOuUU
E94kcs5MQXBqz/VLQ7CJJRUyW8jKMUWe5sAn64q77yNGhBPCPk6knJlZePHJlnCcqZfI07xhW7X4
uuL2diJZ0E1C3BFzucE0hrrtsU1ZRzlTzIsGmIYZe57sbN5c07/4MXX3Gu9XhY8SLfGsT5Wzecja
whewtGhc0BTIKZCtx4jHSyK7BsiEacG5rnDwDagp17AaR5ZEU9V4YyEZXJ1x1nF9BR//4Z5URfSm
wniDjxUhn6u3Q0ByABU+frSsqoDKjDtm5cI4XBQucuanxuLUMrvEbRQ+z8pWhQuTeNRMk5Xsyg8T
DVikfLDqCZoR2zBKpjZnEH0C73LRb54lBMkqkwQmMlky6gxNEkIQGi3VMg3w0hq+TzBGyzgpRxIC
9E3CWlsgMh5q21FJxpP4Zj4wRc+kgVOYuDbKbBLXYnAm8u1+ZrWauKgmOmMwkrHSEgi0zYZnm5H/
/M1rvv7lnuVxhzHf891hYPz13/PZT67pvGDTT7laX2K7NSlNVDki2ZMlYpzDO4era2LIxGxYhsTp
aaDv13hrEZScZtQLkkBFMFVDCEdSgmUeSdFAOuKqBpWSWn+2vWS7G8CtywefMxoTXdPhty3704Jr
SrAxhEDUyBIqXmrHaYwsc5GALIeZUTPW1BAGdH7EVBv2x3vulyeumh8RbWbIwqwJzZaTwGNQ1tuG
VjNrL+U0uyTU1izRYFJfFJwXW7Z+zc9f/Gc0yXPcDayuVsSnO47zHrt6xcO7O+z0gHVFhVs1maAj
v/vuF7y4fMPr1z/l/uEr6D8j1yt2ux2H057FZoIE5nEhSwZZEHWojqhmRDw5TqgGUqpYUmQ5PXDa
P7DdNCypjLBTfgCzJy5PHPcD3zwd2d/9lq7pGd96Qqgx15dULiLNCdk9YduObf2KcfcRS6RdPePj
PLOOjuzkvB+P2DjyQ/eGywy7/Yn1pue0BHCeJUaWlDktwre3A9U6MVc76uXE6D31MTNtrtgEz9Va
iU8zr2rBygrrK+qqIS6K9TVLSrjGMp+OqCqVhzQnqGqO45Gma0lByDHRbVbEZcZaJcahjN6NofJK
u/L4SfmpvaJpKv7Dl1+zPH+H/cnP0Xnmw90v8DfKZGbc2vLl6QPj0bB6VmM/7thOGczIwynwdYI7
Aj/dbLlofkBV1+y18AuWBMecCz1LM7W1pFREKJoi/7KBxq0w00Df9SVMZT1dc8nrMHNQYT9NfK4O
ZxI/a2t623I7Hln3FY9z4LrtqGxXHry+YpcyUlX83bTwV40laKAWy6Wx+KR84eFdjPyZM9ynTAVc
AMcl8Il1xKysyeQFwrLQiJAW5aIWtlqMYFtriTnREVmmmcYIToVsErXxmCRUTtBUpFY1M0knnDhE
LY00qAZK4ihjbaRvWiQV/Ox4GJjnGW8Mc5iobblv1b6Y0KYpk8XjQ6RXy255gGcL+k/fovktkJmm
B0x3g+YOkxcwDtFc1kRh4K//9f/IVXXDFBSVUk9DE3MILMt07osLlVTELIhXcjRMJFzdc5IHlmDw
g+dFV/4e+jpyU7d0xtHYYsK0YvAmk6KWpohIEdcMgSUrcy5io/3piKYT96eWw+kOlUzvnxXjXSoy
pLg4nAtk1zGPT+ztiYcxclzAXFqqFryuCWKxFEa+tRZrLSpC3E3FthY9lRiqBraf/4RV/YquumGx
ZXKMFACU5Q9q3Iyep6yVlfP8t8WkiZTmIv0xFdYpMUaMbUuNTRNIUUzLH1bJCJnAyjraztG88MR3
ifu0Y5CA2kv0cEIvN2RrabyljdBeWMIUES9kMzMwEI+CIzmujAEV9injJLPxyu/mQGuEKVtmYMwG
FcNypspZTBnDqBZKWRRqNeRoaXBYpySNqMtl9FYpORcG/EmU91oQf3cieI18LobKC2sVvBieidJm
4XOESMAGZTRKdgYTGhqp8ZKpraPzivFrkka+6C6wsvDLOFO3FV+GiUzkcM4GqAY+Ho6Iq8kaqOsa
bwKaLEYqmm7Fq5c913/2gt/97d/jX1js0REjDKdIf/EJF90NdVsjtmKJufiskwVvcA7aWql9RlXw
Elg0EHNgnsfzSL1DcuEfZ4qgQDMY14BGlJGcA6eQ6F1Cg6eqLf2q4QeXK/78Bz8lH99ymAaOU0NV
tdR1TZMdVjOLJlxlceKIdfmj6n2px4xTYlg1hOmsRtQOLCxGybYnmhPv44GMY5oyrXHcdBdFz+eV
lXWsZEuOgeNw4OkIbJVJJ7AT3kx8stpi97c0YvFGyeMef1oQBzxkunaL+kS/HpinPc3lBbqCaRrx
7RVN7/Btw/XNF3AsgbIwK8Nc8XxdlIJYIYUnQnxPtgGNAWRCtdx8ICLZErJBjcPaDUsIoEMxCuZD
0b6Kcnf6hv2y0NQr7mdYBmVxEXt6x/pSyA6m3RPh7S2nFyOyHDFz5KbqCWEgmRVZGrpoyKMQR8v2
oqfxEeNqpmwJquSUeRwTByK7mLm9v6VPFbMkTFTMpmGYTkwc2B4GprBh7AaaTli1HRfXTakQ2eJu
d6LkFNAlU4vFqCmWxKW41POcMNFTNS3TspBzQkM6j9steXoqekod8BK5XguaW/7NT/+E39w84zev
D/zqN99wGz4yPt6Twkw1dvjQc5cv+PXXEecXqAJBnlgyfHl7wsuJ//blmvbyCtc4rs5UtYmEI5NS
0cW2FsZcePrLsmBzokOouhXbqy0WwXiHMz1rVU45capnSA7N54kIMy8ajzUNY5joqxVBFXdeqc0Z
TmqY55nZCkYTjShNCqyAWizHOHNjGlaivMpKm4rq0leZVYLaQ4oTD+OROJ3orWWdG66kwTY9NZEI
WI2lMiZCThErDquRynmMuEIRM6W+RmVLyEwE0YxFcJUn5oSYwrHIBKZ5ZFhOhDgzxIWwzEySMSh9
Y/9IclswyDjy7MrwvU1we4dUEaaA4kojJwdwEzmff4dkjMDN5hVfvPoxqonKdgxDoSgGU8x14gxx
mmkqg0mKrTLgSTmcH/gFU3zdN8yHgd3dWzarDh1iWYlVFmcsRgxzzpAdh2mm90JISjwG6soSRInG
cL8fmQ8fse5Eti263pGHljmWhomdwY5CnS0pZmZmxmnmaTGkJTHVhhdXFl3KxLmta5wKxYvoCtUv
JtRbhuOAmRZ6G7j8+Y/YrF7QVFfI+QU9Zks0IDmXFy4tAp2sijXloe6cwxphngPkSEwBZw3GVVgX
y2eUZ5JzWE2IMahYICG2xojQtD1ffNHzu18/4J7D+98Jm43h6cPvqLeGEG6oqpnhcWTV9KiUDIft
K+a5TKi72uOsyayM4zaCZCF6g0qmM57OWh5VGVKBaDgVsi1jPDEgEUIWbCqhtTkrMRXIvaSML80B
TCr9zpAd3y0R13gmTcwqdDaxz8IHgUode80lTIBSqzARcEkQmwqz2jQ0KcICtuqIKN44vC1dxH7d
8e4o3FlLq7B4Q86OIcGQlWlUbkxGdWCalXWXWfcR6wRnlco6rvqWH6567vsXDPKB+497zFqo28zn
b96w9lcIEe8UbwJheURTCQCFXFOlFnIBYQgGzlW0cRzxtSPHwvaVnFFxOBFSijhfMyXFtTWZhRwT
Swj4KlM3HXWwXGx6fvRqyy9/8YH/7/Yr6ramqbeoZIxx1IDLGQFiLuO5JWX6rsIbT/IW6+A47IrC
k0g+k6mqfYOMG2bNZGP5fToWuAmZZUowFXHJ3T5w1Rgutp/S+oBKZnANDzpRtRuuqor33/0tURW1
hrl6ZJ4Vrz3Eidt//Ad8e8VyahDb0KZLkmbSytM2SuUbUkrUi/B0/4D3lm0dCMZw0XaEiwoOA7vh
jqxz4cSfqVzeNme943JO6xaz6zJmUq7RYBBVlFIBMbYnime2kWOKzLri9Cic9r/FbwKfbt4wH59o
4kJcIpvU8/T9gWO4JdRfsAwTS+u4sIYkDoZA9RRgOZI3BsVwsCPUFSdr+BhHdnHhu+P3zP4t6SA0
0mBoeRpG0tAgVeKggXePf8ubm5a+/4znm0yaIecF3xlyHJjijMbEkk80XcvpNGFtuXY0RhJC7TK5
sgz7GRElnGZqZ8sI11hsWzEvAaFAUi47R2tLTmFbd3w/zMRvb+BugkUIx55g37C+eIbGFac5cKOh
7HSjspaRuMt8/c2XvP7kB7TNGu8qkmaMSsFgkvCVR0i0lSESmcxIlgkTJjYXF6zq9TlM5Ertx1h8
Vja2RWMC8VjrybECI6QQMW2HMRWqCW+a4hsX4bgkuq4ihZklLrTOoDEgvnztwlkayQwpEXPi9jAg
KRPFc902rCuPMYGL+sT99JGNq4vGNW/ZUAK6ioEMjS1I3EWKRU9iQe9aMnq2pokKxnSkNCMIUaeC
Hc1gcsBax7DMhKx8PDxwNzzicyZMExXKcV7KZzRJcRXUnpQyPix8RuQf+hpCTzyeOMesy9u8C8jW
YMKn5IdHxCnXmvjTH/2UnArxs+4tQ5yw3jKGwJICJCHkSLt9whMAAAnsSURBVJUcYVlwfVuMNKaM
rrNGKmNo63Mif1nRPna8fNOzDR5jy1jdGyFEQ1QlJ88IDLNytwtUzcx25c+/u4mkAzJPxBg5HCPj
ELD9E057WmepLywnHTC2Js+Jvn1JSh3JB8TNTNYS/MgPL9d88knF5XWHdYVYqirMSyKPGUJgs4LL
l89Zv/opVX2F+IZRSjhYtQS1AbIIAn/ksReTWmmoZAvWtaQ4E+ME4jDicLYpK7A4U877C6oeYyvI
GaGEV7cXPd26IYtBL2t01RA/XrNdN5i84vb+getnW3zTEmLpUzR1qalVzhDmSO8sbofnAeVLAV8p
KuUBjloeZkOfDXcZlgQPknhtLf84z2ycZ4NjUaHNls7CTHkAe1FWviTZCcrihN8tmZ0Ib61Qp4Wt
CD/yFh8ED9zOyktbkssTynS+KVtnmLKljZH7AHNY+LxxNFaofRndWGeIKOI9VB2ft5e0MfD388gF
Qq1CRlmp4OfEh7AQRosmQ14S3lW0RohicFVLX635k1dbfv3Ln/P0YUXtf4EPt3zSf86m2mLVMqfM
4/GJm64hxzusREROWG6AljlMGGlQhBAj0zCy7lriEtCkNNaSYzrvJgOqJZwmzuLbjhSFuj6nuMWW
OoSzdH3Dy/Wawxcv+cd/OnL78Fue9VflxOMr0AorlilHRG3Z41HTGIu1FdJarEtYs8bb8rSrG0sW
eL5ZeDhOzKpghDdDQwowLgFT1yzHwHgKvDsc+BAyrr9mMYFRI7ZSLilsanTGr2/wA9zdfslMQmTB
ZJB+wbsLKr1k0Vua5gW22hLsibu3X2NbZbrucT7TasPSjWTfUCGsZsj5kSh32NpDeofqCIDva2ww
rDbPWE57TtORrB4koigpz6SpoEELk2vCSsVN1fCyv0GXkcew49EPhOW3kE9EVXb3X5HnQEaxU2Ze
v+VkJqgzX339C66uX2LGQBrucRpxMoBklqmnaTpOS42azOIv2UVhniOSIu2UOTyeGMep6GnnFRpb
YrDUnXIwkTy+43Hj2ZjPeNFe4/Q8OlwWxjjhvDCGQG0Ny3DCZKWqPdMwYislxhlVy3JIaBacqRnH
BbUOV0HlFXEZiy0ijlgmTKTEZ69uWB9n/vVh5u67z3irPeHdAzp9oJ9uyKeGt9MdVxfPCc97Xm5W
WFn4Ye/YHSfefX/L8btfcbm+wa1fAYqTRGMg2Yh3DhEDFsIMkyZkPJFOe+qrTZk4uKqcbmyhVRpN
pUKlnJP/QnY1YkGdx5jSXDBnYEdQBQRrhaZ2wMJihMZpOcWbVL6vt1iZGGzmYXjk2+MtbigVqv7z
a670GdY5krH0qcFXDSEkWpNwacIYV/5fUq7nJUacqzHiUK+QE5FAZcqInj+EqkyFMRDCASOlVWI1
I5LIy8iUT3w47DkNRzoLJi5MaSGOCW9hEIOzlgowSanIdDFia8uynwvFjAw6QX6CNKEnA2ECN5Oz
ZVJB54k4BpDAnJbCxs/CnCOjLgXWpQkrNVWqMHVm1gmpelLK2P+/pzPLjSO5ouh5MeVUIyWSkkCp
YQF2Cza8Fq/Ee/AS/WXAcKvthlpEkxKnqsoxJn9EoZeQCCDjvRv33qMLmObXMdHmDVeq5fnuGx+c
EOuF1aqFFPE+E6R0tb/kyMtzJhw8h+cjFw3IKJgqUSvYpYbn5cikBmZ/4unpG4732HTJoluu11t0
1bBkg1JCPwV8P6F28Jgmnk4HLiqPiz3XFzdstg1ZwFjoX0bCHLEHT1PDm7d7Nj/8yK65RlTHojJj
yuSsIceCTT6DmMrRlTihnOV3VOGsW1uiDmkJBD8V17trUChEWtIykhK/c+WVrsk5opRm33X82W34
56rD9z1PruHduz/RvHzBL/f4x0fcvmUKjnal2ZqKZfaMYaHrHGklKJfRn/7293+8aOFJZW4lslGJ
VznhM7zSGhH4pjLZJo6S+EziVic2YrjNhUjUSyKSyTrSKo0iUCH4KeF96dHWYrjPiU5lJkncKCHF
uZixcrHcW52K21onnkicUiHfvFGa32LmNkNKBo3iylp00jhTgq2GUtOZc8SlQPQ9wY98JOK8R/lE
LfC+sQw5IirSuYxrYdMpnHOIjqVgPypyCDz0Mw8PjtbtGe9/oc0FSqBSi5KOw3++UK13pLFGSYPW
rxG9IUjDcKYuTSmwhIhRUiZ1sRjRBU+YSu8vKZ+B96psJaIhOax2EAVTlW7u8hM0SMw4o/l1sByO
Jy7XOzptsEYDQu8XQkxgStbdaI3OFoUukY0AVd1h26YYl5oW5WraumbVWi73GzaN5t2m5arr2FWG
m03LtrU0Vabb12x3FdF6Rh4Z0iPDt6/oxxN6bgkvnue7GZcsdrVjvd7SVg5rKqzp8IMGldi837K7
3qC7F1y30OwdYX4ipwld1dzdfoW6RdQaDhM+NKRjzzSsGU+KcUiQQIshxRUiNVZTZOggWGfxMSLK
QBZEMqLXKEqFq8uJ3vf0wzPP4yNjGFlttsjQI6YiTuCPiuFlYT565ikxm5kYIksaqCRgCAz+gWSF
o+/xIly8fYsymqrecZpnvjz8zFOOHObvnMavfL/7iXRa4Z8DElf0t5k07fFRQ7ojx8RwemBcFvrT
RNU49ts3ZBXJkjhMPfPoifNCWgI1uWyMAiEWWTDlchEqbYlRozCEpM7FMxk/e9q1I6dQTFtOo5VG
5FxfXDtEF/iId5ZDysUj8PQz63VNcIax/y9tZbh5f8W+aahcMc+maSAce0yceH3VUK/eEANlsAoT
Siznen0kJ0IYmPqep/t7DIntpsM0HdrWpFTUl3hWYXIu0qex+nzJGIRzrawqA49SJdOsRRc5W8CR
qck0TU2lNHVVoSRS2YraVGjJVLYi+QmXI/Wpp0oLl6tE5wxts0XnRFN1RRE0llq7YoDSlhQWlKnO
SXSNMTWokln20ROlQF3mGJAzyEMbSwwTKWlizni/MPqB0+mJwQ/0p0dO/ZG4TGwl0ighzRMul+dM
SYmuKt9qK8M4wb/vRn76RUh3LXhXHHxOlQ1dEnLsSWlCpgnSXJQ55bj58ZqLbQM6IUaIRCKlCW4O
Gh8VRINxFT4WAiFKGOaFeQr89jCx3Hl2VmO15w9/WWGqE/Urja4MSRSmNRgcMRuWlFhU4hRmTi8j
p+89LhhcUjB5pgUOzwt+aRgePNl9YN9cMU2CrRpWO81kFEetWVTmAASfqV1gJQLH7/z1wyWfXr/h
5nJLs+2oVjUhJIbThBoW6jBx+UPH7uMfeb37RN1sWGzFnBVTLE+mijI4SumSQc4Y3MJmFjg3DYKg
rEahSFnOT3+gsgLlQNTvSxspliVNN0AuaatcoU6Bz/+75/O/jjgRpgfP248NZtOw3u242G/ZNDXX
G0WUjHeJbDK3U8+LNRxF+D/mGKdcY+IkXQAAAABJRU5ErkJggg==
This is the demo wiki built automatically by [[travis-ci|http://travis-ci.org/]] following the instructions at
the master branch of this github repo: [[https://github.com/danielo515/TW5-auto-publish2gh-pages]]
Copyright (c) 2014, Danielo Rodriguez
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.





! HelloThere

{{HelloThere}}


This task management system has been achieved with the help of [[Francis Meetze's tutorial video|https://youtu.be/a7-pcOSfDFM?t=12m26s]].

* [[ToDo]]
* [[Completed]]
<$list filter="[!has[draft.of]tag[task]!tag[done]sort[created]]">

<$checkbox tag="done">
<$link to={{!!title}}>
<$view field="created" format="date" template="DD-mmm-YY hh:mm"/> - <$view field="title"/>
</$link>
</$checkbox>

</$list>